Makefile 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. # Haxe compiler Makefile
  2. #
  3. # - use 'make' to build all
  4. # - use 'make haxe' to build only the compiler (not the libraries)
  5. # - if you want to build quickly, install 'ocamlopt.opt' and change OCAMLOPT=ocamlopt.opt
  6. #
  7. # Windows users :
  8. # - use 'make -f Makefile.win' to build for Windows
  9. # - use 'make MSVC=1 -f Makefile.win' to build for Windows with OCaml/MSVC
  10. #
  11. .SUFFIXES : .ml .mli .cmo .cmi .cmx .mly
  12. INSTALL_DIR=/usr/local
  13. INSTALL_BIN_DIR=$(INSTALL_DIR)/bin
  14. INSTALL_LIB_DIR=$(INSTALL_DIR)/lib/haxe
  15. INSTALL_STD_DIR=$(INSTALL_DIR)/share/haxe/std
  16. PACKAGE_OUT_DIR=out
  17. INSTALLER_TMP_DIR=installer
  18. PACKAGE_SRC_EXTENSION=.tar.gz
  19. MAKEFILENAME?=Makefile
  20. PLATFORM?=unix
  21. OUTPUT=haxe
  22. HAXELIB_OUTPUT=haxelib
  23. PREBUILD_OUTPUT=prebuild
  24. EXTENSION=
  25. LFLAGS=
  26. STATICLINK?=0
  27. # Configuration
  28. # Modules in these directories should only depend on modules that are in directories to the left
  29. HAXE_DIRECTORIES=core core/json core/display syntax context context/display codegen codegen/gencommon generators generators/jvm optimization filters macro macro/eval macro/eval/bytes typing compiler
  30. EXTLIB_LIBS=extlib-leftovers extc neko javalib swflib ttflib ilib objsize pcre ziplib
  31. OCAML_LIBS=unix str threads dynlink
  32. OPAM_LIBS=sedlex xml-light extlib ptmap sha
  33. FINDLIB_LIBS=$(OCAML_LIBS)
  34. FINDLIB_LIBS+=$(OPAM_LIBS)
  35. # Includes, packages and compiler
  36. HAXE_INCLUDES=$(HAXE_DIRECTORIES:%=-I _build/src/%)
  37. EXTLIB_INCLUDES=$(EXTLIB_LIBS:%=-I libs/%)
  38. ALL_INCLUDES=$(EXTLIB_INCLUDES) $(HAXE_INCLUDES)
  39. FINDLIB_PACKAGES=$(FINDLIB_LIBS:%=-package %)
  40. CFLAGS=
  41. ALL_CFLAGS=-bin-annot -safe-string -thread -g -w -3 -w -40 $(CFLAGS) $(ALL_INCLUDES) $(FINDLIB_PACKAGES)
  42. MESSAGE_FILTER=sed -e 's/_build\/src\//src\//' tmp.tmp
  43. ifeq ($(BYTECODE),1)
  44. TARGET_FLAG = bytecode
  45. COMPILER = ocamlfind ocamlc
  46. LIB_EXT = cma
  47. MODULE_EXT = cmo
  48. NATIVE_LIB_FLAG = -custom
  49. else
  50. TARGET_FLAG = native
  51. COMPILER = ocamlfind ocamlopt
  52. LIB_EXT = cmxa
  53. MODULE_EXT = cmx
  54. OCAMLDEP_FLAGS = -native
  55. endif
  56. CC_CMD = ($(COMPILER) $(ALL_CFLAGS) -c $< 2>tmp.tmp && $(MESSAGE_FILTER)) || ($(MESSAGE_FILTER) && exit 1)
  57. # Meta information
  58. BUILD_DIRECTORIES := $(HAXE_DIRECTORIES:%=_build/src/%)
  59. HAXE_SRC := $(wildcard $(HAXE_DIRECTORIES:%=src/%/*.ml))
  60. BUILD_SRC := $(HAXE_SRC:%=_build/%)
  61. ADD_REVISION?=0
  62. BRANCH=$(shell echo $$APPVEYOR_REPO_NAME | grep -q /haxe && echo $$APPVEYOR_REPO_BRANCH || echo $$TRAVIS_REPO_SLUG | grep -q /haxe && echo $$TRAVIS_BRANCH || git rev-parse --abbrev-ref HEAD)
  63. COMMIT_SHA=$(shell git rev-parse --short HEAD)
  64. COMMIT_DATE=$(shell \
  65. if [ "$$(uname)" = "Darwin" ]; then \
  66. date -u -r $$(git show -s --format=%ct HEAD) +%Y%m%d%H%M%S; \
  67. else \
  68. date -u -d @$$(git show -s --format=%ct HEAD) +%Y%m%d%H%M%S; \
  69. fi \
  70. )
  71. PACKAGE_FILE_NAME=haxe_$(COMMIT_DATE)_$(COMMIT_SHA)
  72. HAXE_VERSION=$(shell $(CURDIR)/$(OUTPUT) -version 2>&1 | awk '{print $$1;}')
  73. HAXE_VERSION_SHORT=$(shell echo "$(HAXE_VERSION)" | grep -oE "^[0-9]+\.[0-9]+\.[0-9]+")
  74. # using $(CURDIR) on Windows will not work since it might be a Cygwin path
  75. ifdef SYSTEMROOT
  76. EXTENSION=.exe
  77. else
  78. export HAXE_STD_PATH=$(CURDIR)/std
  79. endif
  80. # Native libraries
  81. ifneq ($(STATICLINK),0)
  82. LIB_PARAMS= -cclib '-Wl,-Bstatic -lpcre -lz -Wl,-Bdynamic '
  83. else
  84. LIB_PARAMS?= -cclib -lpcre -cclib -lz
  85. endif
  86. NATIVE_LIBS=-thread -cclib libs/extc/extc_stubs.o -cclib libs/extc/process_stubs.o -cclib libs/objsize/c_objsize.o -cclib libs/pcre/pcre_stubs.o -ccopt -L/usr/local/lib $(LIB_PARAMS)
  87. # Modules
  88. -include Makefile.modules
  89. # Rules
  90. all: libs haxe tools
  91. libs:
  92. $(foreach lib,$(EXTLIB_LIBS),$(MAKE) -C libs/$(lib) $(TARGET_FLAG) &&) true
  93. _build/%:%
  94. mkdir -p $(dir $@)
  95. cp $< $@
  96. build_dirs:
  97. @mkdir -p $(BUILD_DIRECTORIES)
  98. _build/src/syntax/grammar.ml:src/syntax/grammar.mly
  99. camlp4o -impl $< -o $@
  100. _build/src/compiler/version.ml: FORCE
  101. ifneq ($(ADD_REVISION),0)
  102. $(MAKE) -f Makefile.version_extra -s --no-print-directory ADD_REVISION=$(ADD_REVISION) BRANCH=$(BRANCH) COMMIT_SHA=$(COMMIT_SHA) COMMIT_DATE=$(COMMIT_DATE) > _build/src/compiler/version.ml
  103. else
  104. echo let version_extra = None > _build/src/compiler/version.ml
  105. endif
  106. _build/src/core/defineList.ml: src-json/define.json prebuild
  107. ./$(PREBUILD_OUTPUT) define $< > $@
  108. _build/src/core/metaList.ml: src-json/meta.json prebuild
  109. ./$(PREBUILD_OUTPUT) meta $< > $@
  110. build_src: | $(BUILD_SRC) _build/src/syntax/grammar.ml _build/src/compiler/version.ml _build/src/core/defineList.ml _build/src/core/metaList.ml
  111. prebuild: _build/src/core/json/json.ml _build/src/prebuild/main.ml
  112. $(COMPILER) -safe-string -linkpkg -g -o $(PREBUILD_OUTPUT) -package sedlex -package extlib -I _build/src/core/json _build/src/core/json/json.ml _build/src/prebuild/main.ml
  113. haxe: build_src
  114. $(MAKE) -f $(MAKEFILENAME) build_pass_1
  115. $(MAKE) -f $(MAKEFILENAME) build_pass_2
  116. $(MAKE) -f $(MAKEFILENAME) build_pass_3
  117. $(MAKE) -f $(MAKEFILENAME) build_pass_4
  118. build_pass_1:
  119. printf MODULES= > Makefile.modules
  120. ls -1 $(HAXE_DIRECTORIES:%=_build/src/%/*.ml) | tr '\n' ' ' >> Makefile.modules
  121. build_pass_2:
  122. printf MODULES= > Makefile.modules
  123. ocamlfind ocamldep -sort -slash $(HAXE_INCLUDES) $(MODULES) | sed -e "s/\.ml//g" >> Makefile.modules
  124. build_pass_3:
  125. ocamlfind ocamldep -slash $(OCAMLDEP_FLAGS) $(HAXE_INCLUDES) $(MODULES:%=%.ml) > Makefile.dependencies
  126. build_pass_4: $(MODULES:%=%.$(MODULE_EXT))
  127. $(COMPILER) -safe-string -linkpkg -g -o $(OUTPUT) $(NATIVE_LIBS) $(NATIVE_LIB_FLAG) $(LFLAGS) $(FINDLIB_PACKAGES) $(EXTLIB_INCLUDES) $(EXTLIB_LIBS:=.$(LIB_EXT)) $(MODULES:%=%.$(MODULE_EXT))
  128. kill_exe_win:
  129. ifdef SYSTEMROOT
  130. -@taskkill /F /IM haxe.exe 2>/dev/null
  131. endif
  132. plugin:
  133. ifeq ($(BYTECODE),1)
  134. $(CC_CMD) $(PLUGIN).ml
  135. else
  136. $(COMPILER) $(ALL_CFLAGS) -shared -o $(PLUGIN).cmxs $(PLUGIN).ml
  137. endif
  138. # Only use if you have only changed gencpp.ml
  139. quickcpp: build_src build_pass_4 copy_haxetoolkit
  140. CPP_OS := $(shell uname)
  141. ifeq ($(CPP_OS),Linux)
  142. copy_haxetoolkit:
  143. sudo cp haxe /usr/bin/haxe
  144. else
  145. copy_haxetoolkit: /cygdrive/c/HaxeToolkit/haxe/haxe.exe
  146. /cygdrive/c/HaxeToolkit/haxe/haxe.exe:haxe.exe
  147. cp $< $@
  148. endif
  149. haxelib:
  150. (cd $(CURDIR)/extra/haxelib_src && $(CURDIR)/$(OUTPUT) client.hxml && nekotools boot run.n)
  151. mv extra/haxelib_src/run$(EXTENSION) $(HAXELIB_OUTPUT)
  152. tools: haxelib
  153. install: uninstall
  154. mkdir -p "$(DESTDIR)$(INSTALL_BIN_DIR)"
  155. cp $(OUTPUT) $(HAXELIB_OUTPUT) "$(DESTDIR)$(INSTALL_BIN_DIR)"
  156. mkdir -p "$(DESTDIR)$(INSTALL_STD_DIR)"
  157. cp -r std/* "$(DESTDIR)$(INSTALL_STD_DIR)"
  158. uninstall:
  159. rm -rf $(DESTDIR)$(INSTALL_BIN_DIR)/$(OUTPUT) $(DESTDIR)$(INSTALL_BIN_DIR)/$(HAXELIB_OUTPUT)
  160. if [ -d "$(DESTDIR)$(INSTALL_LIB_DIR)/lib" ] && find "$(DESTDIR)$(INSTALL_LIB_DIR)/lib" -mindepth 1 -print -quit | grep -q .; then \
  161. echo "The local haxelib repo at $(DESTDIR)$(INSTALL_LIB_DIR)/lib will not be removed. Remove it manually if you want."; \
  162. find $(DESTDIR)$(INSTALL_LIB_DIR)/ ! -name 'lib' -mindepth 1 -maxdepth 1 -exec rm -rf {} +; \
  163. else \
  164. rm -rf $(DESTDIR)$(INSTALL_LIB_DIR); \
  165. fi
  166. rm -rf $(DESTDIR)$(INSTALL_STD_DIR)
  167. opam_install:
  168. opam install $(OPAM_LIBS) camlp4 ocamlfind --yes
  169. # Dependencies
  170. -include Makefile.dependencies
  171. # Package
  172. package_src:
  173. mkdir -p $(PACKAGE_OUT_DIR)
  174. # use git-archive-all since we have submodules
  175. # https://github.com/Kentzo/git-archive-all
  176. curl -s https://raw.githubusercontent.com/Kentzo/git-archive-all/1.15/git_archive_all.py -o extra/git_archive_all.py
  177. python extra/git_archive_all.py $(PACKAGE_OUT_DIR)/$(PACKAGE_FILE_NAME)_src$(PACKAGE_SRC_EXTENSION)
  178. package_unix:
  179. mkdir -p $(PACKAGE_OUT_DIR)
  180. rm -rf $(PACKAGE_FILE_NAME) $(PACKAGE_FILE_NAME).tar.gz
  181. #delete all content which was generated in _build dir except interfaces
  182. find _build/ -type f ! -name '*.cmi' -delete
  183. #add ocaml version to the _build dir
  184. ocaml -version > _build/ocaml.version
  185. # Copy the package contents to $(PACKAGE_FILE_NAME)
  186. mkdir -p $(PACKAGE_FILE_NAME)
  187. cp -r $(OUTPUT) $(HAXELIB_OUTPUT) std extra/LICENSE.txt extra/CONTRIB.txt extra/CHANGES.txt _build $(PACKAGE_FILE_NAME)
  188. # archive
  189. tar -zcf $(PACKAGE_OUT_DIR)/$(PACKAGE_FILE_NAME)_bin.tar.gz $(PACKAGE_FILE_NAME)
  190. rm -r $(PACKAGE_FILE_NAME)
  191. package_bin: package_$(PLATFORM)
  192. xmldoc:
  193. cd extra && \
  194. $(CURDIR)/$(HAXELIB_OUTPUT) newrepo && \
  195. $(CURDIR)/$(HAXELIB_OUTPUT) git hxcpp https://github.com/HaxeFoundation/hxcpp && \
  196. $(CURDIR)/$(HAXELIB_OUTPUT) git hxjava https://github.com/HaxeFoundation/hxjava && \
  197. $(CURDIR)/$(HAXELIB_OUTPUT) git hxcs https://github.com/HaxeFoundation/hxcs && \
  198. PATH="$(CURDIR):$(PATH)" $(CURDIR)/$(OUTPUT) doc.hxml
  199. $(INSTALLER_TMP_DIR):
  200. mkdir -p $(INSTALLER_TMP_DIR)
  201. $(INSTALLER_TMP_DIR)/neko-osx64.tar.gz: $(INSTALLER_TMP_DIR)
  202. wget -nv http://nekovm.org/media/neko-2.1.0-osx64.tar.gz -O installer/neko-osx64.tar.gz
  203. # Installer
  204. package_installer_mac: $(INSTALLER_TMP_DIR)/neko-osx64.tar.gz package_unix
  205. $(eval OUTFILE := $(shell pwd)/$(PACKAGE_OUT_DIR)/$(PACKAGE_FILE_NAME)_installer.tar.gz)
  206. $(eval PACKFILE := $(shell pwd)/$(PACKAGE_OUT_DIR)/$(PACKAGE_FILE_NAME)_bin.tar.gz)
  207. $(eval VERSION := $(shell $(CURDIR)/$(OUTPUT) -version 2>&1))
  208. $(eval NEKOVER := $(shell neko -version 2>&1))
  209. bash -c "rm -rf $(INSTALLER_TMP_DIR)/{resources,pkg,tgz,haxe.tar.gz}"
  210. mkdir $(INSTALLER_TMP_DIR)/resources
  211. # neko - unpack to change the dir name
  212. cd $(INSTALLER_TMP_DIR)/resources && tar -zxvf ../neko-osx64.tar.gz
  213. mv $(INSTALLER_TMP_DIR)/resources/neko* $(INSTALLER_TMP_DIR)/resources/neko
  214. cd $(INSTALLER_TMP_DIR)/resources && tar -zcvf neko.tar.gz neko
  215. # haxe - unpack to change the dir name
  216. cd $(INSTALLER_TMP_DIR)/resources && tar -zxvf $(PACKFILE)
  217. mv $(INSTALLER_TMP_DIR)/resources/haxe* $(INSTALLER_TMP_DIR)/resources/haxe
  218. cd $(INSTALLER_TMP_DIR)/resources && tar -zcvf haxe.tar.gz haxe
  219. # scripts
  220. cp -rf extra/mac-installer/* $(INSTALLER_TMP_DIR)/resources
  221. cd $(INSTALLER_TMP_DIR)/resources && tar -zcvf scripts.tar.gz scripts
  222. # installer structure
  223. mkdir -p $(INSTALLER_TMP_DIR)/pkg
  224. cd $(INSTALLER_TMP_DIR)/pkg && xar -xf ../resources/installer-structure.pkg .
  225. mkdir $(INSTALLER_TMP_DIR)/tgz; mv $(INSTALLER_TMP_DIR)/resources/*.tar.gz $(INSTALLER_TMP_DIR)/tgz
  226. cd $(INSTALLER_TMP_DIR)/tgz; find . | cpio -o --format odc | gzip -c > ../pkg/files.pkg/Payload
  227. cd $(INSTALLER_TMP_DIR)/pkg/files.pkg && bash -c "INSTKB=$$(du -sk ../../tgz | awk '{print $$1;}'); \
  228. du -sk ../../tgz; \
  229. echo $$INSTKB ; \
  230. INSTKBH=`expr $$INSTKB - 4`; \
  231. echo $$INSTKBH ;\
  232. sed -i '' 's/%%INSTKB%%/$$INSTKBH/g' PackageInfo ;\
  233. sed -i '' 's/%%VERSION%%/$(VERSION)/g' PackageInfo ;\
  234. sed -i '' 's/%%VERSTRING%%/$(VERSION)/g' PackageInfo ;\
  235. sed -i '' 's/%%VERLONG%%/$(VERSION)/g' PackageInfo ;\
  236. sed -i '' 's/%%NEKOVER%%/$(NEKOVER)/g' PackageInfo ;\
  237. cd .. ;\
  238. sed -i '' 's/%%VERSION%%/$(VERSION)/g' Distribution ;\
  239. sed -i '' 's/%%VERSTRING%%/$(VERSION)/g' Distribution ;\
  240. sed -i '' 's/%%VERLONG%%/$(VERSION)/g' Distribution ;\
  241. sed -i '' 's/%%NEKOVER%%/$(NEKOVER)/g' Distribution ;\
  242. sed -i '' 's/%%INSTKB%%/$$INSTKBH/g' Distribution"
  243. # repackage
  244. cd $(INSTALLER_TMP_DIR)/pkg; xar --compression none -cf ../$(PACKAGE_FILE_NAME).pkg *
  245. # tar
  246. cd $(INSTALLER_TMP_DIR); tar -zcvf $(OUTFILE) $(PACKAGE_FILE_NAME).pkg
  247. # Clean
  248. clean: clean_libs clean_haxe clean_tools clean_package
  249. clean_libs:
  250. $(foreach lib,$(EXTLIB_LIBS),$(MAKE) -C libs/$(lib) clean &&) true
  251. clean_haxe:
  252. rm -f -r _build $(OUTPUT) $(PREBUILD_OUTPUT)
  253. clean_tools:
  254. rm -f $(OUTPUT) $(PREBUILD_OUTPUT) $(HAXELIB_OUTPUT)
  255. clean_package:
  256. rm -rf $(PACKAGE_OUT_DIR)
  257. FORCE:
  258. # SUFFIXES
  259. .ml.cmx:
  260. $(CC_CMD)
  261. .ml.cmo:
  262. $(CC_CMD)
  263. .PHONY: prebuild haxe libs haxelib