CMakeLists使用简介

常用技巧

常用关键词

cmake_minimum_required

1
cmake_minimum_required(VERSION 3.15)

指定最小CMake版本不能低于3.15

project

1
project(emodem C ASM)

指定工程名称,并指定所有源文件可能使用的语言为C或ASM(汇编)。

message

1
message(STATUS "cross compile cortex-r5")

输出消息。

  • STATUS为普通状态消息
  • FATAL_ERROR为致命异常消息,输出消息后配置会立即终止

if

1
2
3
4
5
6
7
if(NOT FREERTOS_CONFIG_FILE_DIRECTORY)
message(FATAL_ERROR "xxx")
elseif(NOT EXISTS xxx.h)
message(FATAL_ERROR "xxx.h")
else
message(status "x")
endif()

判断条件是否满足,并进行相关逻辑处理。

set

1
set(CMAKE_ASM_FLAGS "${COMMON_FLAGS} -x assembler-with-cpp")

指定CMake宏对应的值,子工程会继承父工程的CMake宏。

add_subdirectory

1
add_subdirectory(FreeRTOS/FreeRTOS-Kernel)

增加子工程。

file

1
file(GLOB_RECURSE APP_SRC   "app/**/*.c")

文件处理,GLOB_RECURSE用于递归查找文件,并将结果保存到CMake宏APP_SRC中。

add_executable

1
2
3
add_executable(${MAIN_TARGET}
${APP_SRC}
)

指定可执行文件目标,并指定编译源码${APP_SRC}

add_library

1
2
3
4
add_library(freertos_kernel STATIC
croutine.c
$<IF:$<BOOL:$<FILTER:${FREERTOS_HEAP},EXCLUDE,^[1-5]$>>,${FREERTOS_HEAP},portable/MemMang/heap_${FREERTOS_HEAP}.c>
)

指定静态库目标,并指定编译源码croutine.c portable/MemMang/heap_xxx.c

include

1
include(${CMAKE_TOOLCHAIN_FILE})

包含头文件${CMAKE_TOOLCHAIN_FILE}

include_directories

1
2
3
4
5
include_directories(${MAIN_TARGET}
include
FreeRTOS/FreeRTOS-Kernel/include
FreeRTOS/FreeRTOS-Kernel/portable/GCC/ARM_COTEXT_R5
)

目标增加include文件搜索路径include FreeRTOS/FreeRTOS-Kernel/include FreeRTOS/FreeRTOS-Kernel/portable/GCC/ARM_COTEXT_R5

target_include_directories

1
2
3
4
5
6
target_include_directories(freertos_kernel
PUBLIC
include
portable/GCC/ARM_COTEXT_R5
${FREERTOS_CONFIG_FILE_DIRECTORY}
)

目标增加include文件搜索路径include FreeRTOS/FreeRTOS-Kernel/portable/GCC/ARM_COTEXT_R5 ${FREERTOS_CONFIG_FILE_DIRECTORY}

add_definitions

1
add_definitions(-DDEBUG -DUSE_LOG)

增加编译宏DEBUGUSE_LOG

1
2
3
target_link_directories(${MAIN_TARGET} PRIVATE
${PROJECT_BINARY_DIR}/lib
)

目标增加链接库搜索路径${PROJECT_BINARY_DIR}/lib

1
2
3
4
target_link_libraries(${MAIN_TARGET} PRIVATE
freertos_kernel_port
freertos_kernel
)

目标增加链接库freertos_kernel_port freertos_kernel

常用CMake宏

指定CMake宏使用set关键词进行设置。

名称说明
PROJECT_NAME工程名称
PROJECT_BINARY_DIR工程二进制主路径,即build构建主路径
PROJECT_SOURCE_DIR工程源文件主路径,即主CMakeList.txt文件所在路径
CMAKE_C_COMPILERC语言编译器路径
CMAKE_CXX_COMPILERC++编译器路径
CMAKE_ASM_COMPILER汇编编译器路径
CMAKE_C_FLAGSC语言编译参数
CMAKE_ASM_FLAGS汇编编译参数
CMAKE_EXE_LINKER_FLAGS可执行文件链接参数
LIBRARY_OUTPUT_PATH库输出路径
EXECUTABLE_OUTPUT_PATH可执行文件输出路径

项目实例

嵌入式处理器r5

工程中有三个文件构成,主CMakeLists负责产生elf文件和生成bin文件。FreeRTOS代码在os/freertos中,CMakeLists用于生成内核静态库libfreertos_kernel.aos/freertos/portable下,CMakeLists用于生成处理器相关静态库libfreertos_kernel_port.a

原版CMakeLists内容比较多,这里固定选择GCC_ARM_COTEXT_R5,已将冗余项裁剪,具体可以参考FreeRTOSv202210.01-LTS对应文件。

主CMakeLists

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
cmake_minimum_required(VERSION 3.15)

project(emodem C ASM)

message(STATUS "cross compile cortex-r5")

set(TOOLCHAIN_PATH /usr/local/gcc-arm-none-eabi-8-2018-q4-major)
set(CMAKE_C_COMPILER ${TOOLCHAIN_PATH}/bin/arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PATH}/bin/arm-none-eabi-gcc)
set(CMAKE_ASM_COMPILER ${TOOLCHAIN_PATH}/bin/arm-none-eabi-gcc)
set(COMMON_FLAGS "-mcpu=cortex-r5 -marm -mfloat-abi=hard -mfpu=vfpv3-d16 -O1 -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -g3")
set(CMAKE_C_FLAGS "-D__SINGLE_DISPLAY_DC__=2 -D__DPTX_CONNECTOR__ ${COMMON_FLAGS} -D SAFETY_GMAC")
set(CMAKE_ASM_FLAGS "-D__SINGLE_DISPLAY_DC__=2 -D__DPTX_CONNECTOR__ ${COMMON_FLAGS} -x assembler-with-cpp")
set(CMAKE_EXE_LINKER_FLAGS "-T ${PROJECT_SOURCE_DIR}/cortex_r5.ld -Wl,-Map,${PROJECT_NAME}.map -nostartfiles -Xlinker --gc-sections --specs=nano.specs -u _printf_float --specs=nosys.specs")

set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
# option(MYDEBUG "enable debug compilation" OFF)
# if (MYDEBUG)
# add_definitions(-DMYDEBUG)
# message(STATUS "Currently is in debug mode")
# else()
# message(STATUS "Currently is not in debug mode")
# endif()

set(FREERTOS_CONFIG_FILE_DIRECTORY ${PROJECT_SOURCE_DIR}/include CACHE STRING "Absolute path to the directory with FreeRTOSConfig.h")
add_subdirectory(os/freertos)

file(GLOB_RECURSE APP_SRC "app/**/*.c")
file(GLOB_RECURSE BOOT_SRC "boot/*.S")

# find_library(FREERTOS_LIB testFunc HINTS ${PROJECT_SOURCE_DIR}/testFunc/lib)

set(MAIN_TARGET ${PROJECT_NAME}_freertos.elf)
add_executable(${MAIN_TARGET}
${BOOT_SRC}
${APP_SRC}
)
include_directories(${MAIN_TARGET}
include
os/freertos/include
os/freertos/portable
)
target_link_directories(${MAIN_TARGET} PRIVATE
${PROJECT_BINARY_DIR}/lib
${PROJECT_SOURCE_DIR}/lib
)
target_link_libraries(${MAIN_TARGET} PRIVATE
freertos_kernel_port
freertos_kernel
# mcal
)
set(MAIN_BIN_TARGET ${PROJECT_NAME}_freertos.bin)
add_custom_command(TARGET ${MAIN_TARGET} POST_BUILD
COMMAND ${TOOLCHAIN_PATH}/bin/arm-none-eabi-objcopy -O binary -S ${EXECUTABLE_OUTPUT_PATH}/${MAIN_TARGET} ${EXECUTABLE_OUTPUT_PATH}/${MAIN_BIN_TARGET}
COMMENT "Generate ${EXECUTABLE_OUTPUT_PATH}/${MAIN_BIN_TARGET}"
)


# target_link_options(${MAIN_TARGET} PRIVATE
# -T${PROJECT_SOURCE_DIR}/cortex_r5.ld
# )

# # indicate lib path
# target_link_directories(${MAIN_TARGET}
# PRIVATE
# ${OUT_PATH}/lib
# )



# # on the basic of debug to set CFLAGS
# if (debug STREQUAL "yes")
# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O0 -ggdb3")
# else()
# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O2")
# endif()

# # on the basic of r5_LITTLE_FLASH to set CFLAGS
# if (r5_LITTLE_FLASH STREQUAL "TRUE")
# # set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSAMPLE_620U_NAND")
# endif()

os/freertos的MakeLists

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
cmake_minimum_required(VERSION 3.15)

# User is responsible to set two mandatory options:
# FREERTOS_CONFIG_FILE_DIRECTORY
# FREERTOS_PORT
#
# User can choose which heap implementation to use (either the implementations
# included with FreeRTOS [1..5] or a custom implementation ) by providing the
# option FREERTOS_HEAP. If the option is not set, the cmake will default to
# using heap_4.c.

# Absolute path to FreeRTOS config file directory
# set(FREERTOS_CONFIG_FILE_DIRECTORY ${FREERTOS_CONFIG_FILE_PATH} CACHE STRING "Absolute path to the directory with FreeRTOSConfig.h")

if(NOT FREERTOS_CONFIG_FILE_DIRECTORY)
message(FATAL_ERROR " FreeRTOSConfig.h file directory not specified. Please specify absolute path to it from top-level CMake file:\n"
" set(FREERTOS_CONFIG_FILE_DIRECTORY <absolute path to FreeRTOSConfig.h directory> CACHE STRING \"\")\n"
" or from CMake command line option:\n"
" -DFREERTOS_CONFIG_FILE_DIRECTORY='/absolute_path/to/FreeRTOSConfig.h/directory'")
elseif(NOT EXISTS ${FREERTOS_CONFIG_FILE_DIRECTORY}/FreeRTOSConfig.h)
message(FATAL_ERROR " FreeRTOSConfig.h file not found in the directory specified (${FREERTOS_CONFIG_FILE_DIRECTORY})\n"
" Please specify absolute path to it from top-level CMake file:\n"
" set(FREERTOS_CONFIG_FILE_DIRECTORY <absolute path to FreeRTOSConfig.h directory> CACHE STRING \"\")\n"
" or from CMake command line option:\n"
" -DFREERTOS_CONFIG_FILE_DIRECTORY='/absolute_path/to/FreeRTOSConfig.h/directory'")
endif()

# Heap number or absolute path to custom heap implementation provided by user
set(FREERTOS_HEAP "4" CACHE STRING "FreeRTOS heap model number. 1 .. 5. Or absolute path to custom heap source file")

# FreeRTOS port option
set(FREERTOS_PORT "GCC_ARM_COTEXT_R5" CACHE STRING "FreeRTOS port name")

if(NOT FREERTOS_PORT)
message(FATAL_ERROR " FREERTOS_PORT is not set. Please specify it from top-level CMake file (example):\n"
" set(FREERTOS_PORT GCC_ARM_CM4F CACHE STRING \"\")\n"
" or from CMake command line option:\n"
" -DFREERTOS_PORT=GCC_ARM_CM4F\n"
" \n"
" Available port options:\n"
" GCC_ARM_COTEXT_R5 - Compiller: GCC Target: ARM Cortex-R5")
endif()

add_subdirectory(portable)

add_library(freertos_kernel STATIC
src/croutine.c
src/event_groups.c
src/list.c
src/queue.c
src/stream_buffer.c
src/tasks.c
src/timers.c

# If FREERTOS_HEAP is digit between 1 .. 5 - it is heap number, otherwise - it is path to custom heap source file
$<IF:$<BOOL:$<FILTER:${FREERTOS_HEAP},EXCLUDE,^[1-5]$>>,${FREERTOS_HEAP},portable/MemMang/heap_${FREERTOS_HEAP}.c>
)

target_include_directories(freertos_kernel
PUBLIC
include
portable/GCC/ARM_COTEXT_R5
${FREERTOS_CONFIG_FILE_DIRECTORY}
)

target_link_libraries(freertos_kernel freertos_kernel_port)

os/freertos/portable的CMakeLists

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# FreeRTOS internal cmake file. Do not use it in user top-level project

add_library(freertos_kernel_port STATIC
# ARM-Cortext-R5 port for GCC
$<$<STREQUAL:${FREERTOS_PORT},GCC_ARM_COTEXT_R5>:
portable_port.c
portASM.S>

# 16-Bit DOS ports for BCC
$<$<STREQUAL:${FREERTOS_PORT},BCC_16BIT_DOS_FLSH186>:
BCC/16BitDOS/common/portcomn.c
BCC/16BitDOS/Flsh186/port.c>
)

if( FREERTOS_PORT MATCHES "GCC_ARM_CM(3|4)_MPU" OR
FREERTOS_PORT STREQUAL "IAR_ARM_CM4F_MPU" OR
FREERTOS_PORT STREQUAL "RVDS_ARM_CM4_MPU" OR
FREERTOS_PORT MATCHES "GCC_ARM_CM(23|33|55|85)_NTZ_NONSECURE" OR
FREERTOS_PORT MATCHES "GCC_ARM_CM(23|33|55|85)_NONSECURE" OR
FREERTOS_PORT MATCHES "GCC_ARM_CM(33|55|85)_TFM" OR
FREERTOS_PORT MATCHES "IAR_ARM_CM(23|33|55|85)_NTZ_NONSECURE" OR
FREERTOS_PORT MATCHES "IAR_ARM_CM(23|33|55|85)_NONSECURE"
)
target_sources(freertos_kernel_port PRIVATE Common/mpu_wrappers.c)
endif()

target_include_directories(freertos_kernel_port PUBLIC
# ARM-Cortext-R5 port for GCC
$<$<STREQUAL:${FREERTOS_PORT},GCC_ARM_COTEXT_R5>:${CMAKE_CURRENT_LIST_DIR}>

# 16-Bit DOS ports for BCC
$<$<STREQUAL:${FREERTOS_PORT},BCC_16BIT_DOS_FLSH186>:
${CMAKE_CURRENT_LIST_DIR}/BCC/16BitDOS/common
${CMAKE_CURRENT_LIST_DIR}/BCC/16BitDOS/Flsh186>

$<$<STREQUAL:${FREERTOS_PORT},BCC_16BIT_DOS_PC>:
${CMAKE_CURRENT_LIST_DIR}/BCC/16BitDOS/common
${CMAKE_CURRENT_LIST_DIR}/BCC/16BitDOS/PC>
)

target_link_libraries(freertos_kernel_port
PUBLIC
$<$<STREQUAL:${FREERTOS_PORT},GCC_RP2040>:pico_base_headers>
$<$<STREQUAL:${FREERTOS_PORT},GCC_XTENSA_ESP32>:idf::esp32>
PRIVATE
freertos_kernel
"$<$<STREQUAL:${FREERTOS_PORT},GCC_RP2040>:hardware_clocks;hardware_exception>"
$<$<STREQUAL:${FREERTOS_PORT},MSVC_MINGW>:winmm> # Windows library which implements timers
)

其他说明

基本结构

工程文件CMakeLists.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# 指定CMake工具的最小版本号
cmake_minimum_required(VERSION 3.10)

# 指定C++标准版本
set(CMAKE_CXX_STANDARD 17)

# 指定工程名称
# CXX可以不指定
project(TEST CXX)

# 判断主机平台,增加编译宏
if (CMAKE_HOST_SYSTEM_NAME MATCHES "Linux")
message("-- Detecting system: Linux")
add_definitions(-DBUILD_IN_LINUX)
else()
message("-- Detecting system: Windows")
endif()
# 判断平台
if(WIN32)
message(STATUS "This is windows")
elseif(UNIX)
message(STATUS "This is linux")
else()
message(STATUS "This is mac")
endif()

# 判断编译模式
if(CMAKE_BUILD_TYPE AND (CMAKE_BUILD_TYPE STREQUAL "Debug"))
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -O0")
message(STATUS "Build mode: ${CMAKE_BUILD_TYPE} ${CMAKE_CXX_FLAGS_DEBUG}")
else()
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall")
message(STATUS "Build mode: ${CMAKE_BUILD_TYPE} ${CMAKE_CXX_FLAGS_RELEASE}")
endif()

# 查找curl包,CMake自带包管理
# 根据依赖添加
find_package(CURL)
if(CURL_FOUND)
include_directories(${CURL_INCLUDE_DIR})
else()
message(FATAL_ERROR "CURL library not found")
endif()
# 自定义LARCH包,REQUIRED必须具备此包
# 根据依赖添加
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_BINARY_DIR}/../cmod)
find_package(LARCH REQUIRED)
if(LARCH_FOUND)
message(STATUS "LARCH library found")
include_directories(${LARCH_INCLUDE_DIR})
else()
message(FATAL_ERROR "LARCH library not found")
endif()

# 配置各子组件,目录中需要包含CMakeLists.txt文件
add_subdirectory(show)
add_subdirectory(lib)

# 配置工程各类组件输出路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
set(LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
set(ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/liba)

# 设置环境变量方式
set(ENV{ENV_PRO_PATH} ${PROJECT_BINARY_DIR})

# 递归(GLOB_RECURSE)查找src/AST目录中cpp文件
file(GLOB_RECURSE AST_SOURCE "src/AST/*.cpp")

# 增加可执行文件编译目标
add_executable(testc "src/tools/Generator.cpp"
${AST_SOURCE}
)

# 增加可执行文件编译的头文件目录
target_include_directories(testc PUBLIC include # include
)

# 处理过程执行命令
# 增加命令执行,并将结果输出到变量中,由message打印出来
exec_program(ls ${PROJECT_BINARY_DIR}
OUTPUT_VARIABLE o1
ARGS -l -h
RETURN_VALUE r1
)
message("ls output:\n${o1} \n ls return: ${r1}")

message

基本格式

message( [STATUS|WARNING|AUTHOR_WARNING|SEND_ERROR|FATAL_ERROR] "Message to display" ...)

STATUS

状态消息,自动在消息前增加--以示区别

1
2
3
message(STATUS "Detecting system: Linux")

[cmake] -- Detecting system: Linux

WARFATAL_ERRORNING

告警消息,消息单独显示一行,CMake会继续执行

1
2
3
4
5
6
7
message(WARNING "Detecting system: Linux")

[cmake] CMake Warning at CMakeLists.txt:8 (message):
[cmake] Detecting system: Linux
[cmake]
[cmake]
[cmake] Not searching for unused variables given on the command line.

AUTHOR_WARNING

开发者告警消息,消息单独显示一行,CMake会继续执行

1
2
3
4
5
6
7
message(AUTHOR_WARNING "Detecting system: Linux")

[cmake] CMake Warning (dev) at CMakeLists.txt:8 (message):
[cmake] Detecting system: Linux
[cmake] This warning is for project developers. Use -Wno-dev to suppress it.
[cmake]
[cmake] Not searching for unused variables given on the command line.

SEND_ERROR

错误消息,消息单独显示一行,CMake会继续执行但会跳过生成步骤

1
2
3
4
5
6
7
8
9
message(SEND_ERROR "Detecting system: Linux")

[cmake] CMake Error at CMakeLists.txt:8 (message):
[cmake] Detecting system: Linux
[cmake]
[cmake]
[cmake] Not searching for unused variables given on the command line.
[cmake] -- Configuring incomplete, errors occurred!
[cmake] See also "/root/workspace/tcl3/build/CMakeFiles/CMakeOutput.log".

FATAL_ERROR

错误消息,消息单独显示一行,CMake会终止所有处理

1
2
3
4
5
6
7
8
9
message(FATAL_ERROR "Detecting system: Linux")

[cmake] CMake Error at CMakeLists.txt:8 (message):
[cmake] Detecting system: Linux
[cmake]
[cmake]
[cmake] Not searching for unused variables given on the command line.
[cmake] -- Configuring incomplete, errors occurred!
[cmake] See also "/root/workspace/tcl3/build/CMakeFiles/CMakeOutput.log".

自定义包

自定义LARCH

创建文件cmod/FindLARCH.cmake,文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# set(CMAKE_FIND_LIBRARY_PREFIXES lib)
# set(CMAKE_FIND_LIBRARY_SUFFIXES .so)

find_path(LARCH_INCLUDE_DIR larch.h /tmp/test/p1/include)
find_path(LARCH_LIBRARY liblarch.so /tmp/test/p1/lib)
# find_library(LARCH_LIBRARY NAMES larch PATH /tmp/test/p1/lib)

if(LARCH_INCLUDE_DIR AND LARCH_LIBRARY)
set(LARCH_FOUND TRUE)
endif()

if(LARCH_FOUND)
if(NOT LARCH_FIND_QUIETLY)
message(STATUS "Found LARCH: ${LARCH_LIBRARY}")
endif()
else()
if(LARCH_FIND_REQUIRED)
message(FATAL_ERROR "LARCH library not found")
endif()
endif()

子组件

库文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
cmake_minimum_required(VERSION 3.10)

# 配置库源文件
set(LIB_SRC larch.c)

# 配置版本号
set(API_VERSION 1.2)
set(CUR_VERSION 1.2.1)

# 编译动态库;VERSION为当前版本;SOVERSION为API版本,它会链接到当前版本,不带版本库也会链接到API版本;
add_library(larch SHARED ${LIB_SRC})
set_target_properties(larch PROPERTIES VERSION ${CUR_VERSION} SOVERSION ${API_VERSION})

# 编译静态库,目标不能同名,静态库需要用属性来修改
add_library(larch_static STATIC ${LIB_SRC})
set_target_properties(larch_static PROPERTIES OUTPUT_NAME "larch")

# 获取目标属性
get_target_property(OV larch_static OUTPUT_NAME)
# message(STATUS "This is larch_static name:"${OV})

# 配置共享库和头文件安装路径
install(TARGETS larch larch_static
RUNTIME DESTINATION /${PROJECT_NAME}/bin # 执行程序
LIBRARY DESTINATION /${PROJECT_NAME}/lib # 动态库
ARCHIVE DESTINATION /${PROJECT_NAME}/libstatic # 静态库
# PERMISSIONS OWNER_EXECUTE OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ # 配置权限
)
install(FILES larch.h DESTINATION /${PROJECT_NAME}/include)

可执行文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
cmake_minimum_required(VERSION 3.10)

# 配置源码和输出路径
# set(DESTDIR /usr/local)
# CMAKE_INSTALL_PREFIX:=/usr/local
# set(SRC_LIST main.c)
aux_source_directory(. SRC_LIST)

# 配置cmake构建打印
message(STATUS "Start build tr")

# 配置编译执行程序
add_executable(tr ${SRC_LIST})

# 配置头文件搜索路径
# 这里应该改为工程包含路径${LARCH_INCLUDE_DIR},见自定义LARCH包
find_path(header_path NAMES larch.h PATHS ../lib)
if(header_path)
include_directories(${header_path})
message(STATUS "find header path: " ${header_path})
endif(header_path)

# 配置动态库或静态库(liblarch.a)
target_link_libraries(tr larch)
add_dependencies(tr larch)

# 配置程序和库安装路径
install(TARGETS tr
RUNTIME DESTINATION /${PROJECT_NAME}/bin # 执行程序
LIBRARY DESTINATION /${PROJECT_NAME}/lib # 动态库
ARCHIVE DESTINATION /${PROJECT_NAME}/libstatic # 静态库
# PERMISSIONS OWNER_EXECUTE OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ # 配置权限
)

# 配置文档或目录安装路径
install(PROGRAMS ReadMe.md DESTINATION /${PROJECT_NAME}/docs
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ # 配置权限
)
install(DIRECTORY scripts/ DESTINATION /${PROJECT_NAME}/scripts
PATTERN "scripts/*.sh"
PATTERN "scripts/*.conf" EXCLUDE
)