Commit 2821345eacb71222ed9acf31f193eda81daeec3f

Ralf Habacker 2020-11-02T13:06:55

cmake: add option ENABLE_WINE to enable support for running cross compiled tests with wine For details about the ENABLE_WINE option, which support three modes AUTO|ON|OFF see the documentation of cmake macro check_auto_option(). A custom path for the wine executable can be specified by adding -DWINE_EXECUTABLE=<path> to the cmake command line. The cmake related macros were copied from https://gitlab.freedesktop.org/dbus/dbus/-/blob/master/cmake/modules/Macros.cmake

diff --git a/CMakeLists.txt b/CMakeLists.txt
index ab20340..1c6fe4c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -6,9 +6,29 @@ endif ()
 
 project (dlfcn-win32 C)
 
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules")
+include(Macros)
+
 option(BUILD_SHARED_LIBS "shared/static libs" ON) 
 option(BUILD_TESTS "tests?" OFF)
 
+if(WIN32 AND NOT CMAKE_HOST_WIN32 AND CMAKE_CROSSCOMPILING AND BUILD_TESTS)
+    add_auto_option(ENABLE_WINE "Enable running tests with wine" AUTO)
+    find_program(WINE_EXECUTABLE wine)
+    check_auto_option(ENABLE_WINE "wine support" WINE_EXECUTABLE "wine executable")
+    if(ENABLE_WINE AND WINE_EXECUTABLE)
+        set(WRAPPER ${WINE_EXECUTABLE})
+        set(RUN_TESTS 1)
+        message(STATUS "Support to run cross compiled tests - enabled")
+    endif()
+elseif(BUILD_TESTS)
+    set(RUN_TESTS 1)
+endif()
+
+if(RUN_TESTS)
+    enable_testing()
+endif()
+
 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
@@ -16,6 +36,5 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
 add_subdirectory(src)
 
 if (BUILD_TESTS)
-    enable_testing()
     add_subdirectory(tests)
 endif()
diff --git a/cmake/modules/Macros.cmake b/cmake/modules/Macros.cmake
new file mode 100644
index 0000000..fa0f1fc
--- /dev/null
+++ b/cmake/modules/Macros.cmake
@@ -0,0 +1,32 @@
+#
+# provide option with three states AUTO, ON, OFF
+#
+macro(add_auto_option _name _text _default)
+    if(NOT DEFINED ${_name})
+        set(${_name} ${_default} CACHE STRING "${_text}" FORCE)
+    else()
+        set(${_name} ${_default} CACHE STRING "${_text}")
+    endif()
+    set_property(CACHE ${_name} PROPERTY STRINGS AUTO ON OFF)
+endmacro()
+
+#
+# Ensure that if a tristate ON/OFF/AUTO feature is set to ON,
+# its requirements have been met. Fail with a fatal error if not.
+#
+# _name: name of a variable ENABLE_FOO representing a tristate ON/OFF/AUTO feature
+# _text: human-readable description of the feature enabled by _name, for the
+#        error message
+# _var: name of a variable representing a system property we checked for,
+#       such as an executable that must exist for the feature enabled by _name to work
+# _vartext: what we checked for, for the error message
+#
+macro(check_auto_option _name _text _var _vartext)
+    set(_nameval ${${_name}})
+    set(_varval ${${_var}})
+    #message("debug: _name ${_name} ${_nameval}  _var ${_var} ${_varval}")
+    if(_nameval AND NOT _nameval STREQUAL "AUTO" AND NOT _varval)
+        message(FATAL_ERROR "${_text} requested but ${_vartext} not found")
+    endif()
+endmacro()
+
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 35b6931..5fc6c44 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -12,4 +12,6 @@ set_target_properties(testdll3 PROPERTIES PREFIX "")
 
 add_executable(t_dlfcn test.c)
 target_link_libraries(t_dlfcn dl)
-add_test(NAME t_dlfcn COMMAND $<TARGET_FILE:t_dlfcn> WORKING_DIRECTORY $<TARGET_FILE_DIR:t_dlfcn>)
+if(RUN_TESTS)
+    add_test(NAME t_dlfcn COMMAND ${WRAPPER} $<TARGET_FILE:t_dlfcn> WORKING_DIRECTORY $<TARGET_FILE_DIR:t_dlfcn>)
+endif()