Commit e37edf0e894c0db8c09b2aed3a3ef7504d56baf4

Silvio Traversaro 2017-03-10T00:02:02

Merge pull request #29 from traversaro/add-appveyor Fix tests in Visual Studio 2015 and add AppVeyor support

diff --git a/.appveyor.yml b/.appveyor.yml
new file mode 100644
index 0000000..d97a44e
--- /dev/null
+++ b/.appveyor.yml
@@ -0,0 +1,74 @@
+# Copyright (c) 2014, Ruslan Baratov
+# Copyright (c) 2014, 2016 Alexander Lamaison
+# Copyright (c) 2017 Silvio Traversaro
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright notice, this
+#   list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above copyright notice,
+#   this list of conditions and the following disclaimer in the documentation
+#   and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+os: Visual Studio 2015
+
+environment:
+  matrix:
+    - GENERATOR: "Visual Studio 14 2015"
+      BUILD_SHARED_LIBS: ON
+
+    - GENERATOR: "Visual Studio 14 2015"
+      BUILD_SHARED_LIBS: OFF
+
+    - GENERATOR: "Visual Studio 12 2013"
+      BUILD_SHARED_LIBS: ON
+
+    - GENERATOR: "Visual Studio 12 2013"
+      BUILD_SHARED_LIBS: OFF
+
+platform:
+  - x86
+  - x64
+
+configuration:
+  - Debug
+  - Release
+  
+build_script:
+  - ps: if($env:PLATFORM -eq "x64") { $env:CMAKE_GEN_SUFFIX=" Win64" }
+  - md build
+  - cd build
+  - cmake "-G%GENERATOR%%CMAKE_GEN_SUFFIX%" -DBUILD_SHARED_LIBS=%BUILD_SHARED_LIBS% -DBUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX="./install" ..
+  - cmake --build . --config "%CONFIGURATION%"
+
+test_script:
+  - ctest --output-on-failure --build-config "%CONFIGURATION%"
+
+after_test:
+  - cmake --build . --config "%CONFIGURATION%" --target INSTALL
+  # Test also the use of dlfcn-win32 from an external CMake project 
+  # Append the instllation directory of dlfcn-win32 to CMAKE_PREFIX_PATH to make sure that the CMake project is found 
+  - set CMAKE_PREFIX_PATH=%APPVEYOR_BUILD_FOLDER%/build/install 
+  # Append the bin installation directory of dlfcn-win32 to the path to make sure that .dll are found 
+  - set PATH=%PATH%;%APPVEYOR_BUILD_FOLDER%/build/install/bin 
+  - cd ../cmake-test 
+  - md build
+  - cd build
+  - cmake "-G%GENERATOR%%CMAKE_GEN_SUFFIX%" -DBUILD_SHARED_LIBS=%BUILD_SHARED_LIBS% -DBUILD_TESTS=ON ..
+  - cmake --build . --config "%CONFIGURATION%"
+  - ctest --output-on-failure --build-config "%CONFIGURATION%"
+
diff --git a/README.md b/README.md
index cd6241a..40bb07b 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-dlfcn-win32
+dlfcn-win32 [![Build status](https://ci.appveyor.com/api/projects/status/7bebkh3crggtlnwt/branch/master?svg=true)](https://ci.appveyor.com/project/dlfcn-win32/dlfcn-win32/branch/master)
 ===========
 
 dlfcn-win32 is an implementation of dlfcn for Windows.
diff --git a/cmake-test/CMakeLists.txt b/cmake-test/CMakeLists.txt
new file mode 100644
index 0000000..532f2b8
--- /dev/null
+++ b/cmake-test/CMakeLists.txt
@@ -0,0 +1,14 @@
+# Simple CMake project to test the use of dlfcn-win32
+# imported target. The test compiled is the same compiled
+# as part of the main dlfcn-win32 project 
+
+cmake_minimum_required(VERSION 3.0)
+
+find_package(dlfcn-win32 REQUIRED)
+
+add_library(testdll SHARED ../testdll.c)
+set_target_properties(testdll PROPERTIES PREFIX "")
+add_executable(t_dlfcn ../test.c)
+target_link_libraries(t_dlfcn dlfcn-win32::dl)
+enable_testing()
+add_test(NAME t_dlfcn COMMAND t_dlfcn)
diff --git a/test.c b/test.c
index 878694e..14523ad 100644
--- a/test.c
+++ b/test.c
@@ -24,6 +24,7 @@
 #include <crtdbg.h>
 #endif
 #include <stdio.h>
+#include <string.h>
 #include "dlfcn.h"
 
 /* If these dlclose's fails, we don't care as the handles are going to be
@@ -41,7 +42,6 @@
                         RETURN_ERROR;  \
                     }                  \
                 } while( 0 )
-                        
 
 /* This is what this test does:
  * - Open library with RTLD_GLOBAL
@@ -74,7 +74,7 @@ int main()
     void *library;
     char *error;
     int (*function)( void );
-    int (*printf_local)( const char * );
+    size_t (*fwrite_local) ( const void *, size_t, size_t, FILE * );
     int (*nonexistentfunction)( void );
     int ret;
 
@@ -108,8 +108,8 @@ int main()
     else
         printf( "SUCCESS\tGot global handle: %p\n", global );
 
-    printf_local = dlsym(global, "printf");
-    if (!printf_local)
+    fwrite_local = dlsym(global, "fwrite");
+    if (!fwrite_local)
     {
         error = dlerror();
         printf("ERROR\tCould not get symbol from global handle: %s\n",
@@ -119,8 +119,10 @@ int main()
         RETURN_ERROR;
     }
     else
-        printf("SUCCESS\tGot symbol from global handle: %p\n", printf_local);
-    printf_local("Hello world from local printf!\n");
+        printf("SUCCESS\tGot symbol from global handle: %p\n", fwrite_local);
+    char * hello_world = "Hello world from local fwrite!\n";
+    fwrite_local(hello_world,sizeof(char),strlen(hello_world),stderr);
+    fflush(stderr);
 
     function = dlsym( library, "function" );
     if( !function )
@@ -304,7 +306,7 @@ int main()
                 error ? error : "" );
     }
 
-    function = dlsym(global, "printf");
+    function = dlsym(global, "fwrite");
     if (!function)
     {
         error = dlerror();
@@ -316,6 +318,7 @@ int main()
     }
     else
         printf("SUCCESS\tGot symbol from global handle: %p\n", function);
+    
 
     ret = dlclose( library );
     if( ret )