|
|
@@ -0,0 +1,67 @@
|
|
|
+set(failure_test_executables
|
|
|
+ ${CMAKE_CURRENT_BINARY_DIR}/failure_test_targets)
|
|
|
+file(WRITE ${failure_test_executables} "")
|
|
|
+
|
|
|
+# Check if we should do anything. If the compiler doesn't support hidden
|
|
|
+# visibility, the failure tests won't fail, so just write an empty targets
|
|
|
+# list and punt.
|
|
|
+if(NOT WIN32 AND NOT CYGWIN AND NOT COMPILER_HAS_HIDDEN_VISIBILITY)
|
|
|
+ return()
|
|
|
+endif()
|
|
|
+
|
|
|
+# Read the input source file
|
|
|
+file(READ ${CMAKE_CURRENT_SOURCE_DIR}/exportheader_test.cpp content_post)
|
|
|
+set(content_pre "")
|
|
|
+
|
|
|
+# Generate source files for failure test executables
|
|
|
+set(counter 0)
|
|
|
+while(1)
|
|
|
+ # Find first occurrence of link error marker in remaining content
|
|
|
+ string(REGEX MATCH "//([^;\n]+;) LINK ERROR( [(][^)]+[)])?\n(.*)"
|
|
|
+ match "${content_post}")
|
|
|
+ if(match STREQUAL "")
|
|
|
+ # No more matches
|
|
|
+ break()
|
|
|
+ endif()
|
|
|
+
|
|
|
+ # Shift content buffers and extract failing statement
|
|
|
+ string(LENGTH "${content_post}" content_post_length)
|
|
|
+ string(LENGTH "${match}" matched_length)
|
|
|
+ math(EXPR shift_length "${content_post_length} - ${matched_length}")
|
|
|
+
|
|
|
+ string(SUBSTRING "${content_post}" 0 ${shift_length} shift)
|
|
|
+ set(content_pre "${content_pre}${shift}")
|
|
|
+ set(content_post "${CMAKE_MATCH_3}")
|
|
|
+ set(content_active "//${CMAKE_MATCH_1} LINK ERROR${CMAKE_MATCH_2}")
|
|
|
+ set(statement "${CMAKE_MATCH_1}")
|
|
|
+
|
|
|
+ # Check if potential error is conditional, and evaluate condition if so
|
|
|
+ string(REGEX REPLACE " [(]([^)]+)[)]" "\\1" condition "${CMAKE_MATCH_2}")
|
|
|
+ if(NOT condition STREQUAL "")
|
|
|
+ string(REGEX REPLACE " +" ";" condition "${condition}")
|
|
|
+ if(${condition})
|
|
|
+ else()
|
|
|
+ message(STATUS "Not testing '${statement}'; "
|
|
|
+ "condition (${condition}) is FALSE")
|
|
|
+ set(content_pre "${content_pre}// link error removed\n")
|
|
|
+ continue()
|
|
|
+ endif()
|
|
|
+ endif()
|
|
|
+
|
|
|
+ if(NOT skip)
|
|
|
+ message(STATUS "Creating failure test for '${statement}'")
|
|
|
+ math(EXPR counter "${counter} + 1")
|
|
|
+
|
|
|
+ # Write new source file
|
|
|
+ set(out ${CMAKE_CURRENT_BINARY_DIR}/exportheader_failtest-${counter}.cpp)
|
|
|
+ file(WRITE ${out} "${content_pre}${statement}\n${content_post}")
|
|
|
+
|
|
|
+ # Add executable for failure test
|
|
|
+ add_executable(GEH-fail-${counter} EXCLUDE_FROM_ALL ${out})
|
|
|
+ target_link_libraries(GEH-fail-${counter} ${link_libraries})
|
|
|
+ file(APPEND ${failure_test_executables} "GEH-fail-${counter}\n")
|
|
|
+ endif()
|
|
|
+
|
|
|
+ # Add placeholder where failing statement was removed
|
|
|
+ set(content_pre "${content_pre}${content_active}\n")
|
|
|
+endwhile()
|