如何使用不同的生成后操作为单个可执行文件设置2个CMake目标?

9jyewag0  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(157)

我正在处理一个由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方法来做我想做的事情?

rqcrx0a6

rqcrx0a61#

不要创建别名,而是创建一个custom target来执行命令,并将add a dependency添加到可执行目标

add_executable(pgm-dev main.cpp)

add_custom_target(pgm-prod COMMAND size $<TARGET_FILE:pgm-dev>)
add_dependency(pgm-prod pgm-dev)

这样,cmake可确保在执行命令之前构建pgm-dev
如果您需要执行这些命令中的多个命令,则可以引入执行依赖于原始目标的命令的中间目标,并创建一个目标来执行依赖于所有这些命令的所有命令:
第一个

相关问题