【问题标题】:Cmake: Getting the location of a target from the command lineCmake:从命令行获取目标的位置
【发布时间】:2020-02-04 08:31:02
【问题描述】:

目前我认为我需要从 Cmake 的命令行获取目标输出的位置(在它构建之后)。

或者,也许我需要编写 CMake 脚本以允许进程在目标上运行(在它构建之后)。

我们的基本流程是:

  1. 代码
  2. 构建
  3. 调试
  4. 构建
  5. 个人资料
  6. 构建

我想让这更容易在命令行的一个地方完成。

目前,我们正计划在我们的构建内容中添加一个 python 前端(因为它是一个具有多个处理器的异构 SoC,由于需要多个编译器,我们无法进行单一配置)所以在外面没什么大不了的。

我希望能够做类似的事情:

  cmake <configuration stuff> 
  build.py <target>
  debug.py <target>
  profile.py <target>

开发人员不必知道目标二进制文件的确切位置。 (仅供参考,这些事情比仅仅调用 gdb 或其他任何东西更复杂,因此它们确实需要一个脚本才能通过 3rd 方工具从命令行实现)

这很容易实现吗?或者我是否需要在 Cmake 中编写一些内容以在配置期间将所需信息输出到文件并在事后查询该文件?

非常感谢任何指导或帮助实现我的目标。

编辑:试图在我的提问中更加明确:

在我使用 cmake 进行配置之后。有没有办法从构建目录再次运行 cmake 来查询缓存/构建系统/任何东西来找出目标的输出在哪里。

例如:

./source
   /modules
     /module1
        /submodule1
            /test1
        /submodule2
            /test1
     /module2
        /test1
     /module3
        /test1

我进入我的构建目录,执行cmake -S .. -B . &lt;etc&gt;

我现在有一棵树,里面装满了 makefile 和其他东西。

如果我确实做了,那棵树会填充大致反映源树的构建工件(至少在我的经验中是这样)

如果我这样做make help,它会按名称输出一堆目标。

module1
submodule1
submodule1_test1
submodule2
submodule2_test1

等等

现在,我想知道 submodule1_test1 的可执行文件在哪里,而不必知道它的父级是 module1。此时我可以运行 cmake 并查询缓存/构建系统以获取该命名目标的位置吗?

如果我不能,我可以通过在配置时形成一个“数据库”来自己管理它。这不是一个问题。我只是希望 cmake 保留这些信息,以便以后在其缓存或其他任何地方查询。

【问题讨论】:

  • Is this easily accomplishable? 是的do I need to script up some stuff in Cmake to output the required information to a file during configuration 你可以query that file after the fact? 你也可以这样做。你可以只做add_custom_command(COMMAND echo $&lt;TARGET_FILE:the_target&gt;)。你试过什么?它奏效了吗?你做了什么研究?但是可执行文件放在CMAKE_RUNTIME_OUTPUT_DIRECTORY 中,所以问题是cmake &lt;configuration stuff&gt; 期间决定它的去向。
  • @KamilCuk 好吧,也许是一个更有针对性的问题:在配置和构建完成后,我可以做些什么来做cmake &lt;something&gt; MyTarget 并让它回显到标准输出的路径?我没有看到 add_custom_command() 在这方面如何帮助我。
  • cmake 用于配置事物。 MyTarget 的位置会根据您在 &lt;something&gt; 中输入的内容而变化。关键是可以控制MyTarget 可执行文件的去向。如果您在CMakeLists.txt 所在的目录中执行cmake .,那么MyTarget 将在该目录中。我不明白。当您运行cmake 时,您可以决定您想要MyTarget 的位置。例如,如果您希望 MyTarget 位于 /tmp/bin 中,则只需 cmake -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/tmp/bin . 即可配置项目。如果RUNTIME_OUTPUT_DIRECTORY没有设置,那么就只是使用CMakeCache的目录
  • 我知道 cmake 是用来配置的。我只是想知道是否可以在配置完成后查询配置以获取在构建系统之外使用的详细信息。查看我的编辑
  • 有点进步。 add_custom_target(path-${mytarget} COMMAND echo $make help 列表,但我想这也无济于事。

标签: cmake


【解决方案1】:

当您第一次使用 CMake 生成项目时,它会创建一个 CMakeCache.txt 文件,其中包含您项目中的所有变量缓存变量。您可以使用 Python 对其进行解析并找到 project_name_BINARY_DIR 变量。那将是您的构建目标根目录。从那时起,您可以使用 Python 递归检查测试可执行文件的子目录,如果它们都具有标准命名模式,例如 FooTests.exe。

或者,如果您使用set cache 命令,它也应该被添加到 CMakeCache.txt。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多