Tests/RunCMake/Make: simplify GNUMakeJobSeverAware check function
This commit is contained in:
parent
6ba173ba35
commit
99be022428
@ -1 +0,0 @@
|
||||
^(Warning: (Borland's make|NMake|Watcom's WMake) does not support parallel builds\. Ignoring parallel build command line option\.)?$
|
@ -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"
|
||||
)
|
@ -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"
|
||||
)
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
if (argc != 2) {
|
||||
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) {
|
||||
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;
|
||||
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;
|
||||
}
|
||||
|
||||
fprintf(stderr, "%s\n", message);
|
||||
return 1;
|
||||
return result;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user