From 11a0f72ac0aa0553d61f7a72e839ec7e88460268 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 18 Jul 2022 17:43:56 -0400 Subject: Tests: Simplify RunCMake.file-CHMOD case names The `CHMOD-` prefix is redundant with the overall test name. --- Tests/RunCMake/file-CHMOD/CHMOD-all-perms-result.txt | 1 - Tests/RunCMake/file-CHMOD/CHMOD-all-perms-stderr.txt | 5 ----- Tests/RunCMake/file-CHMOD/CHMOD-all-perms.cmake | 6 ------ Tests/RunCMake/file-CHMOD/CHMOD-invalid-path-result.txt | 1 - Tests/RunCMake/file-CHMOD/CHMOD-invalid-path-stderr.txt | 6 ------ Tests/RunCMake/file-CHMOD/CHMOD-invalid-path.cmake | 4 ---- Tests/RunCMake/file-CHMOD/CHMOD-invalid-perms-result.txt | 1 - Tests/RunCMake/file-CHMOD/CHMOD-invalid-perms-stderr.txt | 4 ---- Tests/RunCMake/file-CHMOD/CHMOD-invalid-perms.cmake | 5 ----- Tests/RunCMake/file-CHMOD/CHMOD-no-keyword-result.txt | 1 - Tests/RunCMake/file-CHMOD/CHMOD-no-keyword-stderr.txt | 4 ---- Tests/RunCMake/file-CHMOD/CHMOD-no-keyword.cmake | 5 ----- Tests/RunCMake/file-CHMOD/CHMOD-no-perms-result.txt | 1 - Tests/RunCMake/file-CHMOD/CHMOD-no-perms-stderr.txt | 4 ---- Tests/RunCMake/file-CHMOD/CHMOD-no-perms.cmake | 5 ----- Tests/RunCMake/file-CHMOD/CHMOD-ok.cmake | 5 ----- Tests/RunCMake/file-CHMOD/CHMOD-override.cmake | 6 ------ Tests/RunCMake/file-CHMOD/CHMOD-write-only-result.txt | 1 - Tests/RunCMake/file-CHMOD/CHMOD-write-only-stderr.txt | 6 ------ Tests/RunCMake/file-CHMOD/CHMOD-write-only.cmake | 6 ------ Tests/RunCMake/file-CHMOD/RunCMakeTest.cmake | 16 ++++++++-------- Tests/RunCMake/file-CHMOD/all-perms-result.txt | 1 + Tests/RunCMake/file-CHMOD/all-perms-stderr.txt | 5 +++++ Tests/RunCMake/file-CHMOD/all-perms.cmake | 6 ++++++ Tests/RunCMake/file-CHMOD/invalid-path-result.txt | 1 + Tests/RunCMake/file-CHMOD/invalid-path-stderr.txt | 6 ++++++ Tests/RunCMake/file-CHMOD/invalid-path.cmake | 4 ++++ Tests/RunCMake/file-CHMOD/invalid-perms-result.txt | 1 + Tests/RunCMake/file-CHMOD/invalid-perms-stderr.txt | 4 ++++ Tests/RunCMake/file-CHMOD/invalid-perms.cmake | 5 +++++ Tests/RunCMake/file-CHMOD/no-keyword-result.txt | 1 + Tests/RunCMake/file-CHMOD/no-keyword-stderr.txt | 4 ++++ Tests/RunCMake/file-CHMOD/no-keyword.cmake | 5 +++++ Tests/RunCMake/file-CHMOD/no-perms-result.txt | 1 + Tests/RunCMake/file-CHMOD/no-perms-stderr.txt | 4 ++++ Tests/RunCMake/file-CHMOD/no-perms.cmake | 5 +++++ Tests/RunCMake/file-CHMOD/ok.cmake | 5 +++++ Tests/RunCMake/file-CHMOD/override.cmake | 6 ++++++ Tests/RunCMake/file-CHMOD/write-only-result.txt | 1 + Tests/RunCMake/file-CHMOD/write-only-stderr.txt | 6 ++++++ Tests/RunCMake/file-CHMOD/write-only.cmake | 6 ++++++ 41 files changed, 85 insertions(+), 85 deletions(-) delete mode 100644 Tests/RunCMake/file-CHMOD/CHMOD-all-perms-result.txt delete mode 100644 Tests/RunCMake/file-CHMOD/CHMOD-all-perms-stderr.txt delete mode 100644 Tests/RunCMake/file-CHMOD/CHMOD-all-perms.cmake delete mode 100644 Tests/RunCMake/file-CHMOD/CHMOD-invalid-path-result.txt delete mode 100644 Tests/RunCMake/file-CHMOD/CHMOD-invalid-path-stderr.txt delete mode 100644 Tests/RunCMake/file-CHMOD/CHMOD-invalid-path.cmake delete mode 100644 Tests/RunCMake/file-CHMOD/CHMOD-invalid-perms-result.txt delete mode 100644 Tests/RunCMake/file-CHMOD/CHMOD-invalid-perms-stderr.txt delete mode 100644 Tests/RunCMake/file-CHMOD/CHMOD-invalid-perms.cmake delete mode 100644 Tests/RunCMake/file-CHMOD/CHMOD-no-keyword-result.txt delete mode 100644 Tests/RunCMake/file-CHMOD/CHMOD-no-keyword-stderr.txt delete mode 100644 Tests/RunCMake/file-CHMOD/CHMOD-no-keyword.cmake delete mode 100644 Tests/RunCMake/file-CHMOD/CHMOD-no-perms-result.txt delete mode 100644 Tests/RunCMake/file-CHMOD/CHMOD-no-perms-stderr.txt delete mode 100644 Tests/RunCMake/file-CHMOD/CHMOD-no-perms.cmake delete mode 100644 Tests/RunCMake/file-CHMOD/CHMOD-ok.cmake delete mode 100644 Tests/RunCMake/file-CHMOD/CHMOD-override.cmake delete mode 100644 Tests/RunCMake/file-CHMOD/CHMOD-write-only-result.txt delete mode 100644 Tests/RunCMake/file-CHMOD/CHMOD-write-only-stderr.txt delete mode 100644 Tests/RunCMake/file-CHMOD/CHMOD-write-only.cmake create mode 100644 Tests/RunCMake/file-CHMOD/all-perms-result.txt create mode 100644 Tests/RunCMake/file-CHMOD/all-perms-stderr.txt create mode 100644 Tests/RunCMake/file-CHMOD/all-perms.cmake create mode 100644 Tests/RunCMake/file-CHMOD/invalid-path-result.txt create mode 100644 Tests/RunCMake/file-CHMOD/invalid-path-stderr.txt create mode 100644 Tests/RunCMake/file-CHMOD/invalid-path.cmake create mode 100644 Tests/RunCMake/file-CHMOD/invalid-perms-result.txt create mode 100644 Tests/RunCMake/file-CHMOD/invalid-perms-stderr.txt create mode 100644 Tests/RunCMake/file-CHMOD/invalid-perms.cmake create mode 100644 Tests/RunCMake/file-CHMOD/no-keyword-result.txt create mode 100644 Tests/RunCMake/file-CHMOD/no-keyword-stderr.txt create mode 100644 Tests/RunCMake/file-CHMOD/no-keyword.cmake create mode 100644 Tests/RunCMake/file-CHMOD/no-perms-result.txt create mode 100644 Tests/RunCMake/file-CHMOD/no-perms-stderr.txt create mode 100644 Tests/RunCMake/file-CHMOD/no-perms.cmake create mode 100644 Tests/RunCMake/file-CHMOD/ok.cmake create mode 100644 Tests/RunCMake/file-CHMOD/override.cmake create mode 100644 Tests/RunCMake/file-CHMOD/write-only-result.txt create mode 100644 Tests/RunCMake/file-CHMOD/write-only-stderr.txt create mode 100644 Tests/RunCMake/file-CHMOD/write-only.cmake diff --git a/Tests/RunCMake/file-CHMOD/CHMOD-all-perms-result.txt b/Tests/RunCMake/file-CHMOD/CHMOD-all-perms-result.txt deleted file mode 100644 index d00491f..0000000 --- a/Tests/RunCMake/file-CHMOD/CHMOD-all-perms-result.txt +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/Tests/RunCMake/file-CHMOD/CHMOD-all-perms-stderr.txt b/Tests/RunCMake/file-CHMOD/CHMOD-all-perms-stderr.txt deleted file mode 100644 index b22387b..0000000 --- a/Tests/RunCMake/file-CHMOD/CHMOD-all-perms-stderr.txt +++ /dev/null @@ -1,5 +0,0 @@ -CMake Error at CHMOD-all-perms\.cmake:[0-9]+ \(file\): - file Remove either PERMISSIONS or FILE_PERMISSIONS or DIRECTORY_PERMISSIONS - from the invocation -Call Stack \(most recent call first\): - CMakeLists\.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/file-CHMOD/CHMOD-all-perms.cmake b/Tests/RunCMake/file-CHMOD/CHMOD-all-perms.cmake deleted file mode 100644 index b49583d..0000000 --- a/Tests/RunCMake/file-CHMOD/CHMOD-all-perms.cmake +++ /dev/null @@ -1,6 +0,0 @@ -file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) - -file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a) -file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a PERMISSIONS OWNER_READ - FILE_PERMISSIONS OWNER_READ DIRECTORY_PERMISSIONS OWNER_READ) diff --git a/Tests/RunCMake/file-CHMOD/CHMOD-invalid-path-result.txt b/Tests/RunCMake/file-CHMOD/CHMOD-invalid-path-result.txt deleted file mode 100644 index d00491f..0000000 --- a/Tests/RunCMake/file-CHMOD/CHMOD-invalid-path-result.txt +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/Tests/RunCMake/file-CHMOD/CHMOD-invalid-path-stderr.txt b/Tests/RunCMake/file-CHMOD/CHMOD-invalid-path-stderr.txt deleted file mode 100644 index 8d09e35..0000000 --- a/Tests/RunCMake/file-CHMOD/CHMOD-invalid-path-stderr.txt +++ /dev/null @@ -1,6 +0,0 @@ -CMake Error at CHMOD-invalid-path\.cmake:[0-9]+ \(file\): - file does not exist: - - .*/chmod-tests/I_dont_exist -Call Stack \(most recent call first\): - CMakeLists\.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/file-CHMOD/CHMOD-invalid-path.cmake b/Tests/RunCMake/file-CHMOD/CHMOD-invalid-path.cmake deleted file mode 100644 index 36915c1..0000000 --- a/Tests/RunCMake/file-CHMOD/CHMOD-invalid-path.cmake +++ /dev/null @@ -1,4 +0,0 @@ -file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) - -file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/I_dont_exist PERMISSIONS OWNER_READ) diff --git a/Tests/RunCMake/file-CHMOD/CHMOD-invalid-perms-result.txt b/Tests/RunCMake/file-CHMOD/CHMOD-invalid-perms-result.txt deleted file mode 100644 index d00491f..0000000 --- a/Tests/RunCMake/file-CHMOD/CHMOD-invalid-perms-result.txt +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/Tests/RunCMake/file-CHMOD/CHMOD-invalid-perms-stderr.txt b/Tests/RunCMake/file-CHMOD/CHMOD-invalid-perms-stderr.txt deleted file mode 100644 index 84ba2a2..0000000 --- a/Tests/RunCMake/file-CHMOD/CHMOD-invalid-perms-stderr.txt +++ /dev/null @@ -1,4 +0,0 @@ -CMake Error at CHMOD-invalid-perms\.cmake:[0-9]+ \(file\): - file INVALID_PERMISSION is an invalid permission specifier -Call Stack \(most recent call first\): - CMakeLists\.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/file-CHMOD/CHMOD-invalid-perms.cmake b/Tests/RunCMake/file-CHMOD/CHMOD-invalid-perms.cmake deleted file mode 100644 index 22cab0b..0000000 --- a/Tests/RunCMake/file-CHMOD/CHMOD-invalid-perms.cmake +++ /dev/null @@ -1,5 +0,0 @@ -file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) - -file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a) -file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a PERMISSIONS INVALID_PERMISSION) diff --git a/Tests/RunCMake/file-CHMOD/CHMOD-no-keyword-result.txt b/Tests/RunCMake/file-CHMOD/CHMOD-no-keyword-result.txt deleted file mode 100644 index d00491f..0000000 --- a/Tests/RunCMake/file-CHMOD/CHMOD-no-keyword-result.txt +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/Tests/RunCMake/file-CHMOD/CHMOD-no-keyword-stderr.txt b/Tests/RunCMake/file-CHMOD/CHMOD-no-keyword-stderr.txt deleted file mode 100644 index 2c248f8..0000000 --- a/Tests/RunCMake/file-CHMOD/CHMOD-no-keyword-stderr.txt +++ /dev/null @@ -1,4 +0,0 @@ -CMake Error at CHMOD-no-keyword\.cmake:[0-9]+ \(file\): - file No permissions given -Call Stack \(most recent call first\): - CMakeLists\.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/file-CHMOD/CHMOD-no-keyword.cmake b/Tests/RunCMake/file-CHMOD/CHMOD-no-keyword.cmake deleted file mode 100644 index 8b62106..0000000 --- a/Tests/RunCMake/file-CHMOD/CHMOD-no-keyword.cmake +++ /dev/null @@ -1,5 +0,0 @@ -file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) - -file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a) -file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a) diff --git a/Tests/RunCMake/file-CHMOD/CHMOD-no-perms-result.txt b/Tests/RunCMake/file-CHMOD/CHMOD-no-perms-result.txt deleted file mode 100644 index d00491f..0000000 --- a/Tests/RunCMake/file-CHMOD/CHMOD-no-perms-result.txt +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/Tests/RunCMake/file-CHMOD/CHMOD-no-perms-stderr.txt b/Tests/RunCMake/file-CHMOD/CHMOD-no-perms-stderr.txt deleted file mode 100644 index a18609f..0000000 --- a/Tests/RunCMake/file-CHMOD/CHMOD-no-perms-stderr.txt +++ /dev/null @@ -1,4 +0,0 @@ -CMake Error at CHMOD-no-perms\.cmake:[0-9]+ \(file\): - file No permissions given -Call Stack \(most recent call first\): - CMakeLists\.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/file-CHMOD/CHMOD-no-perms.cmake b/Tests/RunCMake/file-CHMOD/CHMOD-no-perms.cmake deleted file mode 100644 index 9fbd359..0000000 --- a/Tests/RunCMake/file-CHMOD/CHMOD-no-perms.cmake +++ /dev/null @@ -1,5 +0,0 @@ -file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) - -file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a) -file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a PERMISSIONS) diff --git a/Tests/RunCMake/file-CHMOD/CHMOD-ok.cmake b/Tests/RunCMake/file-CHMOD/CHMOD-ok.cmake deleted file mode 100644 index 87e3e57..0000000 --- a/Tests/RunCMake/file-CHMOD/CHMOD-ok.cmake +++ /dev/null @@ -1,5 +0,0 @@ -file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) - -file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a) -file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a PERMISSIONS OWNER_READ) diff --git a/Tests/RunCMake/file-CHMOD/CHMOD-override.cmake b/Tests/RunCMake/file-CHMOD/CHMOD-override.cmake deleted file mode 100644 index d9226b8..0000000 --- a/Tests/RunCMake/file-CHMOD/CHMOD-override.cmake +++ /dev/null @@ -1,6 +0,0 @@ -file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) - -file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a) -file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a PERMISSIONS OWNER_READ - FILE_PERMISSIONS OWNER_READ OWNER_WRITE) diff --git a/Tests/RunCMake/file-CHMOD/CHMOD-write-only-result.txt b/Tests/RunCMake/file-CHMOD/CHMOD-write-only-result.txt deleted file mode 100644 index d00491f..0000000 --- a/Tests/RunCMake/file-CHMOD/CHMOD-write-only-result.txt +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/Tests/RunCMake/file-CHMOD/CHMOD-write-only-stderr.txt b/Tests/RunCMake/file-CHMOD/CHMOD-write-only-stderr.txt deleted file mode 100644 index 1c87a59..0000000 --- a/Tests/RunCMake/file-CHMOD/CHMOD-write-only-stderr.txt +++ /dev/null @@ -1,6 +0,0 @@ -CMake Error at CHMOD-write-only\.cmake:[0-9]+ \(file\): - file failed to open for reading \(Permission denied\): - - .*/chmod-tests/a -Call Stack \(most recent call first\): - CMakeLists\.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/file-CHMOD/CHMOD-write-only.cmake b/Tests/RunCMake/file-CHMOD/CHMOD-write-only.cmake deleted file mode 100644 index 1289efc..0000000 --- a/Tests/RunCMake/file-CHMOD/CHMOD-write-only.cmake +++ /dev/null @@ -1,6 +0,0 @@ -file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) - -file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a "CONTENT") -file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a PERMISSIONS OWNER_WRITE) -file(READ ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a content) diff --git a/Tests/RunCMake/file-CHMOD/RunCMakeTest.cmake b/Tests/RunCMake/file-CHMOD/RunCMakeTest.cmake index 18deb89..52b6d4e 100644 --- a/Tests/RunCMake/file-CHMOD/RunCMakeTest.cmake +++ b/Tests/RunCMake/file-CHMOD/RunCMakeTest.cmake @@ -1,12 +1,12 @@ include(RunCMake) -run_cmake(CHMOD-no-perms) -run_cmake(CHMOD-no-keyword) -run_cmake(CHMOD-all-perms) -run_cmake(CHMOD-invalid-perms) -run_cmake(CHMOD-invalid-path) -run_cmake(CHMOD-ok) -run_cmake(CHMOD-override) +run_cmake(no-perms) +run_cmake(no-keyword) +run_cmake(all-perms) +run_cmake(invalid-perms) +run_cmake(invalid-path) +run_cmake(ok) +run_cmake(override) if(UNIX) execute_process(COMMAND id -u $ENV{USER} @@ -15,5 +15,5 @@ if(UNIX) endif() if(NOT WIN32 AND NOT MSYS AND NOT "${uid}" STREQUAL "0") - run_cmake(CHMOD-write-only) + run_cmake(write-only) endif() diff --git a/Tests/RunCMake/file-CHMOD/all-perms-result.txt b/Tests/RunCMake/file-CHMOD/all-perms-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/all-perms-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/file-CHMOD/all-perms-stderr.txt b/Tests/RunCMake/file-CHMOD/all-perms-stderr.txt new file mode 100644 index 0000000..8853aed --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/all-perms-stderr.txt @@ -0,0 +1,5 @@ +CMake Error at all-perms\.cmake:[0-9]+ \(file\): + file Remove either PERMISSIONS or FILE_PERMISSIONS or DIRECTORY_PERMISSIONS + from the invocation +Call Stack \(most recent call first\): + CMakeLists\.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/file-CHMOD/all-perms.cmake b/Tests/RunCMake/file-CHMOD/all-perms.cmake new file mode 100644 index 0000000..b49583d --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/all-perms.cmake @@ -0,0 +1,6 @@ +file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) +file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) + +file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a) +file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a PERMISSIONS OWNER_READ + FILE_PERMISSIONS OWNER_READ DIRECTORY_PERMISSIONS OWNER_READ) diff --git a/Tests/RunCMake/file-CHMOD/invalid-path-result.txt b/Tests/RunCMake/file-CHMOD/invalid-path-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/invalid-path-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/file-CHMOD/invalid-path-stderr.txt b/Tests/RunCMake/file-CHMOD/invalid-path-stderr.txt new file mode 100644 index 0000000..f2f9c82 --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/invalid-path-stderr.txt @@ -0,0 +1,6 @@ +CMake Error at invalid-path\.cmake:[0-9]+ \(file\): + file does not exist: + + .*/chmod-tests/I_dont_exist +Call Stack \(most recent call first\): + CMakeLists\.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/file-CHMOD/invalid-path.cmake b/Tests/RunCMake/file-CHMOD/invalid-path.cmake new file mode 100644 index 0000000..36915c1 --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/invalid-path.cmake @@ -0,0 +1,4 @@ +file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) +file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) + +file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/I_dont_exist PERMISSIONS OWNER_READ) diff --git a/Tests/RunCMake/file-CHMOD/invalid-perms-result.txt b/Tests/RunCMake/file-CHMOD/invalid-perms-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/invalid-perms-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/file-CHMOD/invalid-perms-stderr.txt b/Tests/RunCMake/file-CHMOD/invalid-perms-stderr.txt new file mode 100644 index 0000000..003252a --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/invalid-perms-stderr.txt @@ -0,0 +1,4 @@ +CMake Error at invalid-perms\.cmake:[0-9]+ \(file\): + file INVALID_PERMISSION is an invalid permission specifier +Call Stack \(most recent call first\): + CMakeLists\.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/file-CHMOD/invalid-perms.cmake b/Tests/RunCMake/file-CHMOD/invalid-perms.cmake new file mode 100644 index 0000000..22cab0b --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/invalid-perms.cmake @@ -0,0 +1,5 @@ +file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) +file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) + +file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a) +file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a PERMISSIONS INVALID_PERMISSION) diff --git a/Tests/RunCMake/file-CHMOD/no-keyword-result.txt b/Tests/RunCMake/file-CHMOD/no-keyword-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/no-keyword-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/file-CHMOD/no-keyword-stderr.txt b/Tests/RunCMake/file-CHMOD/no-keyword-stderr.txt new file mode 100644 index 0000000..1dfc6a9 --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/no-keyword-stderr.txt @@ -0,0 +1,4 @@ +CMake Error at no-keyword\.cmake:[0-9]+ \(file\): + file No permissions given +Call Stack \(most recent call first\): + CMakeLists\.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/file-CHMOD/no-keyword.cmake b/Tests/RunCMake/file-CHMOD/no-keyword.cmake new file mode 100644 index 0000000..8b62106 --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/no-keyword.cmake @@ -0,0 +1,5 @@ +file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) +file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) + +file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a) +file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a) diff --git a/Tests/RunCMake/file-CHMOD/no-perms-result.txt b/Tests/RunCMake/file-CHMOD/no-perms-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/no-perms-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/file-CHMOD/no-perms-stderr.txt b/Tests/RunCMake/file-CHMOD/no-perms-stderr.txt new file mode 100644 index 0000000..1d18464 --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/no-perms-stderr.txt @@ -0,0 +1,4 @@ +CMake Error at no-perms\.cmake:[0-9]+ \(file\): + file No permissions given +Call Stack \(most recent call first\): + CMakeLists\.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/file-CHMOD/no-perms.cmake b/Tests/RunCMake/file-CHMOD/no-perms.cmake new file mode 100644 index 0000000..9fbd359 --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/no-perms.cmake @@ -0,0 +1,5 @@ +file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) +file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) + +file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a) +file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a PERMISSIONS) diff --git a/Tests/RunCMake/file-CHMOD/ok.cmake b/Tests/RunCMake/file-CHMOD/ok.cmake new file mode 100644 index 0000000..87e3e57 --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/ok.cmake @@ -0,0 +1,5 @@ +file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) +file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) + +file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a) +file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a PERMISSIONS OWNER_READ) diff --git a/Tests/RunCMake/file-CHMOD/override.cmake b/Tests/RunCMake/file-CHMOD/override.cmake new file mode 100644 index 0000000..d9226b8 --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/override.cmake @@ -0,0 +1,6 @@ +file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) +file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) + +file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a) +file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a PERMISSIONS OWNER_READ + FILE_PERMISSIONS OWNER_READ OWNER_WRITE) diff --git a/Tests/RunCMake/file-CHMOD/write-only-result.txt b/Tests/RunCMake/file-CHMOD/write-only-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/write-only-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/file-CHMOD/write-only-stderr.txt b/Tests/RunCMake/file-CHMOD/write-only-stderr.txt new file mode 100644 index 0000000..da310a2 --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/write-only-stderr.txt @@ -0,0 +1,6 @@ +CMake Error at write-only\.cmake:[0-9]+ \(file\): + file failed to open for reading \(Permission denied\): + + .*/chmod-tests/a +Call Stack \(most recent call first\): + CMakeLists\.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/file-CHMOD/write-only.cmake b/Tests/RunCMake/file-CHMOD/write-only.cmake new file mode 100644 index 0000000..1289efc --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/write-only.cmake @@ -0,0 +1,6 @@ +file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) +file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) + +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a "CONTENT") +file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a PERMISSIONS OWNER_WRITE) +file(READ ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a content) -- cgit v0.12 From 1cf2c94c69cffeb5dde30ca13e5f341f184b3b4c Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 18 Jul 2022 17:48:21 -0400 Subject: Tests: Simplify RunCMake.file-CHMOD cases Run each case as a `cmake -P` script instead of a full project. The caller handles build directory removal and creation. --- Tests/RunCMake/file-CHMOD/RunCMakeTest.cmake | 16 ++++++++-------- Tests/RunCMake/file-CHMOD/all-perms-stderr.txt | 7 +++---- Tests/RunCMake/file-CHMOD/all-perms.cmake | 7 ++----- Tests/RunCMake/file-CHMOD/invalid-path-stderr.txt | 8 ++++---- Tests/RunCMake/file-CHMOD/invalid-path.cmake | 5 +---- Tests/RunCMake/file-CHMOD/invalid-perms-stderr.txt | 7 +++---- Tests/RunCMake/file-CHMOD/invalid-perms.cmake | 7 ++----- Tests/RunCMake/file-CHMOD/no-keyword-stderr.txt | 7 +++---- Tests/RunCMake/file-CHMOD/no-keyword.cmake | 7 ++----- Tests/RunCMake/file-CHMOD/no-perms-stderr.txt | 7 +++---- Tests/RunCMake/file-CHMOD/no-perms.cmake | 7 ++----- Tests/RunCMake/file-CHMOD/ok.cmake | 7 ++----- Tests/RunCMake/file-CHMOD/override.cmake | 7 ++----- Tests/RunCMake/file-CHMOD/write-only-stderr.txt | 8 ++++---- Tests/RunCMake/file-CHMOD/write-only.cmake | 9 +++------ 15 files changed, 44 insertions(+), 72 deletions(-) diff --git a/Tests/RunCMake/file-CHMOD/RunCMakeTest.cmake b/Tests/RunCMake/file-CHMOD/RunCMakeTest.cmake index 52b6d4e..52a8ad6 100644 --- a/Tests/RunCMake/file-CHMOD/RunCMakeTest.cmake +++ b/Tests/RunCMake/file-CHMOD/RunCMakeTest.cmake @@ -1,12 +1,12 @@ include(RunCMake) -run_cmake(no-perms) -run_cmake(no-keyword) -run_cmake(all-perms) -run_cmake(invalid-perms) -run_cmake(invalid-path) -run_cmake(ok) -run_cmake(override) +run_cmake_script(no-perms) +run_cmake_script(no-keyword) +run_cmake_script(all-perms) +run_cmake_script(invalid-perms) +run_cmake_script(invalid-path) +run_cmake_script(ok) +run_cmake_script(override) if(UNIX) execute_process(COMMAND id -u $ENV{USER} @@ -15,5 +15,5 @@ if(UNIX) endif() if(NOT WIN32 AND NOT MSYS AND NOT "${uid}" STREQUAL "0") - run_cmake(write-only) + run_cmake_script(write-only) endif() diff --git a/Tests/RunCMake/file-CHMOD/all-perms-stderr.txt b/Tests/RunCMake/file-CHMOD/all-perms-stderr.txt index 8853aed..6932a1f 100644 --- a/Tests/RunCMake/file-CHMOD/all-perms-stderr.txt +++ b/Tests/RunCMake/file-CHMOD/all-perms-stderr.txt @@ -1,5 +1,4 @@ -CMake Error at all-perms\.cmake:[0-9]+ \(file\): +^CMake Error at [^ +]*/all-perms\.cmake:[0-9]+ \(file\): file Remove either PERMISSIONS or FILE_PERMISSIONS or DIRECTORY_PERMISSIONS - from the invocation -Call Stack \(most recent call first\): - CMakeLists\.txt:[0-9]+ \(include\) + from the invocation$ diff --git a/Tests/RunCMake/file-CHMOD/all-perms.cmake b/Tests/RunCMake/file-CHMOD/all-perms.cmake index b49583d..5ff81b8 100644 --- a/Tests/RunCMake/file-CHMOD/all-perms.cmake +++ b/Tests/RunCMake/file-CHMOD/all-perms.cmake @@ -1,6 +1,3 @@ -file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) - -file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a) -file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a PERMISSIONS OWNER_READ +file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/a) +file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/a PERMISSIONS OWNER_READ FILE_PERMISSIONS OWNER_READ DIRECTORY_PERMISSIONS OWNER_READ) diff --git a/Tests/RunCMake/file-CHMOD/invalid-path-stderr.txt b/Tests/RunCMake/file-CHMOD/invalid-path-stderr.txt index f2f9c82..eb5fb31 100644 --- a/Tests/RunCMake/file-CHMOD/invalid-path-stderr.txt +++ b/Tests/RunCMake/file-CHMOD/invalid-path-stderr.txt @@ -1,6 +1,6 @@ -CMake Error at invalid-path\.cmake:[0-9]+ \(file\): +^CMake Error at [^ +]*/invalid-path\.cmake:[0-9]+ \(file\): file does not exist: - .*/chmod-tests/I_dont_exist -Call Stack \(most recent call first\): - CMakeLists\.txt:[0-9]+ \(include\) + [^ +]*/Tests/RunCMake/file-CHMOD/invalid-path-build/I_dont_exist$ diff --git a/Tests/RunCMake/file-CHMOD/invalid-path.cmake b/Tests/RunCMake/file-CHMOD/invalid-path.cmake index 36915c1..e8b0313 100644 --- a/Tests/RunCMake/file-CHMOD/invalid-path.cmake +++ b/Tests/RunCMake/file-CHMOD/invalid-path.cmake @@ -1,4 +1 @@ -file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) - -file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/I_dont_exist PERMISSIONS OWNER_READ) +file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/I_dont_exist PERMISSIONS OWNER_READ) diff --git a/Tests/RunCMake/file-CHMOD/invalid-perms-stderr.txt b/Tests/RunCMake/file-CHMOD/invalid-perms-stderr.txt index 003252a..daab22e 100644 --- a/Tests/RunCMake/file-CHMOD/invalid-perms-stderr.txt +++ b/Tests/RunCMake/file-CHMOD/invalid-perms-stderr.txt @@ -1,4 +1,3 @@ -CMake Error at invalid-perms\.cmake:[0-9]+ \(file\): - file INVALID_PERMISSION is an invalid permission specifier -Call Stack \(most recent call first\): - CMakeLists\.txt:[0-9]+ \(include\) +^CMake Error at [^ +]*/invalid-perms\.cmake:[0-9]+ \(file\): + file INVALID_PERMISSION is an invalid permission specifier$ diff --git a/Tests/RunCMake/file-CHMOD/invalid-perms.cmake b/Tests/RunCMake/file-CHMOD/invalid-perms.cmake index 22cab0b..42129b9 100644 --- a/Tests/RunCMake/file-CHMOD/invalid-perms.cmake +++ b/Tests/RunCMake/file-CHMOD/invalid-perms.cmake @@ -1,5 +1,2 @@ -file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) - -file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a) -file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a PERMISSIONS INVALID_PERMISSION) +file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/a) +file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/a PERMISSIONS INVALID_PERMISSION) diff --git a/Tests/RunCMake/file-CHMOD/no-keyword-stderr.txt b/Tests/RunCMake/file-CHMOD/no-keyword-stderr.txt index 1dfc6a9..41624a3 100644 --- a/Tests/RunCMake/file-CHMOD/no-keyword-stderr.txt +++ b/Tests/RunCMake/file-CHMOD/no-keyword-stderr.txt @@ -1,4 +1,3 @@ -CMake Error at no-keyword\.cmake:[0-9]+ \(file\): - file No permissions given -Call Stack \(most recent call first\): - CMakeLists\.txt:[0-9]+ \(include\) +^CMake Error at [^ +]*/no-keyword\.cmake:[0-9]+ \(file\): + file No permissions given$ diff --git a/Tests/RunCMake/file-CHMOD/no-keyword.cmake b/Tests/RunCMake/file-CHMOD/no-keyword.cmake index 8b62106..602cfc2 100644 --- a/Tests/RunCMake/file-CHMOD/no-keyword.cmake +++ b/Tests/RunCMake/file-CHMOD/no-keyword.cmake @@ -1,5 +1,2 @@ -file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) - -file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a) -file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a) +file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/a) +file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/a) diff --git a/Tests/RunCMake/file-CHMOD/no-perms-stderr.txt b/Tests/RunCMake/file-CHMOD/no-perms-stderr.txt index 1d18464..4c5a139 100644 --- a/Tests/RunCMake/file-CHMOD/no-perms-stderr.txt +++ b/Tests/RunCMake/file-CHMOD/no-perms-stderr.txt @@ -1,4 +1,3 @@ -CMake Error at no-perms\.cmake:[0-9]+ \(file\): - file No permissions given -Call Stack \(most recent call first\): - CMakeLists\.txt:[0-9]+ \(include\) +^CMake Error at [^ +]*/no-perms\.cmake:[0-9]+ \(file\): + file No permissions given$ diff --git a/Tests/RunCMake/file-CHMOD/no-perms.cmake b/Tests/RunCMake/file-CHMOD/no-perms.cmake index 9fbd359..346f946 100644 --- a/Tests/RunCMake/file-CHMOD/no-perms.cmake +++ b/Tests/RunCMake/file-CHMOD/no-perms.cmake @@ -1,5 +1,2 @@ -file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) - -file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a) -file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a PERMISSIONS) +file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/a) +file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/a PERMISSIONS) diff --git a/Tests/RunCMake/file-CHMOD/ok.cmake b/Tests/RunCMake/file-CHMOD/ok.cmake index 87e3e57..7c74d27 100644 --- a/Tests/RunCMake/file-CHMOD/ok.cmake +++ b/Tests/RunCMake/file-CHMOD/ok.cmake @@ -1,5 +1,2 @@ -file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) - -file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a) -file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a PERMISSIONS OWNER_READ) +file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/a) +file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/a PERMISSIONS OWNER_READ) diff --git a/Tests/RunCMake/file-CHMOD/override.cmake b/Tests/RunCMake/file-CHMOD/override.cmake index d9226b8..67e5a23 100644 --- a/Tests/RunCMake/file-CHMOD/override.cmake +++ b/Tests/RunCMake/file-CHMOD/override.cmake @@ -1,6 +1,3 @@ -file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) - -file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a) -file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a PERMISSIONS OWNER_READ +file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/a) +file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/a PERMISSIONS OWNER_READ FILE_PERMISSIONS OWNER_READ OWNER_WRITE) diff --git a/Tests/RunCMake/file-CHMOD/write-only-stderr.txt b/Tests/RunCMake/file-CHMOD/write-only-stderr.txt index da310a2..169a092 100644 --- a/Tests/RunCMake/file-CHMOD/write-only-stderr.txt +++ b/Tests/RunCMake/file-CHMOD/write-only-stderr.txt @@ -1,6 +1,6 @@ -CMake Error at write-only\.cmake:[0-9]+ \(file\): +^CMake Error at [^ +]*/write-only\.cmake:[0-9]+ \(file\): file failed to open for reading \(Permission denied\): - .*/chmod-tests/a -Call Stack \(most recent call first\): - CMakeLists\.txt:[0-9]+ \(include\) + [^ +]*/Tests/RunCMake/file-CHMOD/write-only-build/a$ diff --git a/Tests/RunCMake/file-CHMOD/write-only.cmake b/Tests/RunCMake/file-CHMOD/write-only.cmake index 1289efc..aa9d803 100644 --- a/Tests/RunCMake/file-CHMOD/write-only.cmake +++ b/Tests/RunCMake/file-CHMOD/write-only.cmake @@ -1,6 +1,3 @@ -file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests) - -file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a "CONTENT") -file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a PERMISSIONS OWNER_WRITE) -file(READ ${CMAKE_CURRENT_BINARY_DIR}/chmod-tests/a content) +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/a "CONTENT") +file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/a PERMISSIONS OWNER_WRITE) +file(READ ${CMAKE_CURRENT_BINARY_DIR}/a content) -- cgit v0.12 From 5512057c13104ca300965bc48cf18371c6b5a89a Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 18 Jul 2022 17:39:27 -0400 Subject: Tests: Add RunCMake.file-CHMOD cases for keywords missing values These make the existing `no-perms` case redundant, so repurpose it to replace `no-keyword`. --- Tests/RunCMake/file-CHMOD/RunCMakeTest.cmake | 4 +++- Tests/RunCMake/file-CHMOD/missing-dir-perms-result.txt | 1 + Tests/RunCMake/file-CHMOD/missing-dir-perms-stderr.txt | 3 +++ Tests/RunCMake/file-CHMOD/missing-dir-perms.cmake | 2 ++ Tests/RunCMake/file-CHMOD/missing-file-perms-result.txt | 1 + Tests/RunCMake/file-CHMOD/missing-file-perms-stderr.txt | 3 +++ Tests/RunCMake/file-CHMOD/missing-file-perms.cmake | 2 ++ Tests/RunCMake/file-CHMOD/missing-perms-result.txt | 1 + Tests/RunCMake/file-CHMOD/missing-perms-stderr.txt | 3 +++ Tests/RunCMake/file-CHMOD/missing-perms.cmake | 2 ++ Tests/RunCMake/file-CHMOD/no-keyword-result.txt | 1 - Tests/RunCMake/file-CHMOD/no-keyword-stderr.txt | 3 --- Tests/RunCMake/file-CHMOD/no-keyword.cmake | 2 -- Tests/RunCMake/file-CHMOD/no-perms.cmake | 2 +- 14 files changed, 22 insertions(+), 8 deletions(-) create mode 100644 Tests/RunCMake/file-CHMOD/missing-dir-perms-result.txt create mode 100644 Tests/RunCMake/file-CHMOD/missing-dir-perms-stderr.txt create mode 100644 Tests/RunCMake/file-CHMOD/missing-dir-perms.cmake create mode 100644 Tests/RunCMake/file-CHMOD/missing-file-perms-result.txt create mode 100644 Tests/RunCMake/file-CHMOD/missing-file-perms-stderr.txt create mode 100644 Tests/RunCMake/file-CHMOD/missing-file-perms.cmake create mode 100644 Tests/RunCMake/file-CHMOD/missing-perms-result.txt create mode 100644 Tests/RunCMake/file-CHMOD/missing-perms-stderr.txt create mode 100644 Tests/RunCMake/file-CHMOD/missing-perms.cmake delete mode 100644 Tests/RunCMake/file-CHMOD/no-keyword-result.txt delete mode 100644 Tests/RunCMake/file-CHMOD/no-keyword-stderr.txt delete mode 100644 Tests/RunCMake/file-CHMOD/no-keyword.cmake diff --git a/Tests/RunCMake/file-CHMOD/RunCMakeTest.cmake b/Tests/RunCMake/file-CHMOD/RunCMakeTest.cmake index 52a8ad6..e6b1169 100644 --- a/Tests/RunCMake/file-CHMOD/RunCMakeTest.cmake +++ b/Tests/RunCMake/file-CHMOD/RunCMakeTest.cmake @@ -1,7 +1,9 @@ include(RunCMake) run_cmake_script(no-perms) -run_cmake_script(no-keyword) +run_cmake_script(missing-perms) +run_cmake_script(missing-file-perms) +run_cmake_script(missing-dir-perms) run_cmake_script(all-perms) run_cmake_script(invalid-perms) run_cmake_script(invalid-path) diff --git a/Tests/RunCMake/file-CHMOD/missing-dir-perms-result.txt b/Tests/RunCMake/file-CHMOD/missing-dir-perms-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/missing-dir-perms-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/file-CHMOD/missing-dir-perms-stderr.txt b/Tests/RunCMake/file-CHMOD/missing-dir-perms-stderr.txt new file mode 100644 index 0000000..2672462 --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/missing-dir-perms-stderr.txt @@ -0,0 +1,3 @@ +^CMake Error at [^ +]*/missing-dir-perms.cmake:[0-9]+ \(file\): + file DIRECTORY_PERMISSIONS is not given any arguments$ diff --git a/Tests/RunCMake/file-CHMOD/missing-dir-perms.cmake b/Tests/RunCMake/file-CHMOD/missing-dir-perms.cmake new file mode 100644 index 0000000..9d0fdad --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/missing-dir-perms.cmake @@ -0,0 +1,2 @@ +file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/a) +file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/a PERMISSIONS OWNER_READ DIRECTORY_PERMISSIONS) diff --git a/Tests/RunCMake/file-CHMOD/missing-file-perms-result.txt b/Tests/RunCMake/file-CHMOD/missing-file-perms-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/missing-file-perms-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/file-CHMOD/missing-file-perms-stderr.txt b/Tests/RunCMake/file-CHMOD/missing-file-perms-stderr.txt new file mode 100644 index 0000000..ae4132f --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/missing-file-perms-stderr.txt @@ -0,0 +1,3 @@ +^CMake Error at [^ +]*/missing-file-perms.cmake:[0-9]+ \(file\): + file FILE_PERMISSIONS is not given any arguments$ diff --git a/Tests/RunCMake/file-CHMOD/missing-file-perms.cmake b/Tests/RunCMake/file-CHMOD/missing-file-perms.cmake new file mode 100644 index 0000000..bcf35aa --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/missing-file-perms.cmake @@ -0,0 +1,2 @@ +file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/a) +file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/a PERMISSIONS OWNER_READ FILE_PERMISSIONS) diff --git a/Tests/RunCMake/file-CHMOD/missing-perms-result.txt b/Tests/RunCMake/file-CHMOD/missing-perms-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/missing-perms-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/file-CHMOD/missing-perms-stderr.txt b/Tests/RunCMake/file-CHMOD/missing-perms-stderr.txt new file mode 100644 index 0000000..fd88e7f --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/missing-perms-stderr.txt @@ -0,0 +1,3 @@ +^CMake Error at [^ +]*/missing-perms.cmake:[0-9]+ \(file\): + file PERMISSIONS is not given any arguments$ diff --git a/Tests/RunCMake/file-CHMOD/missing-perms.cmake b/Tests/RunCMake/file-CHMOD/missing-perms.cmake new file mode 100644 index 0000000..da9f182 --- /dev/null +++ b/Tests/RunCMake/file-CHMOD/missing-perms.cmake @@ -0,0 +1,2 @@ +file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/a) +file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/a FILE_PERMISSIONS OWNER_READ PERMISSIONS) diff --git a/Tests/RunCMake/file-CHMOD/no-keyword-result.txt b/Tests/RunCMake/file-CHMOD/no-keyword-result.txt deleted file mode 100644 index d00491f..0000000 --- a/Tests/RunCMake/file-CHMOD/no-keyword-result.txt +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/Tests/RunCMake/file-CHMOD/no-keyword-stderr.txt b/Tests/RunCMake/file-CHMOD/no-keyword-stderr.txt deleted file mode 100644 index 41624a3..0000000 --- a/Tests/RunCMake/file-CHMOD/no-keyword-stderr.txt +++ /dev/null @@ -1,3 +0,0 @@ -^CMake Error at [^ -]*/no-keyword\.cmake:[0-9]+ \(file\): - file No permissions given$ diff --git a/Tests/RunCMake/file-CHMOD/no-keyword.cmake b/Tests/RunCMake/file-CHMOD/no-keyword.cmake deleted file mode 100644 index 602cfc2..0000000 --- a/Tests/RunCMake/file-CHMOD/no-keyword.cmake +++ /dev/null @@ -1,2 +0,0 @@ -file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/a) -file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/a) diff --git a/Tests/RunCMake/file-CHMOD/no-perms.cmake b/Tests/RunCMake/file-CHMOD/no-perms.cmake index 346f946..602cfc2 100644 --- a/Tests/RunCMake/file-CHMOD/no-perms.cmake +++ b/Tests/RunCMake/file-CHMOD/no-perms.cmake @@ -1,2 +1,2 @@ file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/a) -file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/a PERMISSIONS) +file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/a) -- cgit v0.12 From 1b095729dad25dd24b3e2c72ca7b01e4f97f1839 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 19 Jul 2022 14:32:42 -0400 Subject: Tests: Add RunCMake.cmake_path cases for BASE_DIRECTORY missing value --- Tests/RunCMake/cmake_path/BASE_DIRECTORY-no-arg-stderr.txt | 2 ++ Tests/RunCMake/cmake_path/RunCMakeTest.cmake | 8 ++++++++ 2 files changed, 10 insertions(+) create mode 100644 Tests/RunCMake/cmake_path/BASE_DIRECTORY-no-arg-stderr.txt diff --git a/Tests/RunCMake/cmake_path/BASE_DIRECTORY-no-arg-stderr.txt b/Tests/RunCMake/cmake_path/BASE_DIRECTORY-no-arg-stderr.txt new file mode 100644 index 0000000..ac47545 --- /dev/null +++ b/Tests/RunCMake/cmake_path/BASE_DIRECTORY-no-arg-stderr.txt @@ -0,0 +1,2 @@ +CMake Error at .+/cmake_path/call-cmake_path.cmake:[0-9]+ \(cmake_path\): + cmake_path BASE_DIRECTORY requires an argument. diff --git a/Tests/RunCMake/cmake_path/RunCMakeTest.cmake b/Tests/RunCMake/cmake_path/RunCMakeTest.cmake index 991f46b..8a2dd95 100644 --- a/Tests/RunCMake/cmake_path/RunCMakeTest.cmake +++ b/Tests/RunCMake/cmake_path/RunCMakeTest.cmake @@ -74,6 +74,14 @@ foreach (command IN ITEMS APPEND APPEND_STRING REMOVE_FILENAME REPLACE_FILENAME endforeach() +## BASE_DIRECTORY without argument +set (RunCMake-stderr-file "BASE_DIRECTORY-no-arg-stderr.txt") + +foreach (command IN ITEMS RELATIVE_PATH ABSOLUTE_PATH) + run_cmake_command (${command}-OUTPUT_VARIABLE-no-arg "${CMAKE_COMMAND}" "-DCMAKE_PATH_ARGUMENTS=${command} path BASE_DIRECTORY" -P "${RunCMake_SOURCE_DIR}/call-cmake_path.cmake") +endforeach() + + ## Invalid output variable set (RunCMake-stderr-file "invalid-output-var-stderr.txt") -- cgit v0.12 From 316960ded0f8302f9c56498627d91fe852af2749 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 20 Jul 2022 15:05:47 -0400 Subject: cmInstallCommand: Drop unused local variable --- Source/cmInstallCommand.cxx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Source/cmInstallCommand.cxx b/Source/cmInstallCommand.cxx index b1044a8..82adca8 100644 --- a/Source/cmInstallCommand.cxx +++ b/Source/cmInstallCommand.cxx @@ -2160,11 +2160,9 @@ bool HandleRuntimeDependencySetMode(std::vector const& args, // These generic args also contain the runtime dependency set std::string runtimeDependencySetArg; std::vector runtimeDependencyArgVector; - std::vector parsedArgs; cmInstallCommandArguments genericArgs(helper.DefaultComponentName); genericArgs.Bind("RUNTIME_DEPENDENCY_SET"_s, runtimeDependencySetArg); - genericArgs.Parse(genericArgVector, &runtimeDependencyArgVector, nullptr, - &parsedArgs); + genericArgs.Parse(genericArgVector, &runtimeDependencyArgVector); bool success = genericArgs.Finalize(); cmInstallCommandArguments libraryArgs(helper.DefaultComponentName); -- cgit v0.12 From 31d7aa5e3c586e4818a7debdc0bcdbdfd6c2b7b2 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 19 Jul 2022 14:19:43 -0400 Subject: cmCMakePathCommand: Use cm::optional for keyword argument presence --- Source/cmCMakePathCommand.cxx | 60 +++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 34 deletions(-) diff --git a/Source/cmCMakePathCommand.cxx b/Source/cmCMakePathCommand.cxx index adcffa9..e604ed1 100644 --- a/Source/cmCMakePathCommand.cxx +++ b/Source/cmCMakePathCommand.cxx @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -43,15 +44,14 @@ public: } template - Result Parse(std::vector const& args, - std::vector* keywordsMissingValue = nullptr, - std::vector* parsedKeywords = nullptr) const + Result Parse( + std::vector const& args, + std::vector* keywordsMissingValue = nullptr) const { this->Inputs.clear(); return this->cmArgumentParser::Parse( - cmMakeRange(args).advance(Advance), &this->Inputs, keywordsMissingValue, - parsedKeywords); + cmMakeRange(args).advance(Advance), &this->Inputs, keywordsMissingValue); } const std::vector& GetInputs() const { return this->Inputs; } @@ -83,20 +83,15 @@ public: Result Parse(std::vector const& args) const { this->KeywordsMissingValue.clear(); - this->ParsedKeywords.clear(); return this->CMakePathArgumentParser::template Parse( - args, &this->KeywordsMissingValue, &this->ParsedKeywords); + args, &this->KeywordsMissingValue); } const std::vector& GetKeywordsMissingValue() const { return this->KeywordsMissingValue; } - const std::vector& GetParsedKeywords() const - { - return this->ParsedKeywords; - } bool checkOutputVariable(const Result& arguments, cmExecutionStatus& status) const @@ -109,10 +104,7 @@ public: return false; } - if (std::find(this->GetParsedKeywords().begin(), - this->GetParsedKeywords().end(), - "OUTPUT_VARIABLE"_s) != this->GetParsedKeywords().end() && - arguments.Output.empty()) { + if (arguments.Output && arguments.Output->empty()) { status.SetError("Invalid name for output variable."); return false; } @@ -122,12 +114,11 @@ public: private: mutable std::vector KeywordsMissingValue; - mutable std::vector ParsedKeywords; }; struct OutputVariable { - std::string Output; + cm::optional Output; }; // Usable when OUTPUT_VARIABLE is the only option class OutputVariableParser @@ -307,7 +298,7 @@ bool HandleAppendCommand(std::vector const& args, } status.GetMakefile().AddDefinition( - arguments.Output.empty() ? args[1] : arguments.Output, path.String()); + arguments.Output ? *arguments.Output : args[1], path.String()); return true; } @@ -334,7 +325,7 @@ bool HandleAppendStringCommand(std::vector const& args, } status.GetMakefile().AddDefinition( - arguments.Output.empty() ? args[1] : arguments.Output, path.String()); + arguments.Output ? *arguments.Output : args[1], path.String()); return true; } @@ -364,7 +355,7 @@ bool HandleRemoveFilenameCommand(std::vector const& args, path.RemoveFileName(); status.GetMakefile().AddDefinition( - arguments.Output.empty() ? args[1] : arguments.Output, path.String()); + arguments.Output ? *arguments.Output : args[1], path.String()); return true; } @@ -395,7 +386,7 @@ bool HandleReplaceFilenameCommand(std::vector const& args, parser.GetInputs().empty() ? "" : parser.GetInputs().front()); status.GetMakefile().AddDefinition( - arguments.Output.empty() ? args[1] : arguments.Output, path.String()); + arguments.Output ? *arguments.Output : args[1], path.String()); return true; } @@ -405,7 +396,7 @@ bool HandleRemoveExtensionCommand(std::vector const& args, { struct Arguments { - std::string Output; + cm::optional Output; bool LastOnly = false; }; @@ -438,7 +429,7 @@ bool HandleRemoveExtensionCommand(std::vector const& args, } status.GetMakefile().AddDefinition( - arguments.Output.empty() ? args[1] : arguments.Output, path.String()); + arguments.Output ? *arguments.Output : args[1], path.String()); return true; } @@ -448,7 +439,7 @@ bool HandleReplaceExtensionCommand(std::vector const& args, { struct Arguments { - std::string Output; + cm::optional Output; bool LastOnly = false; }; @@ -483,7 +474,7 @@ bool HandleReplaceExtensionCommand(std::vector const& args, } status.GetMakefile().AddDefinition( - arguments.Output.empty() ? args[1] : arguments.Output, path.String()); + arguments.Output ? *arguments.Output : args[1], path.String()); return true; } @@ -512,7 +503,7 @@ bool HandleNormalPathCommand(std::vector const& args, auto path = cmCMakePath(inputPath).Normal(); status.GetMakefile().AddDefinition( - arguments.Output.empty() ? args[1] : arguments.Output, path.String()); + arguments.Output ? *arguments.Output : args[1], path.String()); return true; } @@ -525,8 +516,8 @@ bool HandleTransformPathCommand( { struct Arguments { - std::string Output; - std::string BaseDirectory; + cm::optional Output; + cm::optional BaseDirectory; bool Normalize = false; }; @@ -554,10 +545,11 @@ bool HandleTransformPathCommand( return false; } - if (std::find(parser.GetParsedKeywords().begin(), - parser.GetParsedKeywords().end(), - "BASE_DIRECTORY"_s) == parser.GetParsedKeywords().end()) { - arguments.BaseDirectory = status.GetMakefile().GetCurrentSourceDirectory(); + std::string baseDirectory; + if (arguments.BaseDirectory) { + baseDirectory = *arguments.BaseDirectory; + } else { + baseDirectory = status.GetMakefile().GetCurrentSourceDirectory(); } std::string inputPath; @@ -565,13 +557,13 @@ bool HandleTransformPathCommand( return false; } - auto path = transform(cmCMakePath(inputPath), arguments.BaseDirectory); + auto path = transform(cmCMakePath(inputPath), baseDirectory); if (arguments.Normalize) { path = path.Normal(); } status.GetMakefile().AddDefinition( - arguments.Output.empty() ? args[1] : arguments.Output, path.String()); + arguments.Output ? *arguments.Output : args[1], path.String()); return true; } -- cgit v0.12 From e98fd9d87ecbc231632653b2f3b31d8a01864874 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 20 Jul 2022 15:12:14 -0400 Subject: cmFileCommand: Use cm::optional for keyword argument presence --- Source/cmFileCommand.cxx | 50 +++++++++++++++++------------------------------- 1 file changed, 18 insertions(+), 32 deletions(-) diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index d2aa63c..7530486 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -954,19 +954,17 @@ bool HandleRPathChangeCommand(std::vector const& args, { // Evaluate arguments. std::string file; - std::string oldRPath; - std::string newRPath; + cm::optional oldRPath; + cm::optional newRPath; bool removeEnvironmentRPath = false; cmArgumentParser parser; std::vector unknownArgs; std::vector missingArgs; - std::vector parsedArgs; parser.Bind("FILE"_s, file) .Bind("OLD_RPATH"_s, oldRPath) .Bind("NEW_RPATH"_s, newRPath) .Bind("INSTALL_REMOVE_ENVIRONMENT_RPATH"_s, removeEnvironmentRPath); - parser.Parse(cmMakeRange(args).advance(1), &unknownArgs, &missingArgs, - &parsedArgs); + parser.Parse(cmMakeRange(args).advance(1), &unknownArgs, &missingArgs); if (!unknownArgs.empty()) { status.SetError( cmStrCat("RPATH_CHANGE given unknown argument ", unknownArgs.front())); @@ -981,15 +979,11 @@ bool HandleRPathChangeCommand(std::vector const& args, status.SetError("RPATH_CHANGE not given FILE option."); return false; } - if (oldRPath.empty() && - std::find(parsedArgs.begin(), parsedArgs.end(), "OLD_RPATH") == - parsedArgs.end()) { + if (!oldRPath) { status.SetError("RPATH_CHANGE not given OLD_RPATH option."); return false; } - if (newRPath.empty() && - std::find(parsedArgs.begin(), parsedArgs.end(), "NEW_RPATH") == - parsedArgs.end()) { + if (!newRPath) { status.SetError("RPATH_CHANGE not given NEW_RPATH option."); return false; } @@ -1003,17 +997,17 @@ bool HandleRPathChangeCommand(std::vector const& args, std::string emsg; bool changed; - if (!cmSystemTools::ChangeRPath(file, oldRPath, newRPath, + if (!cmSystemTools::ChangeRPath(file, *oldRPath, *newRPath, removeEnvironmentRPath, &emsg, &changed)) { status.SetError(cmStrCat("RPATH_CHANGE could not write new RPATH:\n ", - newRPath, "\nto the file:\n ", file, "\n", + *newRPath, "\nto the file:\n ", file, "\n", emsg)); success = false; } if (success) { if (changed) { std::string message = - cmStrCat("Set runtime path of \"", file, "\" to \"", newRPath, '"'); + cmStrCat("Set runtime path of \"", file, "\" to \"", *newRPath, '"'); status.GetMakefile().DisplayStatus(message, -1); } ft.Store(file); @@ -1026,14 +1020,12 @@ bool HandleRPathSetCommand(std::vector const& args, { // Evaluate arguments. std::string file; - std::string newRPath; + cm::optional newRPath; cmArgumentParser parser; std::vector unknownArgs; std::vector missingArgs; - std::vector parsedArgs; parser.Bind("FILE"_s, file).Bind("NEW_RPATH"_s, newRPath); - parser.Parse(cmMakeRange(args).advance(1), &unknownArgs, &missingArgs, - &parsedArgs); + parser.Parse(cmMakeRange(args).advance(1), &unknownArgs, &missingArgs); if (!unknownArgs.empty()) { status.SetError(cmStrCat("RPATH_SET given unrecognized argument \"", unknownArgs.front(), "\".")); @@ -1048,9 +1040,7 @@ bool HandleRPathSetCommand(std::vector const& args, status.SetError("RPATH_SET not given FILE option."); return false; } - if (newRPath.empty() && - std::find(parsedArgs.begin(), parsedArgs.end(), "NEW_RPATH") == - parsedArgs.end()) { + if (!newRPath) { status.SetError("RPATH_SET not given NEW_RPATH option."); return false; } @@ -1064,16 +1054,16 @@ bool HandleRPathSetCommand(std::vector const& args, std::string emsg; bool changed; - if (!cmSystemTools::SetRPath(file, newRPath, &emsg, &changed)) { + if (!cmSystemTools::SetRPath(file, *newRPath, &emsg, &changed)) { status.SetError(cmStrCat("RPATH_SET could not write new RPATH:\n ", - newRPath, "\nto the file:\n ", file, "\n", + *newRPath, "\nto the file:\n ", file, "\n", emsg)); success = false; } if (success) { if (changed) { std::string message = - cmStrCat("Set runtime path of \"", file, "\" to \"", newRPath, '"'); + cmStrCat("Set runtime path of \"", file, "\" to \"", *newRPath, '"'); status.GetMakefile().DisplayStatus(message, -1); } ft.Store(file); @@ -1136,14 +1126,12 @@ bool HandleRPathCheckCommand(std::vector const& args, { // Evaluate arguments. std::string file; - std::string rpath; + cm::optional rpath; cmArgumentParser parser; std::vector unknownArgs; std::vector missingArgs; - std::vector parsedArgs; parser.Bind("FILE"_s, file).Bind("RPATH"_s, rpath); - parser.Parse(cmMakeRange(args).advance(1), &unknownArgs, &missingArgs, - &parsedArgs); + parser.Parse(cmMakeRange(args).advance(1), &unknownArgs, &missingArgs); if (!unknownArgs.empty()) { status.SetError( cmStrCat("RPATH_CHECK given unknown argument ", unknownArgs.front())); @@ -1158,9 +1146,7 @@ bool HandleRPathCheckCommand(std::vector const& args, status.SetError("RPATH_CHECK not given FILE option."); return false; } - if (rpath.empty() && - std::find(parsedArgs.begin(), parsedArgs.end(), "RPATH") == - parsedArgs.end()) { + if (!rpath) { status.SetError("RPATH_CHECK not given RPATH option."); return false; } @@ -1169,7 +1155,7 @@ bool HandleRPathCheckCommand(std::vector const& args, // delete it. This is used during installation to re-install a file // if its RPath will change. if (cmSystemTools::FileExists(file, true) && - !cmSystemTools::CheckRPath(file, rpath)) { + !cmSystemTools::CheckRPath(file, *rpath)) { cmSystemTools::RemoveFile(file); } -- cgit v0.12 From 197ef69aa1758040ccf8a01dd0a9be6ddb8f8c17 Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 17 Jun 2022 12:48:59 -0400 Subject: cmArgumentParser: Simplify internal method signatures Record `Parse` parameters during construction of the internal instance instead of passing them to every method. --- Source/cmArgumentParser.cxx | 23 +++++++++----------- Source/cmArgumentParser.h | 53 ++++++++++++++++++++++++++++++--------------- Utilities/IWYU/mapping.imp | 2 +- 3 files changed, 46 insertions(+), 32 deletions(-) diff --git a/Source/cmArgumentParser.cxx b/Source/cmArgumentParser.cxx index f0c4cfc..355cfdc 100644 --- a/Source/cmArgumentParser.cxx +++ b/Source/cmArgumentParser.cxx @@ -74,19 +74,16 @@ void Instance::Bind(std::vector>& val) this->ExpectValue = false; } -void Instance::Consume(cm::string_view arg, void* result, - std::vector* unparsedArguments, - std::vector* keywordsMissingValue, - std::vector* parsedKeywords) +void Instance::Consume(cm::string_view arg) { auto const it = this->Bindings.Find(arg); if (it != this->Bindings.end()) { - if (parsedKeywords != nullptr) { - parsedKeywords->emplace_back(it->first); + if (this->ParsedKeywords != nullptr) { + this->ParsedKeywords->emplace_back(it->first); } - it->second(*this, result); - if (this->ExpectValue && keywordsMissingValue != nullptr) { - keywordsMissingValue->emplace_back(it->first); + it->second(*this); + if (this->ExpectValue && this->KeywordsMissingValue != nullptr) { + this->KeywordsMissingValue->emplace_back(it->first); } return; } @@ -97,13 +94,13 @@ void Instance::Consume(cm::string_view arg, void* result, this->CurrentList = nullptr; } else if (this->CurrentList != nullptr) { this->CurrentList->emplace_back(arg); - } else if (unparsedArguments != nullptr) { - unparsedArguments->emplace_back(arg); + } else if (this->UnparsedArguments != nullptr) { + this->UnparsedArguments->emplace_back(arg); } if (this->ExpectValue) { - if (keywordsMissingValue != nullptr) { - keywordsMissingValue->pop_back(); + if (this->KeywordsMissingValue != nullptr) { + this->KeywordsMissingValue->pop_back(); } this->ExpectValue = false; } diff --git a/Source/cmArgumentParser.h b/Source/cmArgumentParser.h index 26148d9..a26195d 100644 --- a/Source/cmArgumentParser.h +++ b/Source/cmArgumentParser.h @@ -16,10 +16,13 @@ #include "cmArgumentParserTypes.h" // IWYU pragma: keep +template +class cmArgumentParser; // IWYU pragma: keep + namespace ArgumentParser { class Instance; -using Action = std::function; +using Action = std::function; // using ActionMap = cm::flat_map; class ActionMap : public std::vector> @@ -32,8 +35,16 @@ public: class Instance { public: - Instance(ActionMap const& bindings) + Instance(ActionMap const& bindings, + std::vector* unparsedArguments, + std::vector* keywordsMissingValue, + std::vector* parsedKeywords, + void* result = nullptr) : Bindings(bindings) + , UnparsedArguments(unparsedArguments) + , KeywordsMissingValue(keywordsMissingValue) + , ParsedKeywords(parsedKeywords) + , Result(result) { } @@ -54,16 +65,21 @@ public: this->Bind(*optVal); } - void Consume(cm::string_view arg, void* result, - std::vector* unparsedArguments, - std::vector* keywordsMissingValue, - std::vector* parsedKeywords); + void Consume(cm::string_view arg); private: ActionMap const& Bindings; + std::vector* UnparsedArguments = nullptr; + std::vector* KeywordsMissingValue = nullptr; + std::vector* ParsedKeywords = nullptr; + void* Result = nullptr; + std::string* CurrentString = nullptr; std::vector* CurrentList = nullptr; bool ExpectValue = false; + + template + friend class ::cmArgumentParser; }; } // namespace ArgumentParser @@ -80,8 +96,9 @@ public: bool const inserted = this->Bindings .Emplace(name, - [member](ArgumentParser::Instance& instance, void* result) { - instance.Bind(static_cast(result)->*member); + [member](ArgumentParser::Instance& instance) { + instance.Bind( + static_cast(instance.Result)->*member); }) .second; assert(inserted), (void)inserted; @@ -94,10 +111,11 @@ public: std::vector* keywordsMissingValue = nullptr, std::vector* parsedKeywords = nullptr) const { - ArgumentParser::Instance instance(this->Bindings); + ArgumentParser::Instance instance(this->Bindings, unparsedArguments, + keywordsMissingValue, parsedKeywords, + &result); for (cm::string_view arg : args) { - instance.Consume(arg, &result, unparsedArguments, keywordsMissingValue, - parsedKeywords); + instance.Consume(arg); } } @@ -133,10 +151,10 @@ public: std::vector* keywordsMissingValue = nullptr, std::vector* parsedKeywords = nullptr) const { - ArgumentParser::Instance instance(this->Bindings); + ArgumentParser::Instance instance(this->Bindings, unparsedArguments, + keywordsMissingValue, parsedKeywords); for (cm::string_view arg : args) { - instance.Consume(arg, nullptr, unparsedArguments, keywordsMissingValue, - parsedKeywords); + instance.Consume(arg); } } @@ -145,10 +163,9 @@ protected: bool Bind(cm::string_view name, T& ref) { return this->Bindings - .Emplace(name, - [&ref](ArgumentParser::Instance& instance, void*) { - instance.Bind(ref); - }) + .Emplace( + name, + [&ref](ArgumentParser::Instance& instance) { instance.Bind(ref); }) .second; } diff --git a/Utilities/IWYU/mapping.imp b/Utilities/IWYU/mapping.imp index b80fc22..b0ed911 100644 --- a/Utilities/IWYU/mapping.imp +++ b/Utilities/IWYU/mapping.imp @@ -91,7 +91,7 @@ { symbol: [ "std::__decay_and_strip::__type", private, "\"cmConfigure.h\"", public ] }, { symbol: [ "std::__decay_and_strip::__type", private, "\"cmConfigure.h\"", public ] }, { symbol: [ "std::__decay_and_strip<__gnu_cxx::__normal_iterator > > &>::__type", private, "\"cmConfigure.h\"", public ] }, - { symbol: [ "std::__decay_and_strip > *, std::vector >, std::allocator > > > > &>::__type", private, "\"cmConfigure.h\"", public ] }, + { symbol: [ "std::__decay_and_strip > *, std::vector >, std::allocator > > > > &>::__type", private, "\"cmConfigure.h\"", public ] }, { symbol: [ "std::__success_type > >::type", private, "\"cmConfigure.h\"", public ] }, { symbol: [ "std::__success_type > >::type", private, "\"cmConfigure.h\"", public ] }, { symbol: [ "std::enable_if > >::type", private, "\"cmConfigure.h\"", public ] }, -- cgit v0.12 From a77b9c0ece8dbb2164c2c0f11c1f5368bd055f8a Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 17 Jun 2022 12:52:55 -0400 Subject: cmArgumentParser: De-duplicate parse loop --- Source/cmArgumentParser.h | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Source/cmArgumentParser.h b/Source/cmArgumentParser.h index a26195d..7cbef92 100644 --- a/Source/cmArgumentParser.h +++ b/Source/cmArgumentParser.h @@ -65,7 +65,13 @@ public: this->Bind(*optVal); } - void Consume(cm::string_view arg); + template + void Parse(Range const& args) + { + for (cm::string_view arg : args) { + this->Consume(arg); + } + } private: ActionMap const& Bindings; @@ -78,6 +84,8 @@ private: std::vector* CurrentList = nullptr; bool ExpectValue = false; + void Consume(cm::string_view arg); + template friend class ::cmArgumentParser; }; @@ -114,9 +122,7 @@ public: ArgumentParser::Instance instance(this->Bindings, unparsedArguments, keywordsMissingValue, parsedKeywords, &result); - for (cm::string_view arg : args) { - instance.Consume(arg); - } + instance.Parse(args); } template @@ -153,9 +159,7 @@ public: { ArgumentParser::Instance instance(this->Bindings, unparsedArguments, keywordsMissingValue, parsedKeywords); - for (cm::string_view arg : args) { - instance.Consume(arg); - } + instance.Parse(args); } protected: -- cgit v0.12 From 84b335c2868d245841f08656b96cad3d9df10422 Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 17 Jun 2022 12:25:04 -0400 Subject: cmArgumentParser: Track pending keyword explicitly Avoid allocating missing keyword vector unnecessarily. --- Source/cmArgumentParser.cxx | 16 +++++++++++----- Source/cmArgumentParser.h | 3 +++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Source/cmArgumentParser.cxx b/Source/cmArgumentParser.cxx index 355cfdc..df008a2 100644 --- a/Source/cmArgumentParser.cxx +++ b/Source/cmArgumentParser.cxx @@ -78,13 +78,12 @@ void Instance::Consume(cm::string_view arg) { auto const it = this->Bindings.Find(arg); if (it != this->Bindings.end()) { + this->FinishKeyword(); + this->Keyword = it->first; if (this->ParsedKeywords != nullptr) { this->ParsedKeywords->emplace_back(it->first); } it->second(*this); - if (this->ExpectValue && this->KeywordsMissingValue != nullptr) { - this->KeywordsMissingValue->emplace_back(it->first); - } return; } @@ -98,11 +97,18 @@ void Instance::Consume(cm::string_view arg) this->UnparsedArguments->emplace_back(arg); } + this->ExpectValue = false; +} + +void Instance::FinishKeyword() +{ + if (this->Keyword.empty()) { + return; + } if (this->ExpectValue) { if (this->KeywordsMissingValue != nullptr) { - this->KeywordsMissingValue->pop_back(); + this->KeywordsMissingValue->emplace_back(this->Keyword); } - this->ExpectValue = false; } } diff --git a/Source/cmArgumentParser.h b/Source/cmArgumentParser.h index 7cbef92..2d96f07 100644 --- a/Source/cmArgumentParser.h +++ b/Source/cmArgumentParser.h @@ -71,6 +71,7 @@ public: for (cm::string_view arg : args) { this->Consume(arg); } + this->FinishKeyword(); } private: @@ -80,11 +81,13 @@ private: std::vector* ParsedKeywords = nullptr; void* Result = nullptr; + cm::string_view Keyword; std::string* CurrentString = nullptr; std::vector* CurrentList = nullptr; bool ExpectValue = false; void Consume(cm::string_view arg); + void FinishKeyword(); template friend class ::cmArgumentParser; -- cgit v0.12 From 119e1f7fbc6a8244bd93ce54aa265c303395cfbc Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 20 Jun 2022 14:37:21 -0400 Subject: cmArgumentParser: Factor out common static/dynamic implementation --- Source/cmArgumentParser.h | 61 +++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/Source/cmArgumentParser.h b/Source/cmArgumentParser.h index 2d96f07..75f7a82 100644 --- a/Source/cmArgumentParser.h +++ b/Source/cmArgumentParser.h @@ -32,6 +32,26 @@ public: const_iterator Find(cm::string_view name) const; }; +class Base +{ +public: + using Instance = ArgumentParser::Instance; + + ArgumentParser::ActionMap Bindings; + + bool MaybeBind(cm::string_view name, Action action) + { + return this->Bindings.Emplace(name, std::move(action)).second; + } + + void Bind(cm::string_view name, Action action) + { + bool const inserted = this->MaybeBind(name, std::move(action)); + assert(inserted); + static_cast(inserted); + } +}; + class Instance { public: @@ -96,7 +116,7 @@ private: } // namespace ArgumentParser template -class cmArgumentParser +class cmArgumentParser : private ArgumentParser::Base { public: // I *think* this function could be made `constexpr` when the code is @@ -104,15 +124,9 @@ public: template cmArgumentParser& Bind(cm::static_string_view name, T Result::*member) { - bool const inserted = - this->Bindings - .Emplace(name, - [member](ArgumentParser::Instance& instance) { - instance.Bind( - static_cast(instance.Result)->*member); - }) - .second; - assert(inserted), (void)inserted; + this->Base::Bind(name, [member](Instance& instance) { + instance.Bind(static_cast(instance.Result)->*member); + }); return *this; } @@ -122,9 +136,8 @@ public: std::vector* keywordsMissingValue = nullptr, std::vector* parsedKeywords = nullptr) const { - ArgumentParser::Instance instance(this->Bindings, unparsedArguments, - keywordsMissingValue, parsedKeywords, - &result); + Instance instance(this->Bindings, unparsedArguments, keywordsMissingValue, + parsedKeywords, &result); instance.Parse(args); } @@ -138,20 +151,16 @@ public: parsedKeywords); return result; } - -private: - ArgumentParser::ActionMap Bindings; }; template <> -class cmArgumentParser +class cmArgumentParser : private ArgumentParser::Base { public: template cmArgumentParser& Bind(cm::static_string_view name, T& ref) { - bool const inserted = this->Bind(cm::string_view(name), ref); - assert(inserted), (void)inserted; + this->Base::Bind(name, [&ref](Instance& instance) { instance.Bind(ref); }); return *this; } @@ -160,8 +169,8 @@ public: std::vector* keywordsMissingValue = nullptr, std::vector* parsedKeywords = nullptr) const { - ArgumentParser::Instance instance(this->Bindings, unparsedArguments, - keywordsMissingValue, parsedKeywords); + Instance instance(this->Bindings, unparsedArguments, keywordsMissingValue, + parsedKeywords); instance.Parse(args); } @@ -169,13 +178,7 @@ protected: template bool Bind(cm::string_view name, T& ref) { - return this->Bindings - .Emplace( - name, - [&ref](ArgumentParser::Instance& instance) { instance.Bind(ref); }) - .second; + return this->MaybeBind(name, + [&ref](Instance& instance) { instance.Bind(ref); }); } - -private: - ArgumentParser::ActionMap Bindings; }; -- cgit v0.12 From 5955ec1992fbad26d89b9e3030276350708362c7 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 20 Jun 2022 10:17:22 -0400 Subject: cmArgumentParser: Store keyword action map with explicit name --- Source/cmArgumentParser.cxx | 8 ++++---- Source/cmArgumentParser.h | 22 +++++++++++++++------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/Source/cmArgumentParser.cxx b/Source/cmArgumentParser.cxx index df008a2..c997933 100644 --- a/Source/cmArgumentParser.cxx +++ b/Source/cmArgumentParser.cxx @@ -8,7 +8,7 @@ namespace ArgumentParser { -auto ActionMap::Emplace(cm::string_view name, Action action) +auto KeywordActionMap::Emplace(cm::string_view name, KeywordAction action) -> std::pair { auto const it = @@ -21,7 +21,7 @@ auto ActionMap::Emplace(cm::string_view name, Action action) : std::make_pair(this->emplace(it, name, std::move(action)), true); } -auto ActionMap::Find(cm::string_view name) const -> const_iterator +auto KeywordActionMap::Find(cm::string_view name) const -> const_iterator { auto const it = std::lower_bound(this->begin(), this->end(), name, @@ -76,8 +76,8 @@ void Instance::Bind(std::vector>& val) void Instance::Consume(cm::string_view arg) { - auto const it = this->Bindings.Find(arg); - if (it != this->Bindings.end()) { + auto const it = this->Bindings.Keywords.Find(arg); + if (it != this->Bindings.Keywords.end()) { this->FinishKeyword(); this->Keyword = it->first; if (this->ParsedKeywords != nullptr) { diff --git a/Source/cmArgumentParser.h b/Source/cmArgumentParser.h index 75f7a82..4079946 100644 --- a/Source/cmArgumentParser.h +++ b/Source/cmArgumentParser.h @@ -22,16 +22,24 @@ class cmArgumentParser; // IWYU pragma: keep namespace ArgumentParser { class Instance; -using Action = std::function; +using KeywordAction = std::function; -// using ActionMap = cm::flat_map; -class ActionMap : public std::vector> +// using KeywordActionMap = cm::flat_map; +class KeywordActionMap + : public std::vector> { public: - std::pair Emplace(cm::string_view name, Action action); + std::pair Emplace(cm::string_view name, + KeywordAction action); const_iterator Find(cm::string_view name) const; }; +class ActionMap +{ +public: + KeywordActionMap Keywords; +}; + class Base { public: @@ -39,12 +47,12 @@ public: ArgumentParser::ActionMap Bindings; - bool MaybeBind(cm::string_view name, Action action) + bool MaybeBind(cm::string_view name, KeywordAction action) { - return this->Bindings.Emplace(name, std::move(action)).second; + return this->Bindings.Keywords.Emplace(name, std::move(action)).second; } - void Bind(cm::string_view name, Action action) + void Bind(cm::string_view name, KeywordAction action) { bool const inserted = this->MaybeBind(name, std::move(action)); assert(inserted); -- cgit v0.12 From 50876f6b9afbf638fcc86ebfa83de7cc17a5a7e1 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 6 Jul 2022 17:37:51 -0400 Subject: cmArgumentParser: Add structure to capture operational results Create a way for the parser to record errors or incidental information about the argument parsing operation that clients can inspect afterward. Offer clients a way to hold the structure as part of their arguments structure. --- Source/cmArgumentParser.h | 50 ++++++++++++++---- Tests/CMakeLib/testArgumentParser.cxx | 96 +++++++++++++++++++++-------------- 2 files changed, 98 insertions(+), 48 deletions(-) diff --git a/Source/cmArgumentParser.h b/Source/cmArgumentParser.h index 4079946..0078c04 100644 --- a/Source/cmArgumentParser.h +++ b/Source/cmArgumentParser.h @@ -12,6 +12,7 @@ #include #include +#include #include #include "cmArgumentParserTypes.h" // IWYU pragma: keep @@ -21,6 +22,28 @@ class cmArgumentParser; // IWYU pragma: keep namespace ArgumentParser { +class ParseResult +{ +public: + explicit operator bool() const { return true; } +}; + +template +typename std::enable_if::value, + ParseResult*>::type +AsParseResultPtr(Result& result) +{ + return &result; +} + +template +typename std::enable_if::value, + ParseResult*>::type +AsParseResultPtr(Result&) +{ + return nullptr; +} + class Instance; using KeywordAction = std::function; @@ -44,6 +67,7 @@ class Base { public: using Instance = ArgumentParser::Instance; + using ParseResult = ArgumentParser::ParseResult; ArgumentParser::ActionMap Bindings; @@ -63,12 +87,13 @@ public: class Instance { public: - Instance(ActionMap const& bindings, + Instance(ActionMap const& bindings, ParseResult* parseResult, std::vector* unparsedArguments, std::vector* keywordsMissingValue, std::vector* parsedKeywords, void* result = nullptr) : Bindings(bindings) + , ParseResults(parseResult) , UnparsedArguments(unparsedArguments) , KeywordsMissingValue(keywordsMissingValue) , ParsedKeywords(parsedKeywords) @@ -104,6 +129,7 @@ public: private: ActionMap const& Bindings; + ParseResult* ParseResults = nullptr; std::vector* UnparsedArguments = nullptr; std::vector* KeywordsMissingValue = nullptr; std::vector* ParsedKeywords = nullptr; @@ -139,14 +165,17 @@ public: } template - void Parse(Result& result, Range const& args, + bool Parse(Result& result, Range const& args, std::vector* unparsedArguments, std::vector* keywordsMissingValue = nullptr, std::vector* parsedKeywords = nullptr) const { - Instance instance(this->Bindings, unparsedArguments, keywordsMissingValue, - parsedKeywords, &result); + using ArgumentParser::AsParseResultPtr; + ParseResult* parseResultPtr = AsParseResultPtr(result); + Instance instance(this->Bindings, parseResultPtr, unparsedArguments, + keywordsMissingValue, parsedKeywords, &result); instance.Parse(args); + return parseResultPtr ? static_cast(*parseResultPtr) : true; } template @@ -173,13 +202,16 @@ public: } template - void Parse(Range const& args, std::vector* unparsedArguments, - std::vector* keywordsMissingValue = nullptr, - std::vector* parsedKeywords = nullptr) const + ParseResult Parse( + Range const& args, std::vector* unparsedArguments, + std::vector* keywordsMissingValue = nullptr, + std::vector* parsedKeywords = nullptr) const { - Instance instance(this->Bindings, unparsedArguments, keywordsMissingValue, - parsedKeywords); + ParseResult parseResult; + Instance instance(this->Bindings, &parseResult, unparsedArguments, + keywordsMissingValue, parsedKeywords); instance.Parse(args); + return parseResult; } protected: diff --git a/Tests/CMakeLib/testArgumentParser.cxx b/Tests/CMakeLib/testArgumentParser.cxx index ecfc5fc..054cfd5 100644 --- a/Tests/CMakeLib/testArgumentParser.cxx +++ b/Tests/CMakeLib/testArgumentParser.cxx @@ -15,7 +15,7 @@ namespace { -struct Result +struct Result : public ArgumentParser::ParseResult { bool Option1 = false; bool Option2 = false; @@ -78,6 +78,8 @@ bool verifyResult(Result const& result, } \ } while (false) + ASSERT_TRUE(result); + ASSERT_TRUE(result.Option1); ASSERT_TRUE(!result.Option2); @@ -119,54 +121,65 @@ bool testArgumentParserDynamic() std::vector unparsedArguments; std::vector keywordsMissingValue; - cmArgumentParser{} - .Bind("OPTION_1"_s, result.Option1) - .Bind("OPTION_2"_s, result.Option2) - .Bind("STRING_1"_s, result.String1) - .Bind("STRING_2"_s, result.String2) - .Bind("STRING_3"_s, result.String3) - .Bind("STRING_4"_s, result.String4) - .Bind("LIST_1"_s, result.List1) - .Bind("LIST_2"_s, result.List2) - .Bind("LIST_3"_s, result.List3) - .Bind("LIST_4"_s, result.List4) - .Bind("LIST_5"_s, result.List5) - .Bind("LIST_6"_s, result.List6) - .Bind("MULTI_1"_s, result.Multi1) - .Bind("MULTI_2"_s, result.Multi2) - .Bind("MULTI_3"_s, result.Multi3) - .Bind("MULTI_4"_s, result.Multi4) - .Parse(args, &unparsedArguments, &keywordsMissingValue); + static_cast(result) = + cmArgumentParser{} + .Bind("OPTION_1"_s, result.Option1) + .Bind("OPTION_2"_s, result.Option2) + .Bind("STRING_1"_s, result.String1) + .Bind("STRING_2"_s, result.String2) + .Bind("STRING_3"_s, result.String3) + .Bind("STRING_4"_s, result.String4) + .Bind("LIST_1"_s, result.List1) + .Bind("LIST_2"_s, result.List2) + .Bind("LIST_3"_s, result.List3) + .Bind("LIST_4"_s, result.List4) + .Bind("LIST_5"_s, result.List5) + .Bind("LIST_6"_s, result.List6) + .Bind("MULTI_1"_s, result.Multi1) + .Bind("MULTI_2"_s, result.Multi2) + .Bind("MULTI_3"_s, result.Multi3) + .Bind("MULTI_4"_s, result.Multi4) + .Parse(args, &unparsedArguments, &keywordsMissingValue); return verifyResult(result, unparsedArguments, keywordsMissingValue); } +static auto const parserStatic = // + cmArgumentParser{} + .Bind("OPTION_1"_s, &Result::Option1) + .Bind("OPTION_2"_s, &Result::Option2) + .Bind("STRING_1"_s, &Result::String1) + .Bind("STRING_2"_s, &Result::String2) + .Bind("STRING_3"_s, &Result::String3) + .Bind("STRING_4"_s, &Result::String4) + .Bind("LIST_1"_s, &Result::List1) + .Bind("LIST_2"_s, &Result::List2) + .Bind("LIST_3"_s, &Result::List3) + .Bind("LIST_4"_s, &Result::List4) + .Bind("LIST_5"_s, &Result::List5) + .Bind("LIST_6"_s, &Result::List6) + .Bind("MULTI_1"_s, &Result::Multi1) + .Bind("MULTI_2"_s, &Result::Multi2) + .Bind("MULTI_3"_s, &Result::Multi3) + .Bind("MULTI_4"_s, &Result::Multi4) + /* keep semicolon on own line */; + bool testArgumentParserStatic() { - static auto const parser = // - cmArgumentParser{} - .Bind("OPTION_1"_s, &Result::Option1) - .Bind("OPTION_2"_s, &Result::Option2) - .Bind("STRING_1"_s, &Result::String1) - .Bind("STRING_2"_s, &Result::String2) - .Bind("STRING_3"_s, &Result::String3) - .Bind("STRING_4"_s, &Result::String4) - .Bind("LIST_1"_s, &Result::List1) - .Bind("LIST_2"_s, &Result::List2) - .Bind("LIST_3"_s, &Result::List3) - .Bind("LIST_4"_s, &Result::List4) - .Bind("LIST_5"_s, &Result::List5) - .Bind("LIST_6"_s, &Result::List6) - .Bind("MULTI_1"_s, &Result::Multi1) - .Bind("MULTI_2"_s, &Result::Multi2) - .Bind("MULTI_3"_s, &Result::Multi3) - .Bind("MULTI_4"_s, &Result::Multi4); - std::vector unparsedArguments; std::vector keywordsMissingValue; Result const result = - parser.Parse(args, &unparsedArguments, &keywordsMissingValue); + parserStatic.Parse(args, &unparsedArguments, &keywordsMissingValue); + return verifyResult(result, unparsedArguments, keywordsMissingValue); +} +bool testArgumentParserStaticBool() +{ + std::vector unparsedArguments; + std::vector keywordsMissingValue; + Result result; + ASSERT_TRUE(parserStatic.Parse(result, args, &unparsedArguments, + &keywordsMissingValue) == true); return verifyResult(result, unparsedArguments, keywordsMissingValue); } @@ -184,5 +197,10 @@ int testArgumentParser(int /*unused*/, char* /*unused*/ []) return -1; } + if (!testArgumentParserStaticBool()) { + std::cout << "While executing testArgumentParserStaticBool().\n"; + return -1; + } + return 0; } -- cgit v0.12 From b7c82b26b03349d1201a24acbe198ee1bd00ee3e Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 18 Jul 2022 16:54:13 -0400 Subject: cmArgumentParser: Capture keyword errors in parse results Since commit f46b2e9142 (cmArgumentParser: Model maybe-missing string with wrapper type, 2022-07-06) we know during parsing whether or not it is an error for a keyword to be missing a value. Record such errors in the parse results structure. Offer clients a helper method to report them. This provides clients with an alternative to manually checking `keywordsMissingValue` and generating their own error message. --- Source/cmArgumentParser.cxx | 20 ++++++++++++++++++++ Source/cmArgumentParser.h | 20 +++++++++++++++++++- Tests/CMakeLib/testArgumentParser.cxx | 18 ++++++++++++++++-- 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/Source/cmArgumentParser.cxx b/Source/cmArgumentParser.cxx index c997933..25d5c68 100644 --- a/Source/cmArgumentParser.cxx +++ b/Source/cmArgumentParser.cxx @@ -5,6 +5,9 @@ #include #include "cmArgumentParserTypes.h" +#include "cmMakefile.h" +#include "cmMessageType.h" +#include "cmStringAlgorithms.h" namespace ArgumentParser { @@ -106,10 +109,27 @@ void Instance::FinishKeyword() return; } if (this->ExpectValue) { + if (this->ParseResults != nullptr) { + this->ParseResults->AddKeywordError(this->Keyword, + " missing required value\n"); + } if (this->KeywordsMissingValue != nullptr) { this->KeywordsMissingValue->emplace_back(this->Keyword); } } } +bool ParseResult::MaybeReportError(cmMakefile& mf) const +{ + if (*this) { + return false; + } + std::string e; + for (auto const& ke : this->KeywordErrors) { + e = cmStrCat(e, "Error after keyword \"", ke.first, "\":\n", ke.second); + } + mf.IssueMessage(MessageType::FATAL_ERROR, e); + return true; +} + } // namespace ArgumentParser diff --git a/Source/cmArgumentParser.h b/Source/cmArgumentParser.h index 0078c04..8fda8b7 100644 --- a/Source/cmArgumentParser.h +++ b/Source/cmArgumentParser.h @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -20,12 +21,29 @@ template class cmArgumentParser; // IWYU pragma: keep +class cmMakefile; + namespace ArgumentParser { class ParseResult { + std::map KeywordErrors; + public: - explicit operator bool() const { return true; } + explicit operator bool() const { return this->KeywordErrors.empty(); } + + void AddKeywordError(cm::string_view key, cm::string_view text) + + { + this->KeywordErrors[key] += text; + } + + std::map const& GetKeywordErrors() const + { + return this->KeywordErrors; + } + + bool MaybeReportError(cmMakefile& mf) const; }; template diff --git a/Tests/CMakeLib/testArgumentParser.cxx b/Tests/CMakeLib/testArgumentParser.cxx index 054cfd5..f0ace50 100644 --- a/Tests/CMakeLib/testArgumentParser.cxx +++ b/Tests/CMakeLib/testArgumentParser.cxx @@ -3,7 +3,9 @@ #include #include +#include #include +#include #include #include @@ -69,6 +71,11 @@ bool verifyResult(Result const& result, static std::vector const missing = { "STRING_1"_s, "LIST_1"_s, "LIST_4"_s }; + static std::map const keywordErrors = { + { "STRING_1"_s, " missing required value\n" }, + { "LIST_1"_s, " missing required value\n" }, + { "LIST_4"_s, " missing required value\n" } + }; #define ASSERT_TRUE(x) \ do { \ @@ -78,7 +85,7 @@ bool verifyResult(Result const& result, } \ } while (false) - ASSERT_TRUE(result); + ASSERT_TRUE(!result); ASSERT_TRUE(result.Option1); ASSERT_TRUE(!result.Option2); @@ -112,6 +119,13 @@ bool verifyResult(Result const& result, ASSERT_TRUE(unparsedArguments[0] == "bar"); ASSERT_TRUE(keywordsMissingValue == missing); + ASSERT_TRUE(result.GetKeywordErrors().size() == keywordErrors.size()); + for (auto const& ke : result.GetKeywordErrors()) { + auto const ki = keywordErrors.find(ke.first); + ASSERT_TRUE(ki != keywordErrors.end()); + ASSERT_TRUE(ke.second == ki->second); + } + return true; } @@ -179,7 +193,7 @@ bool testArgumentParserStaticBool() std::vector keywordsMissingValue; Result result; ASSERT_TRUE(parserStatic.Parse(result, args, &unparsedArguments, - &keywordsMissingValue) == true); + &keywordsMissingValue) == false); return verifyResult(result, unparsedArguments, keywordsMissingValue); } -- cgit v0.12 From e56108f629f0719429487b51ff952e80138949fa Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 18 Jul 2022 17:12:54 -0400 Subject: cmExecuteProcessCommand: Report keyword errors via argument parser results --- Source/cmExecuteProcessCommand.cxx | 12 ++++-------- Tests/RunCMake/execute_process/EchoCommand3-stderr.txt | 4 +++- Tests/RunCMake/execute_process/EncodingMissing-stderr.txt | 5 ++++- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Source/cmExecuteProcessCommand.cxx b/Source/cmExecuteProcessCommand.cxx index af56e2d..7fbd826 100644 --- a/Source/cmExecuteProcessCommand.cxx +++ b/Source/cmExecuteProcessCommand.cxx @@ -47,7 +47,7 @@ bool cmExecuteProcessCommand(std::vector const& args, return false; } - struct Arguments + struct Arguments : public ArgumentParser::ParseResult { std::vector> Commands; std::string OutputVariable; @@ -95,14 +95,10 @@ bool cmExecuteProcessCommand(std::vector const& args, .Bind("COMMAND_ERROR_IS_FATAL"_s, &Arguments::CommandErrorIsFatal); std::vector unparsedArguments; - std::vector keywordsMissingValue; - Arguments const arguments = - parser.Parse(args, &unparsedArguments, &keywordsMissingValue); + Arguments const arguments = parser.Parse(args, &unparsedArguments); - if (!keywordsMissingValue.empty()) { - status.SetError(cmStrCat(" called with no value for ", - keywordsMissingValue.front(), ".")); - return false; + if (arguments.MaybeReportError(status.GetMakefile())) { + return true; } if (!unparsedArguments.empty()) { status.SetError(" given unknown argument \"" + unparsedArguments.front() + diff --git a/Tests/RunCMake/execute_process/EchoCommand3-stderr.txt b/Tests/RunCMake/execute_process/EchoCommand3-stderr.txt index e27f1e6..62cad52 100644 --- a/Tests/RunCMake/execute_process/EchoCommand3-stderr.txt +++ b/Tests/RunCMake/execute_process/EchoCommand3-stderr.txt @@ -1,2 +1,4 @@ CMake Error at .*EchoCommand.cmake:.*\(execute_process\): - execute_process called with no value for COMMAND_ECHO. + Error after keyword "COMMAND_ECHO": + + missing required value diff --git a/Tests/RunCMake/execute_process/EncodingMissing-stderr.txt b/Tests/RunCMake/execute_process/EncodingMissing-stderr.txt index 1a69579..7f85654 100644 --- a/Tests/RunCMake/execute_process/EncodingMissing-stderr.txt +++ b/Tests/RunCMake/execute_process/EncodingMissing-stderr.txt @@ -1,4 +1,7 @@ ^CMake Error at EncodingMissing.cmake:[0-9]+ \(execute_process\): - execute_process called with no value for ENCODING. + Error after keyword "ENCODING": + + missing required value + Call Stack \(most recent call first\): CMakeLists.txt:[0-9]+ \(include\)$ -- cgit v0.12 From 74ec6b63c255fc18aa58b6f9d1013510c1efe2db Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 18 Jul 2022 16:55:43 -0400 Subject: cmFileCommand: Report keyword errors via argument parser results --- Source/cmFileCommand.cxx | 164 +++++++++------------ .../File_Archive/create-missing-args-stderr.txt | 20 ++- .../File_Archive/extract-missing-args-stderr.txt | 10 +- .../File_Configure/BadArgContent-stderr.txt | 5 +- .../File_Configure/BadArgOutput-stderr.txt | 5 +- .../File_Generate/EmptyCondition1-stderr.txt | 5 +- .../File_Generate/NewLineStyle-NoArg-stderr.txt | 5 +- .../file-CHMOD/missing-dir-perms-stderr.txt | 4 +- .../file-CHMOD/missing-file-perms-stderr.txt | 4 +- Tests/RunCMake/file-CHMOD/missing-perms-stderr.txt | 4 +- .../badargs2-stderr.txt | 20 ++- .../RunCMake/file/REAL_PATH-no-base-dir-stderr.txt | 9 +- 12 files changed, 132 insertions(+), 123 deletions(-) diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index 7530486..c7ba424 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -959,21 +959,19 @@ bool HandleRPathChangeCommand(std::vector const& args, bool removeEnvironmentRPath = false; cmArgumentParser parser; std::vector unknownArgs; - std::vector missingArgs; parser.Bind("FILE"_s, file) .Bind("OLD_RPATH"_s, oldRPath) .Bind("NEW_RPATH"_s, newRPath) .Bind("INSTALL_REMOVE_ENVIRONMENT_RPATH"_s, removeEnvironmentRPath); - parser.Parse(cmMakeRange(args).advance(1), &unknownArgs, &missingArgs); + ArgumentParser::ParseResult parseResult = + parser.Parse(cmMakeRange(args).advance(1), &unknownArgs); if (!unknownArgs.empty()) { status.SetError( cmStrCat("RPATH_CHANGE given unknown argument ", unknownArgs.front())); return false; } - if (!missingArgs.empty()) { - status.SetError(cmStrCat("RPATH_CHANGE \"", missingArgs.front(), - "\" argument not given value.")); - return false; + if (parseResult.MaybeReportError(status.GetMakefile())) { + return true; } if (file.empty()) { status.SetError("RPATH_CHANGE not given FILE option."); @@ -1023,18 +1021,16 @@ bool HandleRPathSetCommand(std::vector const& args, cm::optional newRPath; cmArgumentParser parser; std::vector unknownArgs; - std::vector missingArgs; parser.Bind("FILE"_s, file).Bind("NEW_RPATH"_s, newRPath); - parser.Parse(cmMakeRange(args).advance(1), &unknownArgs, &missingArgs); + ArgumentParser::ParseResult parseResult = + parser.Parse(cmMakeRange(args).advance(1), &unknownArgs); if (!unknownArgs.empty()) { status.SetError(cmStrCat("RPATH_SET given unrecognized argument \"", unknownArgs.front(), "\".")); return false; } - if (!missingArgs.empty()) { - status.SetError(cmStrCat("RPATH_SET \"", missingArgs.front(), - "\" argument not given value.")); - return false; + if (parseResult.MaybeReportError(status.GetMakefile())) { + return true; } if (file.empty()) { status.SetError("RPATH_SET not given FILE option."); @@ -1078,18 +1074,16 @@ bool HandleRPathRemoveCommand(std::vector const& args, std::string file; cmArgumentParser parser; std::vector unknownArgs; - std::vector missingArgs; parser.Bind("FILE"_s, file); - parser.Parse(cmMakeRange(args).advance(1), &unknownArgs, &missingArgs); + ArgumentParser::ParseResult parseResult = + parser.Parse(cmMakeRange(args).advance(1), &unknownArgs); if (!unknownArgs.empty()) { status.SetError( cmStrCat("RPATH_REMOVE given unknown argument ", unknownArgs.front())); return false; } - if (!missingArgs.empty()) { - status.SetError(cmStrCat("RPATH_REMOVE \"", missingArgs.front(), - "\" argument not given value.")); - return false; + if (parseResult.MaybeReportError(status.GetMakefile())) { + return true; } if (file.empty()) { status.SetError("RPATH_REMOVE not given FILE option."); @@ -1129,18 +1123,16 @@ bool HandleRPathCheckCommand(std::vector const& args, cm::optional rpath; cmArgumentParser parser; std::vector unknownArgs; - std::vector missingArgs; parser.Bind("FILE"_s, file).Bind("RPATH"_s, rpath); - parser.Parse(cmMakeRange(args).advance(1), &unknownArgs, &missingArgs); + ArgumentParser::ParseResult parseResult = + parser.Parse(cmMakeRange(args).advance(1), &unknownArgs); if (!unknownArgs.empty()) { status.SetError( cmStrCat("RPATH_CHECK given unknown argument ", unknownArgs.front())); return false; } - if (!missingArgs.empty()) { - status.SetError(cmStrCat("RPATH_CHECK \"", missingArgs.front(), - "\" argument not given value.")); - return false; + if (parseResult.MaybeReportError(status.GetMakefile())) { + return true; } if (file.empty()) { status.SetError("RPATH_CHECK not given FILE option."); @@ -1238,7 +1230,7 @@ bool HandleRealPathCommand(std::vector const& args, return false; } - struct Arguments + struct Arguments : public ArgumentParser::ParseResult { cm::optional BaseDirectory; bool ExpandTilde = false; @@ -1249,17 +1241,15 @@ bool HandleRealPathCommand(std::vector const& args, .Bind("EXPAND_TILDE"_s, &Arguments::ExpandTilde); std::vector unparsedArguments; - std::vector keywordsMissingValue; - auto arguments = parser.Parse(cmMakeRange(args).advance(3), - &unparsedArguments, &keywordsMissingValue); + auto arguments = + parser.Parse(cmMakeRange(args).advance(3), &unparsedArguments); if (!unparsedArguments.empty()) { status.SetError("REAL_PATH called with unexpected arguments"); return false; } - if (!keywordsMissingValue.empty()) { - status.SetError("BASE_DIRECTORY requires a value"); - return false; + if (arguments.MaybeReportError(status.GetMakefile())) { + return true; } if (!arguments.BaseDirectory) { @@ -2481,7 +2471,7 @@ bool HandleGenerateCommand(std::vector const& args, return false; } - struct Arguments + struct Arguments : public ArgumentParser::ParseResult { cm::optional Output; cm::optional Input; @@ -2507,17 +2497,13 @@ bool HandleGenerateCommand(std::vector const& args, .Bind("NEWLINE_STYLE"_s, &Arguments::NewLineStyle); std::vector unparsedArguments; - std::vector keywordsMissingValues; std::vector parsedKeywords; Arguments const arguments = parser.Parse(cmMakeRange(args).advance(1), &unparsedArguments, - &keywordsMissingValues, &parsedKeywords); + /*keywordsMissingValue=*/nullptr, &parsedKeywords); - if (!keywordsMissingValues.empty()) { - status.SetError( - cmStrCat("GENERATE keywords missing values:\n ", - cmJoin(cmMakeRange(keywordsMissingValues), "\n "))); - return false; + if (arguments.MaybeReportError(status.GetMakefile())) { + return true; } if (!unparsedArguments.empty()) { @@ -3031,7 +3017,7 @@ bool HandleGetRuntimeDependenciesCommand(std::vector const& args, "\n ]])"); } - struct Arguments + struct Arguments : public ArgumentParser::ParseResult { std::string ResolvedDependenciesVar; std::string UnresolvedDependenciesVar; @@ -3074,10 +3060,8 @@ bool HandleGetRuntimeDependenciesCommand(std::vector const& args, .Bind("POST_EXCLUDE_FILES_STRICT"_s, &Arguments::PostExcludeFilesStrict); std::vector unrecognizedArguments; - std::vector keywordsMissingValues; auto parsedArgs = - parser.Parse(cmMakeRange(args).advance(1), &unrecognizedArguments, - &keywordsMissingValues); + parser.Parse(cmMakeRange(args).advance(1), &unrecognizedArguments); auto argIt = unrecognizedArguments.begin(); if (argIt != unrecognizedArguments.end()) { status.SetError(cmStrCat("Unrecognized argument: \"", *argIt, "\"")); @@ -3085,12 +3069,9 @@ bool HandleGetRuntimeDependenciesCommand(std::vector const& args, return false; } - if (!keywordsMissingValues.empty()) { - status.SetError( - cmStrCat("Keywords missing values:\n ", - cmJoin(cmMakeRange(keywordsMissingValues), "\n "))); + if (parsedArgs.MaybeReportError(status.GetMakefile())) { cmSystemTools::SetFatalErrorOccurred(); - return false; + return true; } cmRuntimeDependencyArchive archive( @@ -3190,7 +3171,7 @@ bool HandleGetRuntimeDependenciesCommand(std::vector const& args, bool HandleConfigureCommand(std::vector const& args, cmExecutionStatus& status) { - struct Arguments + struct Arguments : public ArgumentParser::ParseResult { cm::optional Output; cm::optional Content; @@ -3209,10 +3190,8 @@ bool HandleConfigureCommand(std::vector const& args, .Bind("NEWLINE_STYLE"_s, &Arguments::NewlineStyle); std::vector unrecognizedArguments; - std::vector keywordsMissingValues; auto parsedArgs = - parser.Parse(cmMakeRange(args).advance(1), &unrecognizedArguments, - &keywordsMissingValues); + parser.Parse(cmMakeRange(args).advance(1), &unrecognizedArguments); auto argIt = unrecognizedArguments.begin(); if (argIt != unrecognizedArguments.end()) { @@ -3222,12 +3201,9 @@ bool HandleConfigureCommand(std::vector const& args, return false; } - if (!keywordsMissingValues.empty()) { - status.SetError( - cmStrCat("CONFIGURE keywords missing values:\n ", - cmJoin(cmMakeRange(keywordsMissingValues), "\n "))); + if (parsedArgs.MaybeReportError(status.GetMakefile())) { cmSystemTools::SetFatalErrorOccurred(); - return false; + return true; } if (!parsedArgs.Output) { @@ -3322,7 +3298,7 @@ bool HandleConfigureCommand(std::vector const& args, bool HandleArchiveCreateCommand(std::vector const& args, cmExecutionStatus& status) { - struct Arguments + struct Arguments : public ArgumentParser::ParseResult { std::string Output; std::string Format; @@ -3348,10 +3324,8 @@ bool HandleArchiveCreateCommand(std::vector const& args, .Bind("PATHS"_s, &Arguments::Paths); std::vector unrecognizedArguments; - std::vector keywordsMissingValues; auto parsedArgs = - parser.Parse(cmMakeRange(args).advance(1), &unrecognizedArguments, - &keywordsMissingValues); + parser.Parse(cmMakeRange(args).advance(1), &unrecognizedArguments); auto argIt = unrecognizedArguments.begin(); if (argIt != unrecognizedArguments.end()) { status.SetError(cmStrCat("Unrecognized argument: \"", *argIt, "\"")); @@ -3359,12 +3333,9 @@ bool HandleArchiveCreateCommand(std::vector const& args, return false; } - if (!keywordsMissingValues.empty()) { - status.SetError( - cmStrCat("Keywords missing values:\n ", - cmJoin(cmMakeRange(keywordsMissingValues), "\n "))); + if (parsedArgs.MaybeReportError(status.GetMakefile())) { cmSystemTools::SetFatalErrorOccurred(); - return false; + return true; } const char* knownFormats[] = { @@ -3453,7 +3424,7 @@ bool HandleArchiveCreateCommand(std::vector const& args, bool HandleArchiveExtractCommand(std::vector const& args, cmExecutionStatus& status) { - struct Arguments + struct Arguments : public ArgumentParser::ParseResult { std::string Input; bool Verbose = false; @@ -3472,10 +3443,8 @@ bool HandleArchiveExtractCommand(std::vector const& args, .Bind("TOUCH"_s, &Arguments::Touch); std::vector unrecognizedArguments; - std::vector keywordsMissingValues; auto parsedArgs = - parser.Parse(cmMakeRange(args).advance(1), &unrecognizedArguments, - &keywordsMissingValues); + parser.Parse(cmMakeRange(args).advance(1), &unrecognizedArguments); auto argIt = unrecognizedArguments.begin(); if (argIt != unrecognizedArguments.end()) { status.SetError(cmStrCat("Unrecognized argument: \"", *argIt, "\"")); @@ -3483,12 +3452,9 @@ bool HandleArchiveExtractCommand(std::vector const& args, return false; } - if (!keywordsMissingValues.empty()) { - status.SetError( - cmStrCat("Keywords missing values:\n ", - cmJoin(cmMakeRange(keywordsMissingValues), "\n "))); + if (parsedArgs.MaybeReportError(status.GetMakefile())) { cmSystemTools::SetFatalErrorOccurred(); - return false; + return true; } std::string inFile = parsedArgs.Input; @@ -3543,10 +3509,15 @@ bool HandleArchiveExtractCommand(std::vector const& args, return true; } -bool ValidateAndConvertPermissions(const std::vector& permissions, - mode_t& perms, cmExecutionStatus& status) +bool ValidateAndConvertPermissions( + cm::optional>> const& + permissions, + mode_t& perms, cmExecutionStatus& status) { - for (const auto& i : permissions) { + if (!permissions) { + return true; + } + for (const auto& i : *permissions) { if (!cmFSPermissions::stringToModeT(i, perms)) { status.SetError(i + " is an invalid permission specifier"); cmSystemTools::SetFatalErrorOccurred(); @@ -3578,11 +3549,14 @@ bool HandleChmodCommandImpl(std::vector const& args, bool recurse, globber.SetRecurse(recurse); globber.SetRecurseListDirs(recurse); - struct Arguments + struct Arguments : public ArgumentParser::ParseResult { - ArgumentParser::NonEmpty> Permissions; - ArgumentParser::NonEmpty> FilePermissions; - ArgumentParser::NonEmpty> DirectoryPermissions; + cm::optional>> + Permissions; + cm::optional>> + FilePermissions; + cm::optional>> + DirectoryPermissions; }; static auto const parser = @@ -3592,21 +3566,20 @@ bool HandleChmodCommandImpl(std::vector const& args, bool recurse, .Bind("DIRECTORY_PERMISSIONS"_s, &Arguments::DirectoryPermissions); std::vector pathEntries; - std::vector keywordsMissingValues; - Arguments parsedArgs = parser.Parse(cmMakeRange(args).advance(1), - &pathEntries, &keywordsMissingValues); + Arguments parsedArgs = + parser.Parse(cmMakeRange(args).advance(1), &pathEntries); // check validity of arguments - if (parsedArgs.Permissions.empty() && parsedArgs.FilePermissions.empty() && - parsedArgs.DirectoryPermissions.empty()) // no permissions given + if (!parsedArgs.Permissions && !parsedArgs.FilePermissions && + !parsedArgs.DirectoryPermissions) // no permissions given { status.SetError("No permissions given"); cmSystemTools::SetFatalErrorOccurred(); return false; } - if (!parsedArgs.Permissions.empty() && !parsedArgs.FilePermissions.empty() && - !parsedArgs.DirectoryPermissions.empty()) // all keywords are used + if (parsedArgs.Permissions && parsedArgs.FilePermissions && + parsedArgs.DirectoryPermissions) // all keywords are used { status.SetError("Remove either PERMISSIONS or FILE_PERMISSIONS or " "DIRECTORY_PERMISSIONS from the invocation"); @@ -3614,12 +3587,9 @@ bool HandleChmodCommandImpl(std::vector const& args, bool recurse, return false; } - if (!keywordsMissingValues.empty()) { - for (const auto& i : keywordsMissingValues) { - status.SetError(cmStrCat(i, " is not given any arguments")); - cmSystemTools::SetFatalErrorOccurred(); - } - return false; + if (parsedArgs.MaybeReportError(status.GetMakefile())) { + cmSystemTools::SetFatalErrorOccurred(); + return true; } // validate permissions @@ -3663,7 +3633,7 @@ bool HandleChmodCommandImpl(std::vector const& args, bool recurse, if (cmSystemTools::FileExists(i, true)) { bool success = true; const mode_t& filePermissions = - parsedArgs.FilePermissions.empty() ? perms : fperms; + parsedArgs.FilePermissions ? fperms : perms; if (filePermissions) { success = SetPermissions(i, filePermissions, status); } @@ -3675,7 +3645,7 @@ bool HandleChmodCommandImpl(std::vector const& args, bool recurse, else if (cmSystemTools::FileIsDirectory(i)) { bool success = true; const mode_t& directoryPermissions = - parsedArgs.DirectoryPermissions.empty() ? perms : dperms; + parsedArgs.DirectoryPermissions ? dperms : perms; if (directoryPermissions) { success = SetPermissions(i, directoryPermissions, status); } diff --git a/Tests/RunCMake/File_Archive/create-missing-args-stderr.txt b/Tests/RunCMake/File_Archive/create-missing-args-stderr.txt index ecfe401..fd026f9 100644 --- a/Tests/RunCMake/File_Archive/create-missing-args-stderr.txt +++ b/Tests/RunCMake/File_Archive/create-missing-args-stderr.txt @@ -1,9 +1,19 @@ ^CMake Error at create-missing-args.cmake:[0-9]+ \(file\): - file Keywords missing values: + Error after keyword "COMPRESSION": + + missing required value + + Error after keyword "COMPRESSION_LEVEL": + + missing required value + + Error after keyword "FORMAT": + + missing required value + + Error after keyword "OUTPUT": + + missing required value - OUTPUT - FORMAT - COMPRESSION - COMPRESSION_LEVEL Call Stack \(most recent call first\): CMakeLists.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/File_Archive/extract-missing-args-stderr.txt b/Tests/RunCMake/File_Archive/extract-missing-args-stderr.txt index 96c779f..0c93ece 100644 --- a/Tests/RunCMake/File_Archive/extract-missing-args-stderr.txt +++ b/Tests/RunCMake/File_Archive/extract-missing-args-stderr.txt @@ -1,7 +1,11 @@ ^CMake Error at extract-missing-args.cmake:[0-9]+ \(file\): - file Keywords missing values: + Error after keyword "DESTINATION": + + missing required value + + Error after keyword "INPUT": + + missing required value - INPUT - DESTINATION Call Stack \(most recent call first\): CMakeLists.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/File_Configure/BadArgContent-stderr.txt b/Tests/RunCMake/File_Configure/BadArgContent-stderr.txt index dd6a2e7..72292f9 100644 --- a/Tests/RunCMake/File_Configure/BadArgContent-stderr.txt +++ b/Tests/RunCMake/File_Configure/BadArgContent-stderr.txt @@ -1,6 +1,7 @@ CMake Error at BadArgContent.cmake:[0-9]+ \(file\): - file CONFIGURE keywords missing values: + Error after keyword "CONTENT": + + missing required value - CONTENT Call Stack \(most recent call first\): CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/File_Configure/BadArgOutput-stderr.txt b/Tests/RunCMake/File_Configure/BadArgOutput-stderr.txt index e1bf7b4..d793f48 100644 --- a/Tests/RunCMake/File_Configure/BadArgOutput-stderr.txt +++ b/Tests/RunCMake/File_Configure/BadArgOutput-stderr.txt @@ -1,6 +1,7 @@ CMake Error at BadArgOutput.cmake:[0-9]+ \(file\): - file CONFIGURE keywords missing values: + Error after keyword "OUTPUT": + + missing required value - OUTPUT Call Stack \(most recent call first\): CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/File_Generate/EmptyCondition1-stderr.txt b/Tests/RunCMake/File_Generate/EmptyCondition1-stderr.txt index 4278bce..708e6be 100644 --- a/Tests/RunCMake/File_Generate/EmptyCondition1-stderr.txt +++ b/Tests/RunCMake/File_Generate/EmptyCondition1-stderr.txt @@ -1,6 +1,7 @@ CMake Error at EmptyCondition1.cmake:2 \(file\): - file GENERATE keywords missing values: + Error after keyword "CONDITION": + + missing required value - CONDITION Call Stack \(most recent call first\): CMakeLists.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/File_Generate/NewLineStyle-NoArg-stderr.txt b/Tests/RunCMake/File_Generate/NewLineStyle-NoArg-stderr.txt index 4059bf8..b1b7f80 100644 --- a/Tests/RunCMake/File_Generate/NewLineStyle-NoArg-stderr.txt +++ b/Tests/RunCMake/File_Generate/NewLineStyle-NoArg-stderr.txt @@ -1,6 +1,7 @@ CMake Error at NewLineStyle-NoArg.cmake:[0-9]+ \(file\): - file GENERATE keywords missing values: + Error after keyword "NEWLINE_STYLE": + + missing required value - NEWLINE_STYLE Call Stack \(most recent call first\): CMakeLists.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/file-CHMOD/missing-dir-perms-stderr.txt b/Tests/RunCMake/file-CHMOD/missing-dir-perms-stderr.txt index 2672462..c05bb2d 100644 --- a/Tests/RunCMake/file-CHMOD/missing-dir-perms-stderr.txt +++ b/Tests/RunCMake/file-CHMOD/missing-dir-perms-stderr.txt @@ -1,3 +1,5 @@ ^CMake Error at [^ ]*/missing-dir-perms.cmake:[0-9]+ \(file\): - file DIRECTORY_PERMISSIONS is not given any arguments$ + Error after keyword "DIRECTORY_PERMISSIONS": + + missing required value$ diff --git a/Tests/RunCMake/file-CHMOD/missing-file-perms-stderr.txt b/Tests/RunCMake/file-CHMOD/missing-file-perms-stderr.txt index ae4132f..c3f4f0f 100644 --- a/Tests/RunCMake/file-CHMOD/missing-file-perms-stderr.txt +++ b/Tests/RunCMake/file-CHMOD/missing-file-perms-stderr.txt @@ -1,3 +1,5 @@ ^CMake Error at [^ ]*/missing-file-perms.cmake:[0-9]+ \(file\): - file FILE_PERMISSIONS is not given any arguments$ + Error after keyword "FILE_PERMISSIONS": + + missing required value$ diff --git a/Tests/RunCMake/file-CHMOD/missing-perms-stderr.txt b/Tests/RunCMake/file-CHMOD/missing-perms-stderr.txt index fd88e7f..1508b13 100644 --- a/Tests/RunCMake/file-CHMOD/missing-perms-stderr.txt +++ b/Tests/RunCMake/file-CHMOD/missing-perms-stderr.txt @@ -1,3 +1,5 @@ ^CMake Error at [^ ]*/missing-perms.cmake:[0-9]+ \(file\): - file PERMISSIONS is not given any arguments$ + Error after keyword "PERMISSIONS": + + missing required value$ diff --git a/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/badargs2-stderr.txt b/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/badargs2-stderr.txt index c6ad3d0..39f307d 100644 --- a/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/badargs2-stderr.txt +++ b/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/badargs2-stderr.txt @@ -13,11 +13,21 @@ Call Stack \(most recent call first\): This warning is for project developers\. Use -Wno-dev to suppress it\. CMake Error at badargs2\.cmake:[0-9]+ \(file\): - file Keywords missing values: + Error after keyword "BUNDLE_EXECUTABLE": + + missing required value + + Error after keyword "CONFLICTING_DEPENDENCIES_PREFIX": + + missing required value + + Error after keyword "RESOLVED_DEPENDENCIES_VAR": + + missing required value + + Error after keyword "UNRESOLVED_DEPENDENCIES_VAR": + + missing required value - RESOLVED_DEPENDENCIES_VAR - UNRESOLVED_DEPENDENCIES_VAR - CONFLICTING_DEPENDENCIES_PREFIX - BUNDLE_EXECUTABLE Call Stack \(most recent call first\): CMakeLists\.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/file/REAL_PATH-no-base-dir-stderr.txt b/Tests/RunCMake/file/REAL_PATH-no-base-dir-stderr.txt index 7c58aeb..54a3e5a 100644 --- a/Tests/RunCMake/file/REAL_PATH-no-base-dir-stderr.txt +++ b/Tests/RunCMake/file/REAL_PATH-no-base-dir-stderr.txt @@ -1,2 +1,7 @@ -CMake Error at REAL_PATH-no-base-dir.cmake:[0-9]+ \(file\): - file BASE_DIRECTORY requires a value +^CMake Error at REAL_PATH-no-base-dir.cmake:[0-9]+ \(file\): + Error after keyword "BASE_DIRECTORY": + + missing required value + +Call Stack \(most recent call first\): + CMakeLists.txt:[0-9]+ \(include\)$ -- cgit v0.12 From 7e4a9afa1a0eaf059e5704920ef82647dad79377 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 19 Jul 2022 14:12:51 -0400 Subject: cmCMakeHost*Command: Report keyword errors via argument parser results --- Source/cmCMakeHostSystemInformationCommand.cxx | 12 ++++-------- .../Registry_BadQuery2-stderr.txt | 6 ++++-- .../Registry_BadView1-stderr.txt | 6 ++++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Source/cmCMakeHostSystemInformationCommand.cxx b/Source/cmCMakeHostSystemInformationCommand.cxx index 033dd6d..58129a0 100644 --- a/Source/cmCMakeHostSystemInformationCommand.cxx +++ b/Source/cmCMakeHostSystemInformationCommand.cxx @@ -474,7 +474,7 @@ bool QueryWindowsRegistry(Range args, cmExecutionStatus& status, } std::string const& key = *args.begin(); - struct Arguments + struct Arguments : public ArgumentParser::ParseResult { std::string ValueName; bool ValueNames = false; @@ -491,19 +491,15 @@ bool QueryWindowsRegistry(Range args, cmExecutionStatus& status, .Bind("SEPARATOR"_s, &Arguments::Separator) .Bind("ERROR_VARIABLE"_s, &Arguments::ErrorVariable); std::vector invalidArgs; - std::vector keywordsMissingValue; - Arguments const arguments = - parser.Parse(args.advance(1), &invalidArgs, &keywordsMissingValue); + Arguments const arguments = parser.Parse(args.advance(1), &invalidArgs); if (!invalidArgs.empty()) { status.SetError(cmStrCat("given invalid argument(s) \"", cmJoin(invalidArgs, ", "_s), "\".")); return false; } - if (!keywordsMissingValue.empty()) { - status.SetError(cmStrCat("missing expected value for argument(s) \"", - cmJoin(keywordsMissingValue, ", "_s), "\".")); - return false; + if (arguments.MaybeReportError(status.GetMakefile())) { + return true; } if ((!arguments.ValueName.empty() && (arguments.ValueNames || arguments.SubKeys)) || diff --git a/Tests/RunCMake/cmake_host_system_information/Registry_BadQuery2-stderr.txt b/Tests/RunCMake/cmake_host_system_information/Registry_BadQuery2-stderr.txt index 6a430f1..ea1566d 100644 --- a/Tests/RunCMake/cmake_host_system_information/Registry_BadQuery2-stderr.txt +++ b/Tests/RunCMake/cmake_host_system_information/Registry_BadQuery2-stderr.txt @@ -1,5 +1,7 @@ CMake Error at Registry_BadQuery2.cmake:[0-9]+ \(cmake_host_system_information\): - cmake_host_system_information missing expected value for argument\(s\) - "VALUE". + Error after keyword "VALUE": + + missing required value + Call Stack \(most recent call first\): CMakeLists.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/cmake_host_system_information/Registry_BadView1-stderr.txt b/Tests/RunCMake/cmake_host_system_information/Registry_BadView1-stderr.txt index 5eda4ff..f8c96d8 100644 --- a/Tests/RunCMake/cmake_host_system_information/Registry_BadView1-stderr.txt +++ b/Tests/RunCMake/cmake_host_system_information/Registry_BadView1-stderr.txt @@ -1,5 +1,7 @@ CMake Error at Registry_BadView1.cmake:[0-9]+ \(cmake_host_system_information\): - cmake_host_system_information missing expected value for argument\(s\) - "VIEW". + Error after keyword "VIEW": + + missing required value + Call Stack \(most recent call first\): CMakeLists.txt:[0-9]+ \(include\) -- cgit v0.12 From 8a18e82e9581bd490253c1b2531c2c5e70c5d62b Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 19 Jul 2022 14:29:43 -0400 Subject: cmCMakePathCommand: Report keyword errors via argument parser results --- Source/cmCMakePathCommand.cxx | 66 ++++++++++------------ .../cmake_path/BASE_DIRECTORY-no-arg-stderr.txt | 4 +- .../cmake_path/OUTPUT_VARIABLE-no-arg-stderr.txt | 4 +- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/Source/cmCMakePathCommand.cxx b/Source/cmCMakePathCommand.cxx index e604ed1..b955bcf 100644 --- a/Source/cmCMakePathCommand.cxx +++ b/Source/cmCMakePathCommand.cxx @@ -2,7 +2,6 @@ file Copyright.txt or https://cmake.org/licensing for details. */ #include "cmCMakePathCommand.h" -#include #include #include #include @@ -44,14 +43,12 @@ public: } template - Result Parse( - std::vector const& args, - std::vector* keywordsMissingValue = nullptr) const + Result Parse(std::vector const& args) const { this->Inputs.clear(); return this->cmArgumentParser::Parse( - cmMakeRange(args).advance(Advance), &this->Inputs, keywordsMissingValue); + cmMakeRange(args).advance(Advance), &this->Inputs); } const std::vector& GetInputs() const { return this->Inputs; } @@ -82,28 +79,13 @@ public: template Result Parse(std::vector const& args) const { - this->KeywordsMissingValue.clear(); - return this->CMakePathArgumentParser::template Parse( - args, &this->KeywordsMissingValue); - } - - const std::vector& GetKeywordsMissingValue() const - { - return this->KeywordsMissingValue; + args); } bool checkOutputVariable(const Result& arguments, cmExecutionStatus& status) const { - if (std::find(this->GetKeywordsMissingValue().begin(), - this->GetKeywordsMissingValue().end(), - "OUTPUT_VARIABLE"_s) != - this->GetKeywordsMissingValue().end()) { - status.SetError("OUTPUT_VARIABLE requires an argument."); - return false; - } - if (arguments.Output && arguments.Output->empty()) { status.SetError("Invalid name for output variable."); return false; @@ -111,12 +93,9 @@ public: return true; } - -private: - mutable std::vector KeywordsMissingValue; }; -struct OutputVariable +struct OutputVariable : public ArgumentParser::ParseResult { cm::optional Output; }; @@ -288,6 +267,9 @@ bool HandleAppendCommand(std::vector const& args, const auto arguments = parser.Parse(args); + if (arguments.MaybeReportError(status.GetMakefile())) { + return true; + } if (!parser.checkOutputVariable(arguments, status)) { return false; } @@ -310,6 +292,9 @@ bool HandleAppendStringCommand(std::vector const& args, const auto arguments = parser.Parse(args); + if (arguments.MaybeReportError(status.GetMakefile())) { + return true; + } if (!parser.checkOutputVariable(arguments, status)) { return false; } @@ -337,6 +322,9 @@ bool HandleRemoveFilenameCommand(std::vector const& args, const auto arguments = parser.Parse(args); + if (arguments.MaybeReportError(status.GetMakefile())) { + return true; + } if (!parser.checkOutputVariable(arguments, status)) { return false; } @@ -367,6 +355,9 @@ bool HandleReplaceFilenameCommand(std::vector const& args, const auto arguments = parser.Parse(args); + if (arguments.MaybeReportError(status.GetMakefile())) { + return true; + } if (!parser.checkOutputVariable(arguments, status)) { return false; } @@ -394,7 +385,7 @@ bool HandleReplaceFilenameCommand(std::vector const& args, bool HandleRemoveExtensionCommand(std::vector const& args, cmExecutionStatus& status) { - struct Arguments + struct Arguments : public ArgumentParser::ParseResult { cm::optional Output; bool LastOnly = false; @@ -406,6 +397,9 @@ bool HandleRemoveExtensionCommand(std::vector const& args, Arguments const arguments = parser.Parse(args); + if (arguments.MaybeReportError(status.GetMakefile())) { + return true; + } if (!parser.checkOutputVariable(arguments, status)) { return false; } @@ -437,7 +431,7 @@ bool HandleRemoveExtensionCommand(std::vector const& args, bool HandleReplaceExtensionCommand(std::vector const& args, cmExecutionStatus& status) { - struct Arguments + struct Arguments : public ArgumentParser::ParseResult { cm::optional Output; bool LastOnly = false; @@ -449,6 +443,9 @@ bool HandleReplaceExtensionCommand(std::vector const& args, Arguments const arguments = parser.Parse(args); + if (arguments.MaybeReportError(status.GetMakefile())) { + return true; + } if (!parser.checkOutputVariable(arguments, status)) { return false; } @@ -486,6 +483,9 @@ bool HandleNormalPathCommand(std::vector const& args, const auto arguments = parser.Parse(args); + if (arguments.MaybeReportError(status.GetMakefile())) { + return true; + } if (!parser.checkOutputVariable(arguments, status)) { return false; } @@ -514,7 +514,7 @@ bool HandleTransformPathCommand( const std::string& base)>& transform, bool normalizeOption = false) { - struct Arguments + struct Arguments : public ArgumentParser::ParseResult { cm::optional Output; cm::optional BaseDirectory; @@ -529,6 +529,9 @@ bool HandleTransformPathCommand( Arguments arguments = parser.Parse(args); + if (arguments.MaybeReportError(status.GetMakefile())) { + return true; + } if (!parser.checkOutputVariable(arguments, status)) { return false; } @@ -538,13 +541,6 @@ bool HandleTransformPathCommand( return false; } - if (std::find(parser.GetKeywordsMissingValue().begin(), - parser.GetKeywordsMissingValue().end(), "BASE_DIRECTORY"_s) != - parser.GetKeywordsMissingValue().end()) { - status.SetError("BASE_DIRECTORY requires an argument."); - return false; - } - std::string baseDirectory; if (arguments.BaseDirectory) { baseDirectory = *arguments.BaseDirectory; diff --git a/Tests/RunCMake/cmake_path/BASE_DIRECTORY-no-arg-stderr.txt b/Tests/RunCMake/cmake_path/BASE_DIRECTORY-no-arg-stderr.txt index ac47545..ad7d134 100644 --- a/Tests/RunCMake/cmake_path/BASE_DIRECTORY-no-arg-stderr.txt +++ b/Tests/RunCMake/cmake_path/BASE_DIRECTORY-no-arg-stderr.txt @@ -1,2 +1,4 @@ CMake Error at .+/cmake_path/call-cmake_path.cmake:[0-9]+ \(cmake_path\): - cmake_path BASE_DIRECTORY requires an argument. + Error after keyword "BASE_DIRECTORY": + + missing required value diff --git a/Tests/RunCMake/cmake_path/OUTPUT_VARIABLE-no-arg-stderr.txt b/Tests/RunCMake/cmake_path/OUTPUT_VARIABLE-no-arg-stderr.txt index e1d6592..63289ef 100644 --- a/Tests/RunCMake/cmake_path/OUTPUT_VARIABLE-no-arg-stderr.txt +++ b/Tests/RunCMake/cmake_path/OUTPUT_VARIABLE-no-arg-stderr.txt @@ -1,2 +1,4 @@ CMake Error at .+/cmake_path/call-cmake_path.cmake:[0-9]+ \(cmake_path\): - cmake_path OUTPUT_VARIABLE requires an argument. + Error after keyword "OUTPUT_VARIABLE": + + missing required value -- cgit v0.12