Cmake:文件未复制
Cmake : file is not copying
我在一个大项目中工作,它是用 Fortran 编写的。我们在 CMake 的帮助下构建它。我需要将函数"test_tsmparser.F90"需要的文件"plane.tsm"复制到构建目录中的相应位置。我已经为另一个功能做了一次,但现在它不起作用。
对应CMakeList.txt:
include_directories(${CMAKE_BINARY_DIR}/src)
include_directories(${CMAKE_BINARY_DIR}/test)
include_directories(${CMAKE_BINARY_DIR}/utils/xml/sax)
add_executable(test_tsmparser test_tsmparser.F90)
target_link_libraries(test_tsmparser testlib sax)
function (cm_export_file FILE DEST)
if (NOT TARGET export-files)
add_custom_target(export-files ALL COMMENT "Exporting files into build tree")
endif (NOT TARGET export-files)
get_filename_component(FILENAME "${FILE}" NAME)
add_custom_command(TARGET export-files COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${FILE}" "${CMAKE_CURRENT_BINARY_DIR}/${DEST}/${FILENAME}")
install(FILES "${FILE}" DESTINATION "${DEST}")
endfunction (cm_export_file)
cm_export_file("plane.tsm" "./")
对我来说很奇怪,创建了可执行文件 test_tsmparser,但没有复制文件 "plane.tsm"。这意味着什么?
可能问题是之前另一个目标调用了完全相同的函数。
如果您需要更多信息,请告诉我,因为我不知道还有什么相关的。
在创建应产生输出的自定义命令时,您应该使用 add_custom_command()
的 OUTPUT
签名,而不是 TARGET
签名:
function (cm_export_file FILE DEST)
get_filename_component(FILENAME "${FILE}" NAME)
add_custom_command(
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${DEST}/${FILENAME}"
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${FILE}"
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${FILE}" "${CMAKE_CURRENT_BINARY_DIR}/${DEST}/${FILENAME}"
)
set(copiedFiles ${copiedFiles} "${CMAKE_CURRENT_BINARY_DIR}/${DEST}/${FILENAME}" PARENT_SCOPE)
install(FILES "${FILE}" DESTINATION "${DEST}")
endfunction (cm_export_file)
然后,完成所有调用后,创建将驱动命令的自定义目标:
add_custom_target(
export-files ALL
DEPENDS ${copiedFiles}
COMMENT "Exporting files into build tree"
)
看来我只需要更改这两个 CMakeList 的目标名称即可。
感谢您的帮助。
我在一个大项目中工作,它是用 Fortran 编写的。我们在 CMake 的帮助下构建它。我需要将函数"test_tsmparser.F90"需要的文件"plane.tsm"复制到构建目录中的相应位置。我已经为另一个功能做了一次,但现在它不起作用。
对应CMakeList.txt:
include_directories(${CMAKE_BINARY_DIR}/src)
include_directories(${CMAKE_BINARY_DIR}/test)
include_directories(${CMAKE_BINARY_DIR}/utils/xml/sax)
add_executable(test_tsmparser test_tsmparser.F90)
target_link_libraries(test_tsmparser testlib sax)
function (cm_export_file FILE DEST)
if (NOT TARGET export-files)
add_custom_target(export-files ALL COMMENT "Exporting files into build tree")
endif (NOT TARGET export-files)
get_filename_component(FILENAME "${FILE}" NAME)
add_custom_command(TARGET export-files COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${FILE}" "${CMAKE_CURRENT_BINARY_DIR}/${DEST}/${FILENAME}")
install(FILES "${FILE}" DESTINATION "${DEST}")
endfunction (cm_export_file)
cm_export_file("plane.tsm" "./")
对我来说很奇怪,创建了可执行文件 test_tsmparser,但没有复制文件 "plane.tsm"。这意味着什么?
可能问题是之前另一个目标调用了完全相同的函数。
如果您需要更多信息,请告诉我,因为我不知道还有什么相关的。
在创建应产生输出的自定义命令时,您应该使用 add_custom_command()
的 OUTPUT
签名,而不是 TARGET
签名:
function (cm_export_file FILE DEST)
get_filename_component(FILENAME "${FILE}" NAME)
add_custom_command(
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${DEST}/${FILENAME}"
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${FILE}"
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${FILE}" "${CMAKE_CURRENT_BINARY_DIR}/${DEST}/${FILENAME}"
)
set(copiedFiles ${copiedFiles} "${CMAKE_CURRENT_BINARY_DIR}/${DEST}/${FILENAME}" PARENT_SCOPE)
install(FILES "${FILE}" DESTINATION "${DEST}")
endfunction (cm_export_file)
然后,完成所有调用后,创建将驱动命令的自定义目标:
add_custom_target(
export-files ALL
DEPENDS ${copiedFiles}
COMMENT "Exporting files into build tree"
)
看来我只需要更改这两个 CMakeList 的目标名称即可。
感谢您的帮助。