【问题标题】:Use makefile variables in CMake script在 CMake 脚本中使用 makefile 变量
【发布时间】:2015-04-07 10:57:22
【问题描述】:

我正在将使用 CMake 构建的组件添加到当前使用 makefile 的较大项目中。有一个“配置”makefile,其中包含一些逻辑,其中包括以 make 变量的形式设置目标目录。通过设置 MAKEFILES env var,配置 makefile 包含在当前构建中,并且实际构建 makefile 在构建和链接到这些目录中的工件时引用这些变量,例如:

# in config.mk
...
MY_TARGET_LIB_DIR=...

# in a build makefile
TGT_LIB=$(MY_TARGET_LIB_DIR)/libsomething.so

# in another build makefile
LDFLAGS=-L$(MY_TARGET_LIB_DIR)

我想做的是在 CMake 生成的 makefile 中使用它,即让 CMake 生成一个 makefile,它在变量 MY_TARGET_LIB_DIR 引用的目录和另一个链接的目录中构建一个库(在本例中为静态)到该目录中的库。

我尝试过做类似的事情

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY $(MY_TARGET_LIB_DIR))

但没有运气 - 这只会导致生成的 makefile 输出到字面上称为 $(MY_TARGET_LIB_DIR) 的子目录中。有解决办法吗?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    通过 ${ENV[...]} 很容易做到这一点,因为 Make 自动导出所有 make 变量到环境中。

    一个例子:

    [ttt] cat CMakeLists.txt
    cmake_minimum_required(VERSION 3.0)
    project(ttt)
    
    add_custom_target(t
        COMMAND echo `printenv ZZZZ`...
        #VERBATIM
        )
    

    那么,我们可以改变ZZZZ 生成步骤之后,在make时间:

    [ttt] cmake .
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /tmp/ttt
    [ttt]
    [ttt]
    [ttt] make ZZZZ=foobar t
    foobar...
    Built target t
    [ttt] ZZZZ=buzzquux make t
    buzzquux...
    Built target t
    [ttt]
    [ttt]
    [ttt] export ZZZZ=bbb
    [ttt] make t
    bbb...
    Built target t
    

    检查生成的 makefile 很有启发性(尤其是出现问题时):

    [ttt] grep -C2 ZZZZ CMakeFiles/t.dir/build.make
    
    CMakeFiles/t:
        echo `printenv ZZZZ`...
    
    t : CMakeFiles/t
    

    【讨论】:

      【解决方案2】:

      不,您不能告诉 CMake 生成的 Makefile 使用来自其他非 CMake Makefile 的变量。他们也不能解析从 shell 传递的参数。

      您可以在配置期间通过cmake -D<variable>=<value> 传递变量,仅此而已。但通常您不想在 make 运行期间进行配置。

      【讨论】:

      • 您似乎误解了我的问题 - 我并没有尝试解析从 shell 传递的任何参数。我想要做的是使用现有makefile中定义的变量,可能通过在CMake生成的makefile中使用文字、非转义$(variable_name)字符串。通过 -D 传递值可能是一个解决方案,但我将如何获得变量的值?我是否必须从 makefile 运行 CMake 才能生成另一个 makefile?
      • 我收到了你的问题,我的回答太短了。使用 -D 您可以只使用变量洞察您的 CMake 文件。但一般来说,您不想为每次构建运行都运行 cmake(即配置)。
      • 我知道-D,但我需要变量的值才能设置它,对吧?问题是我正在从 shell 运行 CMake,但我没有从那里得到的值——它是一个 makefile 变量,所以(除非我遗漏了什么),它的值仅在运行 make 时可用(通过包括 config.mk从我的例子)。
      • 是的,这就是我设置你不想使用 -D 的原因。我看不到实现您想要的方法。
      猜你喜欢
      • 2022-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      相关资源
      最近更新 更多