]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
[CMake] Automatically update `list.h` 3005/head
authorTim Kientzle <kientzle@acm.org>
Wed, 6 May 2026 03:54:12 +0000 (20:54 -0700)
committerTim Kientzle <kientzle@acm.org>
Wed, 6 May 2026 03:54:12 +0000 (20:54 -0700)
`list.h` contains a list of all the tests and is generated
by grepping the test source files for `DEFINE_TEST`.
Previously, it was generated at configure time.
This meant that if you added a new test to an existing
source file, you had to manually reconfigure.

This adds the necessary dependencies so that `list.h`
is regenerated whenever any C test source changes.
This ensures that new tests are always discovered automatically.

Note:  If someone wants to update the autoconf-based
build system to do this, please send a PR.

CMakeLists.txt
build/cmake/discover_tests.cmake.in [new file with mode: 0644]
cat/test/CMakeLists.txt
cpio/test/CMakeLists.txt
libarchive/test/CMakeLists.txt
tar/test/CMakeLists.txt
unzip/test/CMakeLists.txt

index 2cd03f5de427c8025bf253b1842f681d167c92f4..edc9a0d7744d309117bdbdb53357626127e8f699 100644 (file)
@@ -341,26 +341,38 @@ INCLUDE(CheckTypeSize)
 #
 # Generate list.h
 #
-MACRO (GENERATE_LIST_H _listfile _cmlist __list_sources)
+MACRO (GENERATE_LIST_H _listfile _cmlist _target __list_sources)
   SET(_argv ${ARGV})
-  # Remove _listfile and _cmlist from _argv
-  LIST(REMOVE_AT _argv 0 1)
-  IF (NOT EXISTS "${_listfile}" OR
-     ${_cmlist} IS_NEWER_THAN "${_listfile}")
-
-    MESSAGE(STATUS "Generating ${_listfile}")
-    FILE(WRITE ${_listfile} "")
-    FOREACH (testfile ${_argv})
-      IF (testfile MATCHES "^test_[^/]+[.]c$")
-        FILE(STRINGS ${testfile} testvar REGEX "^DEFINE_TEST")
-        FOREACH (deftest ${testvar})
-          FILE(APPEND ${_listfile} "${deftest}\n")
-        ENDFOREACH (deftest)
-      ENDIF (testfile MATCHES "^test_[^/]+[.]c$")
-    ENDFOREACH (testfile)
-
-  ENDIF (NOT EXISTS "${_listfile}" OR
-     ${_cmlist} IS_NEWER_THAN "${_listfile}")
+  # Remove _listfile, _cmlist, and _target from _argv
+  LIST(REMOVE_AT _argv 0 1 2)
+  # Convert source paths to absolute so discover_tests.cmake can find them
+  # regardless of the working directory when cmake -P runs.
+  SET(_gl_abs_sources "")
+  FOREACH(_gl_src ${_argv})
+    IF(IS_ABSOLUTE "${_gl_src}")
+      LIST(APPEND _gl_abs_sources "${_gl_src}")
+    ELSE()
+      LIST(APPEND _gl_abs_sources "${CMAKE_CURRENT_SOURCE_DIR}/${_gl_src}")
+    ENDIF()
+  ENDFOREACH()
+  # Stamp out discover_tests.cmake with source list and output path baked in.
+  SET(SOURCES "${_gl_abs_sources}")
+  SET(OUTPUT "${_listfile}")
+  CONFIGURE_FILE(
+    ${CMAKE_SOURCE_DIR}/build/cmake/discover_tests.cmake.in
+    ${CMAKE_CURRENT_BINARY_DIR}/discover_tests.cmake
+    @ONLY)
+  UNSET(SOURCES)
+  UNSET(OUTPUT)
+  # list.h is regenerated at build time whenever any test .c file changes.
+  ADD_CUSTOM_COMMAND(
+    OUTPUT "${_listfile}"
+    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/discover_tests.cmake
+    DEPENDS ${_gl_abs_sources}
+    COMMENT "Generating ${_listfile}"
+    VERBATIM)
+  # Attaching list.h to the target tells CMake to build it before compiling.
+  TARGET_SOURCES(${_target} PRIVATE "${_listfile}")
 ENDMACRO (GENERATE_LIST_H)
 #
 # Generate installation rules for man pages.
diff --git a/build/cmake/discover_tests.cmake.in b/build/cmake/discover_tests.cmake.in
new file mode 100644 (file)
index 0000000..1a054bc
--- /dev/null
@@ -0,0 +1,13 @@
+# Generated by CMake at configure time -- do not edit.
+# Scans test source files for DEFINE_TEST() declarations and writes list.h.
+set(_sources @SOURCES@)
+set(_output "@OUTPUT@")
+file(WRITE "${_output}" "")
+foreach(_src ${_sources})
+  if(_src MATCHES "test_[^/]+\\.c$")
+    file(STRINGS "${_src}" _lines REGEX "^DEFINE_TEST")
+    foreach(_line ${_lines})
+      file(APPEND "${_output}" "${_line}\n")
+    endforeach()
+  endif()
+endforeach()
index e76b47608728cc8b331b438820c2dbcf33778cb1..75180e285b60c514fdc9539516ff3cb0fd05d08f 100644 (file)
@@ -51,7 +51,7 @@ IF(ENABLE_CAT AND ENABLE_TEST)
   # Generate list.h by grepping DEFINE_TEST() lines out of the C sources.
   #
   GENERATE_LIST_H(${CMAKE_CURRENT_BINARY_DIR}/list.h
-    ${CMAKE_CURRENT_LIST_FILE} ${bsdcat_test_SOURCES})
+    ${CMAKE_CURRENT_LIST_FILE} bsdcat_test ${bsdcat_test_SOURCES})
   SET_PROPERTY(DIRECTORY APPEND PROPERTY INCLUDE_DIRECTORIES
     ${CMAKE_CURRENT_BINARY_DIR})
 
@@ -69,7 +69,7 @@ IF(ENABLE_CAT AND ENABLE_TEST)
     SET_TESTS_PROPERTIES(bsdcat_${_testname} PROPERTIES SKIP_RETURN_CODE 2)
   ENDMACRO (DEFINE_TEST _testname)
 
-  INCLUDE(${CMAKE_CURRENT_BINARY_DIR}/list.h)
+  INCLUDE(${CMAKE_CURRENT_BINARY_DIR}/list.h OPTIONAL)
   INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
   INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/test_utils)
   INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/cat/test)
index fe6ab968d3dd01c155133713ad4a155908322dee..dad046414e39c5a3a799005fb9a7ed9f0dc44806 100644 (file)
@@ -84,7 +84,7 @@ IF(ENABLE_CPIO AND ENABLE_TEST)
   # Generate list.h by grepping DEFINE_TEST() lines out of the C sources.
   #
   GENERATE_LIST_H(${CMAKE_CURRENT_BINARY_DIR}/list.h
-    ${CMAKE_CURRENT_LIST_FILE} ${bsdcpio_test_SOURCES})
+    ${CMAKE_CURRENT_LIST_FILE} bsdcpio_test ${bsdcpio_test_SOURCES})
   SET_PROPERTY(DIRECTORY APPEND PROPERTY INCLUDE_DIRECTORIES
     ${CMAKE_CURRENT_BINARY_DIR})
 
@@ -102,7 +102,7 @@ IF(ENABLE_CPIO AND ENABLE_TEST)
     SET_TESTS_PROPERTIES(bsdcpio_${_testname} PROPERTIES SKIP_RETURN_CODE 2)
   ENDMACRO (DEFINE_TEST _testname)
 
-  INCLUDE(${CMAKE_CURRENT_BINARY_DIR}/list.h)
+  INCLUDE(${CMAKE_CURRENT_BINARY_DIR}/list.h OPTIONAL)
   INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
   INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/test_utils)
   INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/cpio/test)
index fb9bcdc0d50e8d39ec8a13fc32c817312e07a7f6..d175da1bfefd457fae83999f0ba1b5181ddf3525 100644 (file)
@@ -345,7 +345,7 @@ IF(ENABLE_TEST)
   # Generate list.h by grepping DEFINE_TEST() lines out of the C sources.
   #
   GENERATE_LIST_H(${CMAKE_CURRENT_BINARY_DIR}/list.h
-    ${CMAKE_CURRENT_LIST_FILE} ${libarchive_test_SOURCES})
+    ${CMAKE_CURRENT_LIST_FILE} libarchive_test ${libarchive_test_SOURCES})
   SET_PROPERTY(DIRECTORY APPEND PROPERTY INCLUDE_DIRECTORIES
     ${CMAKE_CURRENT_BINARY_DIR})
 
@@ -362,7 +362,7 @@ IF(ENABLE_TEST)
     SET_TESTS_PROPERTIES(libarchive_${_testname} PROPERTIES SKIP_RETURN_CODE 2)
   ENDMACRO (DEFINE_TEST _testname)
 
-  INCLUDE(${CMAKE_CURRENT_BINARY_DIR}/list.h)
+  INCLUDE(${CMAKE_CURRENT_BINARY_DIR}/list.h OPTIONAL)
   INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
   INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/test_utils)
   INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/libarchive/test)
index d3c0bd22af9aabac0a664d6f2cdbbce36133a526..47def97fe2b2d63a932ca5bcbc0d4017e7f6ba26 100644 (file)
@@ -105,7 +105,7 @@ IF(ENABLE_TAR AND ENABLE_TEST)
   # Generate list.h by grepping DEFINE_TEST() lines out of the C sources.
   #
   GENERATE_LIST_H(${CMAKE_CURRENT_BINARY_DIR}/list.h
-    ${CMAKE_CURRENT_LIST_FILE} ${bsdtar_test_SOURCES})
+    ${CMAKE_CURRENT_LIST_FILE} bsdtar_test ${bsdtar_test_SOURCES})
   SET_PROPERTY(DIRECTORY APPEND PROPERTY INCLUDE_DIRECTORIES
     ${CMAKE_CURRENT_BINARY_DIR})
 
@@ -123,7 +123,7 @@ IF(ENABLE_TAR AND ENABLE_TEST)
     SET_TESTS_PROPERTIES(bsdtar_${_testname} PROPERTIES SKIP_RETURN_CODE 2)
   ENDMACRO (DEFINE_TEST _testname)
 
-  INCLUDE(${CMAKE_CURRENT_BINARY_DIR}/list.h)
+  INCLUDE(${CMAKE_CURRENT_BINARY_DIR}/list.h OPTIONAL)
   INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
   INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/test_utils)
   INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/tar/test)
index 45138202a9a361c069baf5df87b2f9852a1d2159..00d232a5f46273549680daed2cf67ad94348b148 100644 (file)
@@ -52,7 +52,7 @@ IF(ENABLE_UNZIP AND ENABLE_TEST)
   # Generate list.h by grepping DEFINE_TEST() lines out of the C sources.
   #
   GENERATE_LIST_H(${CMAKE_CURRENT_BINARY_DIR}/list.h
-    ${CMAKE_CURRENT_LIST_FILE} ${bsdunzip_test_SOURCES})
+    ${CMAKE_CURRENT_LIST_FILE} bsdunzip_test ${bsdunzip_test_SOURCES})
   SET_PROPERTY(DIRECTORY APPEND PROPERTY INCLUDE_DIRECTORIES
     ${CMAKE_CURRENT_BINARY_DIR})
 
@@ -70,7 +70,7 @@ IF(ENABLE_UNZIP AND ENABLE_TEST)
     SET_TESTS_PROPERTIES(bsdunzip_${_testname} PROPERTIES SKIP_RETURN_CODE 2)
   ENDMACRO (DEFINE_TEST _testname)
 
-  INCLUDE(${CMAKE_CURRENT_BINARY_DIR}/list.h)
+  INCLUDE(${CMAKE_CURRENT_BINARY_DIR}/list.h OPTIONAL)
   INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
   INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/test_utils)
   INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/unzip/test)