cmake:来自同一个源子目录的多个构建可能吗?

时间:2017-09-01 15:25:37

标签: build cmake

我有一个包含项目Python语言绑定的子目录,我想为几个Python版本(Python 2和3)构建它。我怎样才能做到这一点? 我想先从同一个源创建两个绑定器:

add_subdirectory(python, python2)
add_subdirectory(python, python3)

[edit] 但是,他们需要特定的参数,因此我尝试提前设置它们:

set(PYTHON_INCLUDE_PATH /usr/include/python2.7)
[...]
add_subdirectory(python, python2)
set(PYTHON_INCLUDE_PATH /usr/include/python3.6)
[...]
add_subdirectory(python, python3)

然而,Cmake抱怨重复的目标名称。 我怎么解决这个问题?或者有更好的方法从同一个源运行多个构建吗?

1 个答案:

答案 0 :(得分:0)

CMakeLists.txt子目录中的python文件可以通过add_executableadd_library或(add_custom_targetadd_custom_command)添加多个目标。以这种方式添加的每个目标都需要一个不同的目标名称,因此它可能看起来像这样:

add_libary(my_python2_bindings <list_of_sources>)
add_library(my_python3_bindings <another_list_of_sources>)

缺点是两者都不能使用与目标名称相同的名称,这是最终文件名将基于的名称。如果这是一项要求,您可以使用设置output name的目标属性以及created的目标属性。

 project(my_python_bindings)

 add_libary(my_python2_bindings <list_of_sources>)
 set_target_properties(my_python2_bindings PROPERTIES OUTPUT_NAME "${PROJECT_NAME}")
 set_target_properties(my_python2_bindings PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/python2")


 add_library(my_python3_bindings <another_list_of_sources>)
 set_target_properties(my_python3_bindings PROPERTIES OUTPUT_NAME "${PROJECT_NAME}")
 set_target_properties(my_python3_bindings PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/python3")

编辑:对于许多python版本,在CMakeLists.txt子目录的python中执行类似的操作,您将获得包含所有python版本PYTHON_VERSION_LIST的列表,然后

foreach(version ${PYTHON_VERSION_LIST})
  add_library(my_python${version}_bindings <list_of_sources>)
  set_target_properties(my_python${version}_bindings PROPERTIES OUTPUT_NAME "${PROJECT_NAME}")
  set_target_properties(my_python${version}_bindings PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/python3")
endforeach()

但是现在您需要为每个版本的不同源列表添加if子句。在这种情况下,可能更容易将我的原始示例扩展为2.7,3.5和3.6,而不仅仅是2和3。

另外,如果每个版本真的不同,就像它们听起来那样,你可能想要给它们提供相同的文件名。

相关问题