You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
5.7 KiB
118 lines
5.7 KiB
#------------REQUIRED_1 指定CMake最低版本------------#
|
|
# 这里指定的CMake版本与它的特性(policies)相互关联
|
|
# 这意味着它也定义了 CMake 行为的变化
|
|
# 务必设置一个合适的 CMake 版本
|
|
cmake_minimum_required(VERSION 3.16)
|
|
|
|
#------------REQUIRED_2 指定项目名及项目版本------------#
|
|
project(
|
|
WireRoutingProject # 项目名称没有什么特别的用处。这里没有添加任何的目标(target)
|
|
VERSION 1.0
|
|
DESCRIPTION "A project for wire routing" # CMake 3.9+ 特性
|
|
# 语言可以是 C,CXX,Fortran,ASM,CUDA(CMake 3.8+),CSharp(3.8+),SWIFT(CMake 3.15+ experimental)
|
|
LANGUAGES CXX # 默认是C CXX
|
|
)
|
|
|
|
#------------REQUIRED_4 指定C++标准------------#
|
|
# !!!不要在库中使用此方式!!!,使用set_target_properties/set_property来针对目标设置标准
|
|
# 设置缓存变量: 设置了 C++ 标准的级别为 17(STRING) ,保存在CMakeCache.txt文件中,此处“”内容会写入为注释
|
|
set(CMAKE_CXX_STANDARD 17 CACHE STRING "The C++ standard to use")
|
|
# 告诉 CMake 使用上述设置
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
# 关闭了拓展,来明确自己使用了 -std=c++11 还是 -std=g++11
|
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
|
|
|
|
|
#------------OPTIONAL_1.1 转换.h.in 为.h头文件------------#
|
|
# configure_file(CMAKE_CURRENT_SOURCE_DIR/{input_file} CMAKE_CURRENT_BINARY_DIR/{output_file})
|
|
configure_file(config.h.in config.h)
|
|
|
|
|
|
#------------REQUIRED_5.1.1 find_package 添加大型第三方库(通过编译安装及包管理安装)------------#
|
|
# 添加自定义依赖路径到 CMAKE_PREFIX_PATH (find_package config 模式搜索路径之一)
|
|
if (WIN32)
|
|
# Windows 本地第三方库目录
|
|
# list(PREPEND CMAKE_PREFIX_PATH ${CMAKE_SOURCE_DIR}/3rd/tinyxml-x86)
|
|
list(PREPEND CMAKE_PREFIX_PATH ${CMAKE_SOURCE_DIR}/3rd/tinyxml-x64)
|
|
# 配置vcpkg
|
|
set(CMAKE_TOOLCHAIN_FILE "D:\\vcpkg\\scripts\\buildsystems\\vcpkg.cmake")
|
|
include(${CMAKE_TOOLCHAIN_FILE})
|
|
# 指定 CONFIG 模式,查看 <deps_dir>/share/<lib_name>/cmake/xxxConfig.cmake 文件名决定查找包名
|
|
find_package(tinyxml CONFIG REQUIRED)
|
|
# 令MSVC忽略 C4819 warning
|
|
add_compile_options(/wd4819)
|
|
elseif (APPLE)
|
|
# MacOS 本地第三方库目录
|
|
list(PREPEND CMAKE_PREFIX_PATH /Users/yony/CODE/Dependencies)
|
|
# Setting pkg-config for tinyxml usage
|
|
set(ENV{PKG_CONFIG_PATH} /opt/homebrew/lib/pkgconfig/)
|
|
find_package(PkgConfig)
|
|
pkg_search_module(TINYXML REQUIRED tinyxml)
|
|
message(STATUS "=== TINYXML_LIBRARIES: ${TINYXML_LIBRARIES}")
|
|
message(STATUS "=== TINYXML_INCLUDE_DIRS: ${TINYXML_INCLUDE_DIRS}")
|
|
elseif (UNIX)
|
|
# Linux 本地第三方库目录
|
|
list(PREPEND CMAKE_PREFIX_PATH /home/yony/PROJECTS/Dependencies)
|
|
find_package(tinyxml CONFIG REQUIRED)
|
|
endif()
|
|
# 输出 find_package 系统路径和当前指定路径
|
|
message(STATUS "CMAKE_SYSTEM_PREFIX_PATH: ${CMAKE_SYSTEM_PREFIX_PATH}")
|
|
message(STATUS "Self added CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}")
|
|
|
|
#------------REQUIRED_5.1.2 include 执行.cmake中的ContentFetch模块来引入库------------#
|
|
# 添加cmake目录到CMAKE_MODULE_PATH,以供 include 方法使用
|
|
list(PREPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
|
|
message(STATUS "Self added CMAKE_MODULE_PATH: ${CMAKE_MODULE_PATH}")
|
|
|
|
# 添加子目录,子目录中的CMakeLists.txt将会被执行
|
|
add_subdirectory(lib)
|
|
|
|
#------------REQUIRED_3 添加可执行文件------------#
|
|
# 不要使用file函数中GLOB来收集文件:如果不重新运行 CMake,Make 或者其他的工具将不会知道你是否添加了某个文件
|
|
# 相对的,使用aux_source_directory来列表化源文件目录
|
|
aux_source_directory(src SRC_DIR)
|
|
add_executable(
|
|
${PROJECT_NAME} # 既是生成的可执行文件的名称,也是创建的 CMake 目标(target)的名称
|
|
${SRC_DIR}
|
|
)
|
|
|
|
|
|
#------------REQUIRED_5.2 将库链接到目标(通常是一个可执行文件),这个命令告诉 CMake 在构建目标时需要链接哪些库------------#
|
|
# target_link_libraries(${PROJECT_NAME} PUBLIC {lib_name1} {lib_name1} ...)
|
|
# 根据包管理工具在系统环境变量的情况,以及网络下载的包中CMakeLists.txt的编写情况
|
|
# 在这里链接库则可下方target_include_directories中可不添加 <lib_name>/include 或 <LIB_NAME>_INCLUDE_DIRS
|
|
|
|
if (WIN32)
|
|
target_link_libraries(
|
|
${PROJECT_NAME} PUBLIC
|
|
unofficial-tinyxml::unofficial-tinyxml
|
|
${CMAKE_SOURCE_DIR}/build/lib/Debug/WireRoutingLib.lib
|
|
)
|
|
elseif (APPLE)
|
|
target_link_libraries(
|
|
${PROJECT_NAME} PUBLIC
|
|
${pkgcfg_lib_TINYXML_tinyxml}
|
|
${CMAKE_SOURCE_DIR}/build/lib/WireRoutingLib.dylib
|
|
)
|
|
endif()
|
|
|
|
|
|
#------------OPTIONAL_1.2 添加生成的config.h头文件所在目录------------#
|
|
# 为目标添加了一个目录,源码中的 #include "config.h" 将会被解析为 ${PROJECT_BINARY_DIR}/config.h
|
|
target_include_directories(
|
|
# PUBLIC 影响当前目标和链接到这个目标的目标(库)
|
|
# PRIVATE(只影响当前目标,不影响依赖)
|
|
# INTERFACE(只影响依赖)
|
|
${PROJECT_NAME} PUBLIC
|
|
${PROJECT_BINARY_DIR} # config.h.in 会生成配置在 build 目录
|
|
${CMAKE_SOURCE_DIR}/include
|
|
${CMAKE_SOURCE_DIR}/lib/include
|
|
${TINYXML_INCLUDE_DIR} # Windows: tinyxml header dir
|
|
${TINYXML_INCLUDE_DIRS} # MacOS: pkg-config tinyxml dir
|
|
)
|
|
|
|
# make install 转移生成链接库的目标路径
|
|
set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/publish" CACHE PATH "Install path prefix" FORCE)
|
|
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin) # .exe .dll
|
|
install(DIRECTORY ${CMAKE_SOURCE_DIR}/data/ DESTINATION data)
|
|
install(FILES readme.md parameters.txt DESTINATION ./)
|
|
|