我有一个包含项目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抱怨重复的目标名称。 我怎么解决这个问题?或者有更好的方法从同一个源运行多个构建吗?
答案 0 :(得分:0)
CMakeLists.txt
子目录中的python
文件可以通过add_executable
或add_library
或(add_custom_target
和add_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。
另外,如果每个版本真的不同,就像它们听起来那样,你可能想要给它们提供相同的文件名。