# We use a custom flag instead of letting user set CMAKE_UNITY_BUILD because we don't want stuff in 3rdparty to be built with unity build # (they may not support them, and configuring each is very time consuming) option(BUILD_CORE_WITH_UNITY_BUILD OFF) option(BUILD_CORE_MAIN "Whether to compile the main executable or not." ON) option(BUILD_CORE_TESTS "Whether to compile the tests executable or not." OFF) option(BUILD_CORE_WITH_OPENGL2_BACKEND ON) option(BUILD_CORE_WITH_OPENGL3_BACKEND ON) option(BUILD_CORE_WITH_VULKAN_BACKEND ON) if(WIN32) option(BUILD_CORE_WITH_DX11_BACKEND ON) option(BUILD_CORE_WITH_DX12_BACKEND ON) elseif(APPLE) option(BUILD_CORE_WITH_METAL_BACKEND ON) endif() function(add_source_group GROUP_NAME) set(${GROUP_NAME} ${ARGN} PARENT_SCOPE) set_source_files_properties(${ARGN} PROPERTIES UNITY_GROUP "${GROUP_NAME}" ) endfunction() set(ENTRYPOINT_MODULE_SOURCES src/Entrypoint/main.cpp src/Entrypoint/Common.cpp src/Entrypoint/OpenGL2.cpp src/Entrypoint/OpenGL3.cpp src/Entrypoint/Vulkan.cpp src/Entrypoint/DirectX11.cpp src/Entrypoint/DirectX12.cpp src/Entrypoint/Metal.mm ) add_source_group(MODEL_MODULE_SOURCES src/Model/GlobalStates.cpp src/Model/Project.cpp src/Model/Stock.cpp ) add_source_group(UI_MODULE_SOURCES src/UI/Localization.cpp src/UI/States.cpp src/UI/UI_DatabaseView.cpp src/UI/UI_Export.cpp src/UI/UI_Items.cpp src/UI/UI_MainWindow.cpp src/UI/UI_Settings.cpp src/UI/UI_Utils.cpp ) add_source_group(UTILS_MODULE_SOURCES src/Utils/I18n.cpp src/Utils/Sigslot.cpp src/Utils/StandardDirectories.cpp src/Utils/String.cpp ) function(add_executable_variant TARGET_NAME) message("CpltCore: generating executable ${TARGET_NAME}") add_executable(${TARGET_NAME} ${ENTRYPOINT_MODULE_SOURCES} ${MODEL_MODULE_SOURCES} ${UI_MODULE_SOURCES} ${UTILS_MODULE_SOURCES} ${UTILS_DIALOG_MODULE_SOURCES} ) target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/src ${CMAKE_SOURCE_DIR}/3rdparty/iconfontheaders ${CMAKE_SOURCE_DIR}/3rdparty/imgui ${CMAKE_SOURCE_DIR}/3rdparty/imnodes ) target_link_libraries(${TARGET_NAME} PRIVATE ${CONAN_LIBS} imgui imnodes ) target_compile_definitions(${TARGET_NAME} PRIVATE PLATFORM_WIN32=$ PLATFORM_MACOS=$ PLATFORM_LINUX=$ ) if(WIN32) message("CpltCore: - building with DirectX11 backend ${BUILD_CORE_WITH_DX11_BACKEND}") message("CpltCore: - building with DirectX12 backend ${BUILD_CORE_WITH_DX12_BACKEND}") target_compile_definitions(${TARGET_NAME} PRIVATE BUILD_CORE_WITH_DX11_BACKEND=$ BUILD_CORE_WITH_DX12_BACKEND=$ ) else() target_compile_definitions(${TARGET_NAME} PRIVATE BUILD_CORE_WITH_DX11_BACKEND=0 BUILD_CORE_WITH_DX12_BACKEND=0 ) endif() if(APPLE) message("CpltCore: - building with Metal backend ${BUILD_CORE_WITH_METAL_BACKEND}") target_compile_definitions(${TARGET_NAME} PRIVATE BUILD_CORE_WITH_METAL_BACKEND=$ ) else() target_compile_definitions(${TARGET_NAME} PRIVATE BUILD_CORE_WITH_METAL_BACKEND=0 ) endif() if(NOT APPLE) message("CpltCore: - building with OpenGL2 backend ${BUILD_CORE_WITH_OPENGL2_BACKEND}") message("CpltCore: - building with OpenGL3 backend ${BUILD_CORE_WITH_OPENGL3_BACKEND}") message("CpltCore: - building with Vulkan backend ${BUILD_CORE_WITH_VULKAN_BACKEND}") target_compile_definitions(${TARGET_NAME} PRIVATE BUILD_CORE_WITH_OPENGL2_BACKEND=$ BUILD_CORE_WITH_OPENGL3_BACKEND=$ BUILD_CORE_WITH_VULKAN_BACKEND=$ ) endif() # Platform specific dependencies for Utils/Dialog, not covered by conan if(APPLE) target_link_libraries(${TARGET_NAME} PUBLIC ${COCOA_LIBRARY}) elseif(LINUX) target_link_libraries(${TARGET_NAME} PUBLIC ${GTK3_LIBRARIES}) target_include_directories(${TARGET_NAME} PRIVATE ${GTK3_INCLUDE_DIRS}) endif() if(WIN32) # No console window when targetting windows if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") # Supposedly the flag -mwindows would automatically make the executable use GUI subsystem # But, when subsystem is set to GUI, linker will only search WinMain and wWinMain but not the standard main (it seems like) # so creating GUI executable fails and the linker silently reverts to the default, CUI subsystem target_link_options(${TARGET_NAME} PRIVATE -Wl,-subsystem:windows) target_link_options(${TARGET_NAME} PRIVATE -Wl,-entry:mainCRTStartup) elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") target_link_options(${TARGET_NAME} PRIVATE /SUBSYSTEM:windows /ENTRY:mainCRTStartup) endif() endif() if(BUILD_CORE_WITH_UNITY_BUILD) message("CpltCore: - using unity build") set_target_properties(${TARGET_NAME} PROPERTIES UNITY_BUILD ON UNITY_BUILD_MODE GROUP ) else() message("CpltCore: - using regular build") endif() endfunction() add_executable_variant(CpltCore_main) target_compile_definitions(CpltCore_main PRIVATE DOCTEST_CONFIG_DISABLE=1) add_executable_variant(CpltCore_test)