也许这是不可能的,我误读了cmake 3.2文档,但我创建一个自定义命令会在Makefile中创建一个自定义"目标",这样我就可以通过调用输出文件的名称来构建目标.CMake文档说:
在makefile术语中,这将以下列形式创建一个新目标:
Run Code Online (Sandbox Code Playgroud)OUTPUT: MAIN_DEPENDENCY DEPENDS COMMAND
所以我想我可以跑了make OUTPUT.也许文档将CMake目标与Makefile目标混淆了?
例如,
add_custom_command(OUTPUT foo_out
COMMAND post_process foo_in > foo_out
DEPENDS foo_in
)
Run Code Online (Sandbox Code Playgroud)
我想要做
make foo_out
Run Code Online (Sandbox Code Playgroud)
它会使foo_out.但是,如果我这样做,我明白了
make: **** No rule to make target `foo_out`. Stop.
Run Code Online (Sandbox Code Playgroud)
果然,cmake二进制输出目录中的任何文件中都不存在"foo_out"这个词.如果我把它改成这个
add_custom_target(bar DEPENDS foo_out)
add_custom_command(OUTPUT foo_out COMMAND post_process foo_in > foo_out)
Run Code Online (Sandbox Code Playgroud)
然后我就能做到
make bar
Run Code Online (Sandbox Code Playgroud)
我能做到
make foo_in
Run Code Online (Sandbox Code Playgroud)
但我还是做不到
make foo_out
Run Code Online (Sandbox Code Playgroud)
问题make bar是它不直观,因为实际的文件输出foo_out不是bar.
我该怎么做呢?
在我的例子中,我需要对标准可执行目标运行一个特殊的处理步骤,该目标将可选资源插入到ELF文件中.我希望能够将两个可执行文件作为Makefile目标,因此我可以构建裸ELF可执行文件以及注入资源的ELF可执行文件.
如果我正在编写自定义Makefile,这很简单!
foo_in: foo.c
$(CC) $< -o $@
foo_out: foo_in
post_process $< …Run Code Online (Sandbox Code Playgroud) 是否有可能调用一个函数的CMake出的add_custom_target还是add_custom_command?
我知道我可以将CMake函数移动到Python(或其他)脚本并从add_custom_target/中调用它,command但我想避免在现有的CMake基础上使用大量脚本.
我想要实现的是使用CPack生成二进制工件的zip包并将其发布到工件库中.对于发布部分,我已经创建了CMake函数,但现在我需要将打包和发布结合在一起.
感谢您提前提供任何帮助/提示.
我正在使用一个外部库,它提供了一个用于自动代码生成的 CMake 函数,用于我的 CMakeLists.txt 文件。问题是,每当我修改 CMakeLists 时,该函数都会再次运行,从而触发重新编译新生成但未更改的源代码。我需要像 add_custom_command 这样的东西,可以将 CMake 函数指定为 COMMAND 而不是可执行文件,以便仅在自动生成的文件不存在时运行该函数。这可行吗?如果没有,是否存在另一种获得相同结果的方法?谢谢。
与此处描述的问题相同,我想将Shell脚本作为TARGET“ package”的POST_BUILD命令执行。目标平台是Debian / Ubuntu。
我将以下内容添加到CMakeLists的末尾:
add_custom_command(
TARGET package
POST_BUILD
COMMAND bash ${PROJECT_BINARY_DIR}/fixup_deb.sh
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
COMMENT "Fix file-permissions of md5sum files in debian package"
)
Run Code Online (Sandbox Code Playgroud)
但这是行不通的。当我调用“ make package”时,脚本不会更改。
目前,我有一个针对自定义目标的解决方法:
add_custom_target(
correctDeb
COMMAND bash ${PROJECT_BINARY_DIR}/fixup_deb.sh
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
)
Run Code Online (Sandbox Code Playgroud)
但是,如果在调用“ make package”时自动完成此操作,则对我来说将更加舒适和更加故障安全。
顺便说一下,$ {PROJECT_BINARY_DIR} /fixup_deb.sh的生成也可以很好地与以下对象配合使用:
configure_file( "${CMAKE_CURRENT_LIST_DIR}/debian/fixup_deb.sh.in" "${PROJECT_BINARY_DIR}/fixup_deb.sh" @ONLY IMMEDIATE )
Run Code Online (Sandbox Code Playgroud) 我正在尝试gperf从cmake文件运行。
我在CMakeLists.txt下面创建了一个非常小的。
当我运行它时
$ cmake .
$ make
Run Code Online (Sandbox Code Playgroud)
它不会创建example.hpp文件
下面可能有什么问题CMakeLists.txt?
cmake_minimum_required( VERSION 2.6 )
function(gperf_generate_new source target)
add_custom_target(${target} echo "Creating ${target}")
add_custom_command(
SOURCE ${source}
TARGET ${target}
COMMAND gperf -L c++ ${source} > ${target}
OUTPUTS ${target}
DEPENDS ${source}
)
endfunction()
gperf_generate_new(command_options.new.gperf example.hpp)
Run Code Online (Sandbox Code Playgroud) 我试图用CMake添加一个自定义目标,为每个给定的.cpp文件执行一个命令.只有在源文件本身或其中一个包含的源文件发生更改时,才应重新执行该命令.AFAIK实现这一点我需要一个包含所有包含文件的列表,并将它们添加到属于我的自定义目标DEPENDS的add_custom_command()调用选项中.
那么是否有内置的方法来获取包含文件的列表?
我知道函数的IMPLICIT_DEPENDS选项,add_custom_command()但它只适用于Makefile生成器.我想为所有发电机做这项工作.
感谢您的时间
编辑:
根据要求,我将发布一些cmake代码来展示我想要实现的目标.我想添加一个自定义目标,在所有给定的.cpp文件上运行clang-tidy.当逐步构建自定义目标时,只要更改.cpp文件或其直接或间接包含的头文件之一,就应重新运行clang-tidy命令.就像重新运行编译器一样.
# ----------------------------------------------------------------------------------------
# mainTargetName The name of the target that shall be analyzed
# files A list of all the main targets .cpp files
#
function( addStaticAnalysisTarget mainTargetName files )
set(targetName runStaticAnalysis_${mainTargetName})
set(command "clang-tidy-4.0 -checks=* -p ${CMAKE_BINARY_DIR}")
foreach( file ${files} )
get_filename_component( baseName ${file} NAME_WE)
set(stampFile ${CMAKE_CURRENT_BINARY_DIR}/analyze_${baseName}.stamp )
set(fullFile ${CMAKE_CURRENT_SOURCE_DIR}/${file})
set(commandWithFile "${command} ${fullFile}")
separate_arguments_for_platform( commandList ${commandWithFile})
add_custom_command(
OUTPUT ${stampFile}
DEPENDS "${fullFile}"
IMPLICIT_DEPENDS CXX "${fullFile}"
COMMAND ${commandList} …Run Code Online (Sandbox Code Playgroud) 我希望能够为 VisualStudio 解决方案定义自定义命令/任务/宏。然后我想对在Solution Explorer.
有几种可能来执行对我来说没问题的命令:
a) 右键单击中的文件Solution Explorer并从上下文菜单中选择命令(我最喜欢的)
b) 在Solution Explorer. 然后单击工具栏上的按钮。然后该命令会以某种方式从Solution Explorer.
c) 在Solution Explorer. 然后从Task Runner Explorer. 执行的任务会以某种方式从“解决方案资源管理器”中检索所选文件
我尝试使用 VisualStudio 扩展VsCommandBuddy。但是,它不支持特定于文件的命令,请参阅
https://github.com/PaulHuizer/VsCommandBuddy/issues/21
我还试图用一个Grunt或Gulp可从启动任务Task Runner Explorer。但是,我不知道如何传递/访问当前在Solution Explorer.
https://blogs.msdn.microsoft.com/webdev/2016/01/06/task-runners-in-visual-studio-2015/
=> 是否有一个 VisualStudio 扩展可以轻松地为文件定义自定义命令?
=> 如何在脚本文件(例如 Gulp、Grunt、Webpack)中传递/访问在 SolutionExplorer 中选择的文件?
=> 您会推荐其他任何舒适的工作流程吗?
可以编写我自己的 VisualStudio 扩展。但我想其他人已经知道了解决方案。
我想添加一个 cmake 自定义命令,该命令仅在使用 Visual Studio 多配置生成器时在调试配置中构建自定义目标时才执行。有没有干净的方法来做到这一点?
为了实现这一点,我首先尝试将整个命令列表包装在这样的生成器表达式中。
add_custom_command(
...
COMMAND $<$<CONFIG:Debug>:cmake;-E;echo;foo>
)
Run Code Online (Sandbox Code Playgroud)
但这在执行命令时给了我一个语法错误。经过一些反复试验,我得到了以下hacky解决方案。这将命令列表的每个单词包装在这样的生成器表达式中。
add_custom_command(
...
COMMAND $<IF:$<CONFIG:Debug>,cmake,echo>;$<IF:$<CONFIG:Debug>,-E, >;$<IF:$<CONFIG:Debug>,echo, >;$<IF:$<CONFIG:Debug>,foo, >
)
Run Code Online (Sandbox Code Playgroud)
这会cmake -E echo foo在编译 Debug 配置时执行该命令,并echo " " " " " "为所有其他配置执行 dummy 命令。
这非常难看,必须根据主机系统更改虚拟命令。在 Linux 上它可能是":" ":" ":" ":". 那么有没有更干净的方法来做到这一点?
感谢您的时间!
我只是想启动并运行一个基本的 CMake 示例,该示例可以运行一些基本的命令行命令。我已经研究了一段时间,但我没有任何运气。我完全错误地使用了这个吗?任何和所有输入将不胜感激。
cmake_minimum_required(VERSION 3.0)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/test.txt
COMMAND echo "Hello world"
COMMENT "This is a comment. But it's not printed during the build?"
)
return()
Run Code Online (Sandbox Code Playgroud)
编辑: 使用:
add_custom_target(run ALL DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/test.txt)
Run Code Online (Sandbox Code Playgroud)
也不起作用,正如其他帖子中所建议的那样。
我正在构建 Next.js 应用程序并使用 Cypress 编写我的测试。我在本地使用.env.local文件配置环境变量。在 CI 管道中,它们通常被定义。
我正在尝试在 Cypress 中编写一个自定义命令来加密cypress/support/command.ts.
import { encryptSession } from 'utils/sessions';
Cypress.Commands.add(
'loginWithCookie',
({
issuer = 'some-issuer',
publicAddress = 'some-address',
email = 'some-mail',
} = {}) => {
const session = { issuer, publicAddress, email };
return encryptSession(session).then(token => {
cy.setCookie('my-session-token', token);
return session;
});
},
);
Run Code Online (Sandbox Code Playgroud)
当此命令运行时,它会失败,因为encryptSession使用了TOKEN_SECRET赛普拉斯未加载的环境变量。
import Iron from '@hapi/iron';
const TOKEN_SECRET = process.env.TOKEN_SECRET || '';
export function encryptSession(session: Record<string, unknown>) {
return Iron.seal(session, …Run Code Online (Sandbox Code Playgroud) javascript environment-variables add-custom-command cypress dotenv