Makefile 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  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. DUNE_COMMAND=dune
  22. HAXE_OUTPUT=haxe
  23. HAXELIB_OUTPUT=haxelib
  24. PREBUILD_OUTPUT=prebuild
  25. EXTENSION=
  26. LFLAGS=
  27. STATICLINK?=0
  28. SYSTEM_NAME=Unknown
  29. ifeq ($(OS),Windows_NT)
  30. SYSTEM_NAME=Windows
  31. else
  32. UNAME_S := $(shell uname -s)
  33. ifeq ($(UNAME_S),Linux)
  34. SYSTEM_NAME=Linux
  35. endif
  36. ifeq ($(UNAME_S),Darwin)
  37. SYSTEM_NAME=Mac
  38. endif
  39. endif
  40. # Configuration
  41. ADD_REVISION?=0
  42. BRANCH=$(shell git rev-parse --abbrev-ref HEAD)
  43. COMMIT_SHA=$(shell git rev-parse --short HEAD)
  44. COMMIT_DATE=$(shell \
  45. if [ "$$(uname)" = "Darwin" ]; then \
  46. date -u -r $$(git show -s --format=%ct HEAD) +%Y%m%d%H%M%S; \
  47. else \
  48. date -u -d @$$(git show -s --format=%ct HEAD) +%Y%m%d%H%M%S; \
  49. fi \
  50. )
  51. PACKAGE_FILE_NAME=haxe_$(COMMIT_DATE)_$(COMMIT_SHA)
  52. HAXE_VERSION=$(shell $(CURDIR)/$(HAXE_OUTPUT) -version 2>&1 | awk '{print $$1;}')
  53. HAXE_VERSION_SHORT=$(shell echo "$(HAXE_VERSION)" | grep -oE "^[0-9]+\.[0-9]+\.[0-9]+")
  54. NEKO_VERSION=2.4.0-rc.1
  55. NEKO_MAJOR_VERSION=$(shell echo "$(NEKO_VERSION)" | grep -oE "^[0-9]+")
  56. NEKO_VERSION_TAG=v$(shell echo "$(NEKO_VERSION)" | sed "s/\./-/g")
  57. ifneq ($(STATICLINK),0)
  58. LIB_PARAMS= -cclib '-Wl,-Bstatic -lpcre2-8 -lz -lmbedtls -lmbedx509 -lmbedcrypto -Wl,-Bdynamic '
  59. else
  60. LIB_PARAMS?= -cclib -lpcre2-8 -cclib -lz -cclib -lmbedtls -cclib -lmbedx509 -cclib -lmbedcrypto
  61. endif
  62. ifeq ($(SYSTEM_NAME),Mac)
  63. LIB_PARAMS+= -cclib '-framework Security -framework CoreFoundation'
  64. endif
  65. all: haxe tools
  66. haxe:
  67. $(DUNE_COMMAND) build --workspace dune-workspace.dev src-prebuild/prebuild.exe
  68. _build/default/src-prebuild/prebuild.exe libparams $(LIB_PARAMS) > lib.sexp
  69. _build/default/src-prebuild/prebuild.exe version "$(ADD_REVISION)" "$(BRANCH)" "$(COMMIT_SHA)" > src/compiler/version.ml
  70. $(DUNE_COMMAND) build --workspace dune-workspace.dev src/haxe.exe
  71. cp -f _build/default/src/haxe.exe ./"$(HAXE_OUTPUT)"
  72. plugin: haxe
  73. $(DUNE_COMMAND) build --workspace dune-workspace.dev plugins/$(PLUGIN)/$(PLUGIN).cmxs
  74. mkdir -p plugins/$(PLUGIN)/cmxs/$(SYSTEM_NAME)
  75. cp -f _build/default/plugins/$(PLUGIN)/$(PLUGIN).cmxs plugins/$(PLUGIN)/cmxs/$(SYSTEM_NAME)/plugin.cmxs
  76. kill_exe_win:
  77. ifdef SYSTEMROOT
  78. -@taskkill /F /IM haxe.exe 2>/dev/null
  79. endif
  80. # Only use if you have only changed gencpp.ml
  81. quickcpp: build_src build_pass_4 copy_haxetoolkit
  82. CPP_OS := $(shell uname)
  83. ifeq ($(CPP_OS),Linux)
  84. copy_haxetoolkit:
  85. sudo cp haxe /usr/bin/haxe
  86. else
  87. copy_haxetoolkit: /cygdrive/c/HaxeToolkit/haxe/haxe.exe
  88. /cygdrive/c/HaxeToolkit/haxe/haxe.exe:haxe.exe
  89. cp $< $@
  90. endif
  91. ifeq ($(SYSTEM_NAME),Mac)
  92. # This assumes that haxelib and neko will both be installed into INSTALL_DIR,
  93. # which is the case when installing using the mac installer package
  94. HAXELIB_LFLAGS= -Wl,-rpath,$(INSTALL_DIR)/lib
  95. endif
  96. haxelib_unix:
  97. cd $(CURDIR)/extra/haxelib_src && \
  98. HAXE_STD_PATH=$(CURDIR)/std $(CURDIR)/$(HAXE_OUTPUT) client.hxml && \
  99. nekotools boot -c run.n
  100. $(CC) $(CURDIR)/extra/haxelib_src/run.c -o $(HAXELIB_OUTPUT) -lneko $(HAXELIB_LFLAGS)
  101. # haxelib should depends on haxe, but we don't want to do that...
  102. ifeq ($(SYSTEM_NAME),Windows)
  103. haxelib: haxelib_$(PLATFORM)
  104. else
  105. haxelib: haxelib_unix
  106. endif
  107. tools: haxelib
  108. install: uninstall
  109. mkdir -p "$(DESTDIR)$(INSTALL_BIN_DIR)"
  110. cp $(HAXE_OUTPUT) $(HAXELIB_OUTPUT) "$(DESTDIR)$(INSTALL_BIN_DIR)"
  111. mkdir -p "$(DESTDIR)$(INSTALL_STD_DIR)"
  112. cp -r std/* "$(DESTDIR)$(INSTALL_STD_DIR)"
  113. uninstall:
  114. rm -rf $(DESTDIR)$(INSTALL_BIN_DIR)/$(HAXE_OUTPUT) $(DESTDIR)$(INSTALL_BIN_DIR)/$(HAXELIB_OUTPUT)
  115. if [ -d "$(DESTDIR)$(INSTALL_LIB_DIR)/lib" ] && find "$(DESTDIR)$(INSTALL_LIB_DIR)/lib" -mindepth 1 -print -quit | grep -q .; then \
  116. echo "The local haxelib repo at $(DESTDIR)$(INSTALL_LIB_DIR)/lib will not be removed. Remove it manually if you want."; \
  117. find $(DESTDIR)$(INSTALL_LIB_DIR)/ ! -name 'lib' -mindepth 1 -maxdepth 1 -exec rm -rf {} +; \
  118. else \
  119. rm -rf $(DESTDIR)$(INSTALL_LIB_DIR); \
  120. fi
  121. rm -rf $(DESTDIR)$(INSTALL_STD_DIR)
  122. opam_install:
  123. opam install ocamlfind dune --yes
  124. haxe_deps:
  125. opam pin add haxe . --no-action
  126. opam install haxe --deps-only --yes
  127. # Package
  128. package_env: opam_install haxe_deps
  129. package_src:
  130. mkdir -p $(PACKAGE_OUT_DIR)
  131. # use git-archive-all since we have submodules
  132. # https://github.com/Kentzo/git-archive-all
  133. curl -s https://raw.githubusercontent.com/Kentzo/git-archive-all/1.15/git_archive_all.py -o extra/git_archive_all.py
  134. python extra/git_archive_all.py $(PACKAGE_OUT_DIR)/$(PACKAGE_FILE_NAME)_src$(PACKAGE_SRC_EXTENSION)
  135. package_unix:
  136. mkdir -p $(PACKAGE_OUT_DIR)
  137. rm -rf $(PACKAGE_FILE_NAME) $(PACKAGE_FILE_NAME).tar.gz
  138. # Copy the package contents to $(PACKAGE_FILE_NAME)
  139. mkdir -p $(PACKAGE_FILE_NAME)
  140. cp -r $(HAXE_OUTPUT) $(HAXELIB_OUTPUT) std extra/LICENSE.txt extra/CONTRIB.txt extra/CHANGES.txt $(PACKAGE_FILE_NAME)
  141. # archive
  142. tar -zcf $(PACKAGE_OUT_DIR)/$(PACKAGE_FILE_NAME)_bin.tar.gz $(PACKAGE_FILE_NAME)
  143. rm -r $(PACKAGE_FILE_NAME)
  144. package_bin: package_$(PLATFORM)
  145. xmldoc:
  146. cd extra && \
  147. $(CURDIR)/$(HAXELIB_OUTPUT) newrepo && \
  148. $(CURDIR)/$(HAXELIB_OUTPUT) git hxcpp https://github.com/HaxeFoundation/hxcpp && \
  149. $(CURDIR)/$(HAXELIB_OUTPUT) git hxjava https://github.com/HaxeFoundation/hxjava && \
  150. PATH="$(CURDIR):$(PATH)" $(CURDIR)/$(HAXE_OUTPUT) doc.hxml
  151. $(INSTALLER_TMP_DIR):
  152. mkdir -p $(INSTALLER_TMP_DIR)
  153. # Can be 'universal', 'arm64', or 'x86_64'
  154. ifndef PACKAGE_INSTALLER_MAC_ARCH
  155. PACKAGE_INSTALLER_MAC_ARCH:=$(shell uname -m)
  156. endif
  157. $(INSTALLER_TMP_DIR)/neko-osx.tar.gz: $(INSTALLER_TMP_DIR)
  158. NEKO_ARCH_SUFFIX=$$(if [ "$(PACKAGE_INSTALLER_MAC_ARCH)" = "x86_64" ]; then \
  159. echo 64; \
  160. else \
  161. echo "-$(PACKAGE_INSTALLER_MAC_ARCH)"; \
  162. fi); \
  163. wget -nv https://github.com/HaxeFoundation/neko/releases/download/$(NEKO_VERSION_TAG)/neko-$(NEKO_VERSION)-osx$$NEKO_ARCH_SUFFIX.tar.gz -O installer/neko-osx.tar.gz
  164. # Installer
  165. package_installer_mac: $(INSTALLER_TMP_DIR)/neko-osx.tar.gz package_unix
  166. $(eval OUTFILE := $(shell pwd)/$(PACKAGE_OUT_DIR)/$(PACKAGE_FILE_NAME)_installer.tar.gz)
  167. $(eval PACKFILE := $(shell pwd)/$(PACKAGE_OUT_DIR)/$(PACKAGE_FILE_NAME)_bin.tar.gz)
  168. $(eval VERSION := $(shell $(CURDIR)/$(HAXE_OUTPUT) -version 2>&1))
  169. bash -c "rm -rf $(INSTALLER_TMP_DIR)/{resources,pkg,tgz,haxe.tar.gz}"
  170. mkdir $(INSTALLER_TMP_DIR)/resources
  171. # neko - unpack to change the dir name
  172. cd $(INSTALLER_TMP_DIR)/resources && tar -zxvf ../neko-osx.tar.gz
  173. mv $(INSTALLER_TMP_DIR)/resources/neko* $(INSTALLER_TMP_DIR)/resources/neko
  174. cd $(INSTALLER_TMP_DIR)/resources && tar -zcvf neko.tar.gz neko
  175. # haxe - unpack to change the dir name
  176. cd $(INSTALLER_TMP_DIR)/resources && tar -zxvf $(PACKFILE)
  177. mv $(INSTALLER_TMP_DIR)/resources/haxe* $(INSTALLER_TMP_DIR)/resources/haxe
  178. cd $(INSTALLER_TMP_DIR)/resources && tar -zcvf haxe.tar.gz haxe
  179. # scripts
  180. cp -rf extra/mac-installer/* $(INSTALLER_TMP_DIR)/resources
  181. sed -i '' 's/%%NEKO_VERSION%%/$(NEKO_VERSION)/g' $(INSTALLER_TMP_DIR)/resources/scripts/neko-postinstall.sh
  182. sed -i '' 's/%%NEKO_MAJOR_VERSION%%/$(NEKO_MAJOR_VERSION)/g' $(INSTALLER_TMP_DIR)/resources/scripts/neko-postinstall.sh
  183. cd $(INSTALLER_TMP_DIR)/resources && tar -zcvf scripts.tar.gz scripts
  184. # installer structure
  185. mkdir -p $(INSTALLER_TMP_DIR)/pkg
  186. cd $(INSTALLER_TMP_DIR)/pkg && xar -xf ../resources/installer-structure.pkg .
  187. mkdir $(INSTALLER_TMP_DIR)/tgz; mv $(INSTALLER_TMP_DIR)/resources/*.tar.gz $(INSTALLER_TMP_DIR)/tgz
  188. cd $(INSTALLER_TMP_DIR)/tgz; find . | cpio -o --format odc | gzip -c > ../pkg/files.pkg/Payload
  189. cd $(INSTALLER_TMP_DIR)/pkg/files.pkg && bash -c "INSTKB=$$(du -sk ../../tgz | awk '{print $$1;}'); \
  190. du -sk ../../tgz; \
  191. echo $$INSTKB ; \
  192. INSTKBH=`expr $$INSTKB - 4`; \
  193. echo $$INSTKBH ;\
  194. sed -i '' 's/%%INSTKB%%/$$INSTKBH/g' PackageInfo ;\
  195. sed -i '' 's/%%VERSION%%/$(VERSION)/g' PackageInfo ;\
  196. sed -i '' 's/%%VERSTRING%%/$(VERSION)/g' PackageInfo ;\
  197. sed -i '' 's/%%VERLONG%%/$(VERSION)/g' PackageInfo ;\
  198. sed -i '' 's/%%NEKOVER%%/$(NEKO_VERSION)/g' PackageInfo ;\
  199. cd .. ;\
  200. sed -i '' 's/%%VERSION%%/$(VERSION)/g' Distribution ;\
  201. sed -i '' 's/%%VERSTRING%%/$(VERSION)/g' Distribution ;\
  202. sed -i '' 's/%%VERLONG%%/$(VERSION)/g' Distribution ;\
  203. sed -i '' 's/%%NEKOVER%%/$(NEKO_VERSION)/g' Distribution ;\
  204. sed -i '' 's/%%INSTKB%%/$$INSTKBH/g' Distribution"
  205. # repackage
  206. cd $(INSTALLER_TMP_DIR)/pkg; xar --compression none -cf ../$(PACKAGE_FILE_NAME).pkg *
  207. # tar
  208. cd $(INSTALLER_TMP_DIR); tar -zcvf $(OUTFILE) $(PACKAGE_FILE_NAME).pkg
  209. # Clean
  210. clean: clean_haxe clean_tools clean_package
  211. clean_haxe:
  212. rm -f -r _build $(HAXE_OUTPUT) $(PREBUILD_OUTPUT)
  213. clean_tools:
  214. rm -f $(HAXE_OUTPUT) $(PREBUILD_OUTPUT) $(HAXELIB_OUTPUT)
  215. clean_package:
  216. rm -rf $(PACKAGE_OUT_DIR)
  217. FORCE:
  218. # SUFFIXES
  219. .ml.cmx:
  220. $(CC_CMD)
  221. .ml.cmo:
  222. $(CC_CMD)
  223. .PHONY: haxe haxelib
  224. # our "all:" target doens't work in parallel mode
  225. .NOTPARALLEL: