是否可以根据cmake中的环境变量使目标共享库文件名可变?

is it possible to make target shared library file name variable according to environment variable in cmake?

我不熟悉 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... )
...

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

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 是实际控制,如果设置了匹配的环境变量,它会在第一次执行时被初始化。它还会在缓存中 和文档 一起出现,因此其他开发人员可以直接查询构建系统以获取其所有配置点。请记住:CMake 不是 Make 并且在每次配置时从环境中读取是一种令人惊讶的行为,通常是不好的做法。