标签: add-custom-command

add_custom_command未生成目标

也许这是不可能的,我误读了cmake 3.2文档,但我创建一个自定义命令会在Makefile中创建一个自定义"目标",这样我就可以通过调用输出文件的名称来构建目标.CMake文档说:

在makefile术语中,这将以下列形式创建一个新目标:

 OUTPUT: MAIN_DEPENDENCY DEPENDS
    COMMAND
Run Code Online (Sandbox Code Playgroud)

所以我想我可以跑了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-command

18
推荐指数
2
解决办法
2万
查看次数

如何从add_custom_target/command调用CMake函数?

是否有可能调用一个函数的CMake出的add_custom_target还是add_custom_command

我知道我可以将CMake函数移动到Python(或其他)脚本并从add_custom_target/中调用它,command但我想避免在现有的CMake基础上使用大量脚本.

我想要实现的是使用CPack生成二进制工件的zip包并将其发布到工件库中.对于发布部分,我已经创建了CMake函数,但现在我需要将打包和发布结合在一起.

感谢您提前提供任何帮助/提示.

c++ cmake target add-custom-command

15
推荐指数
1
解决办法
7433
查看次数

CMake:执行宏/函数作为 add_custom_command 的命令

我正在使用一个外部库,它提供了一个用于自动代码生成的 CMake 函数,用于我的 CMakeLists.txt 文件。问题是,每当我修改 CMakeLists 时,该函数都会再次运行,从而触发重新编译新生成但未更改的源代码。我需要像 add_custom_command 这样的东西,可以将 CMake 函数指定为 COMMAND 而不是可执行文件,以便仅在自动生成的文件不存在时运行该函数。这可行吗?如果没有,是否存在另一种获得相同结果的方法?谢谢。

cmake add-custom-command

7
推荐指数
3
解决办法
9097
查看次数

CMake / CPack:add_custom_command TARGET包POST_BUILD

此处描述的问题相同,我想将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)

cmake package post-build cpack add-custom-command

5
推荐指数
0
解决办法
965
查看次数

cmake add_custom_command 不起作用

我正在尝试gperfcmake文件运行。

我在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 add-custom-command

5
推荐指数
1
解决办法
5596
查看次数

我可以在我的cmake代码中手动使用CMake的cpp文件依赖扫描程序吗?

我试图用CMake添加一个自定义目标,为每个给定的.cpp文件执行一个命令.只有在源文件本身或其中一个包含的源文件发生更改时,才应重新执行该命令.AFAIK实现这一点我需要一个包含所有包含文件的列表,并将它们添加到属于我的自定义目标DEPENDSadd_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)

c++ cmake add-custom-command

5
推荐指数
1
解决办法
347
查看次数

如何在 Visual Studio 中执行自定义文件特定命令/任务?

我希望能够为 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

我还试图用一个GruntGulp可从启动任务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 扩展。但我想其他人已经知道了解决方案。

task visual-studio gruntjs add-custom-command gulp

5
推荐指数
1
解决办法
1861
查看次数

CMake:如何添加仅对一种配置执行的自定义命令?

我想添加一个 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 add-custom-command

5
推荐指数
1
解决办法
3118
查看次数

如何在 CMake 中运行基本的`add_custom_command`

我只是想启动并运行一个基本的 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)

也不起作用,正如其他帖子中所建议的那样。

cmake add-custom-command

5
推荐指数
0
解决办法
4499
查看次数

Cypress 在自定义命令中加载环境变量

我正在构建 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

5
推荐指数
1
解决办法
1229
查看次数