【问题标题】:cmake: Multiple builds from the same source subdir possible?cmake:可能来自同一源子目录的多个构建?
【发布时间】:2017-09-01 15:25:37
【问题描述】:

我有一个包含项目的 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 抱怨重复的目标名称。 我该如何解决这个问题?还是有更好的方法从同一源运行多个构建?

【问题讨论】:

    标签: build cmake


    【解决方案1】:

    python 子目录中的CMakeLists.txt 文件可以通过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 版本,在 python 子目录中的 CMakeLists.txt 中执行类似操作,您将有一个包含所有 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 可能更容易。

    另外,如果每个版本都像听起来一样真正不同,您可能需要认真考虑为它们提供所有相同的文件名。

    【讨论】:

    • 问题是不仅有两个固定的 Python 版本,还有几个(目前是 2.7、3.5、3.6),我想把 add_subdir 放在一个循环中,而不是实际可用的Python 版本。这个问题可能可以通过参数化的目标名称来解决,比如python_bindings_${PYTHON_VERSION}。这可能吗?
    • 您还可以像这样参数化变量:add_library(my_python${version}_bindings ${SRC_${version}}) 为每种情况获取不同的源列表。这将扩展到add_library(my_python3.5_bindings ${SRC_3.5})
    猜你喜欢
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多