From bf32b95efed986eed7f5e0c568c5bc9559bcb854 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 1 Sep 2015 13:39:55 -0400 Subject: [PATCH 1/6] cmFindLibraryCommand: Avoid repeating search for the same name In FindNormalLibraryDirsPerName we consider one name at a time and search the entire path. Avoid repeated consideration of names by removing each one from the list of candidates before considering the next one. This will not change behavior because we already know the earlier candidates were not found on repeated considering anyway. --- Source/cmFindLibraryCommand.cxx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Source/cmFindLibraryCommand.cxx b/Source/cmFindLibraryCommand.cxx index e8d158ebb..e7696af40 100644 --- a/Source/cmFindLibraryCommand.cxx +++ b/Source/cmFindLibraryCommand.cxx @@ -203,6 +203,7 @@ struct cmFindLibraryHelper } bool HasValidSuffix(std::string const& name); void AddName(std::string const& name); + void SetName(std::string const& name); bool CheckDirectory(std::string const& path); bool CheckDirectoryForName(std::string const& path, Name& name); }; @@ -321,6 +322,13 @@ void cmFindLibraryHelper::AddName(std::string const& name) this->Names.push_back(entry); } +//---------------------------------------------------------------------------- +void cmFindLibraryHelper::SetName(std::string const& name) +{ + this->Names.clear(); + this->AddName(name); +} + //---------------------------------------------------------------------------- bool cmFindLibraryHelper::CheckDirectory(std::string const& path) { @@ -459,8 +467,7 @@ std::string cmFindLibraryCommand::FindNormalLibraryDirsPerName() ni != this->Names.end() ; ++ni) { // Switch to searching for this name. - std::string const& name = *ni; - helper.AddName(name); + helper.SetName(*ni); // Search every directory. for(std::vector::const_iterator From ed4de3c9849f323c735929ad3e32d2450ce303a9 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 1 Sep 2015 13:42:14 -0400 Subject: [PATCH 2/6] cmFindProgramCommand: Use Names member instead of passing it --- Source/cmFindProgramCommand.cxx | 17 ++++++++--------- Source/cmFindProgramCommand.h | 6 ++---- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/Source/cmFindProgramCommand.cxx b/Source/cmFindProgramCommand.cxx index fbd9fd34e..ef1c16bc1 100644 --- a/Source/cmFindProgramCommand.cxx +++ b/Source/cmFindProgramCommand.cxx @@ -41,7 +41,7 @@ bool cmFindProgramCommand return true; } - std::string result = FindProgram(this->Names); + std::string result = FindProgram(); if(result != "") { // Save the value in the cache @@ -59,31 +59,30 @@ bool cmFindProgramCommand return true; } -std::string cmFindProgramCommand::FindProgram(std::vector names) +std::string cmFindProgramCommand::FindProgram() { std::string program = ""; if(this->SearchAppBundleFirst || this->SearchAppBundleOnly) { - program = FindAppBundle(names); + program = FindAppBundle(); } if(program.empty() && !this->SearchAppBundleOnly) { - program = cmSystemTools::FindProgram(names, this->SearchPaths, true); + program = cmSystemTools::FindProgram(this->Names, this->SearchPaths, true); } if(program.empty() && this->SearchAppBundleLast) { - program = this->FindAppBundle(names); + program = this->FindAppBundle(); } return program; } -std::string cmFindProgramCommand -::FindAppBundle(std::vector names) +std::string cmFindProgramCommand::FindAppBundle() { - for(std::vector::const_iterator name = names.begin(); - name != names.end() ; ++name) + for(std::vector::const_iterator name = this->Names.begin(); + name != this->Names.end() ; ++name) { std::string appName = *name + std::string(".app"); diff --git a/Source/cmFindProgramCommand.h b/Source/cmFindProgramCommand.h index 70f758ff8..2881aac3e 100644 --- a/Source/cmFindProgramCommand.h +++ b/Source/cmFindProgramCommand.h @@ -52,11 +52,9 @@ public: cmTypeMacro(cmFindProgramCommand, cmFindBase); -protected: - std::string FindProgram(std::vector names); - private: - std::string FindAppBundle(std::vector names); + std::string FindProgram(); + std::string FindAppBundle(); std::string GetBundleExecutable(std::string bundlePath); }; From 907a919be15e262eee75c10d06ce314e912abdbe Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 1 Sep 2015 13:50:13 -0400 Subject: [PATCH 3/6] cmSystemTools: Drop unused StringEndsWith method It has no callers and we can inherit one from KWSys SystemTools anyway. --- Source/cmSystemTools.cxx | 9 --------- Source/cmSystemTools.h | 2 -- 2 files changed, 11 deletions(-) diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index cac6a12d0..65bfe790e 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -1409,15 +1409,6 @@ std::string cmSystemTools::ConvertToRunCommandPath(const char* path) #endif } -bool cmSystemTools::StringEndsWith(const char* str1, const char* str2) -{ - if ( !str1 || !str2 || strlen(str1) < strlen(str2) ) - { - return 0; - } - return !strncmp(str1 + (strlen(str1)-strlen(str2)), str2, strlen(str2)); -} - // compute the relative path from here to there std::string cmSystemTools::RelativePath(const char* local, const char* remote) { diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h index c12a1db96..d14897f47 100644 --- a/Source/cmSystemTools.h +++ b/Source/cmSystemTools.h @@ -336,8 +336,6 @@ public: // be used when RunCommand is called from cmake, because the // running cmake needs paths to be in its format static std::string ConvertToRunCommandPath(const char* path); - //! Check if the first string ends with the second one. - static bool StringEndsWith(const char* str1, const char* str2); /** compute the relative path from local to remote. local must be a directory. remote can be a file or a directory. From fdbfc9f6777696bdba60feafb9bb9a2f3fe02828 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 1 Sep 2015 16:33:24 -0400 Subject: [PATCH 4/6] Tests: Add explicit testing for find_program Previously this command was tested only implicitly as part of larger tests. Add a RunCMake.find_program test to cover find_program cases specifically and independently. --- Tests/RunCMake/CMakeLists.txt | 1 + Tests/RunCMake/find_program/A/testA | 1 + Tests/RunCMake/find_program/B/testB | 1 + Tests/RunCMake/find_program/CMakeLists.txt | 3 +++ Tests/RunCMake/find_program/DirsPerName-stdout.txt | 1 + Tests/RunCMake/find_program/DirsPerName.cmake | 6 ++++++ Tests/RunCMake/find_program/RunCMakeTest.cmake | 8 ++++++++ Tests/RunCMake/find_program/Win/testCom.com | 0 Tests/RunCMake/find_program/Win/testCom.exe | 0 Tests/RunCMake/find_program/Win/testExe.exe | 0 Tests/RunCMake/find_program/WindowsCom-stdout.txt | 1 + Tests/RunCMake/find_program/WindowsCom.cmake | 6 ++++++ Tests/RunCMake/find_program/WindowsExe-stdout.txt | 1 + Tests/RunCMake/find_program/WindowsExe.cmake | 6 ++++++ 14 files changed, 35 insertions(+) create mode 100755 Tests/RunCMake/find_program/A/testA create mode 100755 Tests/RunCMake/find_program/B/testB create mode 100644 Tests/RunCMake/find_program/CMakeLists.txt create mode 100644 Tests/RunCMake/find_program/DirsPerName-stdout.txt create mode 100644 Tests/RunCMake/find_program/DirsPerName.cmake create mode 100644 Tests/RunCMake/find_program/RunCMakeTest.cmake create mode 100755 Tests/RunCMake/find_program/Win/testCom.com create mode 100755 Tests/RunCMake/find_program/Win/testCom.exe create mode 100755 Tests/RunCMake/find_program/Win/testExe.exe create mode 100644 Tests/RunCMake/find_program/WindowsCom-stdout.txt create mode 100644 Tests/RunCMake/find_program/WindowsCom.cmake create mode 100644 Tests/RunCMake/find_program/WindowsExe-stdout.txt create mode 100644 Tests/RunCMake/find_program/WindowsExe.cmake diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index 2955db25f..5bc9af854 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -183,6 +183,7 @@ add_RunCMake_test(find_file) add_RunCMake_test(find_library) add_RunCMake_test(find_package) add_RunCMake_test(find_path) +add_RunCMake_test(find_program -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}) add_RunCMake_test(get_filename_component) add_RunCMake_test(get_property) add_RunCMake_test(if) diff --git a/Tests/RunCMake/find_program/A/testA b/Tests/RunCMake/find_program/A/testA new file mode 100755 index 000000000..1a2485251 --- /dev/null +++ b/Tests/RunCMake/find_program/A/testA @@ -0,0 +1 @@ +#!/bin/sh diff --git a/Tests/RunCMake/find_program/B/testB b/Tests/RunCMake/find_program/B/testB new file mode 100755 index 000000000..1a2485251 --- /dev/null +++ b/Tests/RunCMake/find_program/B/testB @@ -0,0 +1 @@ +#!/bin/sh diff --git a/Tests/RunCMake/find_program/CMakeLists.txt b/Tests/RunCMake/find_program/CMakeLists.txt new file mode 100644 index 000000000..74b3ff8de --- /dev/null +++ b/Tests/RunCMake/find_program/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 3.3) +project(${RunCMake_TEST} NONE) +include(${RunCMake_TEST}.cmake) diff --git a/Tests/RunCMake/find_program/DirsPerName-stdout.txt b/Tests/RunCMake/find_program/DirsPerName-stdout.txt new file mode 100644 index 000000000..f763bb086 --- /dev/null +++ b/Tests/RunCMake/find_program/DirsPerName-stdout.txt @@ -0,0 +1 @@ +-- PROG='[^']*/Tests/RunCMake/find_program/B/testB' diff --git a/Tests/RunCMake/find_program/DirsPerName.cmake b/Tests/RunCMake/find_program/DirsPerName.cmake new file mode 100644 index 000000000..54db6ddfb --- /dev/null +++ b/Tests/RunCMake/find_program/DirsPerName.cmake @@ -0,0 +1,6 @@ +find_program(PROG + NAMES testB testA + PATHS ${CMAKE_CURRENT_SOURCE_DIR}/A ${CMAKE_CURRENT_SOURCE_DIR}/B + NO_DEFAULT_PATH + ) +message(STATUS "PROG='${PROG}'") diff --git a/Tests/RunCMake/find_program/RunCMakeTest.cmake b/Tests/RunCMake/find_program/RunCMakeTest.cmake new file mode 100644 index 000000000..1a99f0a20 --- /dev/null +++ b/Tests/RunCMake/find_program/RunCMakeTest.cmake @@ -0,0 +1,8 @@ +include(RunCMake) + +run_cmake(DirsPerName) + +if(CMAKE_SYSTEM_NAME MATCHES "^(Windows|CYGWIN)$") + run_cmake(WindowsCom) + run_cmake(WindowsExe) +endif() diff --git a/Tests/RunCMake/find_program/Win/testCom.com b/Tests/RunCMake/find_program/Win/testCom.com new file mode 100755 index 000000000..e69de29bb diff --git a/Tests/RunCMake/find_program/Win/testCom.exe b/Tests/RunCMake/find_program/Win/testCom.exe new file mode 100755 index 000000000..e69de29bb diff --git a/Tests/RunCMake/find_program/Win/testExe.exe b/Tests/RunCMake/find_program/Win/testExe.exe new file mode 100755 index 000000000..e69de29bb diff --git a/Tests/RunCMake/find_program/WindowsCom-stdout.txt b/Tests/RunCMake/find_program/WindowsCom-stdout.txt new file mode 100644 index 000000000..e386fce50 --- /dev/null +++ b/Tests/RunCMake/find_program/WindowsCom-stdout.txt @@ -0,0 +1 @@ +-- PROG='[^']*/Tests/RunCMake/find_program/Win/testCom.com' diff --git a/Tests/RunCMake/find_program/WindowsCom.cmake b/Tests/RunCMake/find_program/WindowsCom.cmake new file mode 100644 index 000000000..b32d9e851 --- /dev/null +++ b/Tests/RunCMake/find_program/WindowsCom.cmake @@ -0,0 +1,6 @@ +find_program(PROG + NAMES testCom + PATHS ${CMAKE_CURRENT_SOURCE_DIR}/Win + NO_DEFAULT_PATH + ) +message(STATUS "PROG='${PROG}'") diff --git a/Tests/RunCMake/find_program/WindowsExe-stdout.txt b/Tests/RunCMake/find_program/WindowsExe-stdout.txt new file mode 100644 index 000000000..bdf48aadb --- /dev/null +++ b/Tests/RunCMake/find_program/WindowsExe-stdout.txt @@ -0,0 +1 @@ +-- PROG='[^']*/Tests/RunCMake/find_program/Win/testExe.exe' diff --git a/Tests/RunCMake/find_program/WindowsExe.cmake b/Tests/RunCMake/find_program/WindowsExe.cmake new file mode 100644 index 000000000..3a336ec61 --- /dev/null +++ b/Tests/RunCMake/find_program/WindowsExe.cmake @@ -0,0 +1,6 @@ +find_program(PROG + NAMES testExe + PATHS ${CMAKE_CURRENT_SOURCE_DIR}/Win + NO_DEFAULT_PATH + ) +message(STATUS "PROG='${PROG}'") From fc1990c93384d1d2122cd4e11398a8197b006504 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 1 Sep 2015 13:54:33 -0400 Subject: [PATCH 5/6] cmFindProgramCommand: Re-implement search using more flexible approach Avoid using KWSys SystemTools::FindProgram because it does much more than we actually need for find_program and does not allow us to control the order of preference between directories and names. Create our own cmFindProgramHelper much like cmFindLibraryHelper but without all the find_library-specific parts. --- Source/cmFindProgramCommand.cxx | 97 ++++++++++++++++++++++++++++++++- Source/cmFindProgramCommand.h | 1 + 2 files changed, 97 insertions(+), 1 deletion(-) diff --git a/Source/cmFindProgramCommand.cxx b/Source/cmFindProgramCommand.cxx index ef1c16bc1..c9bc56ded 100644 --- a/Source/cmFindProgramCommand.cxx +++ b/Source/cmFindProgramCommand.cxx @@ -16,6 +16,75 @@ #include #endif +//---------------------------------------------------------------------------- +struct cmFindProgramHelper +{ + cmFindProgramHelper() + { +#if defined (_WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) + // Consider platform-specific extensions. + this->Extensions.push_back(".com"); + this->Extensions.push_back(".exe"); +#endif + // Consider original name with no extensions. + this->Extensions.push_back(""); + } + + // List of valid extensions. + std::vector Extensions; + + // Keep track of the best program file found so far. + std::string BestPath; + + // Current names under consideration. + std::vector Names; + + // Current full path under consideration. + std::string TestPath; + + void AddName(std::string const& name) + { + this->Names.push_back(name); + } + void SetName(std::string const& name) + { + this->Names.clear(); + this->AddName(name); + } + bool CheckDirectory(std::string const& path) + { + for (std::vector::iterator i = this->Names.begin(); + i != this->Names.end(); ++i) + { + if (this->CheckDirectoryForName(path, *i)) + { + return true; + } + } + return false; + } + bool CheckDirectoryForName(std::string const& path, std::string const& name) + { + for (std::vector::iterator ext = this->Extensions.begin(); + ext != this->Extensions.end(); ++ext) + { + this->TestPath = path; + this->TestPath += name; + if (!ext->empty() && cmSystemTools::StringEndsWith(name, ext->c_str())) + { + continue; + } + this->TestPath += *ext; + if (cmSystemTools::FileExists(this->TestPath, true)) + { + this->BestPath = cmSystemTools::CollapseFullPath(this->TestPath); + return true; + } + } + return false; + } +}; + // cmFindProgramCommand bool cmFindProgramCommand ::InitialPass(std::vector const& argsIn, cmExecutionStatus &) @@ -69,7 +138,7 @@ std::string cmFindProgramCommand::FindProgram() } if(program.empty() && !this->SearchAppBundleOnly) { - program = cmSystemTools::FindProgram(this->Names, this->SearchPaths, true); + program = this->FindNormalProgram(); } if(program.empty() && this->SearchAppBundleLast) @@ -79,6 +148,32 @@ std::string cmFindProgramCommand::FindProgram() return program; } +//---------------------------------------------------------------------------- +std::string cmFindProgramCommand::FindNormalProgram() +{ + // Search the entire path for each name. + cmFindProgramHelper helper; + for (std::vector::const_iterator ni = this->Names.begin(); + ni != this->Names.end() ; ++ni) + { + // Switch to searching for this name. + helper.SetName(*ni); + + // Search every directory. + for (std::vector::const_iterator + p = this->SearchPaths.begin(); + p != this->SearchPaths.end(); ++p) + { + if (helper.CheckDirectory(*p)) + { + return helper.BestPath; + } + } + } + // Couldn't find the program. + return ""; +} + std::string cmFindProgramCommand::FindAppBundle() { for(std::vector::const_iterator name = this->Names.begin(); diff --git a/Source/cmFindProgramCommand.h b/Source/cmFindProgramCommand.h index 2881aac3e..df39b14bd 100644 --- a/Source/cmFindProgramCommand.h +++ b/Source/cmFindProgramCommand.h @@ -54,6 +54,7 @@ public: private: std::string FindProgram(); + std::string FindNormalProgram(); std::string FindAppBundle(); std::string GetBundleExecutable(std::string bundlePath); From 8ea7611bc3650c75c86d22a3127cb117dbcaa9be Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 1 Sep 2015 16:25:57 -0400 Subject: [PATCH 6/6] find_program: Optionally consider all names in each directory When more than one value is given to the NAMES option this command by default will consider one name at a time and search every directory for it. Add a NAMES_PER_DIR option to tell this command to consider one directory at a time and search for all names in it. --- Help/command/find_program.rst | 7 +++- .../dev/find_program-NAMES_PER_DIR.rst | 6 +++ Source/cmFindProgramCommand.cxx | 41 +++++++++++++++++++ Source/cmFindProgramCommand.h | 3 ++ .../find_program/NamesPerDir-stdout.txt | 1 + Tests/RunCMake/find_program/NamesPerDir.cmake | 6 +++ .../RunCMake/find_program/RunCMakeTest.cmake | 1 + 7 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 Help/release/dev/find_program-NAMES_PER_DIR.rst create mode 100644 Tests/RunCMake/find_program/NamesPerDir-stdout.txt create mode 100644 Tests/RunCMake/find_program/NamesPerDir.cmake diff --git a/Help/command/find_program.rst b/Help/command/find_program.rst index 2a5ce9a8d..d3430c054 100644 --- a/Help/command/find_program.rst +++ b/Help/command/find_program.rst @@ -2,7 +2,7 @@ find_program ------------ .. |FIND_XXX| replace:: find_program -.. |NAMES| replace:: NAMES name1 [name2 ...] +.. |NAMES| replace:: NAMES name1 [name2 ...] [NAMES_PER_DIR] .. |SEARCH_XXX| replace:: program .. |SEARCH_XXX_DESC| replace:: program .. |prefix_XXX_SUBDIR| replace:: ``/[s]bin`` @@ -26,3 +26,8 @@ find_program :variable:`CMAKE_FIND_ROOT_PATH_MODE_PROGRAM` .. include:: FIND_XXX.txt + +When more than one value is given to the ``NAMES`` option this command by +default will consider one name at a time and search every directory +for it. The ``NAMES_PER_DIR`` option tells this command to consider one +directory at a time and search for all names in it. diff --git a/Help/release/dev/find_program-NAMES_PER_DIR.rst b/Help/release/dev/find_program-NAMES_PER_DIR.rst new file mode 100644 index 000000000..04cd17045 --- /dev/null +++ b/Help/release/dev/find_program-NAMES_PER_DIR.rst @@ -0,0 +1,6 @@ +find_program-NAMES_PER_DIR +-------------------------- + +* The :command:`find_program` command learned a ``NAMES_PER_DIR`` + option to consdier all given ``NAMES`` in each directory before + moving on to the next directory. diff --git a/Source/cmFindProgramCommand.cxx b/Source/cmFindProgramCommand.cxx index c9bc56ded..e64ed87f2 100644 --- a/Source/cmFindProgramCommand.cxx +++ b/Source/cmFindProgramCommand.cxx @@ -85,6 +85,11 @@ struct cmFindProgramHelper } }; +cmFindProgramCommand::cmFindProgramCommand() +{ + this->NamesPerDirAllowed = true; +} + // cmFindProgramCommand bool cmFindProgramCommand ::InitialPass(std::vector const& argsIn, cmExecutionStatus &) @@ -150,6 +155,42 @@ std::string cmFindProgramCommand::FindProgram() //---------------------------------------------------------------------------- std::string cmFindProgramCommand::FindNormalProgram() +{ + if(this->NamesPerDir) + { + return this->FindNormalProgramNamesPerDir(); + } + else + { + return this->FindNormalProgramDirsPerName(); + } +} + +//---------------------------------------------------------------------------- +std::string cmFindProgramCommand::FindNormalProgramNamesPerDir() +{ + // Search for all names in each directory. + cmFindProgramHelper helper; + for (std::vector::const_iterator ni = this->Names.begin(); + ni != this->Names.end() ; ++ni) + { + helper.AddName(*ni); + } + // Search every directory. + for (std::vector::const_iterator + p = this->SearchPaths.begin(); p != this->SearchPaths.end(); ++p) + { + if(helper.CheckDirectory(*p)) + { + return helper.BestPath; + } + } + // Couldn't find the program. + return ""; +} + +//---------------------------------------------------------------------------- +std::string cmFindProgramCommand::FindNormalProgramDirsPerName() { // Search the entire path for each name. cmFindProgramHelper helper; diff --git a/Source/cmFindProgramCommand.h b/Source/cmFindProgramCommand.h index df39b14bd..f88186b92 100644 --- a/Source/cmFindProgramCommand.h +++ b/Source/cmFindProgramCommand.h @@ -25,6 +25,7 @@ class cmFindProgramCommand : public cmFindBase { public: + cmFindProgramCommand(); /** * This is a virtual constructor for the command. */ @@ -55,6 +56,8 @@ public: private: std::string FindProgram(); std::string FindNormalProgram(); + std::string FindNormalProgramDirsPerName(); + std::string FindNormalProgramNamesPerDir(); std::string FindAppBundle(); std::string GetBundleExecutable(std::string bundlePath); diff --git a/Tests/RunCMake/find_program/NamesPerDir-stdout.txt b/Tests/RunCMake/find_program/NamesPerDir-stdout.txt new file mode 100644 index 000000000..964e25971 --- /dev/null +++ b/Tests/RunCMake/find_program/NamesPerDir-stdout.txt @@ -0,0 +1 @@ +-- PROG='[^']*/Tests/RunCMake/find_program/A/testA' diff --git a/Tests/RunCMake/find_program/NamesPerDir.cmake b/Tests/RunCMake/find_program/NamesPerDir.cmake new file mode 100644 index 000000000..49ce49d84 --- /dev/null +++ b/Tests/RunCMake/find_program/NamesPerDir.cmake @@ -0,0 +1,6 @@ +find_program(PROG + NAMES testB testA NAMES_PER_DIR + PATHS ${CMAKE_CURRENT_SOURCE_DIR}/A ${CMAKE_CURRENT_SOURCE_DIR}/B + NO_DEFAULT_PATH + ) +message(STATUS "PROG='${PROG}'") diff --git a/Tests/RunCMake/find_program/RunCMakeTest.cmake b/Tests/RunCMake/find_program/RunCMakeTest.cmake index 1a99f0a20..2adec1100 100644 --- a/Tests/RunCMake/find_program/RunCMakeTest.cmake +++ b/Tests/RunCMake/find_program/RunCMakeTest.cmake @@ -1,6 +1,7 @@ include(RunCMake) run_cmake(DirsPerName) +run_cmake(NamesPerDir) if(CMAKE_SYSTEM_NAME MATCHES "^(Windows|CYGWIN)$") run_cmake(WindowsCom)