我使用CMake为我的项目创建构建脚本(Makefile + VS解决方案)。作为最佳实践,我在单独的文件夹(源代码外)中创建构建脚本。我在同一个文件夹中构建项目。
这适用于已编译的程序,但是我找不到适合我的Python脚本的解决方案,因为它们没有构建步骤可以将它们复制(build
)到构建文件夹。
寻找有创意的解决方案......
要求:
到目前为止,我考虑了两个选项:
我希望这很清楚。
答案 0 :(得分:3)
最终我找到了一个解决方案,它涉及创建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 mklink
只能以管理员身份运行。可以找到解决方法here。create_symlinks
时使用相对路径,因为这是在二进制文件夹中重建目录结构的方式。答案 1 :(得分:0)
我会通过创建自定义命令将python脚本编译到build文件夹中,如this post所示。