1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-17 15:32:10 +08:00

find_program: Find programs that are executable but not readable

`find_program` internally uses `cmSystemTools::FileExists`
which calls `access(R_OK)` instead of `access(X_OK)`.
Use `cmSystemTools::IsFileExecutable` instead to fix this
issue.  An example of such a program is `sudo`.

Fixes: #10468
This commit is contained in:
Vladimir Menshakov
2020-04-04 17:16:18 +01:00
committed by Brad King
parent df543e37f1
commit 86e6349ef7
4 changed files with 10 additions and 1 deletions

View File

@@ -85,7 +85,7 @@ struct cmFindProgramHelper
this->TestNameExt = cmStrCat(name, ext);
this->TestPath =
cmSystemTools::CollapseFullPath(this->TestNameExt, path);
bool exists = cmSystemTools::FileExists(this->TestPath, true);
bool exists = cmSystemTools::FileIsExecutable(this->TestPath);
exists ? this->DebugSearches.FoundAt(this->TestPath)
: this->DebugSearches.FailedAt(this->TestPath);
if (exists) {

View File

@@ -0,0 +1 @@
-- ExeNoRead_EXECUTABLE='.*/Tests/RunCMake/find_program/ExeNoRead-build/ExeNoRead'

View File

@@ -0,0 +1,4 @@
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/ExeNoRead" "#!/bin/sh\n")
execute_process(COMMAND chmod -r+x "${CMAKE_CURRENT_BINARY_DIR}/ExeNoRead")
find_program(ExeNoRead_EXECUTABLE NAMES ExeNoRead NO_DEFAULT_PATH PATHS "${CMAKE_CURRENT_BINARY_DIR}")
message(STATUS "ExeNoRead_EXECUTABLE='${ExeNoRead_EXECUTABLE}'")

View File

@@ -10,3 +10,7 @@ if(CMAKE_SYSTEM_NAME MATCHES "^(Windows|CYGWIN)$")
run_cmake(WindowsCom)
run_cmake(WindowsExe)
endif()
if(UNIX)
run_cmake(ExeNoRead)
endif()