]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
Take advantage of IrrlichtMt CMake target (#11287)
authorJosiahWI <41302989+JosiahWI@users.noreply.github.com>
Tue, 27 Jul 2021 17:11:27 +0000 (12:11 -0500)
committerGitHub <noreply@github.com>
Tue, 27 Jul 2021 17:11:27 +0000 (19:11 +0200)
With the CMake changes to IrrlichtMt, it's now possible to use a target for IrrlichtMt.
Besides greatly improving the ease of setting up IrrlichtMt for users building the client, it removes the need for Minetest's CMake to include transitive dependencies such as image libraries, cleaning it up a tiny bit. The PR works by finding the IrrlichtMt package and linking to the target it provides. If the package isn't found and it isn't building the client, it will still fall back to using just the headers of old Irrlicht or IrrlichtMt.

.gitlab-ci.yml
CMakeLists.txt
README.md
cmake/Modules/FindIrrlicht.cmake [deleted file]
cmake/Modules/MinetestFindIrrlichtHeaders.cmake [new file with mode: 0644]
src/CMakeLists.txt
util/buildbot/buildwin32.sh
util/buildbot/buildwin64.sh
util/ci/common.sh

index b5c4695bb15edcc79bc9ac17ad26600841b79e45..d335285d5aeb7ee585d14b2039505de4f6af3461 100644 (file)
@@ -9,7 +9,7 @@ stages:
   - deploy
 
 variables:
-  IRRLICHT_TAG: "1.9.0mt1"
+  IRRLICHT_TAG: "1.9.0mt2"
   MINETEST_GAME_REPO: "https://github.com/minetest/minetest_game.git"
   CONTAINER_IMAGE: registry.gitlab.com/$CI_PROJECT_PATH
 
@@ -19,14 +19,10 @@ variables:
    - apt-get update
    - apt-get -y install build-essential git cmake libpng-dev libjpeg-dev libxxf86vm-dev libgl1-mesa-dev libsqlite3-dev libleveldb-dev libogg-dev libvorbis-dev libopenal-dev libcurl4-gnutls-dev libfreetype6-dev zlib1g-dev libgmp-dev libjsoncpp-dev
   script:
-    - git clone https://github.com/minetest/irrlicht -b $IRRLICHT_TAG
-    - cd irrlicht
-    - cmake . -DBUILD_SHARED_LIBS=OFF
-    - make -j2
-    - cd ..
+    - git clone https://github.com/minetest/irrlicht -b $IRRLICHT_TAG lib/irrlichtmt
     - mkdir cmakebuild
     - cd cmakebuild
-    - cmake -DIRRLICHT_LIBRARY=$PWD/../irrlicht/lib/Linux/libIrrlichtMt.a -DIRRLICHT_INCLUDE_DIR=$PWD/../irrlicht/include -DCMAKE_INSTALL_PREFIX=../artifact/minetest/usr/ -DCMAKE_BUILD_TYPE=Release -DRUN_IN_PLACE=FALSE -DENABLE_GETTEXT=TRUE -DBUILD_SERVER=TRUE ..
+    - cmake -DCMAKE_INSTALL_PREFIX=../artifact/minetest/usr/ -DCMAKE_BUILD_TYPE=Release -DRUN_IN_PLACE=FALSE -DENABLE_GETTEXT=TRUE -DBUILD_SERVER=TRUE ..
     - make -j2
     - make install
   artifacts:
index 42b3435405e0da84178166827b7cf76c94591695..fe508ffdbecdddf291ad1eb68728ecbc5aeaa0c8 100644 (file)
@@ -68,34 +68,25 @@ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/lib/irrlichtmt")
        if(NOT TARGET IrrlichtMt)
                message(FATAL_ERROR "IrrlichtMt project is missing a CMake target?!")
        endif()
-
-       # set include dir the way it would normally be
-       set(IRRLICHT_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/lib/irrlichtmt/include")
-       set(IRRLICHT_LIBRARY IrrlichtMt)
 else()
-       find_package(Irrlicht)
-       if(BUILD_CLIENT AND NOT IRRLICHT_FOUND)
-               message(FATAL_ERROR "IrrlichtMt is required to build the client, but it was not found.")
-       elseif(NOT IRRLICHT_INCLUDE_DIR)
-               message(FATAL_ERROR "Irrlicht or IrrlichtMt headers are required to build the server, but none found.")
-       endif()
-endif()
+       find_package(IrrlichtMt QUIET)
+       if(NOT TARGET IrrlichtMt::IrrlichtMt)
+               string(CONCAT explanation_msg
+                       "The Minetest team has forked Irrlicht to make their own customizations. "
+                       "It can be found here: https://github.com/minetest/irrlicht")
+               if(BUILD_CLIENT)
+                       message(FATAL_ERROR "IrrlichtMt is required to build the client, but it was not found.\n${explanation_msg}")
+               endif()
 
-include(CheckSymbolExists)
-set(CMAKE_REQUIRED_INCLUDES ${IRRLICHT_INCLUDE_DIR})
-unset(HAS_FORKED_IRRLICHT CACHE)
-check_symbol_exists(IRRLICHT_VERSION_MT "IrrCompileConfig.h" HAS_FORKED_IRRLICHT)
-if(NOT HAS_FORKED_IRRLICHT)
-       string(CONCAT EXPLANATION_MSG
-               "Irrlicht found, but it is not IrrlichtMt (Minetest's Irrlicht fork). "
-               "The Minetest team has forked Irrlicht to make their own customizations. "
-               "It can be found here: https://github.com/minetest/irrlicht")
-       if(BUILD_CLIENT)
-               message(FATAL_ERROR "${EXPLANATION_MSG}\n"
-                       "Building the client with upstream Irrlicht is no longer possible.")
+               include(MinetestFindIrrlichtHeaders)
+               if(NOT IRRLICHT_INCLUDE_DIR)
+                       message(FATAL_ERROR "Irrlicht or IrrlichtMt headers are required to build the server, but none found.\n${explanation_msg}")
+               endif()
+               message(STATUS "Found Irrlicht headers: ${IRRLICHT_INCLUDE_DIR}")
+               add_library(IrrlichtMt::IrrlichtMt INTERFACE IMPORTED)
+               target_include_directories(IrrlichtMt::IrrlichtMt INTERFACE "${IRRLICHT_INCLUDE_DIR}")
        else()
-               message(WARNING "${EXPLANATION_MSG}\n"
-                       "The server can still be built with upstream Irrlicht but this is DISCOURAGED.")
+               message(STATUS "Found IrrlichtMt ${IrrlichtMt_VERSION}")
        endif()
 endif()
 
index 0cd134f27beb9eac49a6f6ae595f1b16daa17623..1774d1ea38d799311457d0b24b898807a8e7d534 100644 (file)
--- a/README.md
+++ b/README.md
@@ -223,6 +223,9 @@ Run it:
   - Debug build is slower, but gives much more useful output in a debugger.
 - If you build a bare server you don't need to have the Irrlicht or IrrlichtMt library installed.
   - In that case use `-DIRRLICHT_INCLUDE_DIR=/some/where/irrlicht/include`.
+- IrrlichtMt can also be installed somewhere that is not a standard install path.
+  - In that case use `-DCMAKE_PREFIX_PATH=/path/to/install_prefix`
+  - The path must be set so that `$(CMAKE_PREFIX_PATH)/lib/cmake/IrrlichtMt` exists.
 
 ### CMake options
 
diff --git a/cmake/Modules/FindIrrlicht.cmake b/cmake/Modules/FindIrrlicht.cmake
deleted file mode 100644 (file)
index 1e33465..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-
-mark_as_advanced(IRRLICHT_DLL)
-
-# Find include directory and libraries
-
-# find our fork first, then upstream (TODO: remove this?)
-foreach(libname IN ITEMS IrrlichtMt Irrlicht)
-       string(TOLOWER "${libname}" libname2)
-
-       find_path(IRRLICHT_INCLUDE_DIR NAMES irrlicht.h
-               DOC "Path to the directory with IrrlichtMt includes"
-               PATHS
-               /usr/local/include/${libname2}
-               /usr/include/${libname2}
-               /system/develop/headers/${libname2} #Haiku
-               PATH_SUFFIXES "include/${libname2}"
-       )
-
-       find_library(IRRLICHT_LIBRARY NAMES lib${libname} ${libname}
-               DOC "Path to the IrrlichtMt library file"
-               PATHS
-               /usr/local/lib
-               /usr/lib
-               /system/develop/lib # Haiku
-       )
-
-       if(IRRLICHT_INCLUDE_DIR OR IRRLICHT_LIBRARY)
-               break()
-       endif()
-endforeach()
-
-# Handholding for users
-if(IRRLICHT_INCLUDE_DIR AND (NOT IS_DIRECTORY "${IRRLICHT_INCLUDE_DIR}" OR
-       NOT EXISTS "${IRRLICHT_INCLUDE_DIR}/irrlicht.h"))
-       message(WARNING "IRRLICHT_INCLUDE_DIR was set to ${IRRLICHT_INCLUDE_DIR} "
-               "but irrlicht.h does not exist inside. The path will not be used.")
-       unset(IRRLICHT_INCLUDE_DIR CACHE)
-endif()
-if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL "Linux" OR APPLE)
-       # (only on systems where we're sure how a valid library looks like)
-       if(IRRLICHT_LIBRARY AND (NOT EXISTS "${IRRLICHT_LIBRARY}" OR
-               NOT IRRLICHT_LIBRARY MATCHES "\\.(a|so|dylib|lib)([.0-9]+)?$"))
-               message(WARNING "IRRLICHT_LIBRARY was set to ${IRRLICHT_LIBRARY} "
-                       "but is not a valid library file. The path will not be used.")
-               unset(IRRLICHT_LIBRARY CACHE)
-       endif()
-endif()
-
-# On Windows, find the DLL for installation
-if(WIN32)
-       # If VCPKG_APPLOCAL_DEPS is ON, dll's are automatically handled by VCPKG
-       if(NOT VCPKG_APPLOCAL_DEPS)
-               find_file(IRRLICHT_DLL NAMES IrrlichtMt.dll
-                       DOC "Path of the IrrlichtMt dll (for installation)"
-               )
-       endif()
-endif(WIN32)
-
-include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(Irrlicht DEFAULT_MSG IRRLICHT_LIBRARY IRRLICHT_INCLUDE_DIR)
-
diff --git a/cmake/Modules/MinetestFindIrrlichtHeaders.cmake b/cmake/Modules/MinetestFindIrrlichtHeaders.cmake
new file mode 100644 (file)
index 0000000..d33b296
--- /dev/null
@@ -0,0 +1,26 @@
+# Locate Irrlicht or IrrlichtMt headers on system.
+
+foreach(libname IN ITEMS IrrlichtMt Irrlicht)
+       string(TOLOWER "${libname}" libname2)
+
+       find_path(IRRLICHT_INCLUDE_DIR NAMES irrlicht.h
+               DOC "Path to the directory with IrrlichtMt includes"
+               PATHS
+               /usr/local/include/${libname2}
+               /usr/include/${libname2}
+               /system/develop/headers/${libname2} #Haiku
+               PATH_SUFFIXES "include/${libname2}"
+       )
+
+       if(IRRLICHT_INCLUDE_DIR)
+               break()
+       endif()
+endforeach()
+
+# Handholding for users
+if(IRRLICHT_INCLUDE_DIR AND (NOT IS_DIRECTORY "${IRRLICHT_INCLUDE_DIR}" OR
+       NOT EXISTS "${IRRLICHT_INCLUDE_DIR}/irrlicht.h"))
+       message(WARNING "IRRLICHT_INCLUDE_DIR was set to ${IRRLICHT_INCLUDE_DIR} "
+               "but irrlicht.h does not exist inside. The path will not be used.")
+       unset(IRRLICHT_INCLUDE_DIR CACHE)
+endif()
index ac460883add96612dbb321b407116027e226a62e..7a5e48b49896ab142d2978bc557f9a220968a742 100644 (file)
@@ -293,33 +293,7 @@ else()
                if(NOT HAIKU AND NOT APPLE)
                        find_package(X11 REQUIRED)
                endif(NOT HAIKU AND NOT APPLE)
-
-               ##
-               # The following dependencies are transitive dependencies from Irrlicht.
-               # Minetest itself does not use them, but we link them so that statically
-               # linking Irrlicht works.
-               if(NOT HAIKU AND NOT APPLE)
-                       # This way Xxf86vm is found on OpenBSD too
-                       find_library(XXF86VM_LIBRARY Xxf86vm)
-                       mark_as_advanced(XXF86VM_LIBRARY)
-                       set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
-               endif(NOT HAIKU AND NOT APPLE)
-
-               find_package(JPEG REQUIRED)
-               find_package(PNG REQUIRED)
-               if(APPLE)
-                       find_library(CARBON_LIB Carbon REQUIRED)
-                       find_library(COCOA_LIB Cocoa REQUIRED)
-                       find_library(IOKIT_LIB IOKit REQUIRED)
-                       mark_as_advanced(
-                               CARBON_LIB
-                               COCOA_LIB
-                               IOKIT_LIB
-                       )
-                       SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
-               endif(APPLE)
-               ##
-       endif(BUILD_CLIENT)
+       endif()
 
        find_package(ZLIB REQUIRED)
        set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
@@ -511,9 +485,7 @@ endif()
 include_directories(
        ${PROJECT_BINARY_DIR}
        ${PROJECT_SOURCE_DIR}
-       ${IRRLICHT_INCLUDE_DIR}
        ${ZLIB_INCLUDE_DIR}
-       ${PNG_INCLUDE_DIR}
        ${SOUND_INCLUDE_DIRS}
        ${SQLITE3_INCLUDE_DIR}
        ${LUA_INCLUDE_DIR}
@@ -548,10 +520,7 @@ if(BUILD_CLIENT)
        target_link_libraries(
                ${PROJECT_NAME}
                ${ZLIB_LIBRARIES}
-               ${IRRLICHT_LIBRARY}
-               ${JPEG_LIBRARIES}
-               ${BZIP2_LIBRARIES}
-               ${PNG_LIBRARIES}
+               IrrlichtMt::IrrlichtMt
                ${X11_LIBRARIES}
                ${SOUND_LIBRARIES}
                ${SQLITE3_LIBRARY}
@@ -559,7 +528,6 @@ if(BUILD_CLIENT)
                ${GMP_LIBRARY}
                ${JSON_LIBRARY}
                ${PLATFORM_LIBS}
-               ${CLIENT_PLATFORM_LIBS}
        )
        if(NOT USE_LUAJIT)
                set_target_properties(${PROJECT_NAME} PROPERTIES
@@ -629,6 +597,11 @@ endif(BUILD_CLIENT)
 if(BUILD_SERVER)
        add_executable(${PROJECT_NAME}server ${server_SRCS} ${extra_windows_SRCS})
        add_dependencies(${PROJECT_NAME}server GenerateVersion)
+
+       get_target_property(
+               IRRLICHT_INCLUDES IrrlichtMt::IrrlichtMt INTERFACE_INCLUDE_DIRECTORIES)
+       # Doesn't work without PRIVATE/PUBLIC/INTERFACE mode specified.
+       target_include_directories(${PROJECT_NAME}server PRIVATE ${IRRLICHT_INCLUDES})
        target_link_libraries(
                ${PROJECT_NAME}server
                ${ZLIB_LIBRARIES}
index 468df05a9c443d21b180b7b49c5e6371d7783df1..40c20525081b1098f33ae8ffddd5c80951c510cc 100755 (executable)
@@ -30,7 +30,7 @@ if [ -z "$toolchain_file" ]; then
 fi
 echo "Using $toolchain_file"
 
-irrlicht_version=1.9.0mt1
+irrlicht_version=1.9.0mt2
 ogg_version=1.3.4
 vorbis_version=1.3.7
 curl_version=7.76.1
@@ -97,7 +97,7 @@ cd $builddir
 mkdir build
 cd build
 
-irr_dlls=$(echo $libdir/irrlicht/bin/*.dll | tr ' ' ';')
+irr_dlls=$(echo $libdir/irrlicht/lib/*.dll | tr ' ' ';')
 vorbis_dlls=$(echo $libdir/libvorbis/bin/libvorbis{,file}-*.dll | tr ' ' ';')
 gettext_dlls=$(echo $libdir/gettext/bin/lib{intl,iconv}-*.dll | tr ' ' ';')
 
@@ -113,9 +113,7 @@ cmake -S $sourcedir -B . \
        -DENABLE_FREETYPE=1 \
        -DENABLE_LEVELDB=1 \
        \
-       -DIRRLICHT_INCLUDE_DIR=$libdir/irrlicht/include/irrlichtmt \
-       -DIRRLICHT_LIBRARY=$libdir/irrlicht/lib/libIrrlichtMt.dll.a \
-       -DIRRLICHT_DLL="$irr_dlls" \
+       -DCMAKE_PREFIX_PATH=$libdir/irrlicht \
        \
        -DZLIB_INCLUDE_DIR=$libdir/zlib/include \
        -DZLIB_LIBRARIES=$libdir/zlib/lib/libz.dll.a \
index 3b5d61c96280c603b5cf0c9c2277b89c886b0566..6d3deceaecdbc82e5686cd7141d7a3652baf0c85 100755 (executable)
@@ -30,7 +30,7 @@ if [ -z "$toolchain_file" ]; then
 fi
 echo "Using $toolchain_file"
 
-irrlicht_version=1.9.0mt1
+irrlicht_version=1.9.0mt2
 ogg_version=1.3.4
 vorbis_version=1.3.7
 curl_version=7.76.1
@@ -97,7 +97,7 @@ cd $builddir
 mkdir build
 cd build
 
-irr_dlls=$(echo $libdir/irrlicht/bin/*.dll | tr ' ' ';')
+irr_dlls=$(echo $libdir/irrlicht/lib/*.dll | tr ' ' ';')
 vorbis_dlls=$(echo $libdir/libvorbis/bin/libvorbis{,file}-*.dll | tr ' ' ';')
 gettext_dlls=$(echo $libdir/gettext/bin/lib{intl,iconv}-*.dll | tr ' ' ';')
 
@@ -113,9 +113,7 @@ cmake -S $sourcedir -B . \
        -DENABLE_FREETYPE=1 \
        -DENABLE_LEVELDB=1 \
        \
-       -DIRRLICHT_INCLUDE_DIR=$libdir/irrlicht/include/irrlichtmt \
-       -DIRRLICHT_LIBRARY=$libdir/irrlicht/lib/libIrrlichtMt.dll.a \
-       -DIRRLICHT_DLL="$irr_dlls" \
+       -DCMAKE_PREFIX_PATH=$libdir/irrlicht \
        \
        -DZLIB_INCLUDE_DIR=$libdir/zlib/include \
        -DZLIB_LIBRARIES=$libdir/zlib/lib/libz.dll.a \
index 6a28482fd6a3e999c672cc8484a510ab2915e49d..70a1bedaf7e7e018a90592fea8ff14a16b53469a 100644 (file)
@@ -11,9 +11,7 @@ install_linux_deps() {
                shift
                pkgs+=(libirrlicht-dev)
        else
-               # TODO: return old URL when IrrlichtMt 1.9.0mt2 is tagged
-               #wget "https://github.com/minetest/irrlicht/releases/download/1.9.0mt1/ubuntu-bionic.tar.gz"
-               wget "http://minetest.kitsunemimi.pw/irrlichtmt-patched-temporary.tgz" -O ubuntu-bionic.tar.gz
+               wget "https://github.com/minetest/irrlicht/releases/download/1.9.0mt2/ubuntu-bionic.tar.gz"
                sudo tar -xaf ubuntu-bionic.tar.gz -C /usr/local
        fi