speed-dreams-code/cmake/customthirdparty.cmake
Xavier Del Campo Romero 022b19a141
Remove simuv2.1, add FreeSOLID as a submodule
As opposed to simu >= 3.0, simu 2.1 did not consider air or wheel
temperatures. This would have several consequences:

- Some drivers such as shadow rely on these parameters to calculate tire
grip. If temperature air is zero (i.e., 0K), no grip is assumed
and therefore speeds are also assigned to zero, making the driver not to
move at all.

- Invalid temperature values (i.e., 0K) would be shown on the UI, both
in ssg and OSG.

Unfortunately, simuv2.1 bundled the SOLID-2.0 library (aka FreeSOLID)
because the library is not available from most GNU/Linux distributions
yet.

In order to solve this situation, the FreeSOLID library was migrated
from CVS to Git [1] so it could be used as a submodule, and therefore
let the build system decide whether to optionally use the in-tree copy.
That said, packaging/3rdParty-devel has dropped FreeSOLID in favour of
the submodule, since it must always be built from source anyway.

[1]: https://forge.a-lec.org/speed-dreams/freesolid
2025-01-27 00:46:06 +01:00

304 lines
13 KiB
CMake

############################################################################
#
# file : FindCustom3rdParty.cmake
# copyright : (C) 2009 by Brian Gavin, 2012 Jean-Philippe Meuret
# web : www.speed-dreams.org
#
############################################################################
############################################################################
# #
# This program is free software; you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation; either version 2 of the License, or #
# (at your option) any later version. #
# #
############################################################################
# @file Custom 3rdParty location handling for some Windows builds
# (standard CMake Find<package> macros can't find it, or don't do
# it the way we need, so we needed another solution).
# Heavily based on OpenScenGraph cmake scripts.
# @author Brian Gavin, Jean-Philippe Meuret
################################################################################################
# Under Windows, install needed 3rd party DLLs close to Speed Dreams executable
# (but stay compatible with the old 2.0.0 3rd party package which had less DLLs inside)
# Find the full path-name of the 3rd party DLL corresponding to the given 3rd party link library
#
# Parameters :
# * LIB_PATH_NAMES : The link library (or list of link libraries) path-name.
# * LIB_NAME_HINTS : Hints for retrieving in LIB_PATH_NAMES the only lib we are taking care of,
# and for retrieving on disk the corresponding DLL.
# * DLL_NAME_PREFIXES : Possible prefixes (to the lib name hint) for retrieving the DLL.
# Note: the empty "" prefix is always tried at the end.
# Ex: "lib;xx" for "lib" and "xx" prefixes.
# * DLL_PATHNAME_VAR : Name of the output variable for the retrieved DLL path-name.
MACRO(_FIND_3RDPARTY_DLL LIB_PATH_NAMES LIB_NAME_HINTS DLL_NAME_PREFIXES DLL_PATHNAME_VAR)
FOREACH(_LIB_NAME_HINT ${LIB_NAME_HINTS})
# Must handle the case of multiple libs listed in ${LIB_PATH_NAMES} :
# Use LIB_NAME_HINTS to retrieve the one we are interested in here.
SET(_LIB_PATHNAME ${LIB_PATH_NAMES})
FOREACH(_LIB_PATHNAME_ ${LIB_PATH_NAMES})
IF(${_LIB_PATHNAME_} MATCHES "${_LIB_NAME_HINT}\\.")
SET(_LIB_PATHNAME ${_LIB_PATHNAME_})
BREAK()
ENDIF(${_LIB_PATHNAME_} MATCHES "${_LIB_NAME_HINT}\\.")
ENDFOREACH(_LIB_PATHNAME_ ${LIB_PATH_NAMES})
# Got the link library pathname : check if any corresponding DLL around (try all prefixes).
# 1) Check the empty prefix
# (CMake ignores it when specified at the beginning of DLL_NAME_PREFIXES ... bull shit).
GET_FILENAME_COMPONENT(_LIB_PATH "${_LIB_PATHNAME}" PATH)
SET(${DLL_PATHNAME_VAR} "${_LIB_PATH}/../bin/${_LIB_NAME_HINT}${CMAKE_SHARED_LIBRARY_SUFFIX}")
#MESSAGE(STATUS "Trying 3rdParty DLL ${${DLL_PATHNAME_VAR}}")
IF(EXISTS "${${DLL_PATHNAME_VAR}}")
MESSAGE(STATUS "Will install 3rdParty DLL ${${DLL_PATHNAME_VAR}}")
BREAK() # First found is the one.
ELSE(EXISTS "${${DLL_PATHNAME_VAR}}")
UNSET(${DLL_PATHNAME_VAR})
ENDIF(EXISTS "${${DLL_PATHNAME_VAR}}")
# 2) Check other (specified) prefixes.
FOREACH(_DLL_NAME_PREFIX ${DLL_NAME_PREFIXES})
SET(${DLL_PATHNAME_VAR} "${_LIB_PATH}/../bin/${_DLL_NAME_PREFIX}${_LIB_NAME_HINT}${CMAKE_SHARED_LIBRARY_SUFFIX}")
#MESSAGE(STATUS "Trying 3rdParty DLL ${${DLL_PATHNAME_VAR}}")
IF(EXISTS "${${DLL_PATHNAME_VAR}}")
BREAK() # First found is the one.
ELSE(EXISTS "${${DLL_PATHNAME_VAR}}")
UNSET(${DLL_PATHNAME_VAR})
ENDIF(EXISTS "${${DLL_PATHNAME_VAR}}")
ENDFOREACH(_DLL_NAME_PREFIX ${DLL_NAME_PREFIXES})
IF(EXISTS "${${DLL_PATHNAME_VAR}}")
MESSAGE(STATUS "Will install 3rdParty DLL ${${DLL_PATHNAME_VAR}}")
BREAK() # First found is the one.
ELSE(EXISTS "${${DLL_PATHNAME_VAR}}")
UNSET(${DLL_PATHNAME_VAR})
ENDIF(EXISTS "${${DLL_PATHNAME_VAR}}")
ENDFOREACH(_LIB_NAME_HINT ${LIB_NAME_HINTS})
#IF(NOT EXISTS "${${DLL_PATHNAME_VAR}}")
# MESSAGE(STATUS "Could not find 3rdParty DLL for lib ${LIB_NAME_HINTS} (prefixes ${DLL_NAME_PREFIXES})")
#ENDIF()
ENDMACRO(_FIND_3RDPARTY_DLL DLL_PATHNAME)
MACRO(SD_INSTALL_CUSTOM_3RDPARTY TARGET_NAME)
# 1) Find 3rd party DLL files to install.
SET(_THIRDPARTY_DLL_PATHNAMES)
_FIND_3RDPARTY_DLL("${OPENAL_LIBRARY}" "OpenAL32" "lib" _DLL_PATHNAME)
LIST(APPEND _THIRDPARTY_DLL_PATHNAMES "${_DLL_PATHNAME}")
# Menu Music requires ogg, vorbis, and vorbisfile
_FIND_3RDPARTY_DLL("${OGG_LIBRARY}" "ogg;libogg;libogg-0" "" _DLL_PATHNAME)
LIST(APPEND _THIRDPARTY_DLL_PATHNAMES "${_DLL_PATHNAME}")
_FIND_3RDPARTY_DLL("${VORBIS_LIBRARY}" "vorbis;libvorbis;libvorbis-0" "" _DLL_PATHNAME)
LIST(APPEND _THIRDPARTY_DLL_PATHNAMES "${_DLL_PATHNAME}")
_FIND_3RDPARTY_DLL("${VORBISFILE_LIBRARY}" "vorbisfile;libvorbisfile;libvorbisfile-3" "" _DLL_PATHNAME)
LIST(APPEND _THIRDPARTY_DLL_PATHNAMES "${_DLL_PATHNAME}")
_FIND_3RDPARTY_DLL("${SDL2_LIBRARY}" "SDL2" ";lib" _DLL_PATHNAME)
LIST(APPEND _THIRDPARTY_DLL_PATHNAMES "${_DLL_PATHNAME}")
_FIND_3RDPARTY_DLL("${SDL2_MIXER_LIBRARY}" "SDL2_mixer" ";lib" _DLL_PATHNAME)
LIST(APPEND _THIRDPARTY_DLL_PATHNAMES "${_DLL_PATHNAME}")
IF(OPTION_3RDPARTY_EXPAT)
_FIND_3RDPARTY_DLL("${EXPAT_LIBRARY}" "expat;expat-1" "lib" _DLL_PATHNAME)
LIST(APPEND _THIRDPARTY_DLL_PATHNAMES "${_DLL_PATHNAME}")
ENDIF(OPTION_3RDPARTY_EXPAT)
IF(OPTION_OSGGRAPH)
# DLLs whose libs we link with.
SET(_OSG_DLLS_NAME_HINTS "OpenThreads;osgDB;osgFX;osgGA;osgParticle;osgShadow;osgViewer;osgUtil;osg;osgText")
FOREACH(_LIB_NAME ${OPENSCENEGRAPH_LIBRARIES})
FOREACH(_NAME_HINT ${_OSG_DLLS_NAME_HINTS})
IF("${_LIB_NAME}" MATCHES "${_NAME_HINT}\\.")
_FIND_3RDPARTY_DLL("${_LIB_NAME}" "${_NAME_HINT}" "lib;ot21-;ot20-;ot12-;osg161-;osg160-;osg158-" _DLL_PATHNAME)
SET(_NAME_HINT_ "${_NAME_HINT}") # For later (see below DLLs we don't link with).
SET(_LIB_NAME_ "${_LIB_NAME}") # For later (see below DLLs we don't link with).
SET(_DLL_PATHNAME_ "${_DLL_PATHNAME}") # For later (see below plugins).
BREAK()
ENDIF()
ENDFOREACH()
LIST(APPEND _THIRDPARTY_DLL_PATHNAMES "${_DLL_PATHNAME}")
ENDFOREACH()
# Plugins : Complete the list right below according to the actual needs.
# TODO: Find a way to install them in the osgPlugins-xxx subdir (works as is, but ...)
SET(_OSG_PLUGIN_NAME_HINTS "osgdb_ac;osgdb_dds;osgdb_glsl") # ';'-separated list
LIST(APPEND _OSG_PLUGIN_NAME_HINTS "osgdb_ive;osgdb_jpeg;osgdb_osg;osgdb_curl;osgdb_freetype")
LIST(APPEND _OSG_PLUGIN_NAME_HINTS "osgdb_osga;osgdb_osgshadow;osgdb_osgtgz;osgdb_png;osgdb_rgb")
GET_FILENAME_COMPONENT(_OSG_PLUGINS_DIR "${_DLL_PATHNAME_}" PATH)
FILE(GLOB_RECURSE _OSG_PLUGIN_NAMES "${_OSG_PLUGINS_DIR}/*${CMAKE_SHARED_LIBRARY_SUFFIX}")
FOREACH(_NAME_HINT ${_OSG_PLUGIN_NAME_HINTS})
FOREACH(_PLUGIN_NAME ${_OSG_PLUGIN_NAMES})
IF("${_PLUGIN_NAME}" MATCHES "osgPlugins.*/.*${_NAME_HINT}\\.")
LIST(APPEND _THIRDPARTY_DLL_PATHNAMES "${_PLUGIN_NAME}")
MESSAGE(STATUS "Will install 3rdParty OSG plugin ${_PLUGIN_NAME}")
BREAK()
ENDIF()
ENDFOREACH()
ENDFOREACH()
ENDIF(OPTION_OSGGRAPH)
_FIND_3RDPARTY_DLL("${ZLIB_LIBRARY}" "zlib;zlib1" "lib" _DLL_PATHNAME)
LIST(APPEND _THIRDPARTY_DLL_PATHNAMES "${_DLL_PATHNAME}")
_FIND_3RDPARTY_DLL("${PNG_LIBRARY}" "png;png16;png15" "lib" _DLL_PATHNAME)
LIST(APPEND _THIRDPARTY_DLL_PATHNAMES "${_DLL_PATHNAME}")
_FIND_3RDPARTY_DLL("${JPEG_LIBRARY}" "jpeg;jpeg-9;jpeg-8" "lib" _DLL_PATHNAME)
LIST(APPEND _THIRDPARTY_DLL_PATHNAMES "${_DLL_PATHNAME}")
# CMake might already define FindFreetype.cmake, but it is not required
# since freetype should already install freetype-config.cmake inside the
# 3rdParty directory.
find_package(freetype CONFIG REQUIRED)
get_target_property(freetype_lib freetype LOCATION)
_FIND_3RDPARTY_DLL("${freetype_lib}" "freetype" ";lib" _DLL_PATHNAME)
LIST(APPEND _THIRDPARTY_DLL_PATHNAMES "${_DLL_PATHNAME}")
get_property(CURL_LIBRARY TARGET CURL::libcurl PROPERTY LOCATION)
_FIND_3RDPARTY_DLL("${CURL_LIBRARY}" "curl" "lib" _DLL_PATHNAME)
LIST(APPEND _THIRDPARTY_DLL_PATHNAMES "${_DLL_PATHNAME}")
_FIND_3RDPARTY_DLL("${GLM_LIBRARY}" "glm" "lib" _DLL_PATHNAME)
LIST(APPEND _THIRDPARTY_DLL_PATHNAMES "${_DLL_PATHNAME}")
_FIND_3RDPARTY_DLL("${TINYGLTF_LIBRARY}" "tinygltf" "lib" _DLL_PATHNAME)
LIST(APPEND _THIRDPARTY_DLL_PATHNAMES "${_DLL_PATHNAME}")
_FIND_3RDPARTY_DLL("${CJSON_LIBRARY}" "cjson" "lib" _DLL_PATHNAME)
LIST(APPEND _THIRDPARTY_DLL_PATHNAMES "${_DLL_PATHNAME}")
_FIND_3RDPARTY_DLL("${minizip_LIBRARIES}" "minizip" "lib" _DLL_PATHNAME)
LIST(APPEND _THIRDPARTY_DLL_PATHNAMES "${_DLL_PATHNAME}")
_FIND_3RDPARTY_DLL("${rhash_LIBRARIES}" "rhash" "lib" _DLL_PATHNAME)
LIST(APPEND _THIRDPARTY_DLL_PATHNAMES "${_DLL_PATHNAME}")
_FIND_3RDPARTY_DLL("${ENET_LIBRARY}" "enet" "lib" _DLL_PATHNAME)
LIST(APPEND _THIRDPARTY_DLL_PATHNAMES "${_DLL_PATHNAME}")
# 2) Copy found 3rd party DLL files to the bin folder (for running without installing).
#MESSAGE(STATUS "3rdParty dependencies : Will install ${_THIRDPARTY_DLL_PATHNAMES}")
SET(_NOINST_DIR "${CMAKE_BINARY_DIR}/${SD_BINDIR}")
ADD_CUSTOM_COMMAND(TARGET ${TARGET_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${_NOINST_DIR}"
VERBATIM)
FOREACH(_DLL ${_THIRDPARTY_DLL_PATHNAMES})
ADD_CUSTOM_COMMAND(TARGET ${TARGET_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E echo Copying "${_DLL}" to "${_NOINST_DIR}"
COMMAND ${CMAKE_COMMAND} -E copy "${_DLL}" "${_NOINST_DIR}"
VERBATIM)
ENDFOREACH()
# 3) Install found 3rd party DLL files to the install folder.
SD_INSTALL_FILES(BIN FILES ${_THIRDPARTY_DLL_PATHNAMES})
# 4) Find Windows compilers run-time DLLs.
IF(MSVC)
# We do it ourselves, but use InstallRequiredSystemLibraries to figure out which ones.
SET(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE)
INCLUDE(InstallRequiredSystemLibraries)
SET(_COMPILER_DLL_PATHNAMES "${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS}")
ELSEIF(MINGW)
# Works with MinGW 14.2.0.
GET_FILENAME_COMPONENT(_MINGW_BINDIR "${CMAKE_CXX_COMPILER}" PATH)
GET_FILENAME_COMPONENT(_MINGW_BINDIR "${_MINGW_BINDIR}/../" REALPATH)
FIND_FILE(libstdcxx_path "libstdc++-6.dll"
HINTS
"${_MINGW_BINDIR}/bin"
"${_MINGW_BINDIR}/lib"
"${_MINGW_BINDIR}/*/bin"
"${_MINGW_BINDIR}/*/lib"
NO_CMAKE_FIND_ROOT_PATH
NO_DEFAULT_PATH)
FIND_FILE(libgcc_path
NAMES
"libgcc_s_seh-1.dll"
"libgcc_s_dw2-1.dll"
"libgcc_s_sjlj-1.dll"
HINTS
"${_MINGW_BINDIR}/bin"
"${_MINGW_BINDIR}/lib"
"${_MINGW_BINDIR}/*/bin"
"${_MINGW_BINDIR}/*/lib"
NO_CMAKE_FIND_ROOT_PATH
NO_DEFAULT_PATH)
FIND_FILE(libssp_path "libssp-0.dll"
HINTS
"${_MINGW_BINDIR}/bin"
"${_MINGW_BINDIR}/lib"
"${_MINGW_BINDIR}/*/bin"
"${_MINGW_BINDIR}/*/lib"
NO_CMAKE_FIND_ROOT_PATH
NO_DEFAULT_PATH)
FIND_FILE(libwinpthread_path "libwinpthread-1.dll"
HINTS
"${_MINGW_BINDIR}/bin"
"${_MINGW_BINDIR}/lib"
"${_MINGW_BINDIR}/*/bin"
"${_MINGW_BINDIR}/*/lib"
NO_CMAKE_FIND_ROOT_PATH
NO_DEFAULT_PATH)
IF(libstdcxx_path STREQUAL "libstdcxx_path-NOTFOUND")
MESSAGE(FATAL_ERROR "Could not find libstdc++")
ENDIF()
IF(libgcc_path STREQUAL "libgcc_path-NOTFOUND")
MESSAGE(FATAL_ERROR "Could not find libgcc")
ENDIF()
IF(libssp_path STREQUAL "libssp_path-NOTFOUND")
MESSAGE(STATUS "Could not find libssp. speed-dreams-2 might be unable to run.")
ELSE()
SET(_COMPILER_DLL_PATHNAMES "${libssp_path}")
ENDIF()
IF(libwinpthread_path STREQUAL "libwinpthread_path-NOTFOUND")
MESSAGE(STATUS "Could not find libwinpthread. win32 thread model assumed.")
ELSE()
SET(_COMPILER_DLL_PATHNAMES "${libwinpthread_path}")
ENDIF()
SET(_COMPILER_DLL_PATHNAMES
${_COMPILER_DLL_PATHNAMES}
"${libstdcxx_path}"
"${libgcc_path}"
)
ENDIF(MSVC)
# 5) Copy found compiler DLL files to the bin folder (for running without installing).
FOREACH(_DLL ${_COMPILER_DLL_PATHNAMES})
ADD_CUSTOM_COMMAND(TARGET ${TARGET_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E echo Copying "${_DLL}" to "${_NOINST_DIR}"
COMMAND ${CMAKE_COMMAND} -E copy "${_DLL}" "${_NOINST_DIR}"
VERBATIM)
ENDFOREACH()
# 6) Install found compiler DLL files to the install folder.
SD_INSTALL_FILES(BIN FILES ${_COMPILER_DLL_PATHNAMES})
ENDMACRO(SD_INSTALL_CUSTOM_3RDPARTY TARGET_NAME)