Attached Files | my_external_project_extract_cmd.patch [^] (6,969 bytes) 2012-10-30 19:58 [Show Content] [Hide Content]diff --git a/Modules/ExternalProject.cmake b/Modules/ExternalProject.cmake
index 8d57860..4c18f72 100644
--- a/Modules/ExternalProject.cmake
+++ b/Modules/ExternalProject.cmake
@@ -30,6 +30,8 @@
# [TLS_VERIFY bool] # Should certificate for https be checked
# [TLS_CAINFO file] # Path to a certificate authority file
# [TIMEOUT seconds] # Time allowed for file download operations
+# #--Extract step---------
+# [EXTRACT_ARCHIVE archive] # File to extract
# #--Update/Patch step----------
# [UPDATE_COMMAND cmd...] # Source work-tree update command
# [PATCH_COMMAND cmd...] # Command to patch downloaded source
@@ -1163,8 +1165,13 @@ function(_ep_add_download_command name)
@ONLY
)
- get_filename_component(src_name "${source_dir}" NAME)
- get_filename_component(work_dir "${source_dir}" PATH)
+ if(download_dir)
+ get_filename_component(src_name "${download_dir}" NAME)
+ get_filename_component(work_dir "${download_dir}" PATH)
+ else()
+ get_filename_component(src_name "${source_dir}" NAME)
+ get_filename_component(work_dir "${source_dir}" PATH)
+ endif()
set(comment "Performing download step (SVN checkout) for '${name}'")
set(svn_user_pw_args "")
if(svn_username)
@@ -1301,13 +1308,6 @@ function(_ep_add_download_command name)
if("x${fname}" STREQUAL "x")
string(REGEX MATCH "[^/\\?]*$" fname "${url}")
endif()
- if(NOT "${fname}" MATCHES "(\\.|=)(bz2|tar|tgz|tar\\.gz|zip)$")
- string(REGEX MATCH "([^/\\?]+(\\.|=)(bz2|tar|tgz|tar\\.gz|zip))/.*$" match_result "${url}")
- set(fname "${CMAKE_MATCH_1}")
- endif()
- if(NOT "${fname}" MATCHES "(\\.|=)(bz2|tar|tgz|tar\\.gz|zip)$")
- message(FATAL_ERROR "Could not extract tarball filename from url:\n ${url}")
- endif()
string(REPLACE ";" "-" fname "${fname}")
set(file ${download_dir}/${fname})
get_property(timeout TARGET ${name} PROPERTY _EP_TIMEOUT)
@@ -1317,10 +1317,10 @@ function(_ep_add_download_command name)
"${url}" "${file}" "${timeout}" "${hash}" "${tls_verify}" "${tls_cainfo}")
set(cmd ${CMAKE_COMMAND} -P ${stamp_dir}/download-${name}.cmake
COMMAND)
- set(comment "Performing download step (download, verify and extract) for '${name}'")
+ set(comment "Performing download step (download and verify) for '${name}'")
else()
set(file "${url}")
- set(comment "Performing download step (verify and extract) for '${name}'")
+ set(comment "Performing download step (verify) for '${name}'")
endif()
_ep_write_verifyfile_script("${stamp_dir}/verify-${name}.cmake" "${file}" "${hash}")
list(APPEND cmd ${CMAKE_COMMAND} -P ${stamp_dir}/verify-${name}.cmake
@@ -1352,6 +1352,104 @@ function(_ep_add_download_command name)
)
endfunction()
+function(_ep_add_extract_command name)
+ ExternalProject_Get_Property(${name} source_dir stamp_dir download_dir tmp_dir)
+ set(depends)
+ set(comment)
+ set(work_dir)
+
+ get_property(extract_file_set TARGET ${name} PROPERTY _EP_EXTRACT_ARCHIVE SET)
+ get_property(extract_file TARGET ${name} PROPERTY _EP_EXTRACT_ARCHIVE)
+ get_property(url TARGET ${name} PROPERTY _EP_URL)
+ get_property(fname TARGET ${name} PROPERTY _EP_DOWNLOAD_NAME)
+
+ # Maintain old behaviour of automatically extracting a url download
+ if(url AND NOT extract_file_set)
+ set(extract_file_set 1)
+ if("x${fname}" STREQUAL "x")
+ string(REGEX MATCH "[^/\\?]*$" fname "${url}")
+ endif()
+ set(extract_file ${url})
+ endif()
+ if(extract_file_set)
+ set(work_dir ${source_dir})
+
+ string(REGEX MATCH "[^/\\?]*$" fname "${extract_file}")
+ if(NOT "${fname}" MATCHES "(\\.|=)(bz2|tar|tgz|tar\\.gz|zip)$")
+ string(REGEX MATCH "([^/\\?]+(\\.|=)(bz2|tar|tgz|tar\\.gz|zip))/.*$" match_result "${extract_file}")
+ set(fname "${CMAKE_MATCH_1}")
+ endif()
+ if(NOT "${fname}" MATCHES "(\\.|=)(bz2|tar|tgz|tar\\.gz|zip)$")
+ message(FATAL_ERROR "Could not extract tarball filename from:\n ${extract_file}")
+ endif()
+ string(REPLACE ";" "-" fname "${fname}")
+
+ set(file ${download_dir}/${fname})
+ _ep_write_extractfile_script("${stamp_dir}/extract-${name}.cmake" "${name}" "${file}" "${source_dir}")
+ set(cmd ${CMAKE_COMMAND} -P ${stamp_dir}/extract-${name}.cmake)
+ endif()
+
+ if(NOT EXISTS ${tmp_dir}/${name}-extcmd.txt.in)
+ file(WRITE ${tmp_dir}/${name}-extcmd.txt.in "cmd='\@cmd\@'\n")
+ endif()
+ configure_file(${tmp_dir}/${name}-extcmd.txt.in ${tmp_dir}/${name}-extcmd.txt)
+ list(APPEND file_deps ${tmp_dir}/${name}-extcmd.txt)
+
+ get_property(log TARGET ${name} PROPERTY _EP_LOG_EXTRACT)
+ if(log)
+ set(log LOG 1)
+ else()
+ else()
+ set(log "")
+ endif()
+
+ ExternalProject_Add_Step(${name} extract
+ COMMAND ${cmd}
+ WORKING_DIRECTORY ${work_dir}
+ DEPENDS ${file_deps}
+ DEPENDEES download
+ ${log}
+ )
+
+endfunction()
+
+function(_ep_add_extract_command2 name)
+ ExternalProject_Get_Property(${name} source_dir stamp_dir download_dir tmp_dir)
+ set(depends)
+ set(comment)
+ set(work_dir)
+
+ get_property(cmd_set TARGET ${name} PROPERTY _EP_EXTRACT_COMMAND SET)
+ get_property(cmd TARGET ${name} PROPERTY _EP_EXTRACT_COMMAND)
+
+ set(work_dir)
+
+ if(cmd_set)
+ set(work_dir ${source_dir})
+ endif()
+
+ if(NOT EXISTS ${tmp_dir}/${name}-extcmd.txt.in)
+ file(WRITE ${tmp_dir}/${name}-extcmd.txt.in "cmd='\@cmd\@'\n")
+ endif()
+ configure_file(${tmp_dir}/${name}-extcmd.txt.in ${tmp_dir}/${name}-extcmd.txt)
+ list(APPEND file_deps ${tmp_dir}/${name}-extcmd.txt)
+
+ get_property(log TARGET ${name} PROPERTY _EP_LOG_EXTRACT)
+ if(log)
+ set(log LOG 1)
+ else()
+ set(log "")
+ endif()
+
+ ExternalProject_Add_Step(${name} extract
+ COMMAND ${cmd}
+ WORKING_DIRECTORY ${work_dir}
+ DEPENDS ${file_deps}
+ DEPENDEES update download
+ ${log}
+ )
+
+endfunction()
function(_ep_add_update_command name)
ExternalProject_Get_Property(${name} source_dir)
@@ -1472,7 +1570,7 @@ function(_ep_add_patch_command name)
ExternalProject_Add_Step(${name} patch
COMMAND ${cmd}
WORKING_DIRECTORY ${work_dir}
- DEPENDEES download
+ DEPENDEES download extract
)
endfunction()
@@ -1545,7 +1643,7 @@ function(_ep_add_configure_command name)
ExternalProject_Add_Step(${name} configure
COMMAND ${cmd}
WORKING_DIRECTORY ${binary_dir}
- DEPENDEES update patch
+ DEPENDEES update patch extract
DEPENDS ${file_deps}
${log}
)
@@ -1698,6 +1796,7 @@ function(ExternalProject_Add name)
_ep_add_mkdir_command(${name})
_ep_add_download_command(${name})
_ep_add_update_command(${name})
+ _ep_add_extract_command(${name})
_ep_add_patch_command(${name})
_ep_add_configure_command(${name})
_ep_add_build_command(${name})
|