1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312
|
# SPDX-License-Identifier: GPL-3.0-or-later
set(CMAKE_CXX_CLANG_TIDY "")
# Like `FetchContent_MakeAvailable` but passes EXCLUDE_FROM_ALL to `add_subdirectory`.
macro(FetchContent_MakeAvailableExcludeFromAll)
foreach(contentName IN ITEMS ${ARGV})
string(TOLOWER ${contentName} contentNameLower)
FetchContent_GetProperties(${contentName})
if(NOT ${contentNameLower}_POPULATED)
FetchContent_Populate(${contentName})
if(EXISTS ${${contentNameLower}_SOURCE_DIR}/CMakeLists.txt)
add_subdirectory(${${contentNameLower}_SOURCE_DIR}
${${contentNameLower}_BINARY_DIR} EXCLUDE_FROM_ALL)
endif()
endif()
endforeach()
endmacro()
if(NOT OPENMW_USE_SYSTEM_BULLET)
set(BUILD_BULLET3 OFF CACHE BOOL "")
set(BUILD_EXTRAS OFF CACHE BOOL "")
set(BUILD_OPENGL3_DEMOS OFF CACHE BOOL "")
set(BUILD_UNIT_TESTS OFF CACHE BOOL "")
set(BUILD_BULLET2_DEMOS OFF CACHE BOOL "")
set(BUILD_CLSOCKET OFF CACHE BOOL "")
set(BUILD_ENET OFF CACHE BOOL "")
set(BUILD_CPU_DEMOS OFF CACHE BOOL "")
set(BUILD_EGL OFF CACHE BOOL "")
set(USE_DOUBLE_PRECISION ON CACHE BOOL "")
set(BULLET2_MULTITHREADING ON CACHE BOOL "")
if(BULLET_STATIC)
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
else()
set(BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE)
endif()
if(MSVC)
# this setting is badly named - having it off forces the static runtime library,
# but having it on does nothing, letting the defaults get used.
# OpenMW uses the defaults, and you can't mix and match.
set(USE_MSVC_RUNTIME_LIBRARY_DLL ON CACHE BOOL "" FORCE)
endif()
# May 7, 2021
include(FetchContent)
FetchContent_Declare(bullet
URL https://github.com/bulletphysics/bullet3/archive/refs/tags/3.17.tar.gz
URL_HASH SHA512=a5105bf5f1dd365a64a350755c7d2c97942f74897a18dcdb3651e6732fd55cc1030a096f5808cf50575281f05e3ac09aa50a48d271a47b94cd61f5167a72b7cc
SOURCE_DIR fetched/bullet
)
FetchContent_MakeAvailableExcludeFromAll(bullet)
set(BULLET_INCLUDE_DIRS ${bullet_SOURCE_DIR}/src PARENT_SCOPE)
# The order here is important to work around a bug in Bullet:
# https://github.com/bulletphysics/bullet3/issues/3233
set(BULLET_LIBRARIES BulletCollision LinearMath PARENT_SCOPE)
endif()
if(NOT OPENMW_USE_SYSTEM_MYGUI)
set(MYGUI_RENDERSYSTEM 4 CACHE STRING "")
set(MYGUI_DISABLE_PLUGINS TRUE CACHE BOOL "")
set(MYGUI_BUILD_DEMOS OFF CACHE BOOL "")
set(MYGUI_BUILD_PLUGINS OFF CACHE BOOL "")
set(MYGUI_BUILD_TOOLS OFF CACHE BOOL "")
set(MYGUI_DONT_USE_OBSOLETE ON CACHE BOOL "")
if(MYGUI_STATIC)
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
else()
set(BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE)
endif()
include(FetchContent)
FetchContent_Declare(mygui
URL https://github.com/MyGUI/mygui/archive/refs/tags/MyGUI3.4.3.zip
URL_HASH SHA512=c804ef665e786076582367f171082cd2181fdbd214300ddcca4a4245c5a0f45e62e72778ee2d96ec46b393e22477dd729f9bb3006e6eecbf536674e34a057721
SOURCE_DIR fetched/mygui
)
FetchContent_MakeAvailableExcludeFromAll(mygui)
set(MyGUI_INCLUDE_DIRS ${mygui_SOURCE_DIR}/MyGUIEngine/include PARENT_SCOPE)
set(MyGUI_LIBRARIES MyGUIEngine PARENT_SCOPE)
endif()
if(NOT OPENMW_USE_SYSTEM_OSG)
set(BUILD_OSG_APPLICATIONS OFF CACHE BOOL "")
set(BUILD_OSG_DEPRECATED_SERIALIZERS OFF CACHE BOOL "")
set(OSG_FIND_3RD_PARTY_DEPS OFF CACHE BOOL "")
set(BUILD_OSG_PLUGINS_BY_DEFAULT OFF CACHE BOOL "")
set(BUILD_OSG_PLUGIN_BMP ON CACHE BOOL "")
set(BUILD_OSG_PLUGIN_DAE ON CACHE BOOL "")
set(BUILD_OSG_PLUGIN_DDS ON CACHE BOOL "")
set(BUILD_OSG_PLUGIN_FREETYPE ON CACHE BOOL "")
set(BUILD_OSG_PLUGIN_JPEG ON CACHE BOOL "")
set(BUILD_OSG_PLUGIN_KTX ON CACHE BOOL "")
set(BUILD_OSG_PLUGIN_OSG ON CACHE BOOL "")
set(BUILD_OSG_PLUGIN_PNG ON CACHE BOOL "")
set(BUILD_OSG_PLUGIN_TGA ON CACHE BOOL "")
set(OSG_USE_FLOAT_MATRIX OFF CACHE BOOL "")
set(OSG_USE_FLOAT_PLANE OFF CACHE BOOL "")
set(OSG_USE_FLOAT_QUAT OFF CACHE BOOL "")
set(OPENGL_PROFILE "GL2" CACHE STRING "")
if(OSG_STATIC)
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
set(DYNAMIC_OPENTHREADS OFF CACHE BOOL "" FORCE)
set(DYNAMIC_OPENSCENEGRAPH OFF CACHE BOOL "" FORCE)
else()
set(BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE)
set(DYNAMIC_OPENTHREADS ON CACHE BOOL "" FORCE)
set(DYNAMIC_OPENSCENEGRAPH ON CACHE BOOL "" FORCE)
endif()
mark_as_advanced(DYNAMIC_OPENTHREADS DYNAMIC_OPENSCENEGRAPH)
if(WIN32)
# OSG here inherits C++17 language level because it doesn't specify its own.
#
# OSG's `using namespace std` interferes with Windows header files.
#
# See https://developercommunity.visualstudio.com/t/error-c2872-byte-ambiguous-symbol/93889
#
# An alternative way to work around this without changing the language level is:
#
# add_compile_definitions(_HAS_STD_BYTE=0)
#
# TODO: Put OSG into its own scope so that this does not leak into Recast below.
set(CMAKE_CXX_STANDARD 11)
if(MSVC)
set(OSG_MSVC_VERSIONED_DLL OFF CACHE BOOL "")
endif()
endif()
# OSGoS branch 3.6
include(FetchContent)
FetchContent_Declare(osg
URL https://github.com/OpenMW/osg/archive/01cc2b585c8456a4ff843066b7e1a8715558289f.zip
URL_HASH SHA512=9b0a94c1c1d99c767f1857629d43c7a53bfcb74ef760993a121567831e168a1ebbfc10b0c67d7f2241c7b6c6dab2d0e6b876d9f17aca0fabe1a8c86b2279f956
SOURCE_DIR fetched/osg
)
FetchContent_MakeAvailableExcludeFromAll(osg)
set(OPENSCENEGRAPH_INCLUDE_DIRS ${osg_SOURCE_DIR}/include ${osg_BINARY_DIR}/include PARENT_SCOPE)
set(OSG_LIBRARIES OpenThreads osg PARENT_SCOPE)
foreach(_name ${USED_OSG_COMPONENTS})
string(TOUPPER ${_name} _name_uc)
set(${_name_uc}_LIBRARIES ${_name} PARENT_SCOPE)
endforeach()
foreach(_name ${USED_OSG_PLUGINS})
string(TOUPPER ${_name} _name_uc)
set(${_name_uc}_LIBRARY ${_name} PARENT_SCOPE)
endforeach()
endif()
if(NOT OPENMW_USE_SYSTEM_RECASTNAVIGATION)
if(RECASTNAVIGATION_STATIC)
set(BUILD_SHARED_LIBS OFF)
else()
set(BUILD_SHARED_LIBS ON)
endif()
set(RECASTNAVIGATION_DEMO OFF CACHE BOOL "")
set(RECASTNAVIGATION_TESTS OFF CACHE BOOL "")
set(RECASTNAVIGATION_EXAMPLES OFF CACHE BOOL "")
include(FetchContent)
FetchContent_Declare(recastnavigation
URL https://github.com/recastnavigation/recastnavigation/archive/c393777d26d2ff6519ac23612abf8af42678c9dd.zip
URL_HASH SHA512=48f20cee7a70c2f20f4c68bb74d5af11a1434be85294e37f5fe7b7aae820fbcdff4f35d3be286eaf6f9cbce0aed4201fcc090df409a5bd04aec5fd7c29b3ad94
SOURCE_DIR fetched/recastnavigation
)
FetchContent_MakeAvailableExcludeFromAll(recastnavigation)
endif()
if (NOT OPENMW_USE_SYSTEM_SQLITE3)
include(FetchContent)
FetchContent_Declare(sqlite3
URL https://www.sqlite.org/2023/sqlite-amalgamation-3410100.zip
URL_HASH SHA512=7de291709e88fffc693cf24ac675950cfc35c1bf7631cfea95167105720a05cf37fb943c57c5c985db2eeaa57b31894b3c0df98a7bd2939b5746fc5a24b5ae87
SOURCE_DIR fetched/sqlite3
)
FetchContent_MakeAvailableExcludeFromAll(sqlite3)
add_library(sqlite3 STATIC ${sqlite3_SOURCE_DIR}/sqlite3.c)
target_include_directories(sqlite3 INTERFACE ${sqlite3_SOURCE_DIR}/)
if (UNIX)
target_link_libraries(sqlite3 ${CMAKE_DL_LIBS})
endif()
add_library(SQLite::SQLite3 ALIAS sqlite3)
set(SQLite3_INCLUDE_DIR ${sqlite3_SOURCE_DIR}/ PARENT_SCOPE)
set(SQLite3_LIBRARY sqlite3 PARENT_SCOPE)
endif()
add_subdirectory(smhasher)
if (BUILD_BENCHMARKS AND NOT OPENMW_USE_SYSTEM_BENCHMARK)
set(BENCHMARK_ENABLE_TESTING OFF)
set(BENCHMARK_ENABLE_INSTALL OFF)
set(BENCHMARK_ENABLE_GTEST_TESTS OFF)
include(FetchContent)
FetchContent_Declare(benchmark
URL https://github.com/google/benchmark/archive/refs/tags/v1.8.3.zip
URL_HASH SHA512=d73587ad9c49338749e1d117a6f8c7ff9c603a91a2ffa91a7355c7df7dea82710b9a810d34ddfef20973ecdc77092ec10fb2b4e4cc8d2e7810cbed79617b3828
SOURCE_DIR fetched/benchmark
)
FetchContent_MakeAvailableExcludeFromAll(benchmark)
endif()
if (NOT OPENMW_USE_SYSTEM_YAML_CPP)
if(YAML_CPP_STATIC)
set(YAML_BUILD_SHARED_LIBS OFF)
else()
set(YAML_BUILD_SHARED_LIBS ON)
endif()
include(FetchContent)
FetchContent_Declare(yaml-cpp
URL https://github.com/jbeder/yaml-cpp/archive/refs/tags/yaml-cpp-0.7.0.zip
URL_HASH MD5=1e8ca0d6ccf99f3ed9506c1f6937d0ec
SOURCE_DIR fetched/yaml-cpp
)
FetchContent_MakeAvailableExcludeFromAll(yaml-cpp)
if (MSVC AND PRECOMPILE_HEADERS_WITH_MSVC)
target_precompile_headers(yaml-cpp PRIVATE <algorithm>)
endif()
endif()
if (NOT OPENMW_USE_SYSTEM_ICU)
set(ICU_ENV "ICU_DATA_FILTER_FILE=${CMAKE_CURRENT_SOURCE_DIR}/icufilters.json")
if (ANDROID)
# Note: Must be a build directory, not an install root, since the configure script
# looks for a configuration file which does not get installed.
set(OPENMW_ICU_HOST_BUILD_DIR "" CACHE STRING "A pre-built ICU build directory for the host system if cross-compiling")
if (OPENMW_ICU_HOST_BUILD_DIR STREQUAL "")
message(FATAL_ERROR "If cross-compiling on android you must set the \
OPENMW_ICU_HOST_BUILD_DIR to the path of a pre-compiled build of \
ICU 70.1 for the system doing the build, as ICU needs to be able \
to run its own executables as part of the build process.")
endif()
# We need a host version of ICU so that the tools can be run when building the data library.
set(NDK_STANDARD_ROOT ${CMAKE_ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64)
string(REPLACE "android-" "" ANDROIDVER ${ANDROID_PLATFORM})
# Wants a triple such as aarch64-linux-android, excluding a trailing
# -clang etc.
string(REGEX MATCH "^[^-]\+-[^-]+-[^-]+" ICU_TOOLCHAIN_NAME ${ANDROID_TOOLCHAIN_NAME})
set(ICU_ENV
${ICU_ENV}
"CC=${CMAKE_C_COMPILER_LAUNCHER} ${NDK_STANDARD_ROOT}/bin/${ICU_TOOLCHAIN_NAME}${ANDROIDVER}-clang"
"CXX=${CMAKE_CXX_COMPILER_LAUNCHER} ${NDK_STANDARD_ROOT}/bin/${ICU_TOOLCHAIN_NAME}${ANDROIDVER}-clang"
"RANLIB=${NDK_STANDARD_ROOT}/bin/${ICU_TOOLCHAIN_NAME}-ranlib"
"AR=${NDK_STANDARD_ROOT}/bin/${ICU_TOOLCHAIN_NAME}-ar"
"CPPFLAGS=${ANDROID_COMPILER_FLAGS}"
"LDFLAGS=${ANDROID_LINKER_FLAGS} -lc -lstdc++"
)
set(ICU_ADDITIONAL_OPTS --disable-tools --host=${ICU_TOOLCHAIN_NAME}${ANDROIDVER} --with-cross-build=${OPENMW_ICU_HOST_BUILD_DIR})
endif()
include(ExternalProject)
ExternalProject_Add(icu
URL https://github.com/unicode-org/icu/archive/refs/tags/release-70-1.zip
URL_HASH MD5=49d5e2e5bab93ae1a4b56e916150544c
SOURCE_DIR fetched/icu
CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env ${ICU_ENV}
<SOURCE_DIR>/icu4c/source/configure --enable-static --disable-shared
--disable-tests --disable-samples --disable-icuio --disable-extras ${ICU_ADDITIONAL_OPTS}
BUILD_COMMAND make
INSTALL_COMMAND ""
)
ExternalProject_Get_Property(icu SOURCE_DIR BINARY_DIR)
set(ICU_INCLUDE_DIRS
${SOURCE_DIR}/icu4c/source/common
${SOURCE_DIR}/icu4c/source/i18n
PARENT_SCOPE
)
foreach(ICULIB data uc i18n)
add_library(ICU::${ICULIB} STATIC IMPORTED GLOBAL)
set_target_properties(ICU::${ICULIB} PROPERTIES IMPORTED_LOCATION
${BINARY_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}icu${ICULIB}${CMAKE_STATIC_LIBRARY_SUFFIX})
add_dependencies(ICU::${ICULIB} icu)
endforeach()
set(ICU_LIBRARIES ICU::i18n ICU::uc ICU::data PARENT_SCOPE)
endif()
if ((BUILD_COMPONENTS_TESTS OR BUILD_OPENCS_TESTS OR BUILD_OPENMW_TESTS) AND NOT OPENMW_USE_SYSTEM_GOOGLETEST)
include(FetchContent)
FetchContent_Declare(googletest
URL https://github.com/google/googletest/archive/refs/tags/release-1.12.1.zip
URL_HASH SHA512=1479ea2f3172c622c0ca305f5b2bc45a42941221ec0ac7865e6d6d020ec4d008d952fc64e01a4c5138d7bed4148cf75596f25bb9e9044a98bbbf5662053ea11c
SOURCE_DIR fetched/googletest
)
if (MSVC)
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
endif()
FetchContent_MakeAvailableExcludeFromAll(googletest)
add_library(GTest::GTest ALIAS gtest)
add_library(GMock::GMock ALIAS gmock)
endif()
|