디렉토리를 소스 트리에서 바이너리 트리로 복사하는 방법
원본 트리에서 이진 트리로 디렉터리를 복사하는 중입니다.예를 들어 다음과 같습니다.www를 bin 폴더에 복사하는 방법.
work
├─bin
└─src
├─doing
│ └─www
├─include
└─lib
고마워요.
버전 2.8 이후 file 명령어에는 copy 인수가 있습니다.
file(COPY yourDir DESTINATION yourDestination)
주의:
상대 입력 경로는 현재 소스 디렉토리에 대해 평가되며 상대 수신처는 현재 빌드 디렉토리에 대해 평가됩니다.
CMake 2.8에서는명령어를 사용합니다.
오래된 버전의 CMake에서는 이 매크로는 어떤 디렉토리에서 다른 디렉토리로 파일을 복사합니다.복사된 파일의 변수를 대체하지 않으려면 configure_file을 변경합니다.@ONLY
인수(예:COPYONLY
).
# Copy files from source directory to destination directory, substituting any
# variables. Create destination directory if it does not exist.
macro(configure_files srcDir destDir)
message(STATUS "Configuring directory ${destDir}")
make_directory(${destDir})
file(GLOB templateFiles RELATIVE ${srcDir} ${srcDir}/*)
foreach(templateFile ${templateFiles})
set(srcTemplatePath ${srcDir}/${templateFile})
if(NOT IS_DIRECTORY ${srcTemplatePath})
message(STATUS "Configuring file ${templateFile}")
configure_file(
${srcTemplatePath}
${destDir}/${templateFile}
@ONLY)
endif(NOT IS_DIRECTORY ${srcTemplatePath})
endforeach(templateFile)
endmacro(configure_files)
아무도 언급하지 않았듯이cmake -E copy_directory
커스텀 타겟으로서 사용한 것은 다음과 같습니다.
add_custom_target(copy-runtime-files ALL
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/runtime-files-dir ${CMAKE_BINARY_DIR}/runtime-files-dir
DEPENDS ${MY_TARGET})
그configure
명령어는 다음 경우에만 파일을 복사합니다.cmake
실행 중입니다.다른 옵션은 새 대상을 생성하여 custom_command 옵션을 사용하는 것입니다.여기 제가 사용하는 것이 있습니다(여러 번 실행하는 경우,add_custom_target
각 콜에 대해 일의로 합니다).
macro(copy_files GLOBPAT DESTINATION)
file(GLOB COPY_FILES
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
${GLOBPAT})
add_custom_target(copy ALL
COMMENT "Copying files: ${GLOBPAT}")
foreach(FILENAME ${COPY_FILES})
set(SRC "${CMAKE_CURRENT_SOURCE_DIR}/${FILENAME}")
set(DST "${DESTINATION}/${FILENAME}")
add_custom_command(
TARGET copy
COMMAND ${CMAKE_COMMAND} -E copy ${SRC} ${DST}
)
endforeach(FILENAME)
endmacro(copy_files)
execute_process를 사용하여 cmake -E를 호출합니다.상세 복사가 필요한 경우copy_directory
명령어를 입력합니다.더 좋은 방법은,symlink
(플랫폼이 지원하는 경우) create_sysloglink 명령을 사용합니다.후자는 다음과 같이 달성할 수 있습니다.
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_SOURCE_DIR}/path/to/www
${CMAKE_BINARY_DIR}/path/to/www)
송신원: http://www.cmake.org/pipermail/cmake/2009-March/028299.html
감사합니다! add_custom_target 및 add_custom_command 번들을 사용하면 매우 도움이 됩니다.저는 제 프로젝트에서 모든 곳에서 사용할 수 있도록 다음과 같은 함수를 작성했습니다.설치 규칙도 지정합니다.주로 인터페이스 헤더 파일을 내보내는 데 사용합니다.
#
# export file: copy it to the build tree on every build invocation and add rule for installation
#
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("API/someHeader0.hpp" "include/API/")
cm_export_file("API/someHeader1.hpp" "include/API/")
Seth Johnson의 답변에 근거해, 한층 더 편리함을 위해서 다음과 같이 쓰고 있습니다.
# Copy files
macro(resource_files files)
foreach(file ${files})
message(STATUS "Copying resource ${file}")
file(COPY ${file} DESTINATION ${Work_Directory})
endforeach()
endmacro()
# Copy directories
macro(resource_dirs dirs)
foreach(dir ${dirs})
# Replace / at the end of the path (copy dir content VS copy dir)
string(REGEX REPLACE "/+$" "" dirclean "${dir}")
message(STATUS "Copying resource ${dirclean}")
file(COPY ${dirclean} DESTINATION ${Work_Directory})
endforeach()
endmacro()
언급URL : https://stackoverflow.com/questions/697560/how-to-copy-directory-from-source-tree-to-binary-tree
'programing' 카테고리의 다른 글
캐시 라인 크기를 프로그래밍 방식으로 가져오시겠습니까? (0) | 2022.08.30 |
---|---|
상태 변경 시 Vuex getter가 업데이트되지 않음 (0) | 2022.08.30 |
C 포인터를 NULL로 초기화할 수 있습니까? (0) | 2022.08.30 |
C 포인터에서 어레이 크기를 가져오려면 어떻게 해야 합니까? (0) | 2022.08.30 |
파일을 압축/해동하기 좋은 Java 라이브러리는 무엇입니까? (0) | 2022.08.30 |