Makefile 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. # Makefile script to generate AppImage for LOVE
  2. # Number of processor to use when compiling
  3. NUMBER_OF_PROCESSORS := $(shell nproc)
  4. # CPU architecture, defaults to host
  5. ARCH := $(shell uname -m)
  6. # CMake URL
  7. CMAKE_VERSION := 3.30.4
  8. CMAKE_URL := https://github.com/Kitware/CMake/releases/download/v$(CMAKE_VERSION)/cmake-$(CMAKE_VERSION)-linux-$(shell uname -m).sh
  9. # LOVE Repository URL
  10. LOVE_REPOSITORY := https://github.com/love2d/love
  11. # Project branches (for git-based projects)
  12. LOVE_BRANCH := main
  13. SDL3_BRANCH := main
  14. SDL3_REV := cc24518c4137dfa5484bedb2deee252de6f06e2a
  15. LUAJIT_BRANCH := v2.1
  16. OPENAL_BRANCH := 1.23.1
  17. ZLIB_BRANCH := v1.3
  18. HARFBUZZ_BRANCH := 10.1.0
  19. # Project versions (for downloadable tars)
  20. LIBOGG_VERSION := 1.3.5
  21. LIBVORBIS_VERSION := 1.3.7
  22. LIBTHEORA_VERSION := 1.2.0alpha1
  23. FT_VERSION := 2.13.3
  24. BZIP2_VERSION := 1.0.8
  25. LIBMODPLUG_VERSION := 0.8.8.5
  26. # Output AppImage
  27. APPIMAGE_OUTPUT := love-$(LOVE_BRANCH).AppImage
  28. # Output tar
  29. TAR_OUTPUT := love-$(LOVE_BRANCH).tar.gz
  30. # No need to change anything beyond this line
  31. override INSTALLPREFIX := $(CURDIR)/installdir
  32. override CMAKE_PREFIX := $(CURDIR)/cmake
  33. CMAKE := $(CMAKE_PREFIX)/bin/cmake
  34. override CMAKE_OPTS := --install-prefix $(INSTALLPREFIX) -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_RPATH='$$ORIGIN/../lib'
  35. override CONFIGURE := LDFLAGS="-Wl,-rpath,'\$$\$$ORIGIN/../lib' $$LDFLAGS" LD_LIBRARY_PATH=$(INSTALLPREFIX)/lib:${LD_LIBRARY_PATH} ../configure --prefix=$(INSTALLPREFIX)
  36. # CMake setup
  37. ifeq ($(SYSTEM_CMAKE),)
  38. cmake_install.sh:
  39. curl $(CURL_DOH_URL) -Lfo cmake_install.sh $(CMAKE_URL)
  40. chmod u+x cmake_install.sh
  41. $(CMAKE): cmake_install.sh
  42. mkdir cmake
  43. bash cmake_install.sh --prefix=$(CMAKE_PREFIX) --skip-license
  44. touch $(CMAKE)
  45. else
  46. CMAKE := $(CURDIR)/cmakewrapper.sh
  47. $(CMAKE):
  48. which cmake
  49. echo $(shell which cmake) '$$@' > $(CMAKE)
  50. chmod u+x $(CMAKE)
  51. endif
  52. # cURL DoH URL
  53. ifneq ($(DOH_URL),)
  54. override CURL_DOH_URL := --doh-url $(DOH_URL)
  55. endif
  56. cmake: $(CMAKE)
  57. # AppImageTool
  58. appimagetool:
  59. curl $(CURL_DOH_URL) -Lfo appimagetool https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-$(ARCH).AppImage
  60. chmod u+x appimagetool
  61. ifneq ($(QEMU),)
  62. # Extract the AppImageTool
  63. $(QEMU) ./appimagetool --appimage-extract
  64. endif
  65. # SDL3
  66. override SDL3_PATH := SDL3-$(SDL3_BRANCH)
  67. $(SDL3_PATH)/CMakeLists.txt:
  68. git clone --depth 4000 -b $(SDL3_BRANCH) https://github.com/libsdl-org/SDL $(SDL3_PATH)
  69. cd $(SDL3_PATH) && git checkout $(SDL3_REV)
  70. $(SDL3_PATH)/build/CMakeCache.txt: $(CMAKE) $(SDL3_PATH)/CMakeLists.txt
  71. $(CMAKE) -B$(SDL3_PATH)/build -S$(SDL3_PATH) $(CMAKE_OPTS)
  72. installdir/lib/libSDL3.so: $(SDL3_PATH)/build/CMakeCache.txt
  73. $(CMAKE) --build $(SDL3_PATH)/build --target install -j $(NUMBER_OF_PROCESSORS)
  74. # libogg
  75. override LIBOGG_FILE := libogg-$(LIBOGG_VERSION)
  76. $(LIBOGG_FILE).tar.gz:
  77. curl $(CURL_DOH_URL) -Lfo $(LIBOGG_FILE).tar.gz http://downloads.xiph.org/releases/ogg/$(LIBOGG_FILE).tar.gz
  78. $(LIBOGG_FILE)/configure: $(LIBOGG_FILE).tar.gz
  79. tar xzf $(LIBOGG_FILE).tar.gz
  80. touch $(LIBOGG_FILE)/configure
  81. $(LIBOGG_FILE)/build/Makefile: $(LIBOGG_FILE)/configure
  82. mkdir -p $(LIBOGG_FILE)/build
  83. cd $(LIBOGG_FILE)/build && $(CONFIGURE)
  84. installdir/lib/libogg.so: $(LIBOGG_FILE)/build/Makefile
  85. cd $(LIBOGG_FILE)/build && $(MAKE) install -j$(NUMBER_OF_PROCESSORS)
  86. # libvorbis
  87. override LIBVORBIS_FILE := libvorbis-$(LIBVORBIS_VERSION)
  88. $(LIBVORBIS_FILE).tar.gz:
  89. curl $(CURL_DOH_URL) -Lfo $(LIBVORBIS_FILE).tar.gz http://downloads.xiph.org/releases/vorbis/$(LIBVORBIS_FILE).tar.gz
  90. $(LIBVORBIS_FILE)/configure: $(LIBVORBIS_FILE).tar.gz
  91. tar xzf $(LIBVORBIS_FILE).tar.gz
  92. touch $(LIBVORBIS_FILE)/configure
  93. $(LIBVORBIS_FILE)/build/Makefile: $(LIBVORBIS_FILE)/configure installdir/lib/libogg.so
  94. mkdir -p $(LIBVORBIS_FILE)/build
  95. cd $(LIBVORBIS_FILE)/build && $(CONFIGURE)
  96. installdir/lib/libvorbis.so: $(LIBVORBIS_FILE)/build/Makefile
  97. cd $(LIBVORBIS_FILE)/build && $(MAKE) install -j$(NUMBER_OF_PROCESSORS)
  98. # libtheora
  99. override LIBTHEORA_FILE := libtheora-$(LIBTHEORA_VERSION)
  100. $(LIBTHEORA_FILE).tar.gz:
  101. curl $(CURL_DOH_URL) -Lfo $(LIBTHEORA_FILE).tar.gz http://downloads.xiph.org/releases/theora/$(LIBTHEORA_FILE).tar.gz
  102. $(LIBTHEORA_FILE)/configure: $(LIBTHEORA_FILE).tar.gz
  103. tar xzf $(LIBTHEORA_FILE).tar.gz
  104. # Their config.guess and config.sub can't detect ARM64
  105. ifeq ($(ARCH),aarch64)
  106. curl $(CURL_DOH_URL) -Lfo $(LIBTHEORA_FILE)/config.guess "https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD"
  107. chmod u+x $(LIBTHEORA_FILE)/config.guess
  108. curl $(CURL_DOH_URL) -Lfo $(LIBTHEORA_FILE)/config.sub "https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD"
  109. chmod u+x $(LIBTHEORA_FILE)/config.sub
  110. endif
  111. touch $(LIBTHEORA_FILE)/configure
  112. $(LIBTHEORA_FILE)/build/Makefile: $(LIBTHEORA_FILE)/configure installdir/lib/libogg.so
  113. mkdir -p $(LIBTHEORA_FILE)/build
  114. cd $(LIBTHEORA_FILE)/build && $(CONFIGURE) --with-ogg=$(INSTALLPREFIX) --with-vorbis=$(INSTALLPREFIX) --disable-examples --disable-encode
  115. installdir/lib/libtheora.so: $(LIBTHEORA_FILE)/build/Makefile
  116. cd $(LIBTHEORA_FILE)/build && $(MAKE) install -j $(NUMBER_OF_PROCESSORS)
  117. # zlib
  118. override ZLIB_PATH := zlib-$(ZLIB_BRANCH)
  119. $(ZLIB_PATH)/configure:
  120. git clone --depth 1 -b $(ZLIB_BRANCH) https://github.com/madler/zlib $(ZLIB_PATH)
  121. $(ZLIB_PATH)/build/Makefile: $(ZLIB_PATH)/configure
  122. mkdir -p $(ZLIB_PATH)/build
  123. cd $(ZLIB_PATH)/build && $(CONFIGURE)
  124. installdir/lib/libz.so: $(ZLIB_PATH)/build/Makefile
  125. cd $(ZLIB_PATH)/build && $(MAKE) install -j$(NUMBER_OF_PROCESSORS)
  126. # OpenAL-soft
  127. override OPENAL_PATH := openal-soft-$(OPENAL_BRANCH)
  128. $(OPENAL_PATH)/CMakeLists.txt:
  129. git clone --depth 1 -b $(OPENAL_BRANCH) https://github.com/kcat/openal-soft $(OPENAL_PATH)
  130. $(OPENAL_PATH)/build/CMakeCache.txt: $(CMAKE) $(OPENAL_PATH)/CMakeLists.txt
  131. $(CMAKE) -B$(OPENAL_PATH)/build -S$(OPENAL_PATH) $(CMAKE_OPTS) -DALSOFT_EXAMPLES=0 -DALSOFT_BACKEND_SNDIO=0
  132. installdir/lib/libopenal.so: $(OPENAL_PATH)/build/CMakeCache.txt
  133. $(CMAKE) --build $(OPENAL_PATH)/build --target install -j $(NUMBER_OF_PROCESSORS)
  134. # BZip2
  135. override BZIP2_FILE := bzip2-$(BZIP2_VERSION)
  136. $(BZIP2_FILE).tar.gz:
  137. curl $(CURL_DOH_URL) -Lfo $(BZIP2_FILE).tar.gz https://sourceware.org/pub/bzip2/$(BZIP2_FILE).tar.gz
  138. $(BZIP2_FILE)/Makefile: $(BZIP2_FILE).tar.gz
  139. tar xzf $(BZIP2_FILE).tar.gz
  140. touch $(BZIP2_FILE)/Makefile
  141. installdir/bzip2installed.txt: $(BZIP2_FILE)/Makefile
  142. cd $(BZIP2_FILE) && $(MAKE) install -j$(NUMBER_OF_PROCESSORS) CFLAGS="-fPIC -Wall -Winline -O2 -g -D_FILE_OFFSET_BITS=64" LDFLAGS="-Wl,-rpath,'\$ORIGIN/../lib'" PREFIX=$(INSTALLPREFIX)
  143. touch installdir/bzip2installed.txt
  144. # FreeType
  145. override FT_FILE := freetype-$(FT_VERSION)
  146. $(FT_FILE).tar.gz:
  147. curl $(CURL_DOH_URL) -Lfo $(FT_FILE).tar.gz https://download.savannah.gnu.org/releases/freetype/$(FT_FILE).tar.gz
  148. $(FT_FILE)/configure: $(FT_FILE).tar.gz
  149. tar xzf $(FT_FILE).tar.gz
  150. touch $(FT_FILE)/configure
  151. $(FT_FILE)/build/Makefile: $(FT_FILE)/configure installdir/bzip2installed.txt installdir/lib/libz.so
  152. mkdir -p $(FT_FILE)/build
  153. cd $(FT_FILE)/build && CFLAGS="-I$(INSTALLPREFIX)/include" LDFLAGS="-Wl,-rpath,'\$$\$$ORIGIN/../lib' -L$(INSTALLPREFIX)/lib -Wl,--no-undefined" PKG_CONFIG_PATH=$(INSTALLPREFIX)/lib/pkgconfig ../configure --prefix=$(INSTALLPREFIX) --without-png --with-bzip2 --without-harfbuzz --without-brotli
  154. installdir/lib/libfreetype.so: $(FT_FILE)/build/Makefile
  155. cd $(FT_FILE)/build && $(MAKE) install -j$(NUMBER_OF_PROCESSORS)
  156. # harfbuzz
  157. override HB_PATH := harfbuzz-$(HARFBUZZ_BRANCH)
  158. $(HB_PATH)/CMakeLists.txt:
  159. git clone --depth 1 -b $(HARFBUZZ_BRANCH) https://github.com/harfbuzz/harfbuzz $(HB_PATH)
  160. $(HB_PATH)/build/CMakeCache.txt: $(CMAKE) $(HB_PATH)/CMakeLists.txt installdir/lib/libfreetype.so
  161. $(CMAKE) -B$(HB_PATH)/build -S$(HB_PATH) $(CMAKE_OPTS) -DHB_HAVE_FREETYPE=1 -DHB_BUILD_SUBSET=0 -DBUILD_SHARED_LIBS=1 -DCMAKE_POSITION_INDEPENDENT_CODE=1
  162. installdir/lib/libharfbuzz.so: $(HB_PATH)/build/CMakeCache.txt
  163. $(CMAKE) --build $(HB_PATH)/build --target install -j $(NUMBER_OF_PROCESSORS)
  164. # libmodplug
  165. override LIBMODPLUG_FILE := libmodplug-$(LIBMODPLUG_VERSION)
  166. $(LIBMODPLUG_FILE).tar.gz:
  167. curl $(CURL_DOH_URL) -Lfo $(LIBMODPLUG_FILE).tar.gz http://sourceforge.net/projects/modplug-xmms/files/libmodplug/$(LIBMODPLUG_VERSION)/$(LIBMODPLUG_FILE).tar.gz/download
  168. $(LIBMODPLUG_FILE)/configure: $(LIBMODPLUG_FILE).tar.gz
  169. tar xzf $(LIBMODPLUG_FILE).tar.gz
  170. touch $(LIBMODPLUG_FILE)/configure
  171. $(LIBMODPLUG_FILE)/build/Makefile: $(LIBMODPLUG_FILE)/configure
  172. mkdir -p $(LIBMODPLUG_FILE)/build
  173. cd $(LIBMODPLUG_FILE)/build && $(CONFIGURE)
  174. installdir/lib/libmodplug.so: $(LIBMODPLUG_FILE)/build/Makefile
  175. cd $(LIBMODPLUG_FILE)/build && $(MAKE) install -j$(NUMBER_OF_PROCESSORS)
  176. # LuaJIT
  177. override LUAJIT_PATH := LuaJIT-$(LUAJIT_BRANCH)
  178. $(LUAJIT_PATH)/Makefile:
  179. git clone --depth 1 -b $(LUAJIT_BRANCH) https://github.com/LuaJIT/LuaJIT $(LUAJIT_PATH)
  180. installdir/lib/libluajit-5.1.so: $(LUAJIT_PATH)/Makefile
  181. cd $(LUAJIT_PATH) && LDFLAGS="-Wl,-rpath,'\$$\$$ORIGIN/../lib'" $(MAKE) amalg -j$(NUMBER_OF_PROCESSORS) PREFIX=/usr
  182. cd $(LUAJIT_PATH) && make install PREFIX=$(INSTALLPREFIX)
  183. cd $(LUAJIT_PATH) && make clean
  184. # LOVE
  185. override LOVE_PATH := love2d-$(LOVE_BRANCH)
  186. $(LOVE_PATH)/CMakeLists.txt:
  187. git clone --depth 1 -b $(LOVE_BRANCH) $(LOVE_REPOSITORY) $(LOVE_PATH)
  188. $(LOVE_PATH)/build/CMakeCache.txt $(LOVE_PATH)/build/love.desktop: $(CMAKE) $(LOVE_PATH)/CMakeLists.txt installdir/lib/libluajit-5.1.so installdir/lib/libmodplug.so installdir/lib/libfreetype.so installdir/lib/libopenal.so installdir/lib/libz.so installdir/lib/libtheora.so installdir/lib/libvorbis.so installdir/lib/libogg.so installdir/lib/libSDL3.so installdir/lib/libharfbuzz.so
  189. OPENALDIR=$$PWD/installdir FREETYPE_DIR=$$PWD/installdir $(CMAKE) -B$(LOVE_PATH)/build -S$(LOVE_PATH) $(CMAKE_OPTS) -DCMAKE_POLICY_DEFAULT_CMP0074=NEW -DLOVE_USE_SDL3=ON -DHarfbuzz_ROOT=installdir -DModPlug_ROOT=installdir -DSDL3_ROOT=installdir -DTheora_ROOT=installdir -DVorbis_ROOT=installdir -DZLIB_ROOT=installdir -DOgg_ROOT=installdir -DLuaJIT_ROOT=installdir
  190. installdir/bin/love: $(LOVE_PATH)/build/CMakeCache.txt
  191. $(CMAKE) --build $(LOVE_PATH)/build --target install -j $(NUMBER_OF_PROCESSORS)
  192. installdir/love.sh: love.sh
  193. mkdir -p installdir
  194. cp love.sh installdir/love.sh
  195. touch installdir/love.sh
  196. installdir/AppRun: love.sh installdir/bin/love
  197. mkdir -p installdir
  198. cp love.sh installdir/AppRun
  199. chmod +x installdir/AppRun
  200. installdir/love.desktop: $(LOVE_PATH)/build/love.desktop
  201. cp $(LOVE_PATH)/build/love.desktop installdir/love.desktop
  202. installdir/love.svg: $(LOVE_PATH)/platform/unix/love.svg
  203. cp $(LOVE_PATH)/platform/unix/love.svg installdir/love.svg
  204. installdir/license.txt: $(LOVE_PATH)/license.txt
  205. cp $(LOVE_PATH)/license.txt installdir/license.txt
  206. appimage-prepare $(APPIMAGE_OUTPUT)-debug.tar.gz: installdir/AppRun installdir/love.desktop installdir/love.svg installdir/license.txt appimagetool
  207. mkdir -p installdir2/lib installdir2/bin
  208. cp installdir/AppRun installdir2/AppRun
  209. cp installdir/license.txt installdir2/license.txt
  210. cp installdir/love.desktop installdir2/love.desktop
  211. cp installdir/love.svg installdir2/love.svg
  212. cp -L installdir/bin/love installdir2/bin/love
  213. mkdir -p debugsym
  214. bash $(CURDIR)/separate_debug.sh installdir2/bin/love debugsym/love.debug
  215. patchelf --set-rpath '$$ORIGIN/../lib' installdir2/bin/love
  216. ldd installdir/bin/love | while read line; do \
  217. dll=`echo $$line | sed 's/\s.*//'`; \
  218. if [ -f installdir/lib/$$dll ]; then \
  219. cp -L installdir/lib/$$dll installdir2/lib/$$dll; \
  220. bash $(CURDIR)/separate_debug.sh installdir2/lib/$$dll debugsym/$$dll.debug; \
  221. patchelf --set-rpath '$$ORIGIN/../lib' installdir2/lib/$$dll; \
  222. echo $$dll; \
  223. fi \
  224. done
  225. cp -r installdir/share installdir2/
  226. cd debugsym; tar -cvzf ../$(APPIMAGE_OUTPUT)-debug.tar.gz *
  227. -rm -rf installdir2/share/aclocal
  228. -rm -rf installdir2/share/man
  229. -rm -rf installdir2/share/doc
  230. -rm -rf installdir2/share/openal
  231. $(TAR_OUTPUT): installdir/AppRun installdir/love.desktop installdir/love.svg installdir/license.txt appimagetool appimage-prepare
  232. cd installdir2; tar -cvzf ../$(TAR_OUTPUT) *
  233. $(APPIMAGE_OUTPUT): installdir/AppRun installdir/love.desktop installdir/love.svg installdir/license.txt appimagetool appimage-prepare
  234. ifeq ($(QEMU),)
  235. ./appimagetool installdir2 $(APPIMAGE_OUTPUT)
  236. else
  237. cd squashfs-root/usr/lib && ../../AppRun ../../../installdir2 ../../../$(APPIMAGE_OUTPUT)
  238. endif
  239. getdeps: $(CMAKE) appimagetool $(SDL3_PATH)/CMakeLists.txt $(LIBOGG_FILE).tar.gz $(LIBVORBIS_FILE).tar.gz $(LIBTHEORA_FILE).tar.gz $(ZLIB_PATH)/configure $(BZIP2_FILE).tar.gz $(FT_FILE).tar.gz $(LIBMODPLUG_FILE).tar.gz $(LUAJIT_PATH)/Makefile $(LOVE_PATH)/CMakeLists.txt $(HB_PATH)/CMakeLists.txt
  240. AppImage: $(APPIMAGE_OUTPUT)
  241. tar: $(TAR_OUTPUT)
  242. default: $(APPIMAGE_OUTPUT) $(TAR_OUTPUT)
  243. .DEFAULT_GOAL := default
  244. .PHONY := default getdeps cmake appimage-prepare AppImage tar dbgsym