OCamlMakefile 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299
  1. ###########################################################################
  2. # OCamlMakefile
  3. # Copyright (C) 1999- Markus Mottl
  4. #
  5. # For updates see:
  6. # http://www.ocaml.info/home/ocaml_sources.html
  7. #
  8. ###########################################################################
  9. # Modified by damien for .glade.ml compilation
  10. # Set these variables to the names of the sources to be processed and
  11. # the result variable. Order matters during linkage!
  12. ifndef SOURCES
  13. SOURCES := foo.ml
  14. endif
  15. export SOURCES
  16. ifndef RES_CLIB_SUF
  17. RES_CLIB_SUF := _stubs
  18. endif
  19. export RES_CLIB_SUF
  20. ifndef RESULT
  21. RESULT := foo
  22. endif
  23. export RESULT := $(strip $(RESULT))
  24. export LIB_PACK_NAME
  25. ifndef DOC_FILES
  26. DOC_FILES := $(filter %.mli, $(SOURCES))
  27. endif
  28. export DOC_FILES
  29. FIRST_DOC_FILE := $(firstword $(DOC_FILES))
  30. export BCSUFFIX
  31. export NCSUFFIX
  32. ifndef TOPSUFFIX
  33. TOPSUFFIX := .top
  34. endif
  35. export TOPSUFFIX
  36. # Eventually set include- and library-paths, libraries to link,
  37. # additional compilation-, link- and ocamlyacc-flags
  38. # Path- and library information needs not be written with "-I" and such...
  39. # Define THREADS if you need it, otherwise leave it unset (same for
  40. # USE_CAMLP4)!
  41. export THREADS
  42. export VMTHREADS
  43. export ANNOTATE
  44. export USE_CAMLP4
  45. export INCDIRS
  46. export LIBDIRS
  47. export EXTLIBDIRS
  48. export RESULTDEPS
  49. export OCAML_DEFAULT_DIRS
  50. export LIBS
  51. export CLIBS
  52. export CFRAMEWORKS
  53. export OCAMLFLAGS
  54. export OCAMLNCFLAGS
  55. export OCAMLBCFLAGS
  56. export OCAMLLDFLAGS
  57. export OCAMLNLDFLAGS
  58. export OCAMLBLDFLAGS
  59. export OCAMLMKLIB_FLAGS
  60. ifndef OCAMLCPFLAGS
  61. OCAMLCPFLAGS := a
  62. endif
  63. export OCAMLCPFLAGS
  64. ifndef DOC_DIR
  65. DOC_DIR := doc
  66. endif
  67. export DOC_DIR
  68. export PPFLAGS
  69. export LFLAGS
  70. export YFLAGS
  71. export IDLFLAGS
  72. export OCAMLDOCFLAGS
  73. export OCAMLFIND_INSTFLAGS
  74. export DVIPSFLAGS
  75. export STATIC
  76. # Add a list of optional trash files that should be deleted by "make clean"
  77. export TRASH
  78. ECHO := echo
  79. ifdef REALLY_QUIET
  80. export REALLY_QUIET
  81. ECHO := true
  82. LFLAGS := $(LFLAGS) -q
  83. YFLAGS := $(YFLAGS) -q
  84. endif
  85. #################### variables depending on your OCaml-installation
  86. SYSTEM := $(shell ocamlc -config 2>/dev/null | grep system | sed 's/system: //')
  87. # This may be
  88. # - mingw
  89. # - mingw64
  90. # - win32
  91. # - cygwin
  92. # - some other string means Unix
  93. # - empty means ocamlc does not support -config
  94. ifeq ($(SYSTEM),$(filter $(SYSTEM),mingw mingw64))
  95. MINGW=1
  96. endif
  97. ifeq ($(SYSTEM),win32)
  98. MSVC=1
  99. endif
  100. ifdef MINGW
  101. export MINGW
  102. WIN32 := 1
  103. # The default value 'cc' makes 'ocamlc -cc "cc"' raises the error 'The
  104. # NTVDM CPU has encountered an illegal instruction'.
  105. ifndef CC
  106. MNO_CYGWIN := $(shell gcc -Wextra -v --help 2>/dev/null | grep -q '\-mno-cygwin'; echo $$?)
  107. CC := gcc
  108. else
  109. MNO_CYGWIN := $(shell $$CC -Wextra -v --help 2>/dev/null | grep -q '\-mno-cygwin'; echo $$?)
  110. endif
  111. # We are compiling with cygwin tools:
  112. ifeq ($(MNO_CYGWIN),0)
  113. CFLAGS_WIN32 := -mno-cygwin
  114. endif
  115. # The OCaml C header files use this flag:
  116. CFLAGS += -D__MINGW32__
  117. endif
  118. ifdef MSVC
  119. export MSVC
  120. WIN32 := 1
  121. ifndef STATIC
  122. CPPFLAGS_WIN32 := -DCAML_DLL
  123. endif
  124. CFLAGS_WIN32 += -nologo
  125. EXT_OBJ := obj
  126. EXT_LIB := lib
  127. ifeq ($(CC),gcc)
  128. # work around GNU Make default value
  129. ifdef THREADS
  130. CC := cl -MT
  131. else
  132. CC := cl
  133. endif
  134. endif
  135. ifeq ($(CXX),g++)
  136. # work around GNU Make default value
  137. CXX := $(CC)
  138. endif
  139. CFLAG_O := -Fo
  140. endif
  141. ifdef WIN32
  142. EXT_CXX := cpp
  143. EXE := .exe
  144. endif
  145. ifndef EXT_OBJ
  146. EXT_OBJ := o
  147. endif
  148. ifndef EXT_LIB
  149. EXT_LIB := a
  150. endif
  151. ifndef EXT_CXX
  152. EXT_CXX := cc
  153. endif
  154. ifndef EXE
  155. EXE := # empty
  156. endif
  157. ifndef CFLAG_O
  158. CFLAG_O := -o # do not delete this comment (preserves trailing whitespace)!
  159. endif
  160. export CC
  161. export CXX
  162. export CFLAGS
  163. export CXXFLAGS
  164. export LDFLAGS
  165. export CPPFLAGS
  166. ifndef RPATH_FLAG
  167. ifdef ELF_RPATH_FLAG
  168. RPATH_FLAG := $(ELF_RPATH_FLAG)
  169. else
  170. RPATH_FLAG := -R
  171. endif
  172. endif
  173. export RPATH_FLAG
  174. ifndef MSVC
  175. ifndef PIC_CFLAGS
  176. PIC_CFLAGS := -fPIC
  177. endif
  178. ifndef PIC_CPPFLAGS
  179. PIC_CPPFLAGS := -DPIC
  180. endif
  181. endif
  182. export PIC_CFLAGS
  183. export PIC_CPPFLAGS
  184. BCRESULT := $(addsuffix $(BCSUFFIX), $(RESULT))
  185. NCRESULT := $(addsuffix $(NCSUFFIX), $(RESULT))
  186. TOPRESULT := $(addsuffix $(TOPSUFFIX), $(RESULT))
  187. ifndef OCAMLFIND
  188. OCAMLFIND := ocamlfind
  189. endif
  190. export OCAMLFIND
  191. ifndef OCAML
  192. OCAML := ocaml
  193. endif
  194. export OCAML
  195. ifndef OCAMLC
  196. OCAMLC := ocamlc
  197. endif
  198. export OCAMLC
  199. ifndef OCAMLOPT
  200. OCAMLOPT := ocamlopt
  201. endif
  202. export OCAMLOPT
  203. ifndef OCAMLMKTOP
  204. OCAMLMKTOP := ocamlmktop
  205. endif
  206. export OCAMLMKTOP
  207. ifndef OCAMLCP
  208. OCAMLCP := ocamlcp
  209. endif
  210. export OCAMLCP
  211. ifndef OCAMLDEP
  212. OCAMLDEP := ocamldep
  213. endif
  214. export OCAMLDEP
  215. ifndef OCAMLLEX
  216. OCAMLLEX := ocamllex
  217. endif
  218. export OCAMLLEX
  219. ifndef OCAMLYACC
  220. OCAMLYACC := ocamlyacc
  221. endif
  222. export OCAMLYACC
  223. ifndef OCAMLMKLIB
  224. OCAMLMKLIB := ocamlmklib
  225. endif
  226. export OCAMLMKLIB
  227. ifndef OCAML_GLADECC
  228. OCAML_GLADECC := lablgladecc2
  229. endif
  230. export OCAML_GLADECC
  231. ifndef OCAML_GLADECC_FLAGS
  232. OCAML_GLADECC_FLAGS :=
  233. endif
  234. export OCAML_GLADECC_FLAGS
  235. ifndef CAMELEON_REPORT
  236. CAMELEON_REPORT := report
  237. endif
  238. export CAMELEON_REPORT
  239. ifndef CAMELEON_REPORT_FLAGS
  240. CAMELEON_REPORT_FLAGS :=
  241. endif
  242. export CAMELEON_REPORT_FLAGS
  243. ifndef CAMELEON_ZOGGY
  244. CAMELEON_ZOGGY := camlp4o pa_zog.cma pr_o.cmo
  245. endif
  246. export CAMELEON_ZOGGY
  247. ifndef CAMELEON_ZOGGY_FLAGS
  248. CAMELEON_ZOGGY_FLAGS :=
  249. endif
  250. export CAMELEON_ZOGGY_FLAGS
  251. ifndef OXRIDL
  252. OXRIDL := oxridl
  253. endif
  254. export OXRIDL
  255. ifndef CAMLIDL
  256. CAMLIDL := camlidl
  257. endif
  258. export CAMLIDL
  259. ifndef CAMLIDLDLL
  260. CAMLIDLDLL := camlidldll
  261. endif
  262. export CAMLIDLDLL
  263. ifndef NOIDLHEADER
  264. MAYBE_IDL_HEADER := -header
  265. endif
  266. export NOIDLHEADER
  267. export NO_CUSTOM
  268. ifndef CAMLP4
  269. CAMLP4 := camlp4
  270. endif
  271. export CAMLP4
  272. ifndef REAL_OCAMLFIND
  273. ifdef PACKS
  274. ifndef CREATE_LIB
  275. ifdef THREADS
  276. PACKS += threads
  277. endif
  278. endif
  279. empty :=
  280. space := $(empty) $(empty)
  281. comma := ,
  282. ifdef PREDS
  283. PRE_OCAML_FIND_PREDICATES := $(subst $(space),$(comma),$(PREDS))
  284. PRE_OCAML_FIND_PACKAGES := $(subst $(space),$(comma),$(PACKS))
  285. OCAML_FIND_PREDICATES := -predicates $(PRE_OCAML_FIND_PREDICATES)
  286. # OCAML_DEP_PREDICATES := -syntax $(PRE_OCAML_FIND_PREDICATES)
  287. OCAML_FIND_PACKAGES := $(OCAML_FIND_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES)
  288. OCAML_DEP_PACKAGES := $(OCAML_DEP_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES)
  289. else
  290. OCAML_FIND_PACKAGES := -package $(subst $(space),$(comma),$(PACKS))
  291. OCAML_DEP_PACKAGES :=
  292. endif
  293. OCAML_FIND_LINKPKG := -linkpkg
  294. REAL_OCAMLFIND := $(OCAMLFIND)
  295. endif
  296. endif
  297. export OCAML_FIND_PACKAGES
  298. export OCAML_DEP_PACKAGES
  299. export OCAML_FIND_LINKPKG
  300. export REAL_OCAMLFIND
  301. ifndef OCAMLDOC
  302. OCAMLDOC := ocamldoc
  303. endif
  304. export OCAMLDOC
  305. ifndef LATEX
  306. LATEX := latex
  307. endif
  308. export LATEX
  309. ifndef DVIPS
  310. DVIPS := dvips
  311. endif
  312. export DVIPS
  313. ifndef PS2PDF
  314. PS2PDF := ps2pdf
  315. endif
  316. export PS2PDF
  317. ifndef OCAMLMAKEFILE
  318. OCAMLMAKEFILE := OCamlMakefile
  319. endif
  320. export OCAMLMAKEFILE
  321. ifndef OCAMLLIBPATH
  322. OCAMLLIBPATH := \
  323. $(shell $(OCAMLC) 2>/dev/null -where || echo /usr/local/lib/ocaml)
  324. endif
  325. export OCAMLLIBPATH
  326. ifndef OCAML_LIB_INSTALL
  327. OCAML_LIB_INSTALL := $(OCAMLLIBPATH)/contrib
  328. endif
  329. export OCAML_LIB_INSTALL
  330. ###########################################################################
  331. #################### change following sections only if
  332. #################### you know what you are doing!
  333. # delete target files when a build command fails
  334. .PHONY: .DELETE_ON_ERROR
  335. .DELETE_ON_ERROR:
  336. # for pedants using "--warn-undefined-variables"
  337. export MAYBE_IDL
  338. export REAL_RESULT
  339. export CAMLIDLFLAGS
  340. export THREAD_FLAG
  341. export RES_CLIB
  342. export MAKEDLL
  343. export ANNOT_FLAG
  344. export C_OXRIDL
  345. export SUBPROJS
  346. export CFLAGS_WIN32
  347. export CPPFLAGS_WIN32
  348. INCFLAGS :=
  349. SHELL := /bin/sh
  350. MLDEPDIR := ._d
  351. BCDIDIR := ._bcdi
  352. NCDIDIR := ._ncdi
  353. FILTER_EXTNS := %.mli %.ml %.mll %.mly %.idl %.oxridl %.c %.m %.$(EXT_CXX) %.rep %.zog %.glade
  354. FILTERED := $(filter $(FILTER_EXTNS), $(SOURCES))
  355. SOURCE_DIRS := $(filter-out ./, $(sort $(dir $(FILTERED))))
  356. FILTERED_REP := $(filter %.rep, $(FILTERED))
  357. DEP_REP := $(FILTERED_REP:%.rep=$(MLDEPDIR)/%.d)
  358. AUTO_REP := $(FILTERED_REP:.rep=.ml)
  359. FILTERED_ZOG := $(filter %.zog, $(FILTERED))
  360. DEP_ZOG := $(FILTERED_ZOG:%.zog=$(MLDEPDIR)/%.d)
  361. AUTO_ZOG := $(FILTERED_ZOG:.zog=.ml)
  362. FILTERED_GLADE := $(filter %.glade, $(FILTERED))
  363. DEP_GLADE := $(FILTERED_GLADE:%.glade=$(MLDEPDIR)/%.d)
  364. AUTO_GLADE := $(FILTERED_GLADE:.glade=.ml)
  365. FILTERED_ML := $(filter %.ml, $(FILTERED))
  366. DEP_ML := $(FILTERED_ML:%.ml=$(MLDEPDIR)/%.d)
  367. FILTERED_MLI := $(filter %.mli, $(FILTERED))
  368. DEP_MLI := $(FILTERED_MLI:.mli=.di)
  369. FILTERED_MLL := $(filter %.mll, $(FILTERED))
  370. DEP_MLL := $(FILTERED_MLL:%.mll=$(MLDEPDIR)/%.d)
  371. AUTO_MLL := $(FILTERED_MLL:.mll=.ml)
  372. FILTERED_MLY := $(filter %.mly, $(FILTERED))
  373. DEP_MLY := $(FILTERED_MLY:%.mly=$(MLDEPDIR)/%.d) $(FILTERED_MLY:.mly=.di)
  374. AUTO_MLY := $(FILTERED_MLY:.mly=.mli) $(FILTERED_MLY:.mly=.ml)
  375. FILTERED_IDL := $(filter %.idl, $(FILTERED))
  376. DEP_IDL := $(FILTERED_IDL:%.idl=$(MLDEPDIR)/%.d) $(FILTERED_IDL:.idl=.di)
  377. C_IDL := $(FILTERED_IDL:%.idl=%_stubs.c)
  378. ifndef NOIDLHEADER
  379. C_IDL += $(FILTERED_IDL:.idl=.h)
  380. endif
  381. OBJ_C_IDL := $(FILTERED_IDL:%.idl=%_stubs.$(EXT_OBJ))
  382. AUTO_IDL := $(FILTERED_IDL:.idl=.mli) $(FILTERED_IDL:.idl=.ml) $(C_IDL)
  383. FILTERED_OXRIDL := $(filter %.oxridl, $(FILTERED))
  384. DEP_OXRIDL := $(FILTERED_OXRIDL:%.oxridl=$(MLDEPDIR)/%.d) $(FILTERED_OXRIDL:.oxridl=.di)
  385. AUTO_OXRIDL := $(FILTERED_OXRIDL:.oxridl=.mli) $(FILTERED_OXRIDL:.oxridl=.ml) $(C_OXRIDL)
  386. FILTERED_C_CXX := $(filter %.c %.m %.$(EXT_CXX), $(FILTERED))
  387. OBJ_C_CXX := $(FILTERED_C_CXX:.c=.$(EXT_OBJ))
  388. OBJ_C_CXX := $(OBJ_C_CXX:.m=.$(EXT_OBJ))
  389. OBJ_C_CXX := $(OBJ_C_CXX:.$(EXT_CXX)=.$(EXT_OBJ))
  390. PRE_TARGETS += $(AUTO_MLL) $(AUTO_MLY) $(AUTO_IDL) $(AUTO_OXRIDL) $(AUTO_ZOG) $(AUTO_REP) $(AUTO_GLADE)
  391. ALL_DEPS := $(DEP_ML) $(DEP_MLI) $(DEP_MLL) $(DEP_MLY) $(DEP_IDL) $(DEP_OXRIDL) $(DEP_ZOG) $(DEP_REP) $(DEP_GLADE)
  392. MLDEPS := $(filter %.d, $(ALL_DEPS))
  393. MLIDEPS := $(filter %.di, $(ALL_DEPS))
  394. BCDEPIS := $(MLIDEPS:%.di=$(BCDIDIR)/%.di)
  395. NCDEPIS := $(MLIDEPS:%.di=$(NCDIDIR)/%.di)
  396. ALLML := $(filter %.mli %.ml %.mll %.mly %.idl %.oxridl %.rep %.zog %.glade, $(FILTERED))
  397. IMPLO_INTF := $(ALLML:%.mli=%.mli.__)
  398. IMPLO_INTF := $(foreach file, $(IMPLO_INTF), \
  399. $(basename $(file)).cmi $(basename $(file)).cmo)
  400. IMPLO_INTF := $(filter-out %.mli.cmo, $(IMPLO_INTF))
  401. IMPLO_INTF := $(IMPLO_INTF:%.mli.cmi=%.cmi)
  402. IMPLX_INTF := $(IMPLO_INTF:.cmo=.cmx)
  403. INTF := $(filter %.cmi, $(IMPLO_INTF))
  404. IMPL_CMO := $(filter %.cmo, $(IMPLO_INTF))
  405. IMPL_CMX := $(IMPL_CMO:.cmo=.cmx)
  406. IMPL_ASM := $(IMPL_CMO:.cmo=.asm)
  407. IMPL_S := $(IMPL_CMO:.cmo=.s)
  408. OBJ_LINK := $(OBJ_C_IDL) $(OBJ_C_CXX)
  409. OBJ_FILES := $(IMPL_CMO:.cmo=.$(EXT_OBJ)) $(OBJ_LINK)
  410. EXECS := $(addsuffix $(EXE), \
  411. $(sort $(TOPRESULT) $(BCRESULT) $(NCRESULT)))
  412. ifdef WIN32
  413. EXECS += $(BCRESULT).dll $(NCRESULT).dll
  414. endif
  415. CLIB_BASE := $(RESULT)$(RES_CLIB_SUF)
  416. ifneq ($(strip $(OBJ_LINK)),)
  417. RES_CLIB := lib$(CLIB_BASE).$(EXT_LIB)
  418. endif
  419. ifdef WIN32
  420. DLLSONAME := dll$(CLIB_BASE).dll
  421. else
  422. DLLSONAME := dll$(CLIB_BASE).so
  423. endif
  424. NONEXECS := $(INTF) $(IMPL_CMO) $(IMPL_CMX) $(IMPL_ASM) $(IMPL_S) \
  425. $(OBJ_FILES) $(PRE_TARGETS) $(BCRESULT).cma $(NCRESULT).cmxa \
  426. $(NCRESULT).$(EXT_LIB) $(BCRESULT).cmi $(BCRESULT).cmo \
  427. $(NCRESULT).cmi $(NCRESULT).cmx $(NCRESULT).$(EXT_OBJ) \
  428. $(RES_CLIB) $(IMPL_CMO:.cmo=.annot) \
  429. $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(LIB_PACK_NAME).cmx \
  430. $(LIB_PACK_NAME).$(EXT_OBJ)
  431. ifndef STATIC
  432. NONEXECS += $(DLLSONAME)
  433. endif
  434. ifndef LIBINSTALL_FILES
  435. LIBINSTALL_FILES := $(RESULT).mli $(RESULT).cmi $(RESULT).cma \
  436. $(RESULT).cmxa $(RESULT).$(EXT_LIB) $(RES_CLIB)
  437. ifndef STATIC
  438. ifneq ($(strip $(OBJ_LINK)),)
  439. LIBINSTALL_FILES += $(DLLSONAME)
  440. endif
  441. endif
  442. endif
  443. export LIBINSTALL_FILES
  444. ifdef WIN32
  445. # some extra stuff is created while linking DLLs
  446. NONEXECS += $(BCRESULT).$(EXT_LIB) $(BCRESULT).exp $(NCRESULT).exp $(CLIB_BASE).exp $(CLIB_BASE).lib
  447. endif
  448. TARGETS := $(EXECS) $(NONEXECS)
  449. # If there are IDL-files
  450. ifneq ($(strip $(FILTERED_IDL)),)
  451. MAYBE_IDL := -cclib -lcamlidl
  452. endif
  453. ifdef USE_CAMLP4
  454. CAMLP4PATH := \
  455. $(shell $(CAMLP4) -where 2>/dev/null || echo /usr/local/lib/camlp4)
  456. INCFLAGS := -I $(CAMLP4PATH)
  457. CINCFLAGS := -I$(CAMLP4PATH)
  458. endif
  459. INCFLAGS := $(INCFLAGS) $(INCDIRS:%=-I %) $(SOURCE_DIRS:%=-I %) $(OCAML_DEFAULT_DIRS:%=-I %)
  460. CINCFLAGS += $(SOURCE_DIRS:%=-I%) $(INCDIRS:%=-I%) $(OCAML_DEFAULT_DIRS:%=-I%)
  461. ifndef MSVC
  462. CLIBFLAGS += $(SOURCE_DIRS:%=-L%) $(LIBDIRS:%=-L%) \
  463. $(EXTLIBDIRS:%=-L%) $(OCAML_DEFAULT_DIRS:%=-L%)
  464. ifeq ($(ELF_RPATH), yes)
  465. CLIBFLAGS += $(EXTLIBDIRS:%=-Wl,$(RPATH_FLAG)%)
  466. endif
  467. endif
  468. ifndef PROFILING
  469. INTF_OCAMLC := $(OCAMLC)
  470. else
  471. ifndef THREADS
  472. INTF_OCAMLC := $(OCAMLCP) -p $(OCAMLCPFLAGS)
  473. else
  474. # OCaml does not support profiling byte code
  475. # with threads (yet), therefore we force an error.
  476. ifndef REAL_OCAMLC
  477. $(error Profiling of multithreaded byte code not yet supported by OCaml)
  478. endif
  479. INTF_OCAMLC := $(OCAMLC)
  480. endif
  481. endif
  482. ifndef MSVC
  483. COMMON_LDFLAGS := $(LDFLAGS:%=-ccopt %) $(SOURCE_DIRS:%=-ccopt -L%) \
  484. $(LIBDIRS:%=-ccopt -L%) $(EXTLIBDIRS:%=-ccopt -L%) \
  485. $(EXTLIBDIRS:%=-ccopt -Wl $(OCAML_DEFAULT_DIRS:%=-ccopt -L%))
  486. ifeq ($(ELF_RPATH),yes)
  487. COMMON_LDFLAGS += $(EXTLIBDIRS:%=-ccopt -Wl,$(RPATH_FLAG)%)
  488. endif
  489. else
  490. COMMON_LDFLAGS := -ccopt "/link -NODEFAULTLIB:LIBC $(LDFLAGS:%=%) $(SOURCE_DIRS:%=-LIBPATH:%) \
  491. $(LIBDIRS:%=-LIBPATH:%) $(EXTLIBDIRS:%=-LIBPATH:%) \
  492. $(OCAML_DEFAULT_DIRS:%=-LIBPATH:%) "
  493. endif
  494. CLIBS_OPTS := $(CLIBS:%=-cclib -l%) $(CFRAMEWORKS:%=-cclib '-framework %')
  495. ifdef MSVC
  496. ifndef STATIC
  497. # MSVC libraries do not have 'lib' prefix
  498. CLIBS_OPTS := $(CLIBS:%=-cclib %.lib)
  499. endif
  500. endif
  501. ifneq ($(strip $(OBJ_LINK)),)
  502. ifdef CREATE_LIB
  503. OBJS_LIBS := -cclib -l$(CLIB_BASE) $(CLIBS_OPTS) $(MAYBE_IDL)
  504. else
  505. OBJS_LIBS := $(OBJ_LINK) $(CLIBS_OPTS) $(MAYBE_IDL)
  506. endif
  507. else
  508. OBJS_LIBS := $(CLIBS_OPTS) $(MAYBE_IDL)
  509. endif
  510. ifdef LIB_PACK_NAME
  511. FOR_PACK_NAME := $(shell echo $(LIB_PACK_NAME) | awk '{print toupper(substr($$0,1,1))substr($$0,2)}')
  512. endif
  513. # If we have to make byte-code
  514. ifndef REAL_OCAMLC
  515. BYTE_OCAML := y
  516. # EXTRADEPS is added dependencies we have to insert for all
  517. # executable files we generate. Ideally it should be all of the
  518. # libraries we use, but it's hard to find the ones that get searched on
  519. # the path since I don't know the paths built into the compiler, so
  520. # just include the ones with slashes in their names.
  521. EXTRADEPS := $(addsuffix .cma,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i))))
  522. ifndef LIB_PACK_NAME
  523. SPECIAL_OCAMLFLAGS := $(OCAMLBCFLAGS)
  524. else
  525. SPECIAL_OCAMLFLAGS := -for-pack $(FOR_PACK_NAME) $(OCAMLBCFLAGS)
  526. endif
  527. REAL_OCAMLC := $(INTF_OCAMLC)
  528. REAL_IMPL := $(IMPL_CMO)
  529. REAL_IMPL_INTF := $(IMPLO_INTF)
  530. IMPL_SUF := .cmo
  531. DEPFLAGS :=
  532. MAKE_DEPS := $(MLDEPS) $(BCDEPIS)
  533. ifdef CREATE_LIB
  534. override CFLAGS := $(PIC_CFLAGS) $(CFLAGS)
  535. override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS)
  536. ifndef STATIC
  537. ifneq ($(strip $(OBJ_LINK)),)
  538. MAKEDLL := $(DLLSONAME)
  539. ALL_LDFLAGS := -dllib $(DLLSONAME)
  540. endif
  541. endif
  542. endif
  543. ifndef NO_CUSTOM
  544. ifneq "$(strip $(OBJ_LINK) $(THREADS) $(MAYBE_IDL) $(CLIBS) $(CFRAMEWORKS))" ""
  545. ALL_LDFLAGS += -custom
  546. endif
  547. endif
  548. ALL_LDFLAGS += $(INCFLAGS) $(OCAMLLDFLAGS) $(OCAMLBLDFLAGS) \
  549. $(COMMON_LDFLAGS) $(LIBS:%=%.cma)
  550. CAMLIDLDLLFLAGS :=
  551. ifdef THREADS
  552. ifdef VMTHREADS
  553. THREAD_FLAG := -vmthread
  554. else
  555. THREAD_FLAG := -thread
  556. endif
  557. ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS)
  558. ifndef CREATE_LIB
  559. ifndef REAL_OCAMLFIND
  560. ALL_LDFLAGS := unix.cma threads.cma $(ALL_LDFLAGS)
  561. endif
  562. endif
  563. endif
  564. # we have to make native-code
  565. else
  566. EXTRADEPS := $(addsuffix .cmxa,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i))))
  567. ifndef PROFILING
  568. SPECIAL_OCAMLFLAGS := $(OCAMLNCFLAGS)
  569. PLDFLAGS :=
  570. else
  571. SPECIAL_OCAMLFLAGS := -p $(OCAMLNCFLAGS)
  572. PLDFLAGS := -p
  573. endif
  574. ifndef LIB_PACK_NAME
  575. SPECIAL_OCAMLFLAGS := $(OCAMLNCFLAGS)
  576. else
  577. SPECIAL_OCAMLFLAGS := -for-pack $(FOR_PACK_NAME) $(OCAMLNCFLAGS)
  578. endif
  579. REAL_IMPL := $(IMPL_CMX)
  580. REAL_IMPL_INTF := $(IMPLX_INTF)
  581. IMPL_SUF := .cmx
  582. override CPPFLAGS := -DNATIVE_CODE $(CPPFLAGS)
  583. DEPFLAGS := -native
  584. MAKE_DEPS := $(MLDEPS) $(NCDEPIS)
  585. ALL_LDFLAGS := $(PLDFLAGS) $(INCFLAGS) $(OCAMLLDFLAGS) \
  586. $(OCAMLNLDFLAGS) $(COMMON_LDFLAGS)
  587. CAMLIDLDLLFLAGS := -opt
  588. ifndef CREATE_LIB
  589. ALL_LDFLAGS += $(LIBS:%=%.cmxa)
  590. else
  591. override CFLAGS := $(PIC_CFLAGS) $(CFLAGS)
  592. override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS)
  593. endif
  594. ifdef THREADS
  595. THREAD_FLAG := -thread
  596. ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS)
  597. ifndef CREATE_LIB
  598. ifndef REAL_OCAMLFIND
  599. ALL_LDFLAGS := unix.cmxa threads.cmxa $(ALL_LDFLAGS)
  600. endif
  601. endif
  602. endif
  603. endif
  604. export MAKE_DEPS
  605. ifdef ANNOTATE
  606. ANNOT_FLAG := -annot
  607. else
  608. endif
  609. ALL_OCAMLCFLAGS := $(THREAD_FLAG) $(ANNOT_FLAG) $(OCAMLFLAGS) \
  610. $(INCFLAGS) $(SPECIAL_OCAMLFLAGS)
  611. ifdef make_deps
  612. -include $(MAKE_DEPS)
  613. PRE_TARGETS :=
  614. endif
  615. ###########################################################################
  616. # USER RULES
  617. # Call "OCamlMakefile QUIET=" to get rid of all of the @'s.
  618. QUIET=@
  619. # generates byte-code (default)
  620. byte-code: $(PRE_TARGETS)
  621. $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
  622. REAL_RESULT="$(BCRESULT)" make_deps=yes
  623. bc: byte-code
  624. byte-code-nolink: $(PRE_TARGETS)
  625. $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
  626. REAL_RESULT="$(BCRESULT)" make_deps=yes
  627. bcnl: byte-code-nolink
  628. top: $(PRE_TARGETS)
  629. $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(TOPRESULT) \
  630. REAL_RESULT="$(BCRESULT)" make_deps=yes
  631. # generates native-code
  632. native-code: $(PRE_TARGETS)
  633. $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \
  634. REAL_RESULT="$(NCRESULT)" \
  635. REAL_OCAMLC="$(OCAMLOPT)" \
  636. make_deps=yes
  637. nc: native-code
  638. native-code-nolink: $(PRE_TARGETS)
  639. $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
  640. REAL_RESULT="$(NCRESULT)" \
  641. REAL_OCAMLC="$(OCAMLOPT)" \
  642. make_deps=yes
  643. ncnl: native-code-nolink
  644. # generates byte-code libraries
  645. byte-code-library: $(PRE_TARGETS)
  646. $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
  647. $(RES_CLIB) $(BCRESULT).cma \
  648. REAL_RESULT="$(BCRESULT)" \
  649. CREATE_LIB=yes \
  650. make_deps=yes
  651. bcl: byte-code-library
  652. # generates native-code libraries
  653. native-code-library: $(PRE_TARGETS)
  654. $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
  655. $(RES_CLIB) $(NCRESULT).cmxa \
  656. REAL_RESULT="$(NCRESULT)" \
  657. REAL_OCAMLC="$(OCAMLOPT)" \
  658. CREATE_LIB=yes \
  659. make_deps=yes
  660. ncl: native-code-library
  661. ifdef WIN32
  662. # generates byte-code dll
  663. byte-code-dll: $(PRE_TARGETS)
  664. $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
  665. $(RES_CLIB) $(BCRESULT).dll \
  666. REAL_RESULT="$(BCRESULT)" \
  667. make_deps=yes
  668. bcd: byte-code-dll
  669. # generates native-code dll
  670. native-code-dll: $(PRE_TARGETS)
  671. $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
  672. $(RES_CLIB) $(NCRESULT).dll \
  673. REAL_RESULT="$(NCRESULT)" \
  674. REAL_OCAMLC="$(OCAMLOPT)" \
  675. make_deps=yes
  676. ncd: native-code-dll
  677. endif
  678. # generates byte-code with debugging information
  679. debug-code: $(PRE_TARGETS)
  680. $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
  681. REAL_RESULT="$(BCRESULT)" make_deps=yes \
  682. OCAMLFLAGS="-g $(OCAMLFLAGS)" \
  683. OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
  684. dc: debug-code
  685. debug-code-nolink: $(PRE_TARGETS)
  686. $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
  687. REAL_RESULT="$(BCRESULT)" make_deps=yes \
  688. OCAMLFLAGS="-g $(OCAMLFLAGS)" \
  689. OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
  690. dcnl: debug-code-nolink
  691. # generates byte-code with debugging information (native code)
  692. debug-native-code: $(PRE_TARGETS)
  693. $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \
  694. REAL_RESULT="$(NCRESULT)" make_deps=yes \
  695. REAL_OCAMLC="$(OCAMLOPT)" \
  696. OCAMLFLAGS="-g $(OCAMLFLAGS)" \
  697. OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
  698. dnc: debug-native-code
  699. debug-native-code-nolink: $(PRE_TARGETS)
  700. $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
  701. REAL_RESULT="$(NCRESULT)" make_deps=yes \
  702. REAL_OCAMLC="$(OCAMLOPT)" \
  703. OCAMLFLAGS="-g $(OCAMLFLAGS)" \
  704. OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
  705. dncnl: debug-native-code-nolink
  706. # generates byte-code libraries with debugging information
  707. debug-code-library: $(PRE_TARGETS)
  708. $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
  709. $(RES_CLIB) $(BCRESULT).cma \
  710. REAL_RESULT="$(BCRESULT)" make_deps=yes \
  711. CREATE_LIB=yes \
  712. OCAMLFLAGS="-g $(OCAMLFLAGS)" \
  713. OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
  714. dcl: debug-code-library
  715. # generates byte-code libraries with debugging information (native code)
  716. debug-native-code-library: $(PRE_TARGETS)
  717. $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
  718. $(RES_CLIB) $(NCRESULT).cmxa \
  719. REAL_RESULT="$(NCRESULT)" make_deps=yes \
  720. REAL_OCAMLC="$(OCAMLOPT)" \
  721. CREATE_LIB=yes \
  722. OCAMLFLAGS="-g $(OCAMLFLAGS)" \
  723. OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
  724. dncl: debug-native-code-library
  725. # generates byte-code for profiling
  726. profiling-byte-code: $(PRE_TARGETS)
  727. $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
  728. REAL_RESULT="$(BCRESULT)" PROFILING="y" \
  729. make_deps=yes
  730. pbc: profiling-byte-code
  731. # generates native-code
  732. profiling-native-code: $(PRE_TARGETS)
  733. $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \
  734. REAL_RESULT="$(NCRESULT)" \
  735. REAL_OCAMLC="$(OCAMLOPT)" \
  736. PROFILING="y" \
  737. make_deps=yes
  738. pnc: profiling-native-code
  739. # generates byte-code libraries
  740. profiling-byte-code-library: $(PRE_TARGETS)
  741. $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
  742. $(RES_CLIB) $(BCRESULT).cma \
  743. REAL_RESULT="$(BCRESULT)" PROFILING="y" \
  744. CREATE_LIB=yes \
  745. make_deps=yes
  746. pbcl: profiling-byte-code-library
  747. # generates native-code libraries
  748. profiling-native-code-library: $(PRE_TARGETS)
  749. $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
  750. $(RES_CLIB) $(NCRESULT).cmxa \
  751. REAL_RESULT="$(NCRESULT)" PROFILING="y" \
  752. REAL_OCAMLC="$(OCAMLOPT)" \
  753. CREATE_LIB=yes \
  754. make_deps=yes
  755. pncl: profiling-native-code-library
  756. # packs byte-code objects
  757. pack-byte-code: $(PRE_TARGETS)
  758. $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT).cmo \
  759. REAL_RESULT="$(BCRESULT)" \
  760. PACK_LIB=yes make_deps=yes
  761. pabc: pack-byte-code
  762. # packs native-code objects
  763. pack-native-code: $(PRE_TARGETS)
  764. $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
  765. $(NCRESULT).cmx $(NCRESULT).$(EXT_OBJ) \
  766. REAL_RESULT="$(NCRESULT)" \
  767. REAL_OCAMLC="$(OCAMLOPT)" \
  768. PACK_LIB=yes make_deps=yes
  769. panc: pack-native-code
  770. # generates HTML-documentation
  771. htdoc: $(DOC_DIR)/$(RESULT)/html/index.html
  772. # generates Latex-documentation
  773. ladoc: $(DOC_DIR)/$(RESULT)/latex/doc.tex
  774. # generates PostScript-documentation
  775. psdoc: $(DOC_DIR)/$(RESULT)/latex/doc.ps
  776. # generates PDF-documentation
  777. pdfdoc: $(DOC_DIR)/$(RESULT)/latex/doc.pdf
  778. # generates all supported forms of documentation
  779. doc: htdoc ladoc psdoc pdfdoc
  780. ###########################################################################
  781. # LOW LEVEL RULES
  782. $(REAL_RESULT): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) $(RESULTDEPS)
  783. $(REAL_OCAMLFIND) $(REAL_OCAMLC) \
  784. $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \
  785. $(OBJS_LIBS) $(ALL_LDFLAGS) -o $@$(EXE) \
  786. $(REAL_IMPL)
  787. nolink: $(REAL_IMPL_INTF) $(OBJ_LINK)
  788. ifdef WIN32
  789. $(REAL_RESULT).dll: $(REAL_IMPL_INTF) $(OBJ_LINK)
  790. $(CAMLIDLDLL) $(CAMLIDLDLLFLAGS) $(OBJ_LINK) $(CLIBS) \
  791. -o $@ $(REAL_IMPL)
  792. endif
  793. %$(TOPSUFFIX): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS)
  794. $(REAL_OCAMLFIND) $(OCAMLMKTOP) \
  795. $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \
  796. $(OBJS_LIBS) $(ALL_LDFLAGS) -o $@$(EXE) \
  797. $(REAL_IMPL)
  798. .SUFFIXES: .mli .ml .cmi .cmo .cmx .cma .cmxa .$(EXT_OBJ) \
  799. .mly .di .d .$(EXT_LIB) .idl %.oxridl .c .m .$(EXT_CXX) .h .so \
  800. .rep .zog .glade
  801. ifndef STATIC
  802. ifdef MINGW
  803. # From OCaml 3.11.0, ocamlmklib is available on windows
  804. OCAMLMLIB_EXISTS = $(shell which $(OCAMLMKLIB))
  805. ifeq ($(strip $(OCAMLMLIB_EXISTS)),)
  806. $(DLLSONAME): $(OBJ_LINK)
  807. $(CC) $(CFLAGS) $(CFLAGS_WIN32) $(OBJ_LINK) -shared -o $@ \
  808. $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/lib%.a))) \
  809. '$(OCAMLLIBPATH)/ocamlrun.a' \
  810. -Wl,--whole-archive \
  811. -Wl,--export-all-symbols \
  812. -Wl,--allow-multiple-definition \
  813. -Wl,--enable-auto-import
  814. else
  815. $(DLLSONAME): $(OBJ_LINK)
  816. $(OCAMLMKLIB) $(INCFLAGS) $(CLIBFLAGS) \
  817. -o $(CLIB_BASE) $(OBJ_LINK) $(CLIBS:%=-l%) \
  818. $(CFRAMEWORKS:%=-framework %) \
  819. $(OCAMLMKLIB_FLAGS)
  820. endif
  821. else
  822. ifdef MSVC
  823. $(DLLSONAME): $(OBJ_LINK)
  824. link /NOLOGO /DLL /OUT:$@ $(OBJ_LINK) \
  825. $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/%.lib))) \
  826. '$(OCAMLLIBPATH)/ocamlrun.lib'
  827. else
  828. $(DLLSONAME): $(OBJ_LINK)
  829. $(OCAMLMKLIB) $(INCFLAGS) $(CLIBFLAGS) \
  830. -o $(CLIB_BASE) $(OBJ_LINK) $(CLIBS:%=-l%) $(CFRAMEWORKS:%=-framework %) \
  831. $(OCAMLMKLIB_FLAGS)
  832. endif
  833. endif
  834. endif
  835. ifndef LIB_PACK_NAME
  836. $(RESULT).cma: $(REAL_IMPL_INTF) $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS)
  837. $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(OBJS_LIBS) $(ALL_LDFLAGS) -o $@ $(REAL_IMPL)
  838. $(RESULT).cmxa $(RESULT).$(EXT_LIB): $(REAL_IMPL_INTF) $(EXTRADEPS) $(RESULTDEPS)
  839. $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(OBJS_LIBS) $(ALL_LDFLAGS) -o $@ $(REAL_IMPL)
  840. else
  841. # Packing a bytecode library
  842. LIB_PACK_NAME_MLI = $(wildcard $(LIB_PACK_NAME).mli)
  843. ifeq ($(LIB_PACK_NAME_MLI),)
  844. LIB_PACK_NAME_CMI = $(LIB_PACK_NAME).cmi
  845. else
  846. # $(LIB_PACK_NAME).mli exists, it likely depends on other compiled interfaces
  847. LIB_PACK_NAME_CMI =
  848. $(LIB_PACK_NAME).cmi: $(REAL_IMPL_INTF)
  849. endif
  850. ifdef BYTE_OCAML
  851. $(LIB_PACK_NAME_CMI) $(LIB_PACK_NAME).cmo: $(REAL_IMPL_INTF)
  852. $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmo $(OCAMLLDFLAGS) $(REAL_IMPL)
  853. # Packing into a unit which can be transformed into a library
  854. # Remember the .ml's must have been compiled with -for-pack $(LIB_PACK_NAME)
  855. else
  856. $(LIB_PACK_NAME_CMI) $(LIB_PACK_NAME).cmx: $(REAL_IMPL_INTF)
  857. $(REAL_OCAMLFIND) $(OCAMLOPT) -pack -o $(LIB_PACK_NAME).cmx $(OCAMLLDFLAGS) $(REAL_IMPL)
  858. endif
  859. $(RESULT).cma: $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS)
  860. $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(OBJS_LIBS) $(ALL_LDFLAGS) -o $@ $(LIB_PACK_NAME).cmo
  861. $(RESULT).cmxa $(RESULT).$(EXT_LIB): $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx $(EXTRADEPS) $(RESULTDEPS)
  862. $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(OBJS_LIBS) $(filter-out -custom, $(ALL_LDFLAGS)) -o $@ $(LIB_PACK_NAME).cmx
  863. endif
  864. $(RES_CLIB): $(OBJ_LINK)
  865. ifndef MSVC
  866. ifneq ($(strip $(OBJ_LINK)),)
  867. $(AR) rcs $@ $(OBJ_LINK)
  868. endif
  869. else
  870. ifneq ($(strip $(OBJ_LINK)),)
  871. lib -nologo -debugtype:cv -out:$(RES_CLIB) $(OBJ_LINK)
  872. endif
  873. endif
  874. %.cmi: %.mli $(EXTRADEPS)
  875. $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
  876. if [ -z "$$pp" ]; then \
  877. $(ECHO) $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
  878. -c $(THREAD_FLAG) $(ANNOT_FLAG) \
  879. $(OCAMLFLAGS) $(INCFLAGS) $<; \
  880. $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
  881. -c $(THREAD_FLAG) $(ANNOT_FLAG) \
  882. $(OCAMLFLAGS) $(INCFLAGS) $<; \
  883. else \
  884. $(ECHO) $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
  885. -c -pp \"$$pp $(PPFLAGS)\" $(THREAD_FLAG) $(ANNOT_FLAG) \
  886. $(OCAMLFLAGS) $(INCFLAGS) $<; \
  887. $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
  888. -c -pp "$$pp $(PPFLAGS)" $(THREAD_FLAG) $(ANNOT_FLAG) \
  889. $(OCAMLFLAGS) $(INCFLAGS) $<; \
  890. fi
  891. %.cmi: %$(IMPL_SUF);
  892. %$(IMPL_SUF) %.$(EXT_OBJ): %.ml $(EXTRADEPS)
  893. $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
  894. if [ -z "$$pp" ]; then \
  895. $(ECHO) $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
  896. -c $(ALL_OCAMLCFLAGS) $<; \
  897. $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
  898. -c $(ALL_OCAMLCFLAGS) $<; \
  899. else \
  900. $(ECHO) $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
  901. -c -pp \"$$pp $(PPFLAGS)\" $(ALL_OCAMLCFLAGS) $<; \
  902. $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
  903. -c -pp "$$pp $(PPFLAGS)" $(ALL_OCAMLCFLAGS) $<; \
  904. fi
  905. .PRECIOUS: %.ml
  906. %.ml: %.mll
  907. $(OCAMLLEX) $(LFLAGS) $<
  908. .PRECIOUS: %.ml %.mli
  909. %.ml %.mli: %.mly
  910. $(OCAMLYACC) $(YFLAGS) $<
  911. $(QUIET)pp=`sed -n -e 's/.*(\*pp \([^*]*\) \*).*/\1/p;q' $<`; \
  912. if [ ! -z "$$pp" ]; then \
  913. mv $*.ml $*.ml.temporary; \
  914. echo "(*pp $$pp $(PPFLAGS)*)" > $*.ml; \
  915. cat $*.ml.temporary >> $*.ml; \
  916. rm $*.ml.temporary; \
  917. mv $*.mli $*.mli.temporary; \
  918. echo "(*pp $$pp $(PPFLAGS)*)" > $*.mli; \
  919. cat $*.mli.temporary >> $*.mli; \
  920. rm $*.mli.temporary; \
  921. fi
  922. .PRECIOUS: %.ml
  923. %.ml: %.rep
  924. $(CAMELEON_REPORT) $(CAMELEON_REPORT_FLAGS) -gen $<
  925. .PRECIOUS: %.ml
  926. %.ml: %.zog
  927. $(CAMELEON_ZOGGY) $(CAMELEON_ZOGGY_FLAGS) -impl $< > $@
  928. .PRECIOUS: %.ml
  929. %.ml: %.glade
  930. $(OCAML_GLADECC) $(OCAML_GLADECC_FLAGS) $< > $@
  931. .PRECIOUS: %.ml %.mli
  932. %.ml %.mli: %.oxridl
  933. $(OXRIDL) $<
  934. .PRECIOUS: %.ml %.mli %_stubs.c %.h
  935. %.ml %.mli %_stubs.c %.h: %.idl
  936. $(CAMLIDL) $(MAYBE_IDL_HEADER) $(IDLFLAGS) \
  937. $(CAMLIDLFLAGS) $<
  938. $(QUIET)if [ $(NOIDLHEADER) ]; then touch $*.h; fi
  939. %.$(EXT_OBJ): %.c
  940. $(OCAMLC) -c -cc "$(CC)" -ccopt "$(CFLAGS) \
  941. $(CPPFLAGS) $(CPPFLAGS_WIN32) \
  942. $(CFLAGS_WIN32) $(CINCFLAGS) $(CFLAG_O)$@ " $<
  943. %.$(EXT_OBJ): %.m
  944. $(CC) -c $(CFLAGS) $(CINCFLAGS) $(CPPFLAGS) \
  945. -I'$(OCAMLLIBPATH)' \
  946. $< $(CFLAG_O)$@
  947. %.$(EXT_OBJ): %.$(EXT_CXX)
  948. $(CXX) -c $(CXXFLAGS) $(CINCFLAGS) $(CPPFLAGS) \
  949. -I'$(OCAMLLIBPATH)' \
  950. $< $(CFLAG_O)$@
  951. $(MLDEPDIR)/%.d: %.ml
  952. $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi
  953. $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
  954. if [ -z "$$pp" ]; then \
  955. $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
  956. $(INCFLAGS) $< \> $@; \
  957. $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
  958. $(INCFLAGS) $< > $@; \
  959. else \
  960. $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
  961. -pp \"$$pp $(PPFLAGS)\" $(INCFLAGS) $< \> $@; \
  962. $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
  963. -pp "$$pp $(PPFLAGS)" $(INCFLAGS) $< > $@; \
  964. fi
  965. $(BCDIDIR)/%.di $(NCDIDIR)/%.di: %.mli
  966. $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi
  967. $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
  968. if [ -z "$$pp" ]; then \
  969. $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(INCFLAGS) $< \> $@; \
  970. $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(INCFLAGS) $< > $@; \
  971. else \
  972. $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \
  973. -pp \"$$pp $(PPFLAGS)\" $(INCFLAGS) $< \> $@; \
  974. $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \
  975. -pp "$$pp $(PPFLAGS)" $(INCFLAGS) $< > $@; \
  976. fi
  977. $(DOC_DIR)/$(RESULT)/html:
  978. mkdir -p $@
  979. $(DOC_DIR)/$(RESULT)/html/index.html: $(DOC_DIR)/$(RESULT)/html $(DOC_FILES)
  980. rm -rf $</*
  981. $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $(FIRST_DOC_FILE)`; \
  982. if [ -z "$$pp" ]; then \
  983. $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -html -d $< $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \
  984. $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -html -d $< $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \
  985. else \
  986. $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -pp \"$$pp $(PPFLAGS)\" -html -d $< $(OCAMLDOCFLAGS) \
  987. $(INCFLAGS) $(DOC_FILES); \
  988. $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -pp "$$pp $(PPFLAGS)" -html -d $< $(OCAMLDOCFLAGS) \
  989. $(INCFLAGS) $(DOC_FILES); \
  990. fi
  991. $(DOC_DIR)/$(RESULT)/latex:
  992. mkdir -p $@
  993. $(DOC_DIR)/$(RESULT)/latex/doc.tex: $(DOC_DIR)/$(RESULT)/latex $(DOC_FILES)
  994. rm -rf $</*
  995. $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $(FIRST_DOC_FILE)`; \
  996. if [ -z "$$pp" ]; then \
  997. $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) \
  998. $(DOC_FILES) -o $@; \
  999. $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES) \
  1000. -o $@; \
  1001. else \
  1002. $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -pp \"$$pp $(PPFLAGS)\" -latex $(OCAMLDOCFLAGS) \
  1003. $(INCFLAGS) $(DOC_FILES) -o $@; \
  1004. $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -pp "$$pp $(PPFLAGS)" -latex $(OCAMLDOCFLAGS) \
  1005. $(INCFLAGS) $(DOC_FILES) -o $@; \
  1006. fi
  1007. $(DOC_DIR)/$(RESULT)/latex/doc.ps: $(DOC_DIR)/$(RESULT)/latex/doc.tex
  1008. cd $(DOC_DIR)/$(RESULT)/latex && \
  1009. $(LATEX) doc.tex && \
  1010. $(LATEX) doc.tex && \
  1011. $(DVIPS) $(DVIPSFLAGS) doc.dvi -o $(@F)
  1012. $(DOC_DIR)/$(RESULT)/latex/doc.pdf: $(DOC_DIR)/$(RESULT)/latex/doc.ps
  1013. cd $(DOC_DIR)/$(RESULT)/latex && $(PS2PDF) $(<F)
  1014. define make_subproj
  1015. .PHONY:
  1016. subproj_$(1):
  1017. $$(eval $$(call PROJ_$(1)))
  1018. $(QUIET)if [ "$(SUBTARGET)" != "all" ]; then \
  1019. $(MAKE) -f $(OCAMLMAKEFILE) $(SUBTARGET); \
  1020. fi
  1021. endef
  1022. $(foreach subproj,$(SUBPROJS),$(eval $(call make_subproj,$(subproj))))
  1023. .PHONY:
  1024. subprojs: $(SUBPROJS:%=subproj_%)
  1025. ###########################################################################
  1026. # (UN)INSTALL RULES FOR LIBRARIES
  1027. .PHONY: libinstall
  1028. libinstall: all
  1029. $(QUIET)printf "\nInstalling library with ocamlfind\n"
  1030. $(OCAMLFIND) install $(OCAMLFIND_INSTFLAGS) $(RESULT) META $(LIBINSTALL_FILES)
  1031. $(QUIET)printf "\nInstallation successful.\n"
  1032. .PHONY: libinstall-byte-code
  1033. libinstall-byte-code: all
  1034. $(QUIET)printf "\nInstalling byte-code library with ocamlfind\n"
  1035. $(OCAMLFIND) install $(OCAMLFIND_INSTFLAGS) $(RESULT) META \
  1036. $(filter-out $(RESULT).$(EXT_LIB) $(RESULT).cmxa, $(LIBINSTALL_FILES))
  1037. $(QUIET)printf "\nInstallation successful.\n"
  1038. .PHONY: libinstall-native-code
  1039. libinstall-native-code: all
  1040. $(QUIET)printf "\nInstalling native-code library with ocamlfind\n"
  1041. $(OCAMLFIND) install $(OCAMLFIND_INSTFLAGS) $(RESULT) META \
  1042. $(filter-out $(DLLSONAME) $(RESULT).cma, $(LIBINSTALL_FILES))
  1043. $(QUIET)printf "\nInstallation successful.\n"
  1044. .PHONY: libuninstall
  1045. libuninstall:
  1046. $(QUIET)printf "\nUninstalling library with ocamlfind\n"
  1047. $(OCAMLFIND) remove $(OCAMLFIND_INSTFLAGS) $(RESULT)
  1048. $(QUIET)printf "\nUninstallation successful.\n"
  1049. .PHONY: rawinstall
  1050. rawinstall: all
  1051. $(QUIET)printf "\nInstalling library to: $(OCAML_LIB_INSTALL)\n"
  1052. -install -d $(OCAML_LIB_INSTALL)
  1053. for i in $(LIBINSTALL_FILES); do \
  1054. if [ -f $$i ]; then \
  1055. install -c -m 0644 $$i $(OCAML_LIB_INSTALL); \
  1056. fi; \
  1057. done
  1058. $(QUIET)printf "\nInstallation successful.\n"
  1059. .PHONY: rawuninstall
  1060. rawuninstall:
  1061. $(QUIET)printf "\nUninstalling library from: $(OCAML_LIB_INSTALL)\n"
  1062. cd $(OCAML_LIB_INSTALL) && rm $(notdir $(LIBINSTALL_FILES))
  1063. $(QUIET)printf "\nUninstallation successful.\n"
  1064. ###########################################################################
  1065. # MAINTENANCE RULES
  1066. .PHONY: clean
  1067. clean::
  1068. rm -f $(TARGETS) $(TRASH)
  1069. rm -rf $(BCDIDIR) $(NCDIDIR) $(MLDEPDIR)
  1070. .PHONY: cleanup
  1071. cleanup::
  1072. rm -f $(NONEXECS) $(TRASH)
  1073. rm -rf $(BCDIDIR) $(NCDIDIR) $(MLDEPDIR)
  1074. .PHONY: clean-doc
  1075. clean-doc::
  1076. rm -rf $(DOC_DIR)/$(RESULT)
  1077. .PHONY: clean-all
  1078. clean-all:: clean clean-doc
  1079. .PHONY: nobackup
  1080. nobackup:
  1081. rm -f *.bak *~ *.dup