summaryrefslogtreecommitdiff
path: root/Modules/BundleUtilities.cmake
diff options
context:
space:
mode:
authorAdam Strzelecki <ono@java.pl>2014-09-03 21:42:53 +0200
committerBrad King <brad.king@kitware.com>2014-10-10 10:15:56 -0400
commit6c313797418a90f4e108a04e9b9e70b1c32e74ff (patch)
tree30dca02073e3c8b88462d4071026af0279fab517 /Modules/BundleUtilities.cmake
parentf640b2a41f9c421f4e29fefaaa6e317d6cd962e0 (diff)
downloadcmake-6c313797418a90f4e108a04e9b9e70b1c32e74ff.tar.gz
BundleUtilities: Use find on UNIX for fast executable lookup
It makes whole executable process quicker on UNIX, especially for large bundles containing many files, since using find narrows results to only files having executable flags then all further tests follow. Since find ... -perm +0111 is not clearly POSIX compliant and some Linux versions refuse it, it is better to use longer but portable: find ... -perm \( -perm -0100 -o -perm -0010 -o -perm -0001 \)
Diffstat (limited to 'Modules/BundleUtilities.cmake')
-rw-r--r--Modules/BundleUtilities.cmake20
1 files changed, 19 insertions, 1 deletions
diff --git a/Modules/BundleUtilities.cmake b/Modules/BundleUtilities.cmake
index 0046c97f00..9e2123193c 100644
--- a/Modules/BundleUtilities.cmake
+++ b/Modules/BundleUtilities.cmake
@@ -378,7 +378,25 @@ endfunction()
function(get_bundle_all_executables bundle exes_var)
set(exes "")
- file(GLOB_RECURSE file_list "${bundle}/*")
+ if(UNIX)
+ find_program(find_cmd "find")
+ mark_as_advanced(find_cmd)
+ endif()
+
+ # find command is much quicker than checking every file one by one on Unix
+ # which can take long time for large bundles, and since anyway we expect
+ # executable to have execute flag set we can narrow the list much quicker.
+ if(find_cmd)
+ execute_process(COMMAND "${find_cmd}" "${bundle}"
+ -type f \( -perm -0100 -o -perm -0010 -o -perm -0001 \)
+ OUTPUT_VARIABLE file_list
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+ string(REPLACE "\n" ";" file_list "${file_list}")
+ else()
+ file(GLOB_RECURSE file_list "${bundle}/*")
+ endif()
+
foreach(f ${file_list})
is_file_executable("${f}" is_executable)
if(is_executable)