【问题标题】:is it possible to make target shared library file name variable according to environment variable in cmake?是否可以根据cmake中的环境变量制作目标共享库文件名变量?
【发布时间】:2021-07-02 02:46:05
【问题描述】:

我对 cmake 不熟悉,但在 CMakeLists.txt 中我们这样设置目标共享库名称。

add_library( mylib SHARED ${source_list} )

这会生成 libmylib.so,CMakeLists.txt 中的其他设置是为 mylib 定义的,例如
关于 mylib 我们也可以使用 shell 环境变量来做一些选择性的设置,比如

target_compile_definitions( mylib PRIVATE -DQQQ -D... )

还可以使用 shell 环境变量来做一些选择性的事情。

if(defined env{MYVAR})
set(CMAKE_C_FLAGS "-g -DXYZ")
else()
set(CMAKE_C_FLAGS "-DXYZ")
endif()

如果我可以根据环境变量将目标共享库名称设置为变量,并在所有其他设置中使用选择的名称变量作为共享库名称,我会很高兴。换句话说,是否可以执行以下操作?

if (defined ENV{FOR_QEMU})
set_name(target_name "simlib_qemu")
else ()
set_name(target_name "simlib")
endif ()
add_library(target_name SHARED ${source_list} )
target_compile_definitions( target_name PRIVATE -DQQQ -D... )
...

【问题讨论】:

    标签: cmake compilation


    【解决方案1】:

    您可以通过以下方式将目标的输出名称设置为您喜欢的任何名称:

    set_target_properties(target_name PROPERTIES OUTPUT_NAME "whatever")
    

    然后你会得到libwhatever.so,而不是libtarget_name.so。您将继续在 CMakeLists.txt 中将目标称为 target_name


    然而,因为无论如何这只会在配置期间起作用,我强烈建议您改用普通的 CMake 变量。如果未设置,您可以从环境中对其进行初始化,如下所示:

    option(FOR_QEMU "Enable if building with Qemu support" "$ENV{FOR_QEMU}")
    
    add_library(simlib SHARED ${source_list})
    target_compile_definitions(simlib PRIVATE -DQQQ -D...)
    
    if (FOR_QEMU)
      set_target_properties(target_name PROPERTIES OUTPUT_NAME "simlib_qemu")
    endif ()
    

    这样,CMake 变量 FOR_QEMU 是事实上的控制,如果设置了匹配的 env-var,它会在第一次执行时被初始化。它也将出现在缓存中带有文档,因此其他开发人员可以直接查询构建系统的所有配置点。请记住:CMake 不是 Make,每次配置时从环境中读取是一种令人惊讶的行为,而且通常是不好的做法。

    【讨论】:

    • 谢谢,效果很好,很方便! (但现在我正在考虑同时制作两个版本,因为它们现在将专门用于不同的名称..)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 2021-09-02
    • 1970-01-01
    • 2020-02-26
    • 2017-09-12
    • 2018-06-22
    • 2016-12-22
    相关资源
    最近更新 更多