Files
cmake_common/cpp.cmake
T

257 lines
7.1 KiB
CMake
Raw Normal View History

2020-04-24 21:39:29 -04:00
macro(do_cpp_project)
set(Boost_USE_STATIC_RUNTIME OFF)
set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)
set(CMAKE_INSTALL_MESSAGE NEVER)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
find_package(Qt5Widgets REQUIRED)
find_package(Qt5QuickWidgets REQUIRED)
find_package(Qt5Quick REQUIRED)
find_package(Qt5Network REQUIRED)
find_package(Qt5WinExtras REQUIRED)
find_package(Qt5WebEngineWidgets REQUIRED)
find_package(Qt5WebSockets REQUIRED)
find_package(Qt5Qml REQUIRED)
find_package(Qt5LinguistTools)
2020-05-07 15:51:54 -04:00
find_package(ZLIB REQUIRED)
2020-04-24 21:39:29 -04:00
find_package(Boost REQUIRED COMPONENTS thread)
find_package(fmt REQUIRED)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set_property(GLOBAL PROPERTY AUTOGEN_SOURCE_GROUP autogen)
set_property(GLOBAL PROPERTY AUTOMOC_SOURCE_GROUP autogen)
set_property(GLOBAL PROPERTY AUTORCC_SOURCE_GROUP autogen)
execute_process(
COMMAND git log -1 --format=%h
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_COMMIT_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE
)
add_compile_definitions(
_UNICODE
UNICODE
NOMINMAX
_CRT_SECURE_NO_WARNINGS
BOOST_CONFIG_SUPPRESS_OUTDATED_MESSAGE
_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING
QT_MESSAGELOGCONTEXT
GITID="${GIT_COMMIT_HASH}")
set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" PROPERTY
2020-04-25 00:53:33 -04:00
VS_STARTUP_PROJECT ${PROJECT_NAME})
2020-04-24 21:39:29 -04:00
endmacro()
macro(cpp_pre_target)
2020-08-21 17:57:39 +01:00
file(GLOB_RECURSE source_files CONFIGURE_DEPENDS *.cpp)
file(GLOB_RECURSE header_files CONFIGURE_DEPENDS *.h)
file(GLOB_RECURSE qrc_files CONFIGURE_DEPENDS *.qrc)
file(GLOB_RECURSE rc_files CONFIGURE_DEPENDS *.rc)
file(GLOB_RECURSE ui_files CONFIGURE_DEPENDS *.ui)
file(GLOB_RECURSE rule_files CONFIGURE_DEPENDS ${CMAKE_BINARY_DIR}/*.rule)
file(GLOB_RECURSE misc_files CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/../*.natvis)
2020-04-24 21:39:29 -04:00
if(${create_translations})
qt5_create_translation(
qm_files
2020-08-21 17:57:39 +01:00
${source_files} ${header_files} ${ui_files} ${additional_translations}
2020-04-25 00:53:33 -04:00
${CMAKE_SOURCE_DIR}/src/${PROJECT_NAME}_en.ts
2020-04-24 21:39:29 -04:00
OPTIONS -silent
)
endif()
set(input_files
${source_files}
${header_files}
${qrc_files}
${rc_files}
${misc_files}
${qm_files})
# this needs to happen before the include() below because they're only used
# when creating the target
link_directories(
${modorganizer_install_lib_path}
${Boost_LIBRARY_DIRS}
${LZ4_ROOT}/bin
${ZLIB_ROOT}/lib
2020-04-25 00:53:33 -04:00
${LOOT_PATH}
${LIBBSARCH_ROOT}
2020-05-06 13:26:03 +02:00
${modorganizer_build_path}/googletest/build/lib
2020-04-24 21:39:29 -04:00
)
endmacro()
macro(cpp_post_target)
2020-04-25 00:53:33 -04:00
target_include_directories(${PROJECT_NAME} PRIVATE
2020-04-24 21:39:29 -04:00
${Boost_INCLUDE_DIRS}
${SPDLOG_ROOT}/include
${SEVENZ_ROOT}/CPP
${ZLIB_INCLUDE_DIRS}
${LZ4_ROOT}/lib
)
source_group(src REGULAR_EXPRESSION ".*\\.(h|cpp|ui)")
source_group(cmake FILES CMakeLists.txt)
source_group(autogen FILES ${rule_files} ${qm_files})
source_group(autogen REGULAR_EXPRESSION ".*\\cmake_pch.*")
source_group(resources FILES ${rc_files} ${qrc_files})
if(EXISTS ${CMAKE_SOURCE_DIR}/src/pch.h)
2020-04-25 00:53:33 -04:00
target_precompile_headers(${PROJECT_NAME}
2020-04-24 21:39:29 -04:00
PRIVATE ${CMAKE_SOURCE_DIR}/src/pch.h)
endif()
2020-04-25 00:53:33 -04:00
set_target_properties(${PROJECT_NAME} PROPERTIES
2020-04-24 21:39:29 -04:00
COMPILE_FLAGS "${COMPILE_FLAGS}")
2020-04-25 00:53:33 -04:00
set_target_properties(${PROJECT_NAME} PROPERTIES
2020-04-24 21:39:29 -04:00
COMPILE_FLAGS_RELWITHDEBINFO "${OPTIMIZE_COMPILE_FLAGS}")
2020-04-25 00:53:33 -04:00
set_target_properties(${PROJECT_NAME} PROPERTIES
2020-04-24 21:39:29 -04:00
LINK_FLAGS_RELWITHDEBINFO "${OPTIMIZE_LINK_FLAGS}")
2020-04-25 00:53:33 -04:00
target_link_libraries(${PROJECT_NAME}
2020-04-24 21:39:29 -04:00
Qt5::Widgets
Qt5::WinExtras
Qt5::WebEngineWidgets
Qt5::Quick
Qt5::Qml
Qt5::QuickWidgets
Qt5::Network
Qt5::WebSockets
fmt::fmt
liblz4 zlibstatic
${Boost_LIBRARIES}
Dbghelp Version Shlwapi
)
2020-04-25 00:53:33 -04:00
if(NOT ${PROJECT_NAME} STREQUAL "uibase")
2020-04-24 21:39:29 -04:00
requires_project("uibase")
endif()
2020-04-25 00:53:33 -04:00
if(${run_elevated})
set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS
"/MANIFESTUAC:\"level='requireAdministrator' uiAccess='false'\"")
endif()
2020-04-24 21:39:29 -04:00
endmacro()
function(add_filter)
cmake_parse_arguments(PARSE_ARGV 0 add_filter "" "NAME" "FILES;GROUPS")
set(files ${add_filter_FILES})
foreach(f ${add_filter_GROUPS})
set(files ${files} ${f}.cpp ${f}.h ${f}.inc ${f}.ui)
endforeach()
string(REPLACE "/" "\\" filter_name ${add_filter_NAME})
source_group(${filter_name} FILES ${files})
endfunction()
function(requires_project)
cmake_parse_arguments(PARSE_ARGV 0 requires "" "" "")
2020-04-25 00:53:33 -04:00
foreach(name ${requires_UNPARSED_ARGUMENTS})
if(${name} STREQUAL "game_gamebryo")
if(${PROJECT_NAME} STREQUAL "game_creation")
set(src_dirs "../gamebryo")
else()
set(src_dirs
"${modorganizer_super_path}/game_gamebryo/src/gamebryo"
"${modorganizer_super_path}/game_gamebryo/src/creation")
endif()
2020-04-24 22:23:24 -04:00
2020-04-25 00:53:33 -04:00
set(include_dirs ${src_dirs})
set(libs "")
if(NOT ${PROJECT_NAME} STREQUAL "game_gamebryo")
set(libs ${libs} game_gamebryo)
endif()
if(NOT ${PROJECT_NAME} STREQUAL "game_creation")
set(libs ${libs} game_creation)
endif()
elseif(${name} STREQUAL "usvfs")
set(src_dirs "${modorganizer_build_path}/usvfs/src")
set(include_dirs "${modorganizer_build_path}/usvfs/include")
set(libs "usvfs_x64")
2020-04-24 22:13:20 -04:00
else()
2020-04-25 00:53:33 -04:00
set(src_dirs "${modorganizer_super_path}/${name}/src")
set(include_dirs ${src_dirs})
set(libs ${name})
2020-04-24 22:13:20 -04:00
endif()
2020-04-24 21:39:29 -04:00
2020-04-25 00:53:33 -04:00
target_include_directories(${PROJECT_NAME} PRIVATE ${include_dirs})
2020-04-24 22:13:20 -04:00
2020-04-24 22:23:24 -04:00
set(has_source_files FALSE)
foreach(src_dir ${src_dirs})
file(GLOB_RECURSE source_files "${src_dir}/*.cpp")
if(NOT "X${source_files}" STREQUAL "X")
set(has_source_files TRUE)
break()
endif()
endforeach()
2020-04-24 22:13:20 -04:00
2020-04-24 22:23:24 -04:00
if(${has_source_files})
2020-04-25 00:53:33 -04:00
target_link_libraries(${PROJECT_NAME} ${libs})
2020-04-24 22:13:20 -04:00
endif()
2020-04-24 21:39:29 -04:00
endforeach()
endfunction()
2020-04-25 00:53:33 -04:00
function(requires_library)
cmake_parse_arguments(PARSE_ARGV 0 requires "" "" "")
foreach(name ${requires_UNPARSED_ARGUMENTS})
if(${name} STREQUAL "loot")
target_include_directories(${PROJECT_NAME} PRIVATE
${LOOT_PATH}/include)
target_link_libraries(${PROJECT_NAME} loot)
elseif(${name} STREQUAL "cpptoml")
include(ExternalProject)
ExternalProject_Add(
cpptoml
PREFIX "external"
URL "https://github.com/skystrife/cpptoml/archive/2051836a96a25e5a2d5283be7f633a157848f15e.tar.gz"
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND "")
ExternalProject_Get_Property(cpptoml SOURCE_DIR)
target_include_directories(${PROJECT_NAME} PRIVATE
"${SOURCE_DIR}/include")
add_dependencies(${PROJECT_NAME} cpptoml)
2020-05-06 13:26:03 +02:00
elseif(${name} STREQUAL "gtest")
target_include_directories(${PROJECT_NAME} PRIVATE
${modorganizer_build_path}/googletest/googletest/include
${modorganizer_build_path}/googletest/googlemock/include)
2020-05-06 13:26:03 +02:00
target_link_libraries(${PROJECT_NAME} gtest)
target_link_libraries(${PROJECT_NAME} gmock)
2020-05-06 13:26:03 +02:00
target_link_libraries(${PROJECT_NAME} gtest_main)
2020-04-25 00:53:33 -04:00
elseif(${name} STREQUAL "python")
target_include_directories(${PROJECT_NAME} PRIVATE
${PYTHON_ROOT}/Include)
elseif(${name} STREQUAL "libbsarch")
target_include_directories(${PROJECT_NAME} PRIVATE
${LIBBSARCH_ROOT})
target_link_libraries(${PROJECT_NAME} libbsarch libbsarch_OOP)
2020-04-25 00:53:33 -04:00
else()
message(FATAL_ERROR "unknown library ${name}")
endif()
endforeach()
endfunction()