diff --git a/Tests/Testing/CMakeLists.txt b/Tests/Testing/CMakeLists.txt index 462f20f59..f85740705 100644 --- a/Tests/Testing/CMakeLists.txt +++ b/Tests/Testing/CMakeLists.txt @@ -54,7 +54,34 @@ ADD_TEST(testing.1 ${Testing_BINARY_DIR}/bin/testing) ADD_SUBDIRECTORY(Sub/Sub2) # Per-config target name test. +ADD_LIBRARY(pcStatic STATIC pcStatic.c) +SET_PROPERTY(TARGET pcStatic PROPERTY RELEASE_POSTFIX -opt) +SET_PROPERTY(TARGET pcStatic PROPERTY DEBUG_POSTFIX -dbg) +ADD_LIBRARY(pcShared SHARED pcShared.c) +SET_PROPERTY(TARGET pcShared PROPERTY RELEASE_POSTFIX -opt) +SET_PROPERTY(TARGET pcShared PROPERTY DEBUG_POSTFIX -dbg) +SET_PROPERTY(TARGET pcShared PROPERTY VERSION 1.2) +SET_PROPERTY(TARGET pcShared PROPERTY SOVERSION 3) +IF(NOT WIN32) + SET(soname_file -DpcShared_soname_file=$) +ENDIF() ADD_EXECUTABLE(perconfig perconfig.c) +TARGET_LINK_LIBRARIES(perconfig pcStatic pcShared) SET_PROPERTY(TARGET perconfig PROPERTY RELEASE_POSTFIX -opt) SET_PROPERTY(TARGET perconfig PROPERTY DEBUG_POSTFIX -dbg) ADD_TEST(NAME testing.perconfig COMMAND perconfig) + +# Test using a driver script with generator expressions. +ADD_TEST(NAME testing.driver + COMMAND ${CMAKE_COMMAND} + -Dconfiguration=$ + -Dperconfig_file_dir=$ + -Dperconfig_file_name=$ + -Dperconfig_file=$ + -DpcStatic_file=$ + -DpcStatic_linker_file=$ + -DpcShared_file=$ + -DpcShared_linker_file=$ + ${soname_file} + -P ${Testing_SOURCE_DIR}/driver.cmake + ) diff --git a/Tests/Testing/driver.cmake b/Tests/Testing/driver.cmake new file mode 100644 index 000000000..4a93acc6c --- /dev/null +++ b/Tests/Testing/driver.cmake @@ -0,0 +1,40 @@ +# Print values for human reference. +foreach(v + configuration + perconfig_file_dir + perconfig_file_name + perconfig_file + pcStatic_file + pcStatic_linker_file + pcShared_file + pcShared_linker_file + pcShared_soname_file + ) + message("${v}=${${v}}") +endforeach() + +# Verify that file names match as expected. +set(pc_file_components ${perconfig_file_dir}/${perconfig_file_name}) +if(NOT "${pc_file_components}" STREQUAL "${perconfig_file}") + message(SEND_ERROR + "File components ${pc_file_components} do not match ${perconfig_file}") +endif() +if(NOT "${pcStatic_file}" STREQUAL "${pcStatic_linker_file}") + message(SEND_ERROR + "pcStatic_file does not match pcStatic_linker_file:\n" + " ${pcStatic_file}\n" + " ${pcStatic_linker_file}\n" + ) +endif() + +# Verify that the implementation files are named correctly. +foreach(lib pcStatic pcShared) + file(STRINGS "${${lib}_file}" info LIMIT_COUNT 1 REGEX "INFO:[^[]*\\[") + if(NOT "${info}" MATCHES ".*INFO:symbol\\[${lib}\\].*") + message(SEND_ERROR "No INFO:symbol[${lib}] found in:\n ${${lib}_file}") + endif() +endforeach() +execute_process(COMMAND ${perconfig_file} RESULT_VARIABLE result) +if(result) + message(SEND_ERROR "Error running:\n ${perconfig_file}\n(${result})") +endif() diff --git a/Tests/Testing/pcShared.c b/Tests/Testing/pcShared.c new file mode 100644 index 000000000..b08fadc94 --- /dev/null +++ b/Tests/Testing/pcShared.c @@ -0,0 +1,5 @@ +#include "pcShared.h" +const char* pcShared(void) +{ + return "INFO:symbol[pcShared]"; +} diff --git a/Tests/Testing/pcShared.h b/Tests/Testing/pcShared.h new file mode 100644 index 000000000..59a6ef43b --- /dev/null +++ b/Tests/Testing/pcShared.h @@ -0,0 +1,16 @@ +#ifndef pcShared_h +#define pcShared_h + +#ifdef _WIN32 +# ifdef pcShared_EXPORTS +# define PC_EXPORT __declspec(dllexport) +# else +# define PC_EXPORT __declspec(dllimport) +# endif +#else +# define PC_EXPORT +#endif + +PC_EXPORT const char* pcShared(void); + +#endif diff --git a/Tests/Testing/pcStatic.c b/Tests/Testing/pcStatic.c new file mode 100644 index 000000000..7e1bf512d --- /dev/null +++ b/Tests/Testing/pcStatic.c @@ -0,0 +1,4 @@ +const char* pcStatic(void) +{ + return "INFO:symbol[pcStatic]"; +} diff --git a/Tests/Testing/perconfig.c b/Tests/Testing/perconfig.c index f8b643afb..d942d4562 100644 --- a/Tests/Testing/perconfig.c +++ b/Tests/Testing/perconfig.c @@ -1,4 +1,8 @@ +#include "pcShared.h" +extern const char* pcStatic(void); int main() { + pcStatic(); + pcShared(); return 0; }