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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
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()