diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index 19a3a6b47..830c08735 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -156,12 +156,23 @@ IF(BUILD_TESTING) ${CMake_BINARY_DIR}/Tests/LoadCommand LoadedCommand) + ADD_TEST(LoadedCommandOneConfig ${CMake_BINARY_DIR}/Source/cmaketest + ${CMake_SOURCE_DIR}/Tests/LoadCommand + ${CMake_BINARY_DIR}/Tests/LoadCommandOneConfig + LoadedCommand ONLY_ONE_CONFIG) + ADD_TEST(complex ${CMake_BINARY_DIR}/Source/cmaketest ${CMake_SOURCE_DIR}/Tests/Complex ${CMake_BINARY_DIR}/Tests/Complex complex ${CMake_BINARY_DIR}/Tests/Complex/bin) + ADD_TEST(complexOneConfig ${CMake_BINARY_DIR}/Source/cmaketest + ${CMake_SOURCE_DIR}/Tests/Complex + ${CMake_BINARY_DIR}/Tests/ComplexOneConfig + complex + ${CMake_BINARY_DIR}/Tests/ComplexOneConfig/bin ONLY_ONE_CONFIG) + ADD_TEST(Example ${CMake_BINARY_DIR}/Source/cmaketest ${CMake_SOURCE_DIR}/Example ${CMake_BINARY_DIR}/Example diff --git a/Source/cmaketest.cxx b/Source/cmaketest.cxx index efb312ef3..515e97838 100644 --- a/Source/cmaketest.cxx +++ b/Source/cmaketest.cxx @@ -49,7 +49,16 @@ int do_cmaketest (int argc, char **argv) << "\t CMAKE_ARGS argument ...\n"; return 1; } - + bool onlyOneConfig = false; + if(argc > 3) + { + if(strcmp(argv[argc-1], "ONLY_ONE_CONFIG") == 0) + { + onlyOneConfig = true; + argc--; + } + } + // does the directory exist ? if (!cmSystemTools::FileIsDirectory(argv[2])) { @@ -138,16 +147,21 @@ int do_cmaketest (int argc, char **argv) return 1; } std::cout << "Done Generating build files.\n"; - - std::cout << "Generating build files (again)...\n"; - if (cm.Run(args) != 0) + // if the option ONLY_ONE_CONFIG is passed to the program + // only run the config step once + if(!onlyOneConfig) { - std::cerr << "Error: cmake execution failed\n"; - // return to the original directory - cmSystemTools::ChangeDirectory(cwd.c_str()); - return 1; + std::cout << "Generating build files (again)...\n"; + if (cm.Run(args) != 0) + { + std::cerr << "Error: cmake execution failed\n"; + // return to the original directory + cmSystemTools::ChangeDirectory(cwd.c_str()); + return 1; + } + std::cout << "Done Generating build files (again).\n"; } - std::cout << "Done Generating build files (again).\n"; + cmListFileCache::GetInstance()->ClearCache(); diff --git a/Tests/Complex/Executable/complex.cxx b/Tests/Complex/Executable/complex.cxx index d6d3839f2..730510d0d 100644 --- a/Tests/Complex/Executable/complex.cxx +++ b/Tests/Complex/Executable/complex.cxx @@ -10,6 +10,7 @@ extern "C" { } #include "cmStandardIncludes.h" #include "cmSystemTools.h" +#include "cmDynamicLoader.h" int cm_passed = 0; int cm_failed = 0; @@ -101,6 +102,31 @@ void TestDir(const char* filename) int main() { + std::string lib = BINARY_DIR; + lib += "/bin/"; + lib += cmDynamicLoader::LibPrefix(); + lib += "CMakeTestModule"; + lib += cmDynamicLoader::LibExtension(); + + cmLibHandle handle = cmDynamicLoader::OpenLibrary(lib.c_str()); + if(!handle) + { + cmFailed("Can not open CMakeTestModule"); + } + else + { + cmDynamicLoaderFunction fun = + cmDynamicLoader::GetSymbolAddress(handle, "ModuleFunction"); + typedef int (*TEST_FUNCTION)(); + TEST_FUNCTION testFun = (TEST_FUNCTION)fun; + int ret = (*testFun)(); + if(!ret) + { + cmFailed("ModuleFunction called from module did not return valid return"); + } + cmPassed("Module loaded and ModuleFunction called correctly"); + } + if(sharedFunction() != 1) { cmFailed("Call to sharedFunction from shared library failed."); diff --git a/Tests/Complex/Library/CMakeLists.txt b/Tests/Complex/Library/CMakeLists.txt index 9fccfc521..0df970b59 100644 --- a/Tests/Complex/Library/CMakeLists.txt +++ b/Tests/Complex/Library/CMakeLists.txt @@ -38,6 +38,7 @@ ENDIF(WIN32) # SOURCE_FILES(SharedLibrarySources sharedFile) ADD_LIBRARY(CMakeTestLibraryShared SHARED ${SharedLibrarySources}) +ADD_LIBRARY(CMakeTestModule MODULE moduleFile.c) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTEST_C_FLAGS") ADD_LIBRARY(CMakeTestCLibraryShared SHARED testConly.c) SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES FOO BAR) @@ -55,7 +56,7 @@ ENDIF(${FOO_BAR_VAR} MATCHES "BAR") # The 'complex' executable will then test if this file exists and remove it. # ADD_DEPENDENCIES(CMakeTestLibraryShared create_file) - +MESSAGE("complex bin dir is ${Complex_BINARY_DIR}") ADD_CUSTOM_COMMAND(COMMAND ${CREATE_FILE_EXE} ARGS "${Complex_BINARY_DIR}/Library/postbuild.txt" TARGET CMakeTestLibraryShared) diff --git a/Tests/Complex/Library/moduleFile.c b/Tests/Complex/Library/moduleFile.c new file mode 100644 index 000000000..608d750f1 --- /dev/null +++ b/Tests/Complex/Library/moduleFile.c @@ -0,0 +1,6 @@ +#include "moduleFile.h" + +int ModuleFunction() +{ + return 1; +} diff --git a/Tests/Complex/Library/moduleFile.h b/Tests/Complex/Library/moduleFile.h new file mode 100644 index 000000000..6b561e109 --- /dev/null +++ b/Tests/Complex/Library/moduleFile.h @@ -0,0 +1,12 @@ +#if defined(_WIN32) || defined(WIN32) /* Win32 version */ +#ifdef CMakeTestModule_EXPORTS +# define CMakeTest_EXPORT __declspec(dllexport) +#else +# define CMakeTest_EXPORT __declspec(dllimport) +#endif +#else +/* unix needs nothing */ +#define CMakeTest_EXPORT +#endif + +CMakeTest_EXPORT int ModuleFunction(); diff --git a/Tests/ComplexOneConfig/Executable/complex.cxx b/Tests/ComplexOneConfig/Executable/complex.cxx index d6d3839f2..730510d0d 100644 --- a/Tests/ComplexOneConfig/Executable/complex.cxx +++ b/Tests/ComplexOneConfig/Executable/complex.cxx @@ -10,6 +10,7 @@ extern "C" { } #include "cmStandardIncludes.h" #include "cmSystemTools.h" +#include "cmDynamicLoader.h" int cm_passed = 0; int cm_failed = 0; @@ -101,6 +102,31 @@ void TestDir(const char* filename) int main() { + std::string lib = BINARY_DIR; + lib += "/bin/"; + lib += cmDynamicLoader::LibPrefix(); + lib += "CMakeTestModule"; + lib += cmDynamicLoader::LibExtension(); + + cmLibHandle handle = cmDynamicLoader::OpenLibrary(lib.c_str()); + if(!handle) + { + cmFailed("Can not open CMakeTestModule"); + } + else + { + cmDynamicLoaderFunction fun = + cmDynamicLoader::GetSymbolAddress(handle, "ModuleFunction"); + typedef int (*TEST_FUNCTION)(); + TEST_FUNCTION testFun = (TEST_FUNCTION)fun; + int ret = (*testFun)(); + if(!ret) + { + cmFailed("ModuleFunction called from module did not return valid return"); + } + cmPassed("Module loaded and ModuleFunction called correctly"); + } + if(sharedFunction() != 1) { cmFailed("Call to sharedFunction from shared library failed."); diff --git a/Tests/ComplexOneConfig/Library/CMakeLists.txt b/Tests/ComplexOneConfig/Library/CMakeLists.txt index 9fccfc521..0df970b59 100644 --- a/Tests/ComplexOneConfig/Library/CMakeLists.txt +++ b/Tests/ComplexOneConfig/Library/CMakeLists.txt @@ -38,6 +38,7 @@ ENDIF(WIN32) # SOURCE_FILES(SharedLibrarySources sharedFile) ADD_LIBRARY(CMakeTestLibraryShared SHARED ${SharedLibrarySources}) +ADD_LIBRARY(CMakeTestModule MODULE moduleFile.c) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTEST_C_FLAGS") ADD_LIBRARY(CMakeTestCLibraryShared SHARED testConly.c) SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES FOO BAR) @@ -55,7 +56,7 @@ ENDIF(${FOO_BAR_VAR} MATCHES "BAR") # The 'complex' executable will then test if this file exists and remove it. # ADD_DEPENDENCIES(CMakeTestLibraryShared create_file) - +MESSAGE("complex bin dir is ${Complex_BINARY_DIR}") ADD_CUSTOM_COMMAND(COMMAND ${CREATE_FILE_EXE} ARGS "${Complex_BINARY_DIR}/Library/postbuild.txt" TARGET CMakeTestLibraryShared) diff --git a/Tests/ComplexOneConfig/Library/moduleFile.c b/Tests/ComplexOneConfig/Library/moduleFile.c new file mode 100644 index 000000000..608d750f1 --- /dev/null +++ b/Tests/ComplexOneConfig/Library/moduleFile.c @@ -0,0 +1,6 @@ +#include "moduleFile.h" + +int ModuleFunction() +{ + return 1; +} diff --git a/Tests/ComplexOneConfig/Library/moduleFile.h b/Tests/ComplexOneConfig/Library/moduleFile.h new file mode 100644 index 000000000..6b561e109 --- /dev/null +++ b/Tests/ComplexOneConfig/Library/moduleFile.h @@ -0,0 +1,12 @@ +#if defined(_WIN32) || defined(WIN32) /* Win32 version */ +#ifdef CMakeTestModule_EXPORTS +# define CMakeTest_EXPORT __declspec(dllexport) +#else +# define CMakeTest_EXPORT __declspec(dllimport) +#endif +#else +/* unix needs nothing */ +#define CMakeTest_EXPORT +#endif + +CMakeTest_EXPORT int ModuleFunction(); diff --git a/Tests/ComplexRelativePaths/Executable/complex.cxx b/Tests/ComplexRelativePaths/Executable/complex.cxx index d6d3839f2..730510d0d 100644 --- a/Tests/ComplexRelativePaths/Executable/complex.cxx +++ b/Tests/ComplexRelativePaths/Executable/complex.cxx @@ -10,6 +10,7 @@ extern "C" { } #include "cmStandardIncludes.h" #include "cmSystemTools.h" +#include "cmDynamicLoader.h" int cm_passed = 0; int cm_failed = 0; @@ -101,6 +102,31 @@ void TestDir(const char* filename) int main() { + std::string lib = BINARY_DIR; + lib += "/bin/"; + lib += cmDynamicLoader::LibPrefix(); + lib += "CMakeTestModule"; + lib += cmDynamicLoader::LibExtension(); + + cmLibHandle handle = cmDynamicLoader::OpenLibrary(lib.c_str()); + if(!handle) + { + cmFailed("Can not open CMakeTestModule"); + } + else + { + cmDynamicLoaderFunction fun = + cmDynamicLoader::GetSymbolAddress(handle, "ModuleFunction"); + typedef int (*TEST_FUNCTION)(); + TEST_FUNCTION testFun = (TEST_FUNCTION)fun; + int ret = (*testFun)(); + if(!ret) + { + cmFailed("ModuleFunction called from module did not return valid return"); + } + cmPassed("Module loaded and ModuleFunction called correctly"); + } + if(sharedFunction() != 1) { cmFailed("Call to sharedFunction from shared library failed."); diff --git a/Tests/ComplexRelativePaths/Library/CMakeLists.txt b/Tests/ComplexRelativePaths/Library/CMakeLists.txt index 9fccfc521..0df970b59 100644 --- a/Tests/ComplexRelativePaths/Library/CMakeLists.txt +++ b/Tests/ComplexRelativePaths/Library/CMakeLists.txt @@ -38,6 +38,7 @@ ENDIF(WIN32) # SOURCE_FILES(SharedLibrarySources sharedFile) ADD_LIBRARY(CMakeTestLibraryShared SHARED ${SharedLibrarySources}) +ADD_LIBRARY(CMakeTestModule MODULE moduleFile.c) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTEST_C_FLAGS") ADD_LIBRARY(CMakeTestCLibraryShared SHARED testConly.c) SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES FOO BAR) @@ -55,7 +56,7 @@ ENDIF(${FOO_BAR_VAR} MATCHES "BAR") # The 'complex' executable will then test if this file exists and remove it. # ADD_DEPENDENCIES(CMakeTestLibraryShared create_file) - +MESSAGE("complex bin dir is ${Complex_BINARY_DIR}") ADD_CUSTOM_COMMAND(COMMAND ${CREATE_FILE_EXE} ARGS "${Complex_BINARY_DIR}/Library/postbuild.txt" TARGET CMakeTestLibraryShared) diff --git a/Tests/ComplexRelativePaths/Library/moduleFile.c b/Tests/ComplexRelativePaths/Library/moduleFile.c new file mode 100644 index 000000000..608d750f1 --- /dev/null +++ b/Tests/ComplexRelativePaths/Library/moduleFile.c @@ -0,0 +1,6 @@ +#include "moduleFile.h" + +int ModuleFunction() +{ + return 1; +} diff --git a/Tests/ComplexRelativePaths/Library/moduleFile.h b/Tests/ComplexRelativePaths/Library/moduleFile.h new file mode 100644 index 000000000..6b561e109 --- /dev/null +++ b/Tests/ComplexRelativePaths/Library/moduleFile.h @@ -0,0 +1,12 @@ +#if defined(_WIN32) || defined(WIN32) /* Win32 version */ +#ifdef CMakeTestModule_EXPORTS +# define CMakeTest_EXPORT __declspec(dllexport) +#else +# define CMakeTest_EXPORT __declspec(dllimport) +#endif +#else +/* unix needs nothing */ +#define CMakeTest_EXPORT +#endif + +CMakeTest_EXPORT int ModuleFunction();