/froc-sanity2/OCamlMakefile

http://github.com/hhughes/ocaml-frui · #! · 1265 lines · 1049 code · 216 blank · 0 comment · 0 complexity · 187b4bd3c517f685ab69ef4a5b748352 MD5 · raw file

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