From 9edd77d2e26ac8c675e0944f8f387123536d4f92 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Tue, 11 Mar 2025 15:20:31 +0100 Subject: [PATCH 1/4] cmake: make possible to build both game and engine against the engine Freetype submodule --- CMakeLists.txt | 19 +++++++++++-------- freetype.cmake | 35 ++++++++++++++++++++++------------- 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8eebf887ce..cabf86fd05 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -778,16 +778,20 @@ endif() option(PREFER_EXTERNAL_LIBS "Tries to use system libs where possible." ON) macro(prefer_package LIB_NAME LIB_CMAKE) - if (PREFER_EXTERNAL_LIBS AND NOT NACL) - find_package(${LIB_NAME}) + if (NOT ${LIB_NAME}_FOUND) + if (PREFER_EXTERNAL_LIBS AND NOT NACL) + find_package(${LIB_NAME}) - if (NOT ${LIB_NAME}_FOUND) - message(WARNING "PREFER_EXTERNAL_LIBS is enabled but external ${LIB_NAME} is not found, falling back to vendored ${LIB_NAME}.") + if (NOT ${LIB_NAME}_FOUND) + message(WARNING "PREFER_EXTERNAL_LIBS is enabled but external ${LIB_NAME} is not found, falling back to vendored ${LIB_NAME}.") + endif() endif() - endif() - if (NOT ${LIB_NAME}_FOUND) - include(${LIB_CMAKE}) + if (NOT ${LIB_NAME}_FOUND) + include(${LIB_CMAKE}) + + set(${LIB_NAME}_FOUND ON) + endif() endif() endmacro() @@ -817,7 +821,6 @@ if (BUILD_CLIENT) set(LIBS_CLIENT ${LIBS_CLIENT} ${PNG_LIBRARIES}) prefer_package(Freetype ${DAEMON_DIR}/freetype.cmake) - include_directories(${FREETYPE_INCLUDE_DIRS}) set(LIBS_CLIENT ${LIBS_CLIENT} ${FREETYPE_LIBRARIES}) diff --git a/freetype.cmake b/freetype.cmake index 2ba7fe93de..45455cedb0 100644 --- a/freetype.cmake +++ b/freetype.cmake @@ -2,24 +2,33 @@ set(FREETYPE_DIR ${DAEMON_DIR}/libs/freetype) set(FREETYPE_INCLUDE_DIRS ${FREETYPE_DIR}/include) set(FREETYPE_LIBRARIES freetype) -option(FT_DISABLE_BROTLI "Disable Brotli" ON) -option(FT_DISABLE_BZIP2 "Disable bzip2" ON) -option(FT_DISABLE_HARFBUZZ "Disable HarfBuzz" ON) -option(FT_DISABLE_PNG "Disable PNG" ON) - if (PREFER_EXTERNAL_LIBS AND NOT NACL) set(FREETYPE_INTERNAL_ZLIB OFF) else() set(FREETYPE_INTERNAL_ZLIB ON) endif() -set(FT_DISABLE_ZLIB ${FREETYPE_INTERNAL_ZLIB} CACHE BOOL "Disable external zlib" FORCE) +if (NOT ${FREETYPE_INTERNAL_ZLIB}) + find_package(ZLIB REQUIRED) + set(FREETYPE_LIBRARIES ${FREETYPE_LIBRARIES} ${ZLIB_LIBRARIES}) +endif() + +# Do not re-add the target if already set to be built. +# For example both the engine and a native game may request Freetype +# to be built, but we need to only build once for both. +if (NOT TARGET freetype) + option(FT_DISABLE_BROTLI "Disable Brotli" ON) + option(FT_DISABLE_BZIP2 "Disable bzip2" ON) + option(FT_DISABLE_HARFBUZZ "Disable HarfBuzz" ON) + option(FT_DISABLE_PNG "Disable PNG" ON) + set(FT_DISABLE_ZLIB ${FREETYPE_INTERNAL_ZLIB} CACHE BOOL "Disable external zlib" FORCE) -add_subdirectory(${FREETYPE_DIR}) + add_subdirectory(${FREETYPE_DIR}) -mark_as_advanced(FT_DISABLE_BROTLI) -mark_as_advanced(FT_DISABLE_BZIP2) -mark_as_advanced(FT_DISABLE_HARFBUZZ) -mark_as_advanced(FT_DISABLE_PNG) -mark_as_advanced(FT_DISABLE_ZLIB) -mark_as_advanced(FT_ENABLE_ERROR_STRINGS) + mark_as_advanced(FT_DISABLE_BROTLI) + mark_as_advanced(FT_DISABLE_BZIP2) + mark_as_advanced(FT_DISABLE_HARFBUZZ) + mark_as_advanced(FT_DISABLE_PNG) + mark_as_advanced(FT_DISABLE_ZLIB) + mark_as_advanced(FT_ENABLE_ERROR_STRINGS) +endif() From 4de56578ec6fa021295c7b03db8f78f157cff648 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Sat, 8 Mar 2025 14:46:49 +0100 Subject: [PATCH 2/4] cmake: always use the -fPIC compiler flag Some libraries may be built statically before being linked against game dll, so -fPIC would be required, and then we better compile everything with -fPIC. --- cmake/DaemonFlags.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/DaemonFlags.cmake b/cmake/DaemonFlags.cmake index 416fd0ff93..036c32fbe9 100644 --- a/cmake/DaemonFlags.cmake +++ b/cmake/DaemonFlags.cmake @@ -381,6 +381,8 @@ else() # Don't set _FORTIFY_SOURCE in debug builds. endif() + try_c_cxx_flag(FPIC "-fPIC") + if (USE_HARDENING) # PNaCl accepts the flags but does not define __stack_chk_guard and __stack_chk_fail. if (NOT NACL) @@ -395,8 +397,6 @@ else() try_c_cxx_flag(WSTACK_PROTECTOR "-Wstack-protector") if (NOT NACL OR (NACL AND GAME_PIE)) - try_c_cxx_flag(FPIC "-fPIC") - # The -pie flag requires -fPIC: # > ld: error: relocation R_X86_64_64 cannot be used against local symbol; recompile with -fPIC # This flag isn't used on macOS: From 22e1afa9ca2f86c82bbb431d286c10ac6dc02b47 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Sat, 8 Mar 2025 13:23:56 +0100 Subject: [PATCH 3/4] cmake: do not prefer system libs by default Engine or game submodules maybe much recent than the one the system provides, and define symbols not found in system libraries. While it is probably unlikely to happen with freetype, this is more likely to happen with some game libraries like Lua. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cabf86fd05..49966045c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -775,7 +775,7 @@ if (USE_BREAKPAD) endif() endif() -option(PREFER_EXTERNAL_LIBS "Tries to use system libs where possible." ON) +option(PREFER_EXTERNAL_LIBS "Tries to use system libs where possible." OFF) macro(prefer_package LIB_NAME LIB_CMAKE) if (NOT ${LIB_NAME}_FOUND) From 23bc0d224f21918db05ea300a932f2f21bc7475b Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Sat, 8 Mar 2025 13:10:59 +0100 Subject: [PATCH 4/4] ci: prefer submodule over system libs --- .github/workflows/codeql.yml | 2 +- azure-pipelines.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 55340c30c7..e59be16cb4 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -73,7 +73,7 @@ jobs: run: | set -x sudo apt-get update - sudo apt-get -y -q --no-install-recommends install zlib1g-dev libncursesw5-dev libgeoip-dev nettle-dev libgmp-dev libcurl4-gnutls-dev libsdl2-dev libogg-dev libvorbis-dev libopusfile-dev libwebp-dev libjpeg8-dev libpng-dev libfreetype6-dev libglew-dev libopenal-dev ninja-build + sudo apt-get -y -q --no-install-recommends install zlib1g-dev libncursesw5-dev libgeoip-dev nettle-dev libgmp-dev libcurl4-gnutls-dev libsdl2-dev libogg-dev libvorbis-dev libopusfile-dev libwebp-dev libjpeg8-dev libpng-dev libglew-dev libopenal-dev ninja-build git submodule update --init --recursive curl -sS https://gitlab.com/illwieckz/git-checkout-modules/raw/master/git-checkout-modules -o ~/git-checkout-modules diff --git a/azure-pipelines.yml b/azure-pipelines.yml index d5b61aba97..ee1f4a3b50 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -117,7 +117,7 @@ jobs: - bash: | set -e sudo apt-get update - sudo apt-get -y -q --no-install-recommends install zlib1g-dev libncursesw5-dev libgeoip-dev nettle-dev libgmp-dev libcurl4-gnutls-dev libsdl2-dev libogg-dev libvorbis-dev libopusfile-dev libwebp-dev libjpeg8-dev libpng-dev libfreetype6-dev libglew-dev libopenal-dev liblua5.2-dev ninja-build $(EXTRA_PACKAGES) + sudo apt-get -y -q --no-install-recommends install zlib1g-dev libncursesw5-dev libgeoip-dev nettle-dev libgmp-dev libcurl4-gnutls-dev libsdl2-dev libogg-dev libvorbis-dev libopusfile-dev libwebp-dev libjpeg8-dev libpng-dev libglew-dev libopenal-dev liblua5.2-dev ninja-build $(EXTRA_PACKAGES) $(EXTRA_INSTALLS) displayName: 'Install deps' - bash: |