summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Cole <david.cole@kitware.com>2008-12-08 19:58:59 (GMT)
committerDavid Cole <david.cole@kitware.com>2008-12-08 19:58:59 (GMT)
commit98afdd0e3710678573f3d582eda9744fd30af747 (patch)
tree56bcdda84c1ba37b1f4a549d1952a442ff7d0ada
parent34f073549edf18f81ea7abf5535f2513ed196332 (diff)
downloadCMake-98afdd0e3710678573f3d582eda9744fd30af747.zip
CMake-98afdd0e3710678573f3d582eda9744fd30af747.tar.gz
CMake-98afdd0e3710678573f3d582eda9744fd30af747.tar.bz2
BUG: Make sure all directories used as working directories exist at CMake configure time as well as having custom commands that create them. Necessary for the Borland Makefiles generator to generate short path names in the makefile build rules. Also, make sure all custom commands chain together properly through the use of the sentinel files.
-rw-r--r--Modules/AddExternalProject.cmake94
1 files changed, 81 insertions, 13 deletions
diff --git a/Modules/AddExternalProject.cmake b/Modules/AddExternalProject.cmake
index 5fd6df0..99b2112 100644
--- a/Modules/AddExternalProject.cmake
+++ b/Modules/AddExternalProject.cmake
@@ -66,6 +66,15 @@ function(get_configure_command_id name cfg_cmd_id_var)
endfunction(get_configure_command_id)
+function(mkdir d)
+ file(MAKE_DIRECTORY "${d}")
+ #message(STATUS "mkdir d='${d}'")
+ if(NOT EXISTS "${d}")
+ message(FATAL_ERROR "error: dir '${d}' does not exist after file(MAKE_DIRECTORY call...")
+ endif()
+endfunction(mkdir)
+
+
function(add_external_project_download_command name)
set(added 0)
get_external_project_directories(base_dir build_dir downloads_dir install_dir
@@ -81,6 +90,7 @@ function(add_external_project_download_command name)
COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-download
WORKING_DIRECTORY ${sentinels_dir}
COMMENT "No download step for '${name}'"
+ DEPENDS ${sentinels_dir}/CMakeExternals-directories
)
set(added 1)
else()
@@ -98,6 +108,7 @@ function(add_external_project_download_command name)
COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-download
WORKING_DIRECTORY ${downloads_dir}
COMMENT "Performing download step for '${name}'"
+ DEPENDS ${sentinels_dir}/CMakeExternals-directories
)
set(added 1)
else()
@@ -127,7 +138,6 @@ function(add_external_project_download_command name)
endif()
set(args -d ${cvs_repository} co ${cvs_tag} -d ${name} ${cvs_module})
- set(wd "${source_dir}")
set(repository ${cvs_repository})
set(module ${cvs_module})
@@ -139,13 +149,14 @@ function(add_external_project_download_command name)
@ONLY
)
+ mkdir("${source_dir}/${name}")
add_custom_command(
OUTPUT ${sentinels_dir}/${name}-download
COMMAND ${CVS_EXECUTABLE} ${args}
COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-download
- WORKING_DIRECTORY ${wd}
+ WORKING_DIRECTORY ${source_dir}
COMMENT "Performing download step (CVS checkout) for '${name}'"
- DEPENDS "${sentinels_dir}/${name}-cvsinfo.txt"
+ DEPENDS ${sentinels_dir}/${name}-cvsinfo.txt
)
set(added 1)
endif()
@@ -166,7 +177,6 @@ function(add_external_project_download_command name)
endif()
set(args co ${svn_repository} ${svn_tag} ${name})
- set(wd "${source_dir}")
set(repository ${svn_repository})
set(module)
@@ -178,13 +188,14 @@ function(add_external_project_download_command name)
@ONLY
)
+ mkdir("${source_dir}/${name}")
add_custom_command(
OUTPUT ${sentinels_dir}/${name}-download
COMMAND ${Subversion_SVN_EXECUTABLE} ${args}
COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-download
- WORKING_DIRECTORY ${wd}
+ WORKING_DIRECTORY ${source_dir}
COMMENT "Performing download step (SVN checkout) for '${name}'"
- DEPENDS "${sentinels_dir}/${name}-svninfo.txt"
+ DEPENDS ${sentinels_dir}/${name}-svninfo.txt
)
set(added 1)
endif()
@@ -194,13 +205,27 @@ function(add_external_project_download_command name)
if(NOT added)
get_target_property(dir ${name} AEP_DIR)
if(dir)
+ get_filename_component(abs_dir "${dir}" ABSOLUTE)
+
+ set(repository "add_external_project DIR")
+ set(module "${abs_dir}")
+ set(tag "")
+
+ configure_file(
+ "${CMAKE_ROOT}/Modules/RepositoryInfo.txt.in"
+ "${sentinels_dir}/${name}-dirinfo.txt"
+ @ONLY
+ )
+
+ mkdir("${source_dir}/${name}")
add_custom_command(
OUTPUT ${sentinels_dir}/${name}-download
- COMMAND ${CMAKE_COMMAND} -E copy_directory ${dir} ${source_dir}/${name}
+ COMMAND ${CMAKE_COMMAND} -E remove_directory ${source_dir}/${name}
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${abs_dir} ${source_dir}/${name}
COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-download
WORKING_DIRECTORY ${source_dir}
COMMENT "Performing download step (DIR copy) for '${name}'"
- DEPENDS ${dir}
+ DEPENDS ${sentinels_dir}/${name}-dirinfo.txt
)
set(added 1)
endif()
@@ -210,6 +235,7 @@ function(add_external_project_download_command name)
if(NOT added)
get_target_property(tar ${name} AEP_TAR)
if(tar)
+ mkdir("${source_dir}/${name}")
add_custom_command(
OUTPUT ${sentinels_dir}/${name}-download
COMMAND ${CMAKE_COMMAND} -Dfilename=${tar} -Dtmp=${tmp_dir}/${name} -Ddirectory=${source_dir}/${name} -P ${CMAKE_ROOT}/Modules/UntarFile.cmake
@@ -226,6 +252,7 @@ function(add_external_project_download_command name)
if(NOT added)
get_target_property(tgz ${name} AEP_TGZ)
if(tgz)
+ mkdir("${source_dir}/${name}")
add_custom_command(
OUTPUT ${sentinels_dir}/${name}-download
COMMAND ${CMAKE_COMMAND} -Dfilename=${tgz} -Dtmp=${tmp_dir}/${name} -Ddirectory=${source_dir}/${name} -P ${CMAKE_ROOT}/Modules/UntarFile.cmake
@@ -242,6 +269,17 @@ function(add_external_project_download_command name)
if(NOT added)
get_target_property(tgz_url ${name} AEP_TGZ_URL)
if(tgz_url)
+ set(repository "add_external_project TGZ_URL")
+ set(module "${tgz_url}")
+ set(tag "")
+
+ configure_file(
+ "${CMAKE_ROOT}/Modules/RepositoryInfo.txt.in"
+ "${sentinels_dir}/${name}-urlinfo.txt"
+ @ONLY
+ )
+
+ mkdir("${source_dir}/${name}")
add_custom_command(
OUTPUT ${sentinels_dir}/${name}-download
COMMAND ${CMAKE_COMMAND} -Dremote=${tgz_url} -Dlocal=${downloads_dir}/${name}.tgz -P ${CMAKE_ROOT}/Modules/DownloadFile.cmake
@@ -249,15 +287,27 @@ function(add_external_project_download_command name)
COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-download
WORKING_DIRECTORY ${source_dir}
COMMENT "Performing download step (TGZ_URL download and untar) for '${name}'"
- DEPENDS ${downloads_dir}/${name}.tgz
+ DEPENDS ${sentinels_dir}/${name}-urlinfo.txt
)
set(added 1)
endif()
endif(NOT added)
+
if(NOT added)
get_target_property(tar_url ${name} AEP_TAR_URL)
if(tar_url)
+ set(repository "add_external_project TAR_URL")
+ set(module "${tar_url}")
+ set(tag "")
+
+ configure_file(
+ "${CMAKE_ROOT}/Modules/RepositoryInfo.txt.in"
+ "${sentinels_dir}/${name}-urlinfo.txt"
+ @ONLY
+ )
+
+ mkdir("${source_dir}/${name}")
add_custom_command(
OUTPUT ${sentinels_dir}/${name}-download
COMMAND ${CMAKE_COMMAND} -Dremote=${tar_url} -Dlocal=${downloads_dir}/${name}.tar -P ${CMAKE_ROOT}/Modules/DownloadFile.cmake
@@ -265,7 +315,7 @@ function(add_external_project_download_command name)
COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-download
WORKING_DIRECTORY ${source_dir}
COMMENT "Performing download step (TAR_URL download and untar) for '${name}'"
- DEPENDS ${downloads_dir}/${name}.tar
+ DEPENDS ${sentinels_dir}/${name}-urlinfo.txt
)
set(added 1)
endif()
@@ -285,9 +335,11 @@ function(add_external_project_configure_command name)
# Create the working_dir for configure, build and install steps:
#
+ mkdir("${working_dir}")
add_custom_command(
- OUTPUT ${working_dir}
+ OUTPUT ${sentinels_dir}/${name}-working_dir
COMMAND ${CMAKE_COMMAND} -E make_directory ${working_dir}
+ COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-working_dir
DEPENDS ${sentinels_dir}/${name}-download
)
@@ -299,7 +351,7 @@ function(add_external_project_configure_command name)
COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-configure
WORKING_DIRECTORY ${working_dir}
COMMENT "No configure step for '${name}'"
- DEPENDS ${working_dir} ${sentinels_dir}/${name}-download
+ DEPENDS ${sentinels_dir}/${name}-working_dir
)
else()
if(NOT cmd)
@@ -319,7 +371,7 @@ function(add_external_project_configure_command name)
COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-configure
WORKING_DIRECTORY ${working_dir}
COMMENT "Performing configure step for '${name}'"
- DEPENDS ${working_dir} ${sentinels_dir}/${name}-download
+ DEPENDS ${sentinels_dir}/${name}-working_dir
)
endif()
endfunction(add_external_project_configure_command)
@@ -423,6 +475,22 @@ function(add_CMakeExternals_target)
get_external_project_directories(base_dir build_dir downloads_dir install_dir
sentinels_dir source_dir tmp_dir)
+ # Make the directories at CMake configure time *and* add a custom command
+ # to make them at build time. They need to exist at makefile generation
+ # time for Borland make and wmake so that CMake may generate makefiles
+ # with "cd C:\short\paths\with\no\spaces" commands in them.
+ #
+ # Additionally, the add_custom_command is still used in case somebody
+ # removes one of the necessary directories and tries to rebuild without
+ # re-running cmake.
+ #
+ mkdir("${build_dir}")
+ mkdir("${downloads_dir}")
+ mkdir("${install_dir}")
+ mkdir("${sentinels_dir}")
+ mkdir("${source_dir}")
+ mkdir("${tmp_dir}")
+
add_custom_command(
OUTPUT ${sentinels_dir}/CMakeExternals-directories
COMMAND ${CMAKE_COMMAND} -E make_directory ${build_dir}