From 0db2c8505e3236c37d500c2d4afb9efbc675fdfc Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 29 Sep 2009 16:39:43 -0400 Subject: [PATCH] Test use of module .def files for MS tools This adds a "ModuleDefinition" test enabled when using MSVC tools. It checks that .def files can be used to export .dll and .exe symbols and create corresponding .lib files that can be linked. See issue #9613. --- Tests/CMakeLists.txt | 1 + Tests/ModuleDefinition/CMakeLists.txt | 22 ++++++++++++++++++++++ Tests/ModuleDefinition/example_dll.c | 1 + Tests/ModuleDefinition/example_dll.def | 2 ++ Tests/ModuleDefinition/example_dll_2.c | 1 + Tests/ModuleDefinition/example_dll_2.def | 2 ++ Tests/ModuleDefinition/example_exe.c | 14 ++++++++++++++ Tests/ModuleDefinition/example_exe.def | 2 ++ Tests/ModuleDefinition/example_mod_1.c | 21 +++++++++++++++++++++ 9 files changed, 66 insertions(+) create mode 100644 Tests/ModuleDefinition/CMakeLists.txt create mode 100644 Tests/ModuleDefinition/example_dll.c create mode 100644 Tests/ModuleDefinition/example_dll.def create mode 100644 Tests/ModuleDefinition/example_dll_2.c create mode 100644 Tests/ModuleDefinition/example_dll_2.def create mode 100644 Tests/ModuleDefinition/example_exe.c create mode 100644 Tests/ModuleDefinition/example_exe.def create mode 100644 Tests/ModuleDefinition/example_mod_1.c diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index 2f5980dc4..4fdd2865f 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -846,6 +846,7 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=CVS -P ${CMake_SOURCE_DIR}/Utilities/Rel IF(CMAKE_TEST_MSVC) ADD_TEST_MACRO(PrecompiledHeader foo) + ADD_TEST_MACRO(ModuleDefinition example_exe) ENDIF(CMAKE_TEST_MSVC) IF("${CMAKE_TEST_GENERATOR}" MATCHES "Makefile") diff --git a/Tests/ModuleDefinition/CMakeLists.txt b/Tests/ModuleDefinition/CMakeLists.txt new file mode 100644 index 000000000..0cef0c773 --- /dev/null +++ b/Tests/ModuleDefinition/CMakeLists.txt @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 2.6) +project(ModuleDefinition C) + +# Test .def file source recognition for DLLs. +add_library(example_dll SHARED example_dll.c example_dll.def) + +# Test /DEF: flag recognition for VS. +if(MSVC) + add_library(example_dll_2 SHARED example_dll_2.c) + set_property(TARGET example_dll_2 PROPERTY LINK_FLAGS + /DEF:"${ModuleDefinition_SOURCE_DIR}/example_dll_2.def") + set(example_dll_2 example_dll_2) +endif() + +# Test .def file source recognition for EXEs. +add_executable(example_exe example_exe.c example_exe.def) +set_property(TARGET example_exe PROPERTY ENABLE_EXPORTS 1) +target_link_libraries(example_exe example_dll ${example_dll_2}) + +# Test linking to the executable. +add_library(example_mod_1 MODULE example_mod_1.c) +target_link_libraries(example_mod_1 example_exe example_dll ${example_dll_2}) diff --git a/Tests/ModuleDefinition/example_dll.c b/Tests/ModuleDefinition/example_dll.c new file mode 100644 index 000000000..88b3904a7 --- /dev/null +++ b/Tests/ModuleDefinition/example_dll.c @@ -0,0 +1 @@ +int example_dll_function(void) { return 0; } diff --git a/Tests/ModuleDefinition/example_dll.def b/Tests/ModuleDefinition/example_dll.def new file mode 100644 index 000000000..df64fb3c1 --- /dev/null +++ b/Tests/ModuleDefinition/example_dll.def @@ -0,0 +1,2 @@ +EXPORTS +example_dll_function diff --git a/Tests/ModuleDefinition/example_dll_2.c b/Tests/ModuleDefinition/example_dll_2.c new file mode 100644 index 000000000..9d79acdd3 --- /dev/null +++ b/Tests/ModuleDefinition/example_dll_2.c @@ -0,0 +1 @@ +int example_dll_2_function(void) { return 0; } diff --git a/Tests/ModuleDefinition/example_dll_2.def b/Tests/ModuleDefinition/example_dll_2.def new file mode 100644 index 000000000..8eba7f9cd --- /dev/null +++ b/Tests/ModuleDefinition/example_dll_2.def @@ -0,0 +1,2 @@ +EXPORTS +example_dll_2_function diff --git a/Tests/ModuleDefinition/example_exe.c b/Tests/ModuleDefinition/example_exe.c new file mode 100644 index 000000000..60cde6aae --- /dev/null +++ b/Tests/ModuleDefinition/example_exe.c @@ -0,0 +1,14 @@ +extern int __declspec(dllimport) example_dll_function(void); +#ifdef _MSC_VER +extern int __declspec(dllimport) example_dll_2_function(void); +#endif +int example_exe_function(void) { return 0; } +int main(void) +{ + return + example_dll_function() + +#ifdef _MSC_VER + example_dll_2_function() + +#endif + example_exe_function(); +} diff --git a/Tests/ModuleDefinition/example_exe.def b/Tests/ModuleDefinition/example_exe.def new file mode 100644 index 000000000..2a0df1f84 --- /dev/null +++ b/Tests/ModuleDefinition/example_exe.def @@ -0,0 +1,2 @@ +EXPORTS +example_exe_function diff --git a/Tests/ModuleDefinition/example_mod_1.c b/Tests/ModuleDefinition/example_mod_1.c new file mode 100644 index 000000000..483f60e11 --- /dev/null +++ b/Tests/ModuleDefinition/example_mod_1.c @@ -0,0 +1,21 @@ +#ifdef __WATCOMC__ +# define MODULE_CCONV __cdecl +#else +# define MODULE_CCONV +#endif + +int __declspec(dllimport) example_exe_function(void); +int __declspec(dllimport) example_dll_function(void); +#ifdef _MSC_VER +int __declspec(dllimport) example_dll_2_function(void); +#endif + +__declspec(dllexport) int MODULE_CCONV example_mod_1_function(int n) +{ + return + example_dll_function() + +#ifdef _MSC_VER + example_dll_2_function() + +#endif + example_exe_function() + n; +}