Browse Source

Tests/RunCMake/Make: simplify GNUMakeJobSeverAware check function

Chris Mahoney 2 năm trước cách đây
mục cha
commit
99be022428

+ 0 - 1
Tests/RunCMake/Make/DetectJobServer-absent-parallel-build-stderr.txt

@@ -1 +0,0 @@
-^(Warning: (Borland's make|NMake|Watcom's WMake) does not support parallel builds\. Ignoring parallel build command line option\.)?$

+ 0 - 13
Tests/RunCMake/Make/DetectJobServer-absent.cmake

@@ -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 - 2
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"
 )

+ 7 - 15
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()
 

+ 3 - 24
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

+ 32 - 57
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;
 }