summaryrefslogtreecommitdiffstats
path: root/Tests
diff options
context:
space:
mode:
authorChris Mahoney <chris.mahoney@kitware.com>2023-08-09 14:28:03 (GMT)
committerChris Mahoney <chris.mahoney@kitware.com>2023-08-15 12:21:29 (GMT)
commit99be022428dcbf505cf889ff5d6f8de62821f652 (patch)
tree02f5b27c9cd117dfed8e2bc013493fd0914bb634 /Tests
parent6ba173ba35db41d1a35431ea2066a626e658eb88 (diff)
downloadCMake-99be022428dcbf505cf889ff5d6f8de62821f652.zip
CMake-99be022428dcbf505cf889ff5d6f8de62821f652.tar.gz
CMake-99be022428dcbf505cf889ff5d6f8de62821f652.tar.bz2
Tests/RunCMake/Make: simplify GNUMakeJobSeverAware check function
Diffstat (limited to 'Tests')
-rw-r--r--Tests/RunCMake/Make/DetectJobServer-absent-parallel-build-stderr.txt1
-rw-r--r--Tests/RunCMake/Make/DetectJobServer-absent.cmake13
-rw-r--r--Tests/RunCMake/Make/DetectJobServer-present.cmake4
-rw-r--r--Tests/RunCMake/Make/GNUMakeJobServerAware-check.cmake22
-rw-r--r--Tests/RunCMake/Make/RunCMakeTest.cmake27
-rw-r--r--Tests/RunCMake/detect_jobserver.c89
6 files changed, 44 insertions, 112 deletions
diff --git a/Tests/RunCMake/Make/DetectJobServer-absent-parallel-build-stderr.txt b/Tests/RunCMake/Make/DetectJobServer-absent-parallel-build-stderr.txt
deleted file mode 100644
index c63bde3..0000000
--- a/Tests/RunCMake/Make/DetectJobServer-absent-parallel-build-stderr.txt
+++ /dev/null
@@ -1 +0,0 @@
-^(Warning: (Borland's make|NMake|Watcom's WMake) does not support parallel builds\. Ignoring parallel build command line option\.)?$
diff --git a/Tests/RunCMake/Make/DetectJobServer-absent.cmake b/Tests/RunCMake/Make/DetectJobServer-absent.cmake
deleted file mode 100644
index e3dddc0..0000000
--- a/Tests/RunCMake/Make/DetectJobServer-absent.cmake
+++ /dev/null
@@ -1,13 +0,0 @@
-# Verifies that the jobserver connection is absent
-add_custom_command(OUTPUT custom_command.txt
- JOB_SERVER_AWARE OFF
- COMMENT "Should not detect jobserver"
- COMMAND ${DETECT_JOBSERVER} --absent "custom_command.txt"
-)
-
-# trigger the custom command to run
-add_custom_target(dummy ALL
- JOB_SERVER_AWARE OFF
- DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/custom_command.txt
- COMMAND ${DETECT_JOBSERVER} --absent "custom_target.txt"
-)
diff --git a/Tests/RunCMake/Make/DetectJobServer-present.cmake b/Tests/RunCMake/Make/DetectJobServer-present.cmake
index a33658f..cfaf7be 100644
--- a/Tests/RunCMake/Make/DetectJobServer-present.cmake
+++ b/Tests/RunCMake/Make/DetectJobServer-present.cmake
@@ -2,12 +2,12 @@
add_custom_command(OUTPUT custom_command.txt
JOB_SERVER_AWARE ON
COMMENT "Should detect jobserver support"
- COMMAND ${DETECT_JOBSERVER} --present "custom_command.txt"
+ COMMAND ${DETECT_JOBSERVER} "custom_command.txt"
)
# trigger the custom command to run
add_custom_target(dummy ALL
JOB_SERVER_AWARE ON
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/custom_command.txt
- COMMAND ${DETECT_JOBSERVER} --present "custom_target.txt"
+ COMMAND ${DETECT_JOBSERVER} "custom_target.txt"
)
diff --git a/Tests/RunCMake/Make/GNUMakeJobServerAware-check.cmake b/Tests/RunCMake/Make/GNUMakeJobServerAware-check.cmake
index da18f00..dbc1555 100644
--- a/Tests/RunCMake/Make/GNUMakeJobServerAware-check.cmake
+++ b/Tests/RunCMake/Make/GNUMakeJobServerAware-check.cmake
@@ -1,21 +1,13 @@
set(BUILD_DIR "${RunCMake_BINARY_DIR}/GNUMakeJobServerAware-build")
-function(check target line)
- # Read the file and split it into a list of lines
- file(READ ${BUILD_DIR}/${target} contents)
- STRING(REGEX REPLACE ";" "\\\\;" contents "${contents}")
- STRING(REGEX REPLACE "\n" ";" contents "${contents}")
+function(check target regex)
+ file(STRINGS ${BUILD_DIR}/${target} lines
+ REGEX ${regex}
+ )
- set(found FALSE)
- foreach(entry ${contents})
- if("${entry}" MATCHES "${line}")
- set(found TRUE)
- break()
- endif()
- endforeach()
-
- if(NOT found)
- message(FATAL_ERROR "Could not find '${line}' in ${BUILD_DIR}/${target}\n${contents}")
+ list(LENGTH lines len)
+ if(len EQUAL 0)
+ message(FATAL_ERROR "Could not find matching lines '${regex}' in ${BUILD_DIR}/${target}")
endif()
endfunction()
diff --git a/Tests/RunCMake/Make/RunCMakeTest.cmake b/Tests/RunCMake/Make/RunCMakeTest.cmake
index 12904c8..5d1ba48 100644
--- a/Tests/RunCMake/Make/RunCMakeTest.cmake
+++ b/Tests/RunCMake/Make/RunCMakeTest.cmake
@@ -71,39 +71,18 @@ if(NOT RunCMake_GENERATOR STREQUAL "Watcom WMake")
run_CMP0113(NEW)
endif()
-function(detect_jobserver_present is_parallel)
+function(detect_jobserver_present)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/DetectJobServer-present-build)
set(RunCMake_TEST_NO_CLEAN 1)
set(RunCMake_TEST_OPTIONS "-DDETECT_JOBSERVER=${DETECT_JOBSERVER}")
run_cmake(DetectJobServer-present)
- if (is_parallel)
- run_cmake_command(DetectJobServer-present-parallel-build ${CMAKE_COMMAND} --build . -j4)
- else()
- run_cmake_command(DetectJobServer-present-build ${CMAKE_COMMAND} --build .)
- endif()
-endfunction()
-
-function(detect_jobserver_absent is_parallel)
- set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/DetectJobServer-absent-build)
- set(RunCMake_TEST_NO_CLEAN 1)
- set(RunCMake_TEST_OPTIONS "-DDETECT_JOBSERVER=${DETECT_JOBSERVER}")
- run_cmake(DetectJobServer-absent)
- if (is_parallel)
- run_cmake_command(DetectJobServer-absent-parallel-build ${CMAKE_COMMAND} --build . -j4)
- else()
- run_cmake_command(DetectJobServer-absent-build ${CMAKE_COMMAND} --build .)
- endif()
+ run_cmake_command(DetectJobServer-present-parallel-build ${CMAKE_COMMAND} --build . -j4)
endfunction()
# Jobservers are currently only supported by GNU makes, except MSYS2 make
if(MAKE_IS_GNU AND NOT RunCMake_GENERATOR MATCHES "MSYS Makefiles")
- detect_jobserver_present(ON)
-else()
- detect_jobserver_absent(ON)
+ detect_jobserver_present()
endif()
-# No matter which generator is used, the jobserver should not be present if a
-# parallel build is not requested
-detect_jobserver_absent(OFF)
if(MAKE_IS_GNU)
# In GNU makes, `JOB_SERVER_AWARE` support is implemented by prefixing
diff --git a/Tests/RunCMake/detect_jobserver.c b/Tests/RunCMake/detect_jobserver.c
index a6c1a7c..8cbfe2e 100644
--- a/Tests/RunCMake/detect_jobserver.c
+++ b/Tests/RunCMake/detect_jobserver.c
@@ -11,22 +11,24 @@
#include <string.h>
#define MAX_MESSAGE_LENGTH 1023
-#define USAGE "Usage: %s [--present|--absent] <output_file>\n"
+#define USAGE "Usage: %s <output_file>\n"
-// Extracts --jobserver-auth=<string> or --jobserver-fds=<string> from
-// MAKEFLAGS. The returned pointer points to the start of <string> Returns NULL
-// if MAKEFLAGS is not set or does not contain --jobserver-auth or
-// --jobserver-fds
+// Extracts the jobserver details from the MAKEFLAGS environment variable.
+//
+// Returns a pointer to either a string of the form "R,W" where R and W are fds
+// or "fifo:PATH".
+//
+// Returns NULL if MAKEFLAGS is not set or does not contain recognized
+// jobserver flags.
char* jobserver_auth(char* message)
{
- const char* jobserver_auth = "--jobserver-auth=";
- const char* jobserver_fds = "--jobserver-fds=";
- char* auth;
- char* fds;
- char* start;
+ const char* jobserver_flags[3] = { "--jobserver-auth=", "--jobserver-fds=",
+ "-J" };
+ char* start = NULL;
char* end;
char* result;
size_t len;
+ int i;
char* makeflags = getenv("MAKEFLAGS");
if (makeflags == NULL) {
@@ -34,18 +36,24 @@ char* jobserver_auth(char* message)
return NULL;
}
- // write MAKEFLAGS to stdout for debugging
fprintf(stdout, "MAKEFLAGS: %s\n", makeflags);
- auth = strstr(makeflags, jobserver_auth);
- fds = strstr(makeflags, jobserver_fds);
- if (auth == NULL && fds == NULL) {
- strncpy(message, "No jobserver found", MAX_MESSAGE_LENGTH);
+ for (i = 0; i < 3; i++) {
+ start = strstr(makeflags, jobserver_flags[i]);
+ if (start != NULL) {
+ start += strlen(jobserver_flags[i]);
+ break;
+ }
+ }
+
+ if (start == NULL) {
+ strncpy(message, "No jobserver flags found", MAX_MESSAGE_LENGTH);
return NULL;
- } else if (auth != NULL) {
- start = auth + strlen(jobserver_auth);
- } else {
- start = fds + strlen(jobserver_fds);
+ }
+
+ // Skip leading white space
+ while (*start == ' ' || *start == '\t') {
+ start++;
}
end = strchr(start, ' ');
@@ -132,38 +140,21 @@ int posix(const char* jobserver, char* message)
}
#endif
-// Takes 2 arguments:
-// Either --present or --absent to indicate we expect the jobserver to be
-// "present and valid", or "absent or invalid"
-//
-// if `--present` is passed, the exit code will be 0 if the jobserver is
-// present, 1 if it is absent if `--absent` is passed, the exit code will be 0
-// if the jobserver is absent, 1 if it is present in either case, if there is
-// some fatal error (e.g the output file cannot be opened), the exit code will
-// be 2
+// Takes 1 argument: an outfile to write results to.
int main(int argc, char** argv)
{
char message[MAX_MESSAGE_LENGTH + 1];
char* output_file;
FILE* fp;
- int expecting_present;
- int expecting_absent;
char* jobserver;
int result;
- if (argc != 3) {
- fprintf(stderr, USAGE, argv[0]);
- return 2;
- }
-
- expecting_present = strcmp(argv[1], "--present") == 0;
- expecting_absent = strcmp(argv[1], "--absent") == 0;
- if (!expecting_present && !expecting_absent) {
+ if (argc != 2) {
fprintf(stderr, USAGE, argv[0]);
return 2;
}
- output_file = argv[2];
+ output_file = argv[1];
fp = fopen(output_file, "w");
if (fp == NULL) {
fprintf(stderr, "Error opening output file: %s\n", output_file);
@@ -172,11 +163,6 @@ int main(int argc, char** argv)
jobserver = jobserver_auth(message);
if (jobserver == NULL) {
- if (expecting_absent) {
- fprintf(stdout, "Success\n");
- return 0;
- }
-
fprintf(stderr, "%s\n", message);
return 1;
}
@@ -187,18 +173,7 @@ int main(int argc, char** argv)
result = posix(jobserver, message);
#endif
free(jobserver);
- message[MAX_MESSAGE_LENGTH] = 0;
-
- if (result == 0 && expecting_present) {
- fprintf(stdout, "Success\n");
- return 0;
- }
-
- if (result == 1 && expecting_absent) {
- fprintf(stdout, "Success\n");
- return 0;
- }
+ message[MAX_MESSAGE_LENGTH] = '\0';
- fprintf(stderr, "%s\n", message);
- return 1;
+ return result;
}