# 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/Backend_OpenGL2.cpp src/Entrypoint/Backend_OpenGL3.cpp src/Entrypoint/Backend_Vulkan.cpp src/Entrypoint/Backend_DirectX11.cpp src/Entrypoint/Backend_DirectX12.cpp src/Entrypoint/Backend_Metal.mm ) add_source_group(MODEL_MODULE_SOURCES src/Model/EvaluatedValue.cpp src/Model/Filter.cpp src/Model/GlobalStates.cpp src/Model/Items.cpp src/Model/Project.cpp src/Model/TransactionsModel.cpp src/Model/Workflow.cpp src/Model/WorkflowNodes.cpp ) add_source_group(UI_MODULE_SOURCES src/UI/Localization.cpp src/UI/States.cpp src/UI/UI_DatabaseView.cpp src/UI/UI_Workflows.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 ) function(add_executable_variant TARGET_NAME) message("CpltCore: generating executable ${TARGET_NAME}") if(BUILD_CORE_WITH_OPENGL2_BACKEND OR BUILD_CORE_WITH_OPENGL3_BACKEND OR BUILD_CORE_WITH_VULKAN_BACKEND OR BUILD_CORE_WITH_METAL_BACKEND) list(APPEND IMGUI_BACKEND_SOURCES ${CMAKE_SOURCE_DIR}/3rdparty/imgui/backend/imgui_impl_glfw.cpp ) endif() if(BUILD_CORE_WITH_DX11_BACKEND OR BUILD_CORE_WITH_DX12_BACKEND) list(APPEND IMGUI_BACKEND_SOURCES ${CMAKE_SOURCE_DIR}/3rdparty/imgui/backend/imgui_impl_win32.cpp ) endif() add_executable(${TARGET_NAME} ${ENTRYPOINT_MODULE_SOURCES} ${MODEL_MODULE_SOURCES} ${UI_MODULE_SOURCES} ${UTILS_MODULE_SOURCES} ${UTILS_DIALOG_MODULE_SOURCES} ${IMGUI_BACKEND_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=$ ) if(BUILD_CORE_WITH_DX11_BACKEND) target_link_libraries(${TARGET_NAME} PRIVATE dxgi.lib d3d11.lib) endif() if(BUILD_CORE_WITH_DX12_BACKEND) target_link_libraries(${TARGET_NAME} PRIVATE dxgi.lib d3d12.lib) endif() 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=$ ) 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=$ ) # TODO conditionally add opengl libraries if(BUILD_CORE_WITH_VULKAN_BACKEND) find_package(Vulkan REQUIRED FATAL_ERROR) target_include_directories(${TARGET_NAME} PRIVATE ${Vulkan_INCLUDE_DIRS}) target_link_libraries(${TARGET_NAME} PRIVATE ${Vulkan_LIBRARIES}) endif() 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 targeting windows function(handle_gnu_style_compiler) # 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) endfunction() function(handle_msvc_style_compiler) target_link_options(${TARGET_NAME} PRIVATE /SUBSYSTEM:windows /ENTRY:mainCRTStartup) endfunction() if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") # GCC (MinGW) handle_gnu_style_compiler() elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") if("x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC") # MSVC-style argument clang (clang-cl.exe) handle_msvc_style_compiler() else() # GNU-style argument clang (clang.exe and clang++.exe) handle_gnu_style_compiler() endif() elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") handle_msvc_style_compiler() 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)