diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml
index 83ebe190a..8f61dc3f0 100644
--- a/.github/workflows/builds.yml
+++ b/.github/workflows/builds.yml
@@ -90,6 +90,15 @@ jobs:
cd build/static_test
make install
+ - name: Check C++ portability build
+ run: |
+ rm -rf build/cxx
+ cmake -B build/cxx -S hidapisrc \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DHIDAPI_BUILD_AS_CXX=ON \
+ "-DCMAKE_CXX_FLAGS=-Wall -Wextra -Werror"
+ cmake --build build/cxx
+
- name: Check Meson build
run: |
meson setup build_meson hidapisrc
@@ -154,6 +163,15 @@ jobs:
cd build/static_test
make install
+ - name: Check C++ portability build
+ run: |
+ rm -rf build/cxx
+ cmake -B build/cxx -S hidapisrc \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DHIDAPI_BUILD_AS_CXX=ON \
+ "-DCMAKE_CXX_FLAGS=-Wall -Wextra -Werror -Wformat-signedness"
+ cmake --build build/cxx
+
- name: Check Meson build
run: |
meson setup build_meson hidapisrc
@@ -206,6 +224,14 @@ jobs:
working-directory: build/msvc
run: ctest -C RelWithDebInfo --no-compress-output --output-on-failure
+ - name: Configure CMake MSVC C++
+ shell: cmd
+ run: |
+ cmake -B build\msvc_cxx -S hidapisrc -DCMAKE_BUILD_TYPE=Release -DHIDAPI_BUILD_AS_CXX=ON -DCMAKE_CXX_STANDARD=20 "-DCMAKE_CXX_FLAGS=%MSVC_COMPILE_FLAGS%"
+ - name: Build CMake MSVC C++
+ working-directory: build/msvc_cxx
+ run: cmake --build . --config Release
+
- name: Configure CMake NMake MSVC
shell: cmd
run: |
diff --git a/BUILD.cmake.md b/BUILD.cmake.md
index 573f910de..cf500e915 100644
--- a/BUILD.cmake.md
+++ b/BUILD.cmake.md
@@ -101,6 +101,13 @@ currently this option is only available on Windows, since only Windows backend h
+
+ Testing-only variables
+
+ - `HIDAPI_BUILD_AS_CXX` - when set to TRUE, the HIDAPI C source files are compiled with a C++ compiler instead of a C compiler. Useful to confirm that HIDAPI's sources stay compatible with consumers that include them into a C++ translation unit. Not intended for production builds; defaults to FALSE.
+
+
+
To see all most-useful CMake variables available for HIDAPI, one of the most convenient ways is too use [`cmake-gui`](https://cmake.org/cmake/help/latest/manual/cmake-gui.1.html) tool ([example](https://cmake.org/runningcmake/)).
_NOTE_: HIDAPI packages built by CMake can be used with `pkg-config`, as if built with [Autotools](BUILD.autotools.md).
diff --git a/libusb/CMakeLists.txt b/libusb/CMakeLists.txt
index 2228bd6c0..62efd3c1e 100644
--- a/libusb/CMakeLists.txt
+++ b/libusb/CMakeLists.txt
@@ -4,6 +4,9 @@ add_library(hidapi_libusb
${HIDAPI_PUBLIC_HEADERS}
hid.c
)
+if(HIDAPI_BUILD_AS_CXX)
+ set_source_files_properties(hid.c PROPERTIES LANGUAGE CXX)
+endif()
target_link_libraries(hidapi_libusb PUBLIC hidapi_include)
if(TARGET usb-1.0)
diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt
index dda5c8176..07251a250 100644
--- a/linux/CMakeLists.txt
+++ b/linux/CMakeLists.txt
@@ -2,6 +2,9 @@ add_library(hidapi_hidraw
${HIDAPI_PUBLIC_HEADERS}
hid.c
)
+if(HIDAPI_BUILD_AS_CXX)
+ set_source_files_properties(hid.c PROPERTIES LANGUAGE CXX)
+endif()
target_link_libraries(hidapi_hidraw PUBLIC hidapi_include)
find_package(Threads REQUIRED)
diff --git a/mac/CMakeLists.txt b/mac/CMakeLists.txt
index 8acd649c7..046a6eef4 100644
--- a/mac/CMakeLists.txt
+++ b/mac/CMakeLists.txt
@@ -4,6 +4,9 @@ add_library(hidapi_darwin
${HIDAPI_PUBLIC_HEADERS}
hid.c
)
+if(HIDAPI_BUILD_AS_CXX)
+ set_source_files_properties(hid.c PROPERTIES LANGUAGE CXX)
+endif()
find_package(Threads REQUIRED)
diff --git a/mac/hid.c b/mac/hid.c
index a91bc1902..4ef045536 100644
--- a/mac/hid.c
+++ b/mac/hid.c
@@ -339,7 +339,7 @@ static bool try_get_ioregistry_int_property(io_service_t service, CFStringRef pr
if (ref) {
if (CFGetTypeID(ref) == CFNumberGetTypeID()) {
- result = CFNumberGetValue(ref, kCFNumberSInt32Type, out_val);
+ result = CFNumberGetValue((CFNumberRef) ref, kCFNumberSInt32Type, out_val);
}
CFRelease(ref);
@@ -544,7 +544,7 @@ static struct hid_device_info *create_device_info_with_usage(IOHIDDeviceRef dev,
{
unsigned short dev_vid;
unsigned short dev_pid;
- int BUF_LEN = 256;
+ const int BUF_LEN = 256;
wchar_t buf[BUF_LEN];
CFTypeRef transport_prop;
@@ -586,7 +586,7 @@ static struct hid_device_info *create_device_info_with_usage(IOHIDDeviceRef dev,
so for (max) "path" string 'DevSrvsID:18446744073709551615' we would need
9+1+20+1=31 bytes buffer, but allocate 32 for simple alignment */
const size_t path_len = 32;
- cur_dev->path = calloc(1, path_len);
+ cur_dev->path = (char *) calloc(1, path_len);
if (cur_dev->path != NULL) {
snprintf(cur_dev->path, path_len, "DevSrvsID:%llu", entry_id);
}
diff --git a/netbsd/CMakeLists.txt b/netbsd/CMakeLists.txt
index 9be903c67..e5688f316 100644
--- a/netbsd/CMakeLists.txt
+++ b/netbsd/CMakeLists.txt
@@ -2,6 +2,9 @@ add_library(hidapi_netbsd
${HIDAPI_PUBLIC_HEADERS}
hid.c
)
+if(HIDAPI_BUILD_AS_CXX)
+ set_source_files_properties(hid.c PROPERTIES LANGUAGE CXX)
+endif()
target_link_libraries(hidapi_netbsd PUBLIC hidapi_include)
find_package(Threads REQUIRED)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index e663c3fd6..c5f4def97 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -38,6 +38,12 @@ endif()
if(NOT DEFINED CMAKE_POSITION_INDEPENDENT_CODE)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
endif()
+if(NOT DEFINED HIDAPI_BUILD_AS_CXX)
+ set(HIDAPI_BUILD_AS_CXX FALSE)
+endif()
+if(HIDAPI_BUILD_AS_CXX)
+ enable_language(CXX)
+endif()
get_directory_property(IS_EXCLUDE_FROM_ALL EXCLUDE_FROM_ALL)
if(IS_EXCLUDE_FROM_ALL)
diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt
index d230c703b..005978366 100644
--- a/windows/CMakeLists.txt
+++ b/windows/CMakeLists.txt
@@ -18,6 +18,9 @@ add_library(hidapi_winapi
${HIDAPI_PUBLIC_HEADERS}
${SOURCES}
)
+if(HIDAPI_BUILD_AS_CXX)
+ set_source_files_properties(hid.c hidapi_descriptor_reconstruct.c PROPERTIES LANGUAGE CXX)
+endif()
target_link_libraries(hidapi_winapi
PUBLIC hidapi_include
)