4

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

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

寻找创造性的解决方案......

要求:

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

到目前为止,我考虑了两种选择:

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

我希望这足够清楚。

4

2 回答 2

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
  • 在 Windows 上mklink仅支持某些 Windows 版本
  • 在 Windowsmklink上只能以管理员身份运行。可以在此处找到解决方法。
  • 调用时使用相对路径,create_symlinks因为这是在二进制文件夹中重建目录结构的方式。
于 2012-12-24T08:31:09.740 回答
0

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

于 2012-12-20T23:55:18.360 回答