Skip to content

Instantly share code, notes, and snippets.

@navono
Created March 5, 2024 07:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save navono/ae51810f6607a8d1ba38287333d6c39d to your computer and use it in GitHub Desktop.
Save navono/ae51810f6607a8d1ba38287333d6c39d to your computer and use it in GitHub Desktop.
CMake 工程示例配置文件
################################################## Project ##################################################
cmake_minimum_required(VERSION 3.24)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
include(utils)
extract_version()
include(get_platform)
include(CPM)
project(VFConfigGen VERSION ${VFCONFIGGEN_VERSION} LANGUAGES CXX)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 编译选项
if (TARGET_PLATFORM_WINDOWS)
add_compile_options(/W4)
add_compile_options(/WX-)
else ()
add_compile_options(-Wall -Wextra -pedantic)
endif ()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY $<1:${CMAKE_SOURCE_DIR}/bin>)
message(STATUS "Build app: ${VFCONFIGGEN_VERSION}")
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
message(STATUS "Build platform: ${CMAKE_SYSTEM_NAME}")
message(STATUS "Build output: ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
################################################## Sources ##################################################
file(GLOB_RECURSE PROJECT_HEADERS
${PROJECT_SOURCE_DIR}/include/*.h
${PROJECT_SOURCE_DIR}/include/*.hpp
${CMAKE_SOURCE_DIR}/include/*.h
${CMAKE_SOURCE_DIR}/include/*.hpp
${CMAKE_SOURCE_DIR}/include/*.ipp
${CMAKE_SOURCE_DIR}/vf/*.h)
file(GLOB_RECURSE PROJECT_SOURCES
${PROJECT_SOURCE_DIR}/*.c
${PROJECT_SOURCE_DIR}/*.cc
${PROJECT_SOURCE_DIR}/*.cxx
${PROJECT_SOURCE_DIR}/*.cpp
${PROJECT_SOURCE_DIR}/*.cu
${CMAKE_SOURCE_DIR}/vf/*.cpp)
file(GLOB_RECURSE PROJECT_CMAKE_UTILS cmake/*.cmake)
file(GLOB_RECURSE PROJECT_MISC *.bat *.gitignore *.md *.py *.sh *.txt)
#message(STATUS "project src dir: ${PROJECT_SOURCE_DIR}")
#message(STATUS "project src: ${PROJECT_SOURCES}")
# 额外的目录
#aux_source_directory(./src/xxx PROJECT_SOURCES)
if (TARGET_PLATFORM_WINDOWS)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/version.rc.in ${CMAKE_CURRENT_BINARY_DIR}/version.rc @ONLY)
list(APPEND PROJECT_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/version.rc)
add_compile_definitions(_WINDOWS)
endif ()
set(PROJECT_FILES
${PROJECT_HEADERS}
${PROJECT_SOURCES}
${PROJECT_CMAKE_UTILS}
${PROJECT_MISC})
include(assign_source_group)
assign_source_group(${PROJECT_FILES})
################################################## Dependencies ##################################################
# ADD LIBRARIES HERE.
# Examples:
# - Header Only:
# find_package (GLM REQUIRED)
# import_library(GLM_INCLUDE_DIRS)
# - Identical Debug and Release:
# find_package (OpenGL REQUIRED)
# import_library(OPENGL_INCLUDE_DIR OPENGL_LIBRARIES)
# - Separate Debug and Release:
# find_package (Boost REQUIRED iostreams)
# import_library(Boost_INCLUDE_DIRS Boost_IOSTREAMS_LIBRARY_DEBUG Boost_IOSTREAMS_LIBRARY_RELEASE)
# - You may also set the PROJECT_INCLUDE_DIRS and PROJECT_LIBRARIES instead of using import_library.
include(import_library)
# SPDLOG_FMT_EXTERNAL 设置为 ON 时, fmt 的依赖必须在 spdlog 之前
CPMAddPackage("gh:fmtlib/fmt#10.2.1")
CPMAddPackage(
NAME spdlog
GITHUB_REPOSITORY gabime/spdlog
VERSION 1.13.0
OPTIONS "SPDLOG_FMT_EXTERNAL ON")
CPMAddPackage("gh:troldal/OpenXLSX#b80da42d1454f361c29117095ebe1989437db390")
CPMAddPackage("gh:ithewei/libhv@1.3.0")
CPMAddPackage("gh:brofield/simpleini@4.22")
CPMAddPackage("gh:nlohmann/json@3.11.3")
if (CMAKE_BUILD_TYPE AND (CMAKE_BUILD_TYPE STREQUAL "Debug"))
list(APPEND PROJECT_LIB_DIR ${CMAKE_SOURCE_DIR}/third_party/libs/Debug)
elseif (CMAKE_BUILD_TYPE AND (CMAKE_BUILD_TYPE STREQUAL "Release"))
list(APPEND PROJECT_LIB_DIR ${CMAKE_SOURCE_DIR}/third_party/libs/Release)
endif ()
list(APPEND PROJECT_LIB_DIR ${CMAKE_SOURCE_DIR}/lib)
list(APPEND PROJECT_INCLUDE_DIRS ${BS_thread_pool_SOURCE_DIR}/include)
if (CMAKE_BUILD_TYPE AND (CMAKE_BUILD_TYPE STREQUAL "Debug"))
list(APPEND PROJECT_LIBRARIES
FBDTemplateConvertD)
elseif (CMAKE_BUILD_TYPE AND (CMAKE_BUILD_TYPE STREQUAL "Release"))
list(APPEND PROJECT_LIBRARIES
FBDTemplateConvert)
endif ()
list(APPEND PROJECT_LIBRARIES
nlohmann_json::nlohmann_json
SimpleIni
OpenXLSX::OpenXLSX
hv
fmt
spdlog::spdlog)
if (TARGET_PLATFORM_WINDOWS)
# 设置使用 MFC
set(CMAKE_MFC_FLAG 2) # 设置为1表示使用静态链接 MFC 库;2是共享链接 MFC 库
set(CMAKE_GENERATOR_PLATFORM Win32)
list(APPEND PROJECT_LIBRARIES
ws2_32.lib
psapi.lib
iphlpapi.lib)
endif ()
################################################## Targets ##################################################
include_directories(${PROJECT_INCLUDE_DIRS})
link_directories(${PROJECT_LIB_DIR}) # 要在 add_executable 前
link_libraries(${PROJECT_LIBRARIES})
message(STATUS "Deps libs dir: ${PROJECT_LIB_DIR}")
message(STATUS "Deps libs: ${PROJECT_LIBRARIES}")
if (TARGET_PLATFORM_WINDOWS)
# 入口类型:
# /SUBSYSTEM:WINDOWS
# /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup
# /SUBSYSTEM:CONSOLE
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS")
add_executable(${PROJECT_NAME} WIN32 ${PROJECT_FILES})
else ()
add_executable(${PROJECT_NAME} ${PROJECT_FILES})
endif ()
# 可添加编译宏,例如:
#add_compile_definitions(UNICODE _UNICODE)
target_include_directories(${PROJECT_NAME} PUBLIC
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
$<INSTALL_INTERFACE:include> PRIVATE ..)
target_compile_definitions(${PROJECT_NAME} PUBLIC ${PROJECT_COMPILE_DEFINITIONS})
target_compile_options(${PROJECT_NAME} PUBLIC ${PROJECT_COMPILE_OPTIONS})
set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE CXX)
if (TARGET_PLATFORM_WINDOWS)
set_target_properties(${PROJECT_NAME} PROPERTIES
VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/bin")
target_compile_definitions(${PROJECT_NAME} PRIVATE
# Prevents Windows.h from adding unnecessary includes
WIN32_LEAN_AND_MEAN
# Prevents Windows.h from defining min/max as macros
NOMINMAX
_CRT_SECURE_NO_WARNINGS)
# 链接 MFC 库
target_link_libraries(${PROJECT_NAME} PRIVATE
"$<$<CONFIG:Debug>:${MFC_LIB_DEBUG}>"
"$<$<CONFIG:Release>:${MFC_LIB_RELEASE}>")
endif ()
################################################## Postbuild ##################################################
# copy third party dll
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_RUNTIME_DLLS:${PROJECT_NAME}> $<TARGET_FILE_DIR:${PROJECT_NAME}>
COMMAND_EXPAND_LISTS)
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
${CMAKE_SOURCE_DIR}/vf_bin
${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
################################################## Installation ##################################################
#install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}-config
# RUNTIME DESTINATION ../../bin)
#install(DIRECTORY ../../include DESTINATION ../../include)
#install(EXPORT ${PROJECT_NAME}-config DESTINATION ../../cmake)
#export(TARGETS ${PROJECT_NAME} FILE ${PROJECT_NAME}-config.cmake)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment