Makefile 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. LBITS := $(shell getconf LONG_BIT)
  2. MARCH ?= $(LBITS)
  3. PREFIX ?= /usr/local
  4. INSTALL_DIR ?= $(PREFIX)
  5. INSTALL_BIN_DIR ?= $(PREFIX)/bin
  6. INSTALL_LIB_DIR ?= $(PREFIX)/lib
  7. INSTALL_INCLUDE_DIR ?= $(PREFIX)/include
  8. LIBS=fmt sdl ssl openal ui uv mysql sqlite
  9. ARCH ?= $(shell uname -m)
  10. CFLAGS = -Wall -O3 -I src -std=c11 -D LIBHL_EXPORTS
  11. LFLAGS = -L. -lhl
  12. EXTRA_LFLAGS ?=
  13. LIBFLAGS =
  14. HLFLAGS = -ldl
  15. LIBEXT = so
  16. LIBTURBOJPEG = -lturbojpeg
  17. PCRE_FLAGS = -I include/pcre -D HAVE_CONFIG_H -D PCRE2_CODE_UNIT_WIDTH=16
  18. PCRE = include/pcre/pcre2_auto_possess.o include/pcre/pcre2_chartables.o include/pcre/pcre2_compile.o \
  19. include/pcre/pcre2_config.o include/pcre/pcre2_context.o include/pcre/pcre2_convert.o \
  20. include/pcre/pcre2_dfa_match.o include/pcre/pcre2_error.o include/pcre/pcre2_extuni.o \
  21. include/pcre/pcre2_find_bracket.o include/pcre/pcre2_jit_compile.o include/pcre/pcre2_maketables.o \
  22. include/pcre/pcre2_match_data.o include/pcre/pcre2_match.o include/pcre/pcre2_newline.o \
  23. include/pcre/pcre2_ord2utf.o include/pcre/pcre2_pattern_info.o include/pcre/pcre2_script_run.o \
  24. include/pcre/pcre2_serialize.o include/pcre/pcre2_string_utils.o include/pcre/pcre2_study.o \
  25. include/pcre/pcre2_substitute.o include/pcre/pcre2_substring.o include/pcre/pcre2_tables.o \
  26. include/pcre/pcre2_ucd.o include/pcre/pcre2_valid_utf.o include/pcre/pcre2_xclass.o
  27. RUNTIME = src/gc.o
  28. STD = src/std/array.o src/std/buffer.o src/std/bytes.o src/std/cast.o src/std/date.o src/std/error.o src/std/debug.o \
  29. src/std/file.o src/std/fun.o src/std/maps.o src/std/math.o src/std/obj.o src/std/random.o src/std/regexp.o \
  30. src/std/socket.o src/std/string.o src/std/sys.o src/std/types.o src/std/ucs2.o src/std/thread.o src/std/process.o \
  31. src/std/track.o
  32. HL = src/code.o src/jit.o src/main.o src/module.o src/debugger.o src/profile.o
  33. FMT_INCLUDE = -I include/mikktspace -I include/minimp3
  34. FMT = libs/fmt/fmt.o libs/fmt/sha1.o include/mikktspace/mikktspace.o libs/fmt/mikkt.o libs/fmt/dxt.o
  35. SDL = libs/sdl/sdl.o libs/sdl/gl.o
  36. OPENAL = libs/openal/openal.o
  37. SSL = libs/ssl/ssl.o
  38. UV = libs/uv/uv.o
  39. UI = libs/ui/ui_stub.o
  40. MYSQL = libs/mysql/socket.o libs/mysql/sha1.o libs/mysql/my_proto.o libs/mysql/my_api.o libs/mysql/mysql.o
  41. SQLITE = libs/sqlite/sqlite.o
  42. LIB = ${PCRE} ${RUNTIME} ${STD}
  43. BOOT = src/_main.o
  44. UNAME := $(shell uname)
  45. # Cygwin
  46. ifeq ($(OS),Windows_NT)
  47. LIBFLAGS += -Wl,--export-all-symbols
  48. LIBEXT = dll
  49. RELEASE_NAME=win
  50. # VS variables are for packaging Visual Studio builds
  51. VS_RUNTIME_LIBRARY ?= c:/windows/system32/vcruntime140.dll
  52. ifeq ($(MARCH),32)
  53. CFLAGS += -msse2 -mfpmath=sse
  54. CC=i686-pc-cygwin-gcc
  55. BUILD_DIR = Release
  56. VS_SDL_LIBRARY ?= include/sdl/lib/x86/SDL2.dll
  57. VS_OPENAL_LIBRARY ?= include/openal/bin/Win32/soft_oal.dll
  58. else
  59. BUILD_DIR = x64/Release
  60. VS_SDL_LIBRARY ?= include/sdl/lib/x64/SDL2.dll
  61. VS_OPENAL_LIBRARY ?= include/openal/bin/Win64/soft_oal.dll
  62. endif
  63. else ifeq ($(UNAME),Darwin)
  64. # Mac
  65. LIBEXT=dylib
  66. BPREFIX := $(shell brew --prefix)
  67. BREW_LIBJPEG := $(shell brew --prefix libjpeg-turbo)
  68. BREW_SDL2 := $(shell brew --prefix sdl2)
  69. BREW_JPEGTURBO := $(shell brew --prefix jpeg-turbo)
  70. BREW_VORBIS := $(shell brew --prefix libvorbis)
  71. BREW_OPENAL := $(shell brew --prefix openal-soft)
  72. BREW_MBEDTLS := $(shell brew --prefix mbedtls@2)
  73. BREW_LIBPNG := $(shell brew --prefix libpng)
  74. BREW_LIBOGG := $(shell brew --prefix libogg)
  75. BREW_LIBUV := $(shell brew --prefix libuv)
  76. CFLAGS += -m$(MARCH) -I include -I $(BREW_LIBJPEG)/include \
  77. -I $(BREW_JPEGTURBO)/include -I $(BREW_SDL2)/include -I $(BREW_VORBIS)/include \
  78. -I $(BREW_MBEDTLS)/include -I $(BREW_LIBPNG)/include -I $(BREW_LIBOGG)/include \
  79. -I $(BREW_LIBUV)/include \
  80. -I $(BREW_OPENAL)/include -Dopenal_soft -DGL_SILENCE_DEPRECATION
  81. LFLAGS += -Wl,-export_dynamic
  82. CFLAGS += -m$(MARCH) -I include -I /usr/local/include -I /usr/local/opt/libjpeg-turbo/include \
  83. -I /usr/local/opt/jpeg-turbo/include -I /usr/local/opt/sdl2/include -I /usr/local/opt/libvorbis/include \
  84. -I /usr/local/opt/openal-soft/include -Dopenal_soft -DGL_SILENCE_DEPRECATION
  85. LFLAGS += -Wl,-export_dynamic -L/usr/local/lib
  86. ifdef OSX_SDK
  87. ISYSROOT = $(shell xcrun --sdk macosx$(OSX_SDK) --show-sdk-path)
  88. CFLAGS += -isysroot $(ISYSROOT)
  89. LFLAGS += -isysroot $(ISYSROOT)
  90. endif
  91. LIBFLAGS += -L$(BREW_LIBJPEG)/lib -L$(BREW_SDL2)/lib -L$(BREW_JPEGTURBO)/lib \
  92. -L$(BREW_VORBIS)/lib -L$(BREW_OPENAL)/lib -L$(BREW_MBEDTLS)/lib \
  93. -L$(BREW_LIBPNG)/lib -L$(BREW_LIBOGG)/lib -L$(BREW_LIBUV)/lib
  94. LIBOPENGL = -framework OpenGL
  95. LIBOPENAL = -lopenal
  96. LIBSSL = -framework Security -framework CoreFoundation
  97. RELEASE_NAME = osx
  98. # Mac native debug
  99. ifneq ($(ARCH),arm64)
  100. HL_DEBUG = include/mdbg/mdbg.o include/mdbg/mach_excServer.o include/mdbg/mach_excUser.o
  101. LIB += ${HL_DEBUG}
  102. endif
  103. CFLAGS += -arch $(ARCH)
  104. LFLAGS += -arch $(ARCH)
  105. else
  106. # Linux
  107. CFLAGS += -m$(MARCH) -fPIC -pthread -fno-omit-frame-pointer
  108. LFLAGS += -lm -Wl,-rpath,.:'$$ORIGIN':$(INSTALL_LIB_DIR) -Wl,--export-dynamic -Wl,--no-undefined
  109. ifeq ($(MARCH),32)
  110. CFLAGS += -I /usr/include/i386-linux-gnu -msse2 -mfpmath=sse
  111. LIBFLAGS += -L/opt/libjpeg-turbo/lib
  112. else
  113. LIBFLAGS += -L/opt/libjpeg-turbo/lib64
  114. endif
  115. LIBOPENAL = -lopenal
  116. LIBOPENGL = -lGL
  117. RELEASE_NAME = linux
  118. endif
  119. ifdef MESA
  120. LIBS += mesa
  121. endif
  122. ifdef DEBUG
  123. CFLAGS += -g
  124. endif
  125. all: libhl hl libs
  126. install:
  127. $(UNAME)==Darwin && ${MAKE} uninstall
  128. mkdir -p $(INSTALL_BIN_DIR)
  129. cp hl $(INSTALL_BIN_DIR)
  130. mkdir -p $(INSTALL_LIB_DIR)
  131. cp *.hdll $(INSTALL_LIB_DIR)
  132. cp libhl.${LIBEXT} $(INSTALL_LIB_DIR)
  133. mkdir -p $(INSTALL_INCLUDE_DIR)
  134. cp src/hl.h src/hlc.h src/hlc_main.c $(INSTALL_INCLUDE_DIR)
  135. uninstall:
  136. rm -f $(INSTALL_BIN_DIR)/hl $(INSTALL_LIB_DIR)/libhl.${LIBEXT} $(INSTALL_LIB_DIR)/*.hdll
  137. rm -f $(INSTALL_INCLUDE_DIR)/hl.h $(INSTALL_INCLUDE_DIR)/hlc.h $(INSTALL_INCLUDE_DIR)/hlc_main.c
  138. libs: $(LIBS)
  139. ./include/pcre/%.o: include/pcre/%.c
  140. ${CC} ${CFLAGS} -o $@ -c $< ${PCRE_FLAGS}
  141. src/std/regexp.o: src/std/regexp.c
  142. ${CC} ${CFLAGS} -o $@ -c $< ${PCRE_FLAGS}
  143. libhl: ${LIB}
  144. ${CC} ${CFLAGS} -o libhl.$(LIBEXT) -m${MARCH} ${LIBFLAGS} -shared ${LIB} -lpthread -lm
  145. hlc: ${BOOT}
  146. ${CC} ${CFLAGS} -o hlc ${BOOT} ${LFLAGS} ${EXTRA_LFLAGS}
  147. hl: ${HL} libhl
  148. ${CC} ${CFLAGS} -o hl ${HL} ${LFLAGS} ${EXTRA_LFLAGS} ${HLFLAGS}
  149. libs/fmt/%.o: libs/fmt/%.c
  150. ${CC} ${CFLAGS} -o $@ -c $< ${FMT_INCLUDE}
  151. fmt: ${FMT} libhl
  152. ${CC} ${CFLAGS} -shared -o fmt.hdll ${FMT} ${LIBFLAGS} -L. -lhl -lpng $(LIBTURBOJPEG) -lz -lvorbisfile
  153. sdl: ${SDL} libhl
  154. ${CC} ${CFLAGS} -shared -o sdl.hdll ${SDL} ${LIBFLAGS} -L. -lhl -lSDL2 $(LIBOPENGL)
  155. openal: ${OPENAL} libhl
  156. ${CC} ${CFLAGS} -shared -o openal.hdll ${OPENAL} ${LIBFLAGS} -L. -lhl $(LIBOPENAL)
  157. ssl: ${SSL} libhl
  158. ${CC} ${CFLAGS} -shared -o ssl.hdll ${SSL} ${LIBFLAGS} -L. -lhl -lmbedtls -lmbedx509 -lmbedcrypto $(LIBSSL)
  159. ui: ${UI} libhl
  160. ${CC} ${CFLAGS} -shared -o ui.hdll ${UI} ${LIBFLAGS} -L. -lhl
  161. uv: ${UV} libhl
  162. ${CC} ${CFLAGS} -shared -o uv.hdll ${UV} ${LIBFLAGS} -L. -lhl -luv
  163. mysql: ${MYSQL} libhl
  164. ${CC} ${CFLAGS} -shared -o mysql.hdll ${MYSQL} ${LIBFLAGS} -L. -lhl
  165. sqlite: ${SQLITE} libhl
  166. ${CC} ${CFLAGS} -shared -o sqlite.hdll ${SQLITE} ${LIBFLAGS} -L. -lhl -lsqlite3
  167. mesa:
  168. (cd libs/mesa && ${MAKE})
  169. release: release_prepare release_$(RELEASE_NAME)
  170. release_haxelib:
  171. ${MAKE} HLIB=directx release_haxelib_package
  172. ${MAKE} HLIB=sdl release_haxelib_package
  173. ${MAKE} HLIB=openal release_haxelib_package
  174. ifeq ($(HLIB),directx)
  175. HLPACK=dx
  176. else
  177. HLPACK=$(HLIB)
  178. endif
  179. release_haxelib_package:
  180. rm -rf $(HLIB)_release
  181. mkdir $(HLIB)_release
  182. (cd libs/$(HLIB) && cp -R $(HLPACK) *.h *.c* haxelib.json ../../$(HLIB)_release | true)
  183. zip -r $(HLIB).zip $(HLIB)_release
  184. haxelib submit $(HLIB).zip
  185. rm -rf $(HLIB)_release
  186. BUILD_DIR ?= .
  187. PACKAGE_NAME := hashlink-$(shell $(BUILD_DIR)/hl --version)-$(RELEASE_NAME)
  188. release_prepare:
  189. rm -rf $(PACKAGE_NAME)
  190. mkdir $(PACKAGE_NAME)
  191. mkdir $(PACKAGE_NAME)/include
  192. cp src/hl.h src/hlc.h src/hlc_main.c $(PACKAGE_NAME)/include
  193. release_win:
  194. cp $(BUILD_DIR)/{hl.exe,libhl.dll,*.hdll,*.lib} $(PACKAGE_NAME)
  195. cp $(VS_RUNTIME_LIBRARY) $(PACKAGE_NAME)
  196. cp $(VS_SDL_LIBRARY) $(PACKAGE_NAME)
  197. cp $(VS_OPENAL_LIBRARY) $(PACKAGE_NAME)/OpenAL32.dll
  198. # 7z switches: https://sevenzip.osdn.jp/chm/cmdline/switches/
  199. 7z a -spf -y -mx9 -bt $(PACKAGE_NAME).zip $(PACKAGE_NAME)
  200. rm -rf $(PACKAGE_NAME)
  201. release_linux release_osx:
  202. cp hl libhl.$(LIBEXT) *.hdll $(PACKAGE_NAME)
  203. tar -cvzf $(PACKAGE_NAME).tar.gz $(PACKAGE_NAME)
  204. rm -rf $(PACKAGE_NAME)
  205. codesign_osx:
  206. sudo security delete-identity -c hl-cert || echo
  207. echo "[req]\ndistinguished_name=codesign_dn\n[codesign_dn]\ncommonName=hl-cert\n[v3_req]\nkeyUsage=critical,digitalSignature\nextendedKeyUsage=critical,codeSigning" > openssl.cnf
  208. openssl req -x509 -newkey rsa:4096 -keyout key.pem -nodes -days 365 -subj '/CN=hl-cert' -outform der -out cert.cer -extensions v3_req -config openssl.cnf
  209. sudo security add-trusted-cert -d -k /Library/Keychains/System.keychain cert.cer
  210. sudo security import key.pem -k /Library/Keychains/System.keychain -A
  211. codesign --entitlements other/osx/entitlements.xml -fs hl-cert hl
  212. rm key.pem cert.cer openssl.cnf
  213. .SUFFIXES : .c .o
  214. .c.o :
  215. ${CC} ${CFLAGS} -o $@ -c $<
  216. clean_o:
  217. rm -f ${STD} ${BOOT} ${RUNTIME} ${PCRE} ${HL} ${FMT} ${SDL} ${SSL} ${OPENAL} ${UI} ${UV} ${MYSQL} ${SQLITE} ${HL_DEBUG}
  218. clean: clean_o
  219. rm -f hl hl.exe libhl.$(LIBEXT) *.hdll
  220. .PHONY: libhl hl hlc fmt sdl libs release