前置INTERFACE_SOURCES

时间:2019-09-09 08:18:01

标签: c++ c cmake properties target

我正在寻找一个INTERFACE库,并指定INTERFACE_SOURCES 因此链接到它的库也可以建立这些源。

不幸的是,由于一些LTO问题,需要在消费者的来源之前对这些来源进行编译和链接。

INTERFACE_SOURCES属性似乎将这些源附加到使用者目标。可以代替它们吗?

我知道一种解决方法是只设置一个source变量并在目标中使用它,但如果可能的话,我想使用一个目标。

1 个答案:

答案 0 :(得分:0)

target_sources()的CMake documentation仅支持附加列表中的源。一种解决方案是获取INTERFACE_SOURCES列表并使用PREPEND list子命令将源添加到列表的前面:

# Get the initial list of INTERFACE_SOURCES for the target.
get_target_property(INITIAL_TARGET_SOURCES MyLib INTERFACE_SOURCES)
message("INITIAL_TARGET_SOURCES: ${INITIAL_TARGET_SOURCES}")

# Prepend the additional INTERFACE target sources (TestClass2.cpp) to the list.
list(PREPEND INITIAL_TARGET_SOURCES ${CMAKE_CURRENT_LIST_DIR}/TestClass2.cpp)
# Set the INTERFACE_SOURCES to the updated list.
set_target_properties(MyLib PROPERTIES
  INTERFACE_SOURCES "${INITIAL_TARGET_SOURCES}"
)

# Check that the target property was updated successfully.
get_target_property(UPDATED_TARGET_SOURCES MyLib INTERFACE_SOURCES)
message("UPDATED_TARGET_SOURCES: ${UPDATED_TARGET_SOURCES}")

此处,INTERFACE_SOURCES的初始列表仅包含TestClass1.cpp,但是在set_target_properties()调用之后,它包含TestClass2.cpp;TestClass1.cpp。这是打印出来的内容:

INITIAL_TARGET_SOURCES: C:/workspace/testproj/TestClass1.cpp
UPDATED_TARGET_SOURCES: C:/workspace/testproj/TestClass2.cpp;C:/workspace/testproj/TestClass1.cpp

如果需要在CMake文件中的多个位置添加源代码,则可以轻松地将其放入CMake function中,以免造成混乱。