From 434c63acd090568147505ff1c31053dcb1b3863f Mon Sep 17 00:00:00 2001 From: Alex Merry Date: Sat, 15 Feb 2014 16:42:47 +0000 Subject: Improve the ECMGenerateHeaders API with a variable for generated files ecm_generate_headers() now allows/forces the caller to collect the paths of the generated headers, so that they can be passed to the install command. This avoids issues of unexpected files being in the CamelCase includes directory, both from previous builds and because of case-insensitive file systems. MODULE_NAME is removed, as it is no longer desirable or necessary. Instead, the headers are placed directly in the output directory (usually CMAKE_CURRENT_BUILD_DIR). Overall, this makes ecm_generate_headers() behave much more like other file generation macros (like the Qt ones). The old syntax is still supported for now, to make the porting effort easier. REVIEW: 115765 --- tests/ECMGenerateHeadersTest/CMakeLists.txt | 6 + .../ECMGenerateHeadersTest/headsubdir/headtest2.h | 0 .../ECMGenerateHeadersTest/headsubdir/headtest3.h | 0 tests/ECMGenerateHeadersTest/headtest1.h | 0 tests/ECMGenerateHeadersTest/headtest2.h | 0 tests/ECMGenerateHeadersTest/run_test.cmake.config | 247 +++++++++++++++++++++ 6 files changed, 253 insertions(+) create mode 100644 tests/ECMGenerateHeadersTest/CMakeLists.txt create mode 100644 tests/ECMGenerateHeadersTest/headsubdir/headtest2.h create mode 100644 tests/ECMGenerateHeadersTest/headsubdir/headtest3.h create mode 100644 tests/ECMGenerateHeadersTest/headtest1.h create mode 100644 tests/ECMGenerateHeadersTest/headtest2.h create mode 100644 tests/ECMGenerateHeadersTest/run_test.cmake.config (limited to 'tests/ECMGenerateHeadersTest') diff --git a/tests/ECMGenerateHeadersTest/CMakeLists.txt b/tests/ECMGenerateHeadersTest/CMakeLists.txt new file mode 100644 index 00000000..9f407cb0 --- /dev/null +++ b/tests/ECMGenerateHeadersTest/CMakeLists.txt @@ -0,0 +1,6 @@ +set(MODULES_DIR "${extra-cmake-modules_SOURCE_DIR}/modules") +configure_file(run_test.cmake.config "${CMAKE_CURRENT_BINARY_DIR}/run_test.cmake" @ONLY) + +add_test( + NAME ECMGenerateHeaders + COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_BINARY_DIR}/run_test.cmake") diff --git a/tests/ECMGenerateHeadersTest/headsubdir/headtest2.h b/tests/ECMGenerateHeadersTest/headsubdir/headtest2.h new file mode 100644 index 00000000..e69de29b diff --git a/tests/ECMGenerateHeadersTest/headsubdir/headtest3.h b/tests/ECMGenerateHeadersTest/headsubdir/headtest3.h new file mode 100644 index 00000000..e69de29b diff --git a/tests/ECMGenerateHeadersTest/headtest1.h b/tests/ECMGenerateHeadersTest/headtest1.h new file mode 100644 index 00000000..e69de29b diff --git a/tests/ECMGenerateHeadersTest/headtest2.h b/tests/ECMGenerateHeadersTest/headtest2.h new file mode 100644 index 00000000..e69de29b diff --git a/tests/ECMGenerateHeadersTest/run_test.cmake.config b/tests/ECMGenerateHeadersTest/run_test.cmake.config new file mode 100644 index 00000000..0a2425fe --- /dev/null +++ b/tests/ECMGenerateHeadersTest/run_test.cmake.config @@ -0,0 +1,247 @@ +set(CMAKE_MODULE_PATH "@MODULES_DIR@") +set(CMAKE_CURRENT_SOURCE_DIR "@CMAKE_CURRENT_SOURCE_DIR@") +set(CMAKE_CURRENT_BINARY_DIR "@CMAKE_CURRENT_BINARY_DIR@") + +include(ECMGenerateHeaders) +include(CMakeParseArguments) + +function (check_files) + set(options) + set(oneValueArgs GENERATED ORIGINALS) + set(multiValueArgs) + cmake_parse_arguments(CF "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + list(LENGTH CF_GENERATED count) + foreach(i RANGE ${count}) + list(GET CF_GENERATED 0 generated_file) + list(GET CF_ORIGINALS 0 original_file) + if (NOT EXISTS "${generated_file}") + message(FATAL_ERROR "${generated_file} was not generated") + endif() + file(READ "${generated_file}" file_contents) + string(STRIP "${file_contents}" file_contents) + set (exp_contents "#include \"${original_file}\"") + if (NOT "${file_contents}" STREQUAL "${exp_contents}") + message(FATAL_ERROR "${generated_file} contains '${file_contents}' instead of '${exp_contents}'") + endif() + endforeach() +endfunction() + +########################################################### + +message(STATUS "Test 1: no optional arguments") +set(camelcase_headers) +set(expfiles "${CMAKE_CURRENT_BINARY_DIR}/HeadTest1" + "${CMAKE_CURRENT_BINARY_DIR}/HeadTest2") +set(origfiles headtest1.h headtest2.h) +file(REMOVE ${expfiles}) +ecm_generate_headers( + camelcase_headers + HEADER_NAMES HeadTest1 HeadTest2 +) +if (NOT "${expfiles}" STREQUAL "${camelcase_headers}") + message(FATAL_ERROR "camelcase_headers was set to \"${camelcase_headers}\" instead of \"${expfiles}\"") +endif() +check_files(GENERATED ${expfiles} + ORIGINALS ${origfiles}) + + +########################################################### + +message(STATUS "Test 2: RELATIVE") +set(camelcase_headers) +set(expfiles "${CMAKE_CURRENT_BINARY_DIR}/HeadTest2" + "${CMAKE_CURRENT_BINARY_DIR}/HeadTest3") +set(origfiles headtest2.h headtest3.h) +file(REMOVE ${expfiles}) +ecm_generate_headers( + camelcase_headers + HEADER_NAMES HeadTest2 HeadTest3 + RELATIVE headsubdir +) +if (NOT "${expfiles}" STREQUAL "${camelcase_headers}") + message(FATAL_ERROR "camelcase_headers was set to \"${camelcase_headers}\" instead of \"${expfiles}\"") +endif() +check_files(GENERATED ${expfiles} + ORIGINALS ${origfiles}) + + +########################################################### + +message(STATUS "Test 3: OUTPUT_DIR") +set(camelcase_headers) +set(expfiles "${CMAKE_CURRENT_BINARY_DIR}/testdir/HeadTest1" + "${CMAKE_CURRENT_BINARY_DIR}/testdir/HeadTest2") +set(origfiles headtest1.h headtest2.h) +file(REMOVE ${expfiles}) +ecm_generate_headers( + camelcase_headers + HEADER_NAMES HeadTest1 HeadTest2 + OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/testdir" +) +if (NOT "${expfiles}" STREQUAL "${camelcase_headers}") + message(FATAL_ERROR "camelcase_headers was set to \"${camelcase_headers}\" instead of \"${expfiles}\"") +endif() +check_files(GENERATED ${expfiles} + ORIGINALS ${origfiles}) + + +########################################################### + +message(STATUS "Test 4: PREFIX") +set(camelcase_headers) +set(expfiles "${CMAKE_CURRENT_BINARY_DIR}/Module/HeadTest1" + "${CMAKE_CURRENT_BINARY_DIR}/Module/HeadTest2") +set(intermediatefiles module/headtest1.h module/headtest2.h) +set(origfiles "${CMAKE_CURRENT_SOURCE_DIR}/headtest1.h" + "${CMAKE_CURRENT_SOURCE_DIR}/headtest2.h") +file(REMOVE ${expfiles} ${intermediatefiles}) +ecm_generate_headers( + camelcase_headers + HEADER_NAMES HeadTest1 HeadTest2 + PREFIX Module +) +if (NOT "${expfiles}" STREQUAL "${camelcase_headers}") + message(FATAL_ERROR "camelcase_headers was set to \"${camelcase_headers}\" instead of \"${expfiles}\"") +endif() +check_files(GENERATED ${expfiles} + ORIGINALS ${intermediatefiles}) +check_files(GENERATED ${expfiles} + ORIGINALS ${intermediatefiles}) + + +########################################################### + +message(STATUS "Test 5: REQUIRED_HEADERS") +set(camelcase_headers) +set(req_headers) +set(expfiles "${CMAKE_CURRENT_BINARY_DIR}/HeadTest1" + "${CMAKE_CURRENT_BINARY_DIR}/HeadTest2") +set(origfiles headtest1.h headtest2.h) +set(origpaths "${CMAKE_CURRENT_SOURCE_DIR}/headtest1.h" + "${CMAKE_CURRENT_SOURCE_DIR}/headtest2.h") +file(REMOVE ${expfiles}) +ecm_generate_headers( + camelcase_headers + HEADER_NAMES HeadTest1 HeadTest2 + REQUIRED_HEADERS req_headers +) +if (NOT "${origpaths}" STREQUAL "${req_headers}") + message(FATAL_ERROR "REQUIRED_HEADERS var was set to \"${req_headers}\" instead of \"${origpaths}\"") +endif() +if (NOT "${expfiles}" STREQUAL "${camelcase_headers}") + message(FATAL_ERROR "camelcase_headers was set to \"${camelcase_headers}\" instead of \"${expfiles}\"") +endif() +check_files(GENERATED ${expfiles} + ORIGINALS ${origfiles}) + + +########################################################### + +message(STATUS "Test 6: RELATIVE and REQUIRED_HEADERS") +set(camelcase_headers) +set(req_headers) +set(expfiles "${CMAKE_CURRENT_BINARY_DIR}/HeadTest2" + "${CMAKE_CURRENT_BINARY_DIR}/HeadTest3") +set(origfiles headtest2.h headtest3.h) +set(origpaths "${CMAKE_CURRENT_SOURCE_DIR}/headsubdir/headtest2.h" + "${CMAKE_CURRENT_SOURCE_DIR}/headsubdir/headtest3.h") +file(REMOVE ${expfiles}) +ecm_generate_headers( + camelcase_headers + HEADER_NAMES HeadTest2 HeadTest3 + RELATIVE headsubdir + REQUIRED_HEADERS req_headers +) +if (NOT "${origpaths}" STREQUAL "${req_headers}") + message(FATAL_ERROR "REQUIRED_HEADERS var was set to \"${req_headers}\" instead of \"${origpaths}\"") +endif() +if (NOT "${expfiles}" STREQUAL "${camelcase_headers}") + message(FATAL_ERROR "camelcase_headers was set to \"${camelcase_headers}\" instead of \"${expfiles}\"") +endif() +check_files(GENERATED ${expfiles} + ORIGINALS ${origfiles}) + + +########################################################### + +message(STATUS "Test 7: OUTPUT_DIR and REQUIRED_HEADERS") +set(camelcase_headers) +set(req_headers) +set(expfiles "${CMAKE_CURRENT_BINARY_DIR}/testdir/HeadTest1" + "${CMAKE_CURRENT_BINARY_DIR}/testdir/HeadTest2") +set(origfiles headtest1.h headtest2.h) +set(origpaths "${CMAKE_CURRENT_SOURCE_DIR}/headtest1.h" + "${CMAKE_CURRENT_SOURCE_DIR}/headtest2.h") +file(REMOVE ${expfiles}) +ecm_generate_headers( + camelcase_headers + HEADER_NAMES HeadTest1 HeadTest2 + OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/testdir" + REQUIRED_HEADERS req_headers +) +if (NOT "${origpaths}" STREQUAL "${req_headers}") + message(FATAL_ERROR "REQUIRED_HEADERS var was set to \"${req_headers}\" instead of \"${origpaths}\"") +endif() +if (NOT "${expfiles}" STREQUAL "${camelcase_headers}") + message(FATAL_ERROR "camelcase_headers was set to \"${camelcase_headers}\" instead of \"${expfiles}\"") +endif() +check_files(GENERATED ${expfiles} + ORIGINALS ${origfiles}) + + +########################################################### + +message(STATUS "Test 8: PREFIX and REQUIRED_HEADERS") +set(camelcase_headers) +set(req_headers) +set(expfiles "${CMAKE_CURRENT_BINARY_DIR}/Module/HeadTest1" + "${CMAKE_CURRENT_BINARY_DIR}/Module/HeadTest2") +set(intermediatefiles module/headtest1.h module/headtest2.h) +set(origfiles "${CMAKE_CURRENT_SOURCE_DIR}/headtest1.h" + "${CMAKE_CURRENT_SOURCE_DIR}/headtest2.h") +set(origpaths ${origfiles}) +file(REMOVE ${expfiles} ${intermediatefiles}) +ecm_generate_headers( + camelcase_headers + HEADER_NAMES HeadTest1 HeadTest2 + PREFIX Module + REQUIRED_HEADERS req_headers +) +if (NOT "${origpaths}" STREQUAL "${req_headers}") + message(FATAL_ERROR "REQUIRED_HEADERS var was set to \"${req_headers}\" instead of \"${origpaths}\"") +endif() +if (NOT "${expfiles}" STREQUAL "${camelcase_headers}") + message(FATAL_ERROR "camelcase_headers was set to \"${camelcase_headers}\" instead of \"${expfiles}\"") +endif() +check_files(GENERATED ${expfiles} + ORIGINALS ${intermediatefiles}) +check_files(GENERATED ${expfiles} + ORIGINALS ${intermediatefiles}) + + +########################################################### + +message(STATUS "Test 9: REQUIRED_HEADERS (duplicate var)") +set(all_headers) +set(expfiles "${CMAKE_CURRENT_BINARY_DIR}/HeadTest1" + "${CMAKE_CURRENT_BINARY_DIR}/HeadTest2") +set(origfiles headtest1.h headtest2.h) +set(origpaths "${CMAKE_CURRENT_SOURCE_DIR}/headtest1.h" + "${CMAKE_CURRENT_SOURCE_DIR}/headtest2.h") +file(REMOVE ${expfiles}) +ecm_generate_headers( + all_headers + HEADER_NAMES HeadTest1 HeadTest2 + REQUIRED_HEADERS all_headers +) +list(SORT all_headers) +set(exp_headers ${expfiles} ${origpaths}) +list(SORT exp_headers) +if (NOT "${exp_headers}" STREQUAL "${all_headers}") + message(FATAL_ERROR "combined headers var was set to \"${all_headers}\" instead of \"${exp_headers}\"") +endif() +check_files(GENERATED ${expfiles} + ORIGINALS ${origfiles}) + + +# vim:ft=cmake -- cgit v1.2.1