CMake out of source build - Python文件

时间:2012-12-19 19:11:19

标签: python makefile cmake

我使用CMake为我的项目创建构建脚本(Makefile + VS解决方案)。作为最佳实践,我在单独的文件夹(源代码外)中创建构建脚本。我在同一个文件夹中构建项目。

这适用于已编译的程序,但是我找不到适合我的Python脚本的解决方案,因为它们没有构建步骤可以将它们复制(build)到构建文件夹。

寻找有创意的解决方案......

要求:

  • 所有可执行文件都应该在构建文件夹后构建中可用(我认为* .py文件是可执行的
  • 应使用IDE(spyder,eclipse等)轻松管理Python脚本
  • 带有python脚本的源文件夹位于Git存储库中。 Build文件夹不是。
  • C ++编译的python模块应该驻留在相关的python脚本旁边

到目前为止,我考虑了两个选项:

  • 在运行CMake时将脚本复制到构建文件夹 - 需要为python文件中的每个更改运行CMake(IDE不友好)。可能引起混淆:要编辑哪些来源的副本?
  • 在构建文件夹中创建指向源文件夹的链接 - 多平台混乱。在脚本旁边部署已编译的c ++ python模块而不会污染源文件夹时出现问题。

我希望这很清楚。

2 个答案:

答案 0 :(得分:3)

最终我找到了一个解决方案,它涉及创建python源的符号链接以及其他未编译但在构建环境中必需的相关文件。为了允许将构建的模块与符号链接混合,我使用了真正的文件夹而不是符号链接。

这样:

  • 有一个python脚本的副本
  • 可以从二进制文件夹
  • 无缝运行/编辑

效用函数:

function (create_symlinks)
    # Do nothing if building in-source
    if (${CMAKE_CURRENT_BINARY_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR})
        return()
    endif()

    foreach (path_file ${ARGN})
        get_filename_component(folder ${path_file} PATH)

        # Create REAL folder
        file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${folder}")

        # Delete symlink if it exists
        file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/${path_file}")

        # Get OS dependent path to use in `execute_process`
        file(TO_NATIVE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${path_file}" link)
        file(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${path_file}" target)

        if (UNIX)
            set(command ln -s ${target} ${link})
        else()
            set(command cmd.exe /c mklink ${link} ${target})
        endif()

        execute_process(COMMAND ${command} 
                        RESULT_VARIABLE result
                        ERROR_VARIABLE output)

        if (NOT ${result} EQUAL 0)
            message(FATAL_ERROR "Could not create symbolic link for: ${target} --> ${output}")
        endif()

    endforeach(path_file)
endfunction(create_symlinks)

python模块的用法(在CMakeLists.txt内):

# Do not omit !!!RELATIVE!!!
file(GLOB_RECURSE files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.py *.dat *.xml)
create_symlinks(${files})

用法:

cd src_dir
mkdir build_dir
cd build_dir
cmake ..

重要:

  • 添加新文件时,请不要忘记运行cmake
  • 仅在mklink支持some Windows versions
  • 在Windows上mklink只能以管理员身份运行。可以找到解决方法here
  • 调用create_symlinks时使用相对路径,因为这是在二进制文件夹中重建目录结构的方式。

答案 1 :(得分:0)

我会通过创建自定义命令将python脚本编译到build文件夹中,如this post所示。