diff --git a/CMakeLists.txt b/CMakeLists.txt index 62b41aa5..56528444 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -119,15 +119,10 @@ set(SOURCES "vehicle/Gauge.cpp" "utilities/Globals.cpp" "utilities/Logs.cpp" -"McZapkie/friction.cpp" -"McZapkie/hamulce.cpp" -"McZapkie/Mover.cpp" -"McZapkie/Oerlikon_ESt.cpp" "model/MdlMngr.cpp" "world/MemCell.cpp" "model/Model3d.cpp" "world/mtable.cpp" -"utilities/parser.cpp" "rendering/nullrenderer.cpp" "rendering/renderer.cpp" "model/ResourceManager.cpp" @@ -159,7 +154,6 @@ set(SOURCES "audio/audio.cpp" "audio/audiorenderer.cpp" "utilities/motiontelemetry.cpp" -"utilities/utilities.cpp" "application/uitranscripts.cpp" "world/station.cpp" "application/application.cpp" @@ -223,7 +217,6 @@ set(SOURCES "utilities/dictionary.cpp" "rendering/particles.cpp" "utilities/headtrack.cpp" -"scripting/ladderlogic.cpp" "rendering/geometrybank.cpp" "rendering/openglcolor.cpp" "simulation/simulationsounds.cpp" @@ -453,11 +446,33 @@ if (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC) add_compile_options("/utf-8") endif() +# the build settings of the game: include dirs, definitions, compile options and libraries. the game, +# its core library and the unit tests all build with the same ones +add_library(eu07_settings INTERFACE) + +# the parts of the simulation the game shares with the unit tests: the vehicle physics, the vehicle +# definition parser and the helpers they use. built once, and tested as the game uses them +set(CORE_SOURCES +"McZapkie/friction.cpp" +"McZapkie/hamulce.cpp" +"McZapkie/Mover.cpp" +"McZapkie/Oerlikon_ESt.cpp" +"utilities/parser.cpp" +"utilities/utilities.cpp" +"scripting/ladderlogic.cpp" +) +add_library(eu07_core STATIC ${CORE_SOURCES}) +target_link_libraries(eu07_core PUBLIC eu07_settings) +set_target_properties(eu07_core PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + FOLDER "libraries") + add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS}) +target_link_libraries(${PROJECT_NAME} eu07_core) -target_compile_definitions(${PROJECT_NAME} PRIVATE ${DEFINITIONS}) +target_compile_definitions(eu07_settings INTERFACE ${DEFINITIONS}) -target_include_directories(${PROJECT_NAME} PRIVATE +target_include_directories(eu07_settings INTERFACE "." "Console" "McZapkie" @@ -478,7 +493,7 @@ if (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC) # /wd4996: disable "deprecation" warnings # /wd4244: disable warnings for conversion with possible loss of data # /wd5033: disable because it is all over Python headers - set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/wd4996 /wd4244 /wd5033") + target_compile_options(eu07_settings INTERFACE /wd4996 /wd4244 /wd5033) set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "/LARGEADDRESSAWARE") endif() @@ -494,7 +509,7 @@ set_target_properties( ${PROJECT_NAME} check_cxx_symbol_exists(__GNUC__ "" COMPILER_HAVE_GNUC) if (COMPILER_HAVE_GNUC) - set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "-fvisibility=hidden") + target_compile_options(eu07_settings INTERFACE -fvisibility=hidden) endif() if(NOT ${CMAKE_VERSION} VERSION_LESS "3.16.0") @@ -502,6 +517,7 @@ if(NOT ${CMAKE_VERSION} VERSION_LESS "3.16.0") if (USE_PCH) target_precompile_headers(${PROJECT_NAME} PRIVATE "$<$:${CMAKE_CURRENT_SOURCE_DIR}/stdafx.h>") + target_precompile_headers(eu07_core PRIVATE "$<$:${CMAKE_CURRENT_SOURCE_DIR}/stdafx.h>") set_source_files_properties("/glad/src/glad.c" "ref/dds-ktx/src/dds-ktx.c" "ref/zstd/zstd.c" "stb/stb_image.c" "imgui/imgui.cpp" "imgui/imgui_demo.cpp" "imgui/imgui_draw.cpp" "imgui/imgui_widgets.cpp" "imgui/imgui_tables.cpp" "imgui/imgui_impl_glfw.cpp" "imgui/ImGuizmo.cpp" PROPERTIES SKIP_PRECOMPILE_HEADERS TRUE) @@ -509,12 +525,12 @@ if(NOT ${CMAKE_VERSION} VERSION_LESS "3.16.0") endif() if (USE_LTO) - set_property(TARGET ${PROJECT_NAME} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) + set_property(TARGET ${PROJECT_NAME} eu07_core PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) endif() if (WITH_OPENVR) - target_include_directories(${PROJECT_NAME} PRIVATE ${OPENVR_INCLUDE_DIR}) - target_link_libraries(${PROJECT_NAME} ${OPENVR_LIBRARY}) + target_include_directories(eu07_settings INTERFACE ${OPENVR_INCLUDE_DIR}) + target_link_libraries(eu07_settings INTERFACE ${OPENVR_LIBRARY}) endif() if (WITH_CRASHPAD) @@ -529,12 +545,12 @@ if (WITH_CRASHPAD) endif() endif() -target_link_libraries(${PROJECT_NAME} glfw) +target_link_libraries(eu07_settings INTERFACE glfw) if(WITH_PYTHON) find_package(Python3 3.14 REQUIRED COMPONENTS Development) - target_include_directories(${PROJECT_NAME} PRIVATE ${Python3_INCLUDE_DIRS}) - target_link_libraries(${PROJECT_NAME} ${Python3_LIBRARIES}) + target_include_directories(eu07_settings INTERFACE ${Python3_INCLUDE_DIRS}) + target_link_libraries(eu07_settings INTERFACE ${Python3_LIBRARIES}) if(WIN32) # Python3_ROOT_DIR is only an input hint and is not populated by @@ -552,78 +568,78 @@ endif() if (NOT WIN32) find_package(PNG 1.6 REQUIRED) - target_link_libraries(${PROJECT_NAME} PNG::PNG) + target_link_libraries(eu07_settings INTERFACE PNG::PNG) else() include_directories(${PNG_INCLUDE_DIRS}) - target_link_libraries(${PROJECT_NAME} ${PNG_LIBRARIES}) + target_link_libraries(eu07_settings INTERFACE ${PNG_LIBRARIES}) endif() find_package(Threads REQUIRED) -target_link_libraries(${PROJECT_NAME} Threads::Threads) +target_link_libraries(eu07_settings INTERFACE Threads::Threads) find_package(GLM REQUIRED) -target_include_directories(${PROJECT_NAME} PRIVATE ${GLM_INCLUDE_DIR}) +target_include_directories(eu07_settings INTERFACE ${GLM_INCLUDE_DIR}) # JSON lib add_subdirectory(ref/json) -target_link_libraries(${PROJECT_NAME} nlohmann_json::nlohmann_json) -target_include_directories(${PROJECT_NAME} PRIVATE ${NLOHMANN_JSON_INCLUDE_INSTALL_DIR}) +target_link_libraries(eu07_settings INTERFACE nlohmann_json::nlohmann_json) +target_include_directories(eu07_settings INTERFACE ${NLOHMANN_JSON_INCLUDE_INSTALL_DIR}) if (WITH_DISCORD_RPC) add_subdirectory(ref/discord-rpc) set_target_properties(discord-rpc PROPERTIES FOLDER "libraries") - target_link_libraries(${PROJECT_NAME} discord-rpc) + target_link_libraries(eu07_settings INTERFACE discord-rpc) # Add the include directory so the compiler can find discord_rpc.h - target_include_directories(${PROJECT_NAME} PUBLIC + target_include_directories(eu07_settings INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/ref/discord-rpc/include" ) - target_compile_definitions(${PROJECT_NAME} PUBLIC WITH_DISCORD_RPC=1) + target_compile_definitions(eu07_settings INTERFACE WITH_DISCORD_RPC=1) else() - target_compile_definitions(${PROJECT_NAME} PUBLIC WITH_DISCORD_RPC=0) + target_compile_definitions(eu07_settings INTERFACE WITH_DISCORD_RPC=0) endif() find_package(OpenAL REQUIRED) if (TARGET OpenAL::OpenAL) - target_link_libraries(${PROJECT_NAME} OpenAL::OpenAL) + target_link_libraries(eu07_settings INTERFACE OpenAL::OpenAL) else() - target_include_directories(${PROJECT_NAME} PRIVATE ${OPENAL_INCLUDE_DIR}) - target_link_libraries(${PROJECT_NAME} ${OPENAL_LIBRARY}) + target_include_directories(eu07_settings INTERFACE ${OPENAL_INCLUDE_DIR}) + target_link_libraries(eu07_settings INTERFACE ${OPENAL_LIBRARY}) endif() find_package(SndFile REQUIRED) -target_link_libraries(${PROJECT_NAME} SndFile::sndfile) +target_link_libraries(eu07_settings INTERFACE SndFile::sndfile) if (WITH_LUA) find_package(LuaJIT REQUIRED) - target_include_directories(${PROJECT_NAME} PRIVATE ${LUAJIT_INCLUDE_DIR}) - target_link_libraries(${PROJECT_NAME} ${LUAJIT_LIBRARIES}) + target_include_directories(eu07_settings INTERFACE ${LUAJIT_INCLUDE_DIR}) + target_link_libraries(eu07_settings INTERFACE ${LUAJIT_LIBRARIES}) endif() if (WITH_UART) find_package(libserialport REQUIRED) - target_include_directories(${PROJECT_NAME} PRIVATE ${libserialport_INCLUDE_DIR}) - target_link_libraries(${PROJECT_NAME} ${libserialport_LIBRARY}) + target_include_directories(eu07_settings INTERFACE ${libserialport_INCLUDE_DIR}) + target_link_libraries(eu07_settings INTERFACE ${libserialport_LIBRARY}) endif() find_package(ASIO REQUIRED) -target_link_libraries(${PROJECT_NAME} asio::asio) +target_link_libraries(eu07_settings INTERFACE asio::asio) if (WIN32) - target_link_libraries(${PROJECT_NAME} ws2_32) + target_link_libraries(eu07_settings INTERFACE ws2_32) endif() # http client of the editor's geoportal orthophoto layer: WinHTTP on Windows, libcurl elsewhere when available if (WIN32) - target_link_libraries(${PROJECT_NAME} winhttp) + target_link_libraries(eu07_settings INTERFACE winhttp) else() find_package(CURL QUIET) if (CURL_FOUND) - target_link_libraries(${PROJECT_NAME} CURL::libcurl) - target_compile_definitions(${PROJECT_NAME} PRIVATE EU07_WITH_CURL) + target_link_libraries(eu07_settings INTERFACE CURL::libcurl) + target_compile_definitions(eu07_settings INTERFACE EU07_WITH_CURL) else() message(STATUS "libcurl not found: the editor's orthophoto layer will only show cached tiles") endif() @@ -631,8 +647,8 @@ endif() if (WITH_ZMQ) find_package(cppzmq REQUIRED) - target_include_directories(${PROJECT_NAME} PRIVATE ${cppzmq_INCLUDE_DIR}) - target_link_libraries(${PROJECT_NAME} ${cppzmq_LIBRARY}) + target_include_directories(eu07_settings INTERFACE ${cppzmq_INCLUDE_DIR}) + target_link_libraries(eu07_settings INTERFACE ${cppzmq_LIBRARY}) endif() if (WIN32) @@ -663,7 +679,7 @@ endif () if (NOT TARGET yaml-cpp) add_subdirectory("betterRenderer/thirdparty/yaml-cpp" "${CMAKE_CURRENT_BINARY_DIR}/yaml-cpp" EXCLUDE_FROM_ALL) endif () -target_link_libraries(${PROJECT_NAME} yaml-cpp) +target_link_libraries(eu07_settings INTERFACE yaml-cpp) # Enable compiling with debug symbols @@ -678,7 +694,7 @@ if(GENERATE_PDB) add_link_options(/DEBUG /MAP) # Ensure that the PCH is built with the correct runtime library for each configuration - set_target_properties(${PROJECT_NAME} PROPERTIES + set_target_properties(${PROJECT_NAME} eu07_core PROPERTIES COMPILE_OPTIONS "$<$:/MDd>$<$:/MD>") else() # GCC/Clang (ensure -g is set for all configurations) @@ -694,8 +710,8 @@ endif() if(ENABLE_AVX2) message(STATUS "Enabling AVX2 instruction set.") if (MSVC) - target_compile_options(${PROJECT_NAME} PRIVATE /arch:AVX2) + target_compile_options(eu07_settings INTERFACE /arch:AVX2) else() - target_compile_options(${PROJECT_NAME} PRIVATE -mavx2) + target_compile_options(eu07_settings INTERFACE -mavx2) endif() -endif() \ No newline at end of file +endif()