我正在处理一个由CMake管理的嵌入式项目,我想对同一个可执行文件执行不同的操作。
考虑我有以下项目:
/cmake/foo.cmake
/CMakeLists.txt
/main.cpp
与此问题无关的main.cpp
:
# include <iostream>
int main() {
std::cout << "hello world" << std::endl;
return 0;
}
foo.cmake
文件包含一个函数:
function(print_executable_size TARGET_NAME)
add_custom_command(
TARGET ${TARGET_NAME}
POST_BUILD
COMMAND size ${TARGET_NAME}.exe
)
endfunction()
主要的CMakeLists.txt
有以下内容:
cmake_minimum_required(VERSION 3.15)
project(proj)
set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
include(foo)
add_executable(pgm-dev main.cpp)
add_executable(pgm-prod ALIAS pgm-dev)
# this line works but this is not needed when compiling the "dev" program.
print_executable_size(pgm-dev)
# Uncomment this line leads to TARGET 'pgm-prod' was not created in this directory.
# print_executable_size(pgm-prod)
我理想的构建过程是:
- 一个cmake目标“pgm-dev,”它只构建可执行文件,
- 一个以“pgm-prod”为目标的cmake,它在必要时重新构建“pgm-dev”可执行文件,并执行一些POST_BUILD操作。
为什么要有两个目标“pgm-dev”和“pgm-prod”?
考虑到“pgm-prod”会做一些额外的构建操作,比如加密生成的二进制文件,所以在日常开发中不需要这样做。
为什么在可执行文件之后使用带函数的cmake文件而不是add_custom_command()
?
我有多个可执行文件涉及我的整个项目,我想避免代码重复。
为什么不使用不同的名称创建另一个可执行文件?
“pgm-dev”和“pgm-prod”的编译方式完全相同,只是生成后操作不同。
我认为使用add_executable(.. ALIAS ..)
会很好,但是我似乎不理解这里的一些关键点。什么是最好的CMake方法来做我想做的事情?
1条答案
按热度按时间rqcrx0a61#
不要创建别名,而是创建一个custom target来执行命令,并将add a dependency添加到可执行目标
这样,cmake可确保在执行命令之前构建
pgm-dev
。如果您需要执行这些命令中的多个命令,则可以引入执行依赖于原始目标的命令的中间目标,并创建一个目标来执行依赖于所有这些命令的所有命令:
第一个