Makefile 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  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=$(DESTDIR)/usr
  13. INSTALL_BIN_DIR=$(INSTALL_DIR)/bin
  14. INSTALL_LIB_DIR=$(INSTALL_DIR)/lib/haxe
  15. INSTALL_STD_DIR=$(INSTALL_LIB_DIR)/std
  16. PACKAGE_OUT_DIR=out
  17. PACKAGE_SRC_EXTENSION=.tar.gz
  18. MAKEFILENAME?=Makefile
  19. PLATFORM?=unix
  20. OUTPUT=haxe
  21. EXTENSION=
  22. LFLAGS=
  23. STATICLINK?=0
  24. # Configuration
  25. HAXE_DIRECTORIES=compiler context generators generators/gencommon macro filters macro/eval optimization syntax typing display
  26. EXTLIB_LIBS=extlib-leftovers extc neko javalib swflib ttflib ilib objsize pcre ziplib
  27. FINDLIB_LIBS=unix str threads sedlex xml-light extlib rope ptmap dynlink
  28. # Includes, packages and compiler
  29. HAXE_INCLUDES=$(HAXE_DIRECTORIES:%=-I _build/src/%)
  30. EXTLIB_INCLUDES=$(EXTLIB_LIBS:%=-I libs/%)
  31. ALL_INCLUDES=$(EXTLIB_INCLUDES) $(HAXE_INCLUDES)
  32. FINDLIB_PACKAGES=$(FINDLIB_LIBS:%=-package %)
  33. CFLAGS=
  34. ALL_CFLAGS=-bin-annot -safe-string -thread -g -w -3 $(CFLAGS) $(ALL_INCLUDES) $(FINDLIB_PACKAGES)
  35. ifeq ($(BYTECODE),1)
  36. TARGET_FLAG = bytecode
  37. COMPILER = ocamlfind ocamlc
  38. LIB_EXT = cma
  39. MODULE_EXT = cmo
  40. NATIVE_LIB_FLAG = -custom
  41. else
  42. TARGET_FLAG = native
  43. COMPILER = ocamlfind ocamlopt
  44. LIB_EXT = cmxa
  45. MODULE_EXT = cmx
  46. endif
  47. CC_CMD = $(COMPILER) $(ALL_CFLAGS) -c $<
  48. # Meta information
  49. BUILD_DIRECTORIES := $(HAXE_DIRECTORIES:%=_build/src/%)
  50. HAXE_SRC := $(wildcard $(HAXE_DIRECTORIES:%=src/%/*.ml))
  51. BUILD_SRC := $(HAXE_SRC:%=_build/%)
  52. ADD_REVISION?=0
  53. 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)
  54. COMMIT_SHA=$(shell git rev-parse --short HEAD)
  55. COMMIT_DATE=$(shell \
  56. if [ "$$(uname)" = "Darwin" ]; then \
  57. date -u -r $$(git show -s --format=%ct HEAD) +%Y%m%d%H%M%S; \
  58. else \
  59. date -u -d @$$(git show -s --format=%ct HEAD) +%Y%m%d%H%M%S; \
  60. fi \
  61. )
  62. PACKAGE_FILE_NAME=haxe_$(COMMIT_DATE)_$(COMMIT_SHA)
  63. HAXE_VERSION=$(shell $(OUTPUT) -version 2>&1 | awk '{print $$1;}')
  64. # using $(CURDIR) on Windows will not work since it might be a Cygwin path
  65. ifdef SYSTEMROOT
  66. EXTENSION=.exe
  67. else
  68. export HAXE_STD_PATH=$(CURDIR)/std
  69. endif
  70. # Native libraries
  71. ifneq ($(STATICLINK),0)
  72. LIB_PARAMS= -cclib '-Wl,-Bstatic -lpcre -lz -Wl,-Bdynamic '
  73. else
  74. LIB_PARAMS?= -cclib -lpcre -cclib -lz
  75. endif
  76. 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)
  77. # Modules
  78. -include Makefile.modules
  79. # Rules
  80. all: libs haxe tools
  81. libs:
  82. $(foreach lib,$(EXTLIB_LIBS),$(MAKE) -C libs/$(lib) $(TARGET_FLAG) &&) true
  83. _build/%:%
  84. cp $< $@
  85. build_dirs:
  86. @mkdir -p $(BUILD_DIRECTORIES)
  87. _build/src/syntax/parser.ml:src/syntax/parser.mly
  88. camlp4o -impl $< -o $@
  89. _build/src/compiler/version.ml:
  90. ifneq ($(ADD_REVISION),0)
  91. $(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
  92. else
  93. echo let version_extra = None > _build/src/compiler/version.ml
  94. endif
  95. build_src:build_dirs $(BUILD_SRC) _build/src/syntax/parser.ml _build/src/compiler/version.ml
  96. haxe: build_src
  97. $(MAKE) -f $(MAKEFILENAME) build_pass_1
  98. $(MAKE) -f $(MAKEFILENAME) build_pass_2
  99. $(MAKE) -f $(MAKEFILENAME) build_pass_3
  100. $(MAKE) -f $(MAKEFILENAME) build_pass_4
  101. build_pass_1:
  102. printf MODULES= > Makefile.modules
  103. ls -1 $(HAXE_DIRECTORIES:%=_build/src/%/*.ml) | tr '\n' ' ' >> Makefile.modules
  104. build_pass_2:
  105. printf MODULES= > Makefile.modules
  106. ocamlfind ocamldep -sort -slash $(HAXE_INCLUDES) $(MODULES) | sed -e "s/\.ml//g" >> Makefile.modules
  107. build_pass_3:
  108. ocamlfind ocamldep -slash -native $(HAXE_INCLUDES) $(MODULES:%=%.ml) > Makefile.dependencies
  109. build_pass_4: $(MODULES:%=%.$(MODULE_EXT))
  110. $(COMPILER) -safe-string -linkpkg -o $(OUTPUT) $(NATIVE_LIBS) $(NATIVE_LIB_FLAG) $(LFLAGS) $(FINDLIB_PACKAGES) $(EXTLIB_INCLUDES) $(EXTLIB_LIBS:=.$(LIB_EXT)) $(MODULES:%=%.$(MODULE_EXT))
  111. plugin:
  112. ifeq ($(BYTECODE),1)
  113. $(CC_CMD) $(PLUGIN).ml
  114. else
  115. $(COMPILER) $(ALL_CFLAGS) -shared -o $(PLUGIN).cmxs $(PLUGIN).ml
  116. endif
  117. # Only use if you have only changed gencpp.ml
  118. quickcpp: _build/src/generators/gencpp.ml build_pass_4 copy_haxetoolkit
  119. _build/src/generators/gencpp.ml:src/generators/gencpp.ml
  120. cp $< $@
  121. copy_haxetoolkit: /cygdrive/c/HaxeToolkit/haxe/haxe.exe
  122. /cygdrive/c/HaxeToolkit/haxe/haxe.exe:haxe.exe
  123. cp $< $@
  124. haxelib:
  125. (cd $(CURDIR)/extra/haxelib_src && $(CURDIR)/$(OUTPUT) client.hxml && nekotools boot run.n)
  126. mv extra/haxelib_src/run$(EXTENSION) haxelib$(EXTENSION)
  127. tools: haxelib
  128. install: uninstall
  129. mkdir -p $(INSTALL_BIN_DIR)
  130. mkdir -p $(INSTALL_LIB_DIR)/lib
  131. cp -rf std $(INSTALL_STD_DIR)
  132. cp -rf extra $(INSTALL_LIB_DIR)
  133. cp haxe $(INSTALL_LIB_DIR)
  134. ln -s $(INSTALL_LIB_DIR)/haxe $(INSTALL_BIN_DIR)/haxe
  135. cp haxelib $(INSTALL_LIB_DIR)
  136. ln -s $(INSTALL_LIB_DIR)/haxelib $(INSTALL_BIN_DIR)/haxelib
  137. chmod -R a+rx $(INSTALL_LIB_DIR)
  138. chmod 777 $(INSTALL_LIB_DIR)/lib
  139. chmod a+rx $(INSTALL_BIN_DIR)/haxe $(INSTALL_BIN_DIR)/haxelib
  140. # will install native version of the tools instead of script ones
  141. install_tools: tools
  142. cp haxelib ${INSTALL_BIN_DIR}/haxelib
  143. chmod a+rx $(INSTALL_BIN_DIR)/haxelib
  144. uninstall:
  145. rm -rf $(INSTALL_BIN_DIR)/haxe $(INSTALL_BIN_DIR)/haxelib
  146. if [ -d "$(INSTALL_LIB_DIR)/lib" ] && find "$(INSTALL_LIB_DIR)/lib" -mindepth 1 -print -quit | grep -q .; then \
  147. echo "The local haxelib repo at $(INSTALL_LIB_DIR)/lib will not be removed. Remove it manually if you want."; \
  148. find $(INSTALL_LIB_DIR)/ ! -name 'lib' -mindepth 1 -maxdepth 1 -exec rm -rf {} +; \
  149. else \
  150. rm -rf $(INSTALL_LIB_DIR); \
  151. fi
  152. # Dependencies
  153. -include Makefile.dependencies
  154. # Package
  155. package_src:
  156. mkdir -p $(PACKAGE_OUT_DIR)
  157. # use git-archive-all since we have submodules
  158. # https://github.com/Kentzo/git-archive-all
  159. curl -s https://raw.githubusercontent.com/Kentzo/git-archive-all/1.15/git_archive_all.py -o extra/git_archive_all.py
  160. python extra/git_archive_all.py $(PACKAGE_OUT_DIR)/$(PACKAGE_FILE_NAME)_src$(PACKAGE_SRC_EXTENSION)
  161. package_unix:
  162. mkdir -p $(PACKAGE_OUT_DIR)
  163. rm -rf $(PACKAGE_FILE_NAME) $(PACKAGE_FILE_NAME).tar.gz
  164. # Copy the package contents to $(PACKAGE_FILE_NAME)
  165. mkdir -p $(PACKAGE_FILE_NAME)
  166. cp -r $(OUTPUT) haxelib$(EXTENSION) std extra/LICENSE.txt extra/CONTRIB.txt extra/CHANGES.txt $(PACKAGE_FILE_NAME)
  167. # archive
  168. tar -zcf $(PACKAGE_OUT_DIR)/$(PACKAGE_FILE_NAME)_bin.tar.gz $(PACKAGE_FILE_NAME)
  169. rm -r $(PACKAGE_FILE_NAME)
  170. package_bin: package_$(PLATFORM)
  171. install_dox:
  172. haxelib git hxparse https://github.com/Simn/hxparse master src
  173. haxelib git hxtemplo https://github.com/Simn/hxtemplo
  174. haxelib git hxargs https://github.com/Simn/hxargs
  175. haxelib git markdown https://github.com/dpeek/haxe-markdown master src
  176. haxelib git hxcpp https://github.com/HaxeFoundation/hxcpp
  177. haxelib git hxjava https://github.com/HaxeFoundation/hxjava
  178. haxelib git hxcs https://github.com/HaxeFoundation/hxcs
  179. haxelib git dox https://github.com/HaxeFoundation/dox
  180. package_doc:
  181. mkdir -p $(PACKAGE_OUT_DIR)
  182. cd $$(haxelib path dox | head -n 1) && haxe run.hxml && haxe gen.hxml
  183. haxelib run dox -theme haxe_api -D website "http://haxe.org/" --title "Haxe API" -o $(PACKAGE_OUT_DIR)/$(PACKAGE_FILE_NAME)_doc.zip -D version "$$(haxe -version 2>&1)" -i $$(haxelib path dox | head -n 1)bin/xml -ex microsoft -ex javax -ex cs.internal -D source-path https://github.com/HaxeFoundation/haxe/blob/$(BRANCH)/std/
  184. deploy_doc:
  185. scp $(PACKAGE_OUT_DIR)/$(PACKAGE_FILE_NAME)_doc.zip [email protected]:/data/haxeapi/www/v/dev/api-latest.zip
  186. ssh [email protected] "cd /data/haxeapi/www/v/dev && find . ! -name 'api-latest.zip' -maxdepth 1 -mindepth 1 -exec rm -rf {} + && unzip -q -o api-latest.zip"
  187. # Clean
  188. clean: clean_libs clean_haxe clean_tools clean_package
  189. clean_libs:
  190. $(foreach lib,$(EXTLIB_LIBS),$(MAKE) -C libs/$(lib) clean &&) true
  191. clean_haxe:
  192. rm -f -r _build $(OUTPUT)
  193. clean_tools:
  194. rm -f $(OUTPUT) haxelib
  195. clean_package:
  196. rm -rf $(PACKAGE_OUT_DIR)
  197. # SUFFIXES
  198. .ml.cmx:
  199. $(CC_CMD)
  200. .ml.cmo:
  201. $(CC_CMD)
  202. .PHONY: haxe libs haxelib