# 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 GROUP_SOURCES) set(${GROUP_NAME} ${GROUP_SOURCES}) set_source_files_properties(${GROUP_SOURCES} PROPERTIES UNITY_GROUP "${GROUP_NAME}" ) endfunction() set(ENTRYPOINT_MODULE_SOURCES src/Entrypoint/main.cpp src/Entrypoint/Common.hpp src/Entrypoint/Common.cpp src/Entrypoint/OpenGL2.hpp src/Entrypoint/OpenGL2.cpp src/Entrypoint/OpenGL3.hpp src/Entrypoint/OpenGL3.cpp src/Entrypoint/Vulkan.hpp src/Entrypoint/Vulkan.cpp src/Entrypoint/DirectX11.hpp src/Entrypoint/DirectX11.cpp src/Entrypoint/DirectX12.hpp src/Entrypoint/DirectX12.cpp src/Entrypoint/Metal.hpp src/Entrypoint/Metal.mm ) # macro(option_with_message OPTION_NAME DEFAULT_VALUE MESSAGE) # option(${OPTION_NAME} ${DEFAULT_VALUE}) # if(${OPTION_NAME}) # message(${MESSAGE}) # endif() # endmacro() # option_with_message(BUILD_CORE_WITH_OPENGL2_BACKEND ON "Building with OpenGL2 backend") # option_with_message(BUILD_CORE_WITH_OPENGL3_BACKEND ON "Building with OpenGL3 backend") # option_with_message(BUILD_CORE_WITH_VULKAN_BACKEND ON "Building with Vulkan backend") # option_with_message(BUILD_CORE_WITH_DX11_BACKEND ON "Building with DirectX11 backend") # option_with_message(BUILD_CORE_WITH_DX12_BACKEND ON "Building with DirectX12 backend") # option_with_message(BUILD_CORE_WITH_METAL_BACKEND ON "Building with Metal backend") add_source_group(UI_MODULE_SOURCES src/UI/Export.hpp src/UI/Export.cpp ) add_source_group(UTILS_MODULE_SOURCES src/Utils/Enum.hpp src/Utils/I18n.hpp src/Utils/I18n.cpp src/Utils/Sigslot.hpp src/Utils/Sigslot.cpp src/Utils/String.hpp src/Utils/String.cpp ) # These files are compiled individually, hence no UNITY_GROUP property # This is because the files here may contain non-c++ languages set(UTILS_DIALOG_MODULE_SOURCES src/Utils/Dialog/Dialog.hpp src/Utils/Dialog/Dialog.cpp ) if(APPLE) find_library(COCOA_LIBRARY Cocoa) list(APPEND UTILS_DIALOG_MODULE_SOURCES src/Utils/Dialog/Dialog_macos.mm ) elseif(WIN32) list(APPEND UTILS_DIALOG_MODULE_SOURCES src/Utils/Dialog/Dialog_win32.cpp ) elseif(LINUX) find_package(PkgConfig REQUIRED) pkg_check_modules(GTK3 REQUIRED gtk+-3.0) list(APPEND UTILS_DIALOG_MODULE_SOURCES src/Utils/Dialog/Dialog_linux.cpp ) endif() function(add_executable_variant TARGET_NAME) message("CpltCore: generating executable ${TARGET_NAME}") add_executable(${TARGET_NAME} ${ENTRYPOINT_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() if(BUILD_CORE_MAIN) add_executable_variant(CpltCore_main) target_compile_definitions(CpltCore_main PRIVATE DOCTEST_CONFIG_DISABLE=1) endif() if(BUILD_CORE_TESTS) add_executable_variant(CpltCore_test) endif()