Take advantage of IrrlichtMt CMake target (#11287)

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.
This commit is contained in:
JosiahWI 2021-07-27 12:11:27 -05:00 committed by GitHub
parent 216728cc5e
commit cf136914cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 62 additions and 140 deletions

@ -9,7 +9,7 @@ stages:
- deploy - deploy
variables: variables:
IRRLICHT_TAG: "1.9.0mt1" IRRLICHT_TAG: "1.9.0mt2"
MINETEST_GAME_REPO: "https://github.com/minetest/minetest_game.git" MINETEST_GAME_REPO: "https://github.com/minetest/minetest_game.git"
CONTAINER_IMAGE: registry.gitlab.com/$CI_PROJECT_PATH CONTAINER_IMAGE: registry.gitlab.com/$CI_PROJECT_PATH
@ -19,14 +19,10 @@ variables:
- apt-get update - 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 - 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: script:
- git clone https://github.com/minetest/irrlicht -b $IRRLICHT_TAG - git clone https://github.com/minetest/irrlicht -b $IRRLICHT_TAG lib/irrlichtmt
- cd irrlicht
- cmake . -DBUILD_SHARED_LIBS=OFF
- make -j2
- cd ..
- mkdir cmakebuild - mkdir cmakebuild
- cd 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 -j2
- make install - make install
artifacts: artifacts:

@ -68,34 +68,25 @@ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/lib/irrlichtmt")
if(NOT TARGET IrrlichtMt) if(NOT TARGET IrrlichtMt)
message(FATAL_ERROR "IrrlichtMt project is missing a CMake target?!") message(FATAL_ERROR "IrrlichtMt project is missing a CMake target?!")
endif() 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() else()
find_package(Irrlicht) find_package(IrrlichtMt QUIET)
if(BUILD_CLIENT AND NOT IRRLICHT_FOUND) if(NOT TARGET IrrlichtMt::IrrlichtMt)
message(FATAL_ERROR "IrrlichtMt is required to build the client, but it was not found.") string(CONCAT explanation_msg
elseif(NOT IRRLICHT_INCLUDE_DIR) "The Minetest team has forked Irrlicht to make their own customizations. "
message(FATAL_ERROR "Irrlicht or IrrlichtMt headers are required to build the server, but none found.") "It can be found here: https://github.com/minetest/irrlicht")
endif() if(BUILD_CLIENT)
endif() message(FATAL_ERROR "IrrlichtMt is required to build the client, but it was not found.\n${explanation_msg}")
endif()
include(CheckSymbolExists) include(MinetestFindIrrlichtHeaders)
set(CMAKE_REQUIRED_INCLUDES ${IRRLICHT_INCLUDE_DIR}) if(NOT IRRLICHT_INCLUDE_DIR)
unset(HAS_FORKED_IRRLICHT CACHE) message(FATAL_ERROR "Irrlicht or IrrlichtMt headers are required to build the server, but none found.\n${explanation_msg}")
check_symbol_exists(IRRLICHT_VERSION_MT "IrrCompileConfig.h" HAS_FORKED_IRRLICHT) endif()
if(NOT HAS_FORKED_IRRLICHT) message(STATUS "Found Irrlicht headers: ${IRRLICHT_INCLUDE_DIR}")
string(CONCAT EXPLANATION_MSG add_library(IrrlichtMt::IrrlichtMt INTERFACE IMPORTED)
"Irrlicht found, but it is not IrrlichtMt (Minetest's Irrlicht fork). " target_include_directories(IrrlichtMt::IrrlichtMt INTERFACE "${IRRLICHT_INCLUDE_DIR}")
"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.")
else() else()
message(WARNING "${EXPLANATION_MSG}\n" message(STATUS "Found IrrlichtMt ${IrrlichtMt_VERSION}")
"The server can still be built with upstream Irrlicht but this is DISCOURAGED.")
endif() endif()
endif() endif()

@ -223,6 +223,9 @@ Run it:
- Debug build is slower, but gives much more useful output in a debugger. - 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. - 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`. - 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 ### CMake options

@ -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)

@ -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()

@ -293,33 +293,7 @@ else()
if(NOT HAIKU AND NOT APPLE) if(NOT HAIKU AND NOT APPLE)
find_package(X11 REQUIRED) find_package(X11 REQUIRED)
endif(NOT HAIKU AND NOT APPLE) endif(NOT HAIKU AND NOT APPLE)
endif()
##
# 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)
find_package(ZLIB REQUIRED) find_package(ZLIB REQUIRED)
set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS}) set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
@ -511,9 +485,7 @@ endif()
include_directories( include_directories(
${PROJECT_BINARY_DIR} ${PROJECT_BINARY_DIR}
${PROJECT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}
${IRRLICHT_INCLUDE_DIR}
${ZLIB_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR}
${PNG_INCLUDE_DIR}
${SOUND_INCLUDE_DIRS} ${SOUND_INCLUDE_DIRS}
${SQLITE3_INCLUDE_DIR} ${SQLITE3_INCLUDE_DIR}
${LUA_INCLUDE_DIR} ${LUA_INCLUDE_DIR}
@ -548,10 +520,7 @@ if(BUILD_CLIENT)
target_link_libraries( target_link_libraries(
${PROJECT_NAME} ${PROJECT_NAME}
${ZLIB_LIBRARIES} ${ZLIB_LIBRARIES}
${IRRLICHT_LIBRARY} IrrlichtMt::IrrlichtMt
${JPEG_LIBRARIES}
${BZIP2_LIBRARIES}
${PNG_LIBRARIES}
${X11_LIBRARIES} ${X11_LIBRARIES}
${SOUND_LIBRARIES} ${SOUND_LIBRARIES}
${SQLITE3_LIBRARY} ${SQLITE3_LIBRARY}
@ -559,7 +528,6 @@ if(BUILD_CLIENT)
${GMP_LIBRARY} ${GMP_LIBRARY}
${JSON_LIBRARY} ${JSON_LIBRARY}
${PLATFORM_LIBS} ${PLATFORM_LIBS}
${CLIENT_PLATFORM_LIBS}
) )
if(NOT USE_LUAJIT) if(NOT USE_LUAJIT)
set_target_properties(${PROJECT_NAME} PROPERTIES set_target_properties(${PROJECT_NAME} PROPERTIES
@ -629,6 +597,11 @@ endif(BUILD_CLIENT)
if(BUILD_SERVER) if(BUILD_SERVER)
add_executable(${PROJECT_NAME}server ${server_SRCS} ${extra_windows_SRCS}) add_executable(${PROJECT_NAME}server ${server_SRCS} ${extra_windows_SRCS})
add_dependencies(${PROJECT_NAME}server GenerateVersion) 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( target_link_libraries(
${PROJECT_NAME}server ${PROJECT_NAME}server
${ZLIB_LIBRARIES} ${ZLIB_LIBRARIES}

@ -30,7 +30,7 @@ if [ -z "$toolchain_file" ]; then
fi fi
echo "Using $toolchain_file" echo "Using $toolchain_file"
irrlicht_version=1.9.0mt1 irrlicht_version=1.9.0mt2
ogg_version=1.3.4 ogg_version=1.3.4
vorbis_version=1.3.7 vorbis_version=1.3.7
curl_version=7.76.1 curl_version=7.76.1
@ -97,7 +97,7 @@ cd $builddir
mkdir build mkdir build
cd 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 ' ' ';') vorbis_dlls=$(echo $libdir/libvorbis/bin/libvorbis{,file}-*.dll | tr ' ' ';')
gettext_dlls=$(echo $libdir/gettext/bin/lib{intl,iconv}-*.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_FREETYPE=1 \
-DENABLE_LEVELDB=1 \ -DENABLE_LEVELDB=1 \
\ \
-DIRRLICHT_INCLUDE_DIR=$libdir/irrlicht/include/irrlichtmt \ -DCMAKE_PREFIX_PATH=$libdir/irrlicht \
-DIRRLICHT_LIBRARY=$libdir/irrlicht/lib/libIrrlichtMt.dll.a \
-DIRRLICHT_DLL="$irr_dlls" \
\ \
-DZLIB_INCLUDE_DIR=$libdir/zlib/include \ -DZLIB_INCLUDE_DIR=$libdir/zlib/include \
-DZLIB_LIBRARIES=$libdir/zlib/lib/libz.dll.a \ -DZLIB_LIBRARIES=$libdir/zlib/lib/libz.dll.a \

@ -30,7 +30,7 @@ if [ -z "$toolchain_file" ]; then
fi fi
echo "Using $toolchain_file" echo "Using $toolchain_file"
irrlicht_version=1.9.0mt1 irrlicht_version=1.9.0mt2
ogg_version=1.3.4 ogg_version=1.3.4
vorbis_version=1.3.7 vorbis_version=1.3.7
curl_version=7.76.1 curl_version=7.76.1
@ -97,7 +97,7 @@ cd $builddir
mkdir build mkdir build
cd 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 ' ' ';') vorbis_dlls=$(echo $libdir/libvorbis/bin/libvorbis{,file}-*.dll | tr ' ' ';')
gettext_dlls=$(echo $libdir/gettext/bin/lib{intl,iconv}-*.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_FREETYPE=1 \
-DENABLE_LEVELDB=1 \ -DENABLE_LEVELDB=1 \
\ \
-DIRRLICHT_INCLUDE_DIR=$libdir/irrlicht/include/irrlichtmt \ -DCMAKE_PREFIX_PATH=$libdir/irrlicht \
-DIRRLICHT_LIBRARY=$libdir/irrlicht/lib/libIrrlichtMt.dll.a \
-DIRRLICHT_DLL="$irr_dlls" \
\ \
-DZLIB_INCLUDE_DIR=$libdir/zlib/include \ -DZLIB_INCLUDE_DIR=$libdir/zlib/include \
-DZLIB_LIBRARIES=$libdir/zlib/lib/libz.dll.a \ -DZLIB_LIBRARIES=$libdir/zlib/lib/libz.dll.a \

@ -11,9 +11,7 @@ install_linux_deps() {
shift shift
pkgs+=(libirrlicht-dev) pkgs+=(libirrlicht-dev)
else else
# TODO: return old URL when IrrlichtMt 1.9.0mt2 is tagged wget "https://github.com/minetest/irrlicht/releases/download/1.9.0mt2/ubuntu-bionic.tar.gz"
#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
sudo tar -xaf ubuntu-bionic.tar.gz -C /usr/local sudo tar -xaf ubuntu-bionic.tar.gz -C /usr/local
fi fi