diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index 4c059aca6..db89e3e44 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -125,7 +125,7 @@ jobs: - name: Install dependencies run: | sudo apt update - sudo apt install libudev-dev libusb-1.0-0-dev python3-pip ninja-build + sudo apt install autoconf automake libudev-dev libusb-1.0-0-dev pkg-config python3-pip ninja-build sudo -H pip3 install meson - name: Configure CMake run: | @@ -138,6 +138,15 @@ jobs: - name: Build CMake Static working-directory: build/static run: make install + - name: Check pkg-config package + run: | + autoreconf --install --force hidapisrc/tests/pkg-config + mkdir -p build/pkg-config-test + cd build/pkg-config-test + CFLAGS="${GNU_COMPILE_FLAGS}" \ + PKG_CONFIG_PATH="${GITHUB_WORKSPACE}/install/shared/lib/pkgconfig" \ + "${GITHUB_WORKSPACE}/hidapisrc/tests/pkg-config/configure" + make V=1 - name: Run virtual-device tests (uhid -> hidraw; raw-gadget self-skips) working-directory: build/shared run: | @@ -156,6 +165,7 @@ jobs: with: files: "install/shared/lib/libhidapi-libusb.so, \ install/shared/lib/libhidapi-hidraw.so, \ + install/shared/lib/pkgconfig/hidapi.pc, \ install/shared/include/hidapi/hidapi.h, \ install/shared/include/hidapi/hidapi_libusb.h, \ install/static/lib/libhidapi-libusb.a, \ diff --git a/Makefile.am b/Makefile.am index 00bcb73cf..0bde02838 100644 --- a/Makefile.am +++ b/Makefile.am @@ -7,10 +7,30 @@ else pkgconfigdir=$(libdir)/pkgconfig endif -if OS_LINUX -pkgconfig_DATA=pc/hidapi-hidraw.pc pc/hidapi-libusb.pc -else pkgconfig_DATA=pc/hidapi.pc + +if OS_LINUX +pkgconfig_DATA += pc/hidapi-hidraw.pc pc/hidapi-libusb.pc +endif + +if OS_DARWIN +pkgconfig_DATA += pc/hidapi-darwin.pc +endif + +if OS_FREEBSD +pkgconfig_DATA += pc/hidapi-libusb.pc +endif + +if OS_KFREEBSD +pkgconfig_DATA += pc/hidapi-libusb.pc +endif + +if OS_HAIKU +pkgconfig_DATA += pc/hidapi-libusb.pc +endif + +if OS_WINDOWS +pkgconfig_DATA += pc/hidapi-winapi.pc endif SUBDIRS= @@ -45,7 +65,12 @@ if BUILD_TESTGUI SUBDIRS += testgui endif -EXTRA_DIST = udev doxygen +EXTRA_DIST = \ + udev \ + doxygen \ + tests/pkg-config/configure.ac \ + tests/pkg-config/Makefile.am \ + tests/pkg-config/test.c dist_doc_DATA = \ README.md \ diff --git a/configure.ac b/configure.ac index 1b2051052..70ba95c2d 100644 --- a/configure.ac +++ b/configure.ac @@ -237,12 +237,52 @@ AM_CONDITIONAL(OS_WINDOWS, test "x$os" = xwindows) AC_CONFIG_HEADERS([config.h]) +m4_define([HIDAPI_CONFIGURE_BACKEND_PC], [ + AC_CONFIG_FILES([$1:pc/hidapi-backend-specific.pc.in], [ + sed \ + -e "s|@HIDAPI_BACKEND_NAME@|$2|g" \ + -e "s|@HIDAPI_BACKEND_DESCRIPTION@|$3|g" \ + -e "s|@HIDAPI_BACKEND_LIBRARY_NAME@|$4|g" \ + "$1" > "$1.tmp" && + mv "$1.tmp" "$1" + ], [$5]) +]) + +HIDAPI_LIB_NAME=hidapi +HIDAPI_LIBUSB_LIB_NAME=hidapi if test "x$os" = "xlinux"; then - AC_CONFIG_FILES([pc/hidapi-hidraw.pc]) - AC_CONFIG_FILES([pc/hidapi-libusb.pc]) -else - AC_CONFIG_FILES([pc/hidapi.pc]) + HIDAPI_LIB_NAME=hidapi-hidraw + HIDAPI_LIBUSB_LIB_NAME=hidapi-libusb + HIDAPI_CONFIGURE_BACKEND_PC( + [pc/hidapi-hidraw.pc], + [hidapi-hidraw], + [C Library for USB/Bluetooth HID device access from Linux, Mac OS X, FreeBSD, and Windows. This is the hidraw implementation.], + [hidapi-hidraw]) +elif test "x$os" = "xdarwin"; then + HIDAPI_CONFIGURE_BACKEND_PC( + [pc/hidapi-darwin.pc], + [hidapi-darwin], + [C Library for USB/Bluetooth HID device access from Linux, Mac OS X, FreeBSD, and Windows. This is the Darwin implementation.], + [hidapi]) +elif test "x$os" = "xwindows"; then + HIDAPI_CONFIGURE_BACKEND_PC( + [pc/hidapi-winapi.pc], + [hidapi-winapi], + [C Library for USB/Bluetooth HID device access from Linux, Mac OS X, FreeBSD, and Windows. This is the WinAPI implementation.], + [hidapi]) +fi +if test "x$os" != "xdarwin" && test "x$os" != "xwindows"; then + HIDAPI_CONFIGURE_BACKEND_PC( + [pc/hidapi-libusb.pc], + [hidapi-libusb], + [C Library for USB HID device access from Linux, Mac OS X, FreeBSD, and Windows. This is the libusb implementation.], + [$hidapi_libusb_lib_name], + [hidapi_libusb_lib_name="$HIDAPI_LIBUSB_LIB_NAME"]) fi +m4_undefine([HIDAPI_CONFIGURE_BACKEND_PC]) + +AC_SUBST([HIDAPI_LIB_NAME]) +AC_CONFIG_FILES([pc/hidapi.pc]) AC_SUBST(LTLDFLAGS) diff --git a/libusb/CMakeLists.txt b/libusb/CMakeLists.txt index 62efd3c1e..e0be178da 100644 --- a/libusb/CMakeLists.txt +++ b/libusb/CMakeLists.txt @@ -105,4 +105,8 @@ if(HIDAPI_INSTALL_TARGETS) ) endif() -hidapi_configure_pc("${PROJECT_ROOT}/pc/hidapi-libusb.pc.in") +hidapi_configure_pc("${PROJECT_ROOT}/pc/hidapi-backend-specific.pc.in" + OUTPUT_NAME "hidapi-libusb" + LIBRARY_NAME "hidapi-libusb" + DESCRIPTION "C Library for USB HID device access from Linux, Mac OS X, FreeBSD, and Windows. This is the libusb implementation." +) diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt index 07251a250..1c34e09d2 100644 --- a/linux/CMakeLists.txt +++ b/linux/CMakeLists.txt @@ -36,4 +36,8 @@ if(HIDAPI_INSTALL_TARGETS) ) endif() -hidapi_configure_pc("${PROJECT_ROOT}/pc/hidapi-hidraw.pc.in") +hidapi_configure_pc("${PROJECT_ROOT}/pc/hidapi-backend-specific.pc.in" + OUTPUT_NAME "hidapi-hidraw" + LIBRARY_NAME "hidapi-hidraw" + DESCRIPTION "C Library for USB/Bluetooth HID device access from Linux, Mac OS X, FreeBSD, and Windows. This is the hidraw implementation." +) diff --git a/mac/CMakeLists.txt b/mac/CMakeLists.txt index 046a6eef4..473e98594 100644 --- a/mac/CMakeLists.txt +++ b/mac/CMakeLists.txt @@ -62,4 +62,8 @@ if(HIDAPI_INSTALL_TARGETS) ) endif() -hidapi_configure_pc("${PROJECT_ROOT}/pc/hidapi.pc.in") +hidapi_configure_pc("${PROJECT_ROOT}/pc/hidapi-backend-specific.pc.in" + OUTPUT_NAME "hidapi-darwin" + LIBRARY_NAME "hidapi" + DESCRIPTION "C Library for USB/Bluetooth HID device access from Linux, Mac OS X, FreeBSD, and Windows. This is the Darwin implementation." +) diff --git a/netbsd/CMakeLists.txt b/netbsd/CMakeLists.txt index e5688f316..6d6df8000 100644 --- a/netbsd/CMakeLists.txt +++ b/netbsd/CMakeLists.txt @@ -43,4 +43,8 @@ if(HIDAPI_INSTALL_TARGETS) ) endif() -hidapi_configure_pc("${PROJECT_ROOT}/pc/hidapi-netbsd.pc.in") +hidapi_configure_pc("${PROJECT_ROOT}/pc/hidapi-backend-specific.pc.in" + OUTPUT_NAME "hidapi-netbsd" + LIBRARY_NAME "hidapi-netbsd" + DESCRIPTION "C Library for USB/Bluetooth HID device access from Linux, Mac OS X, FreeBSD, and Windows. This is the netbsd implementation." +) diff --git a/pc/.gitignore b/pc/.gitignore index 6fd0ef029..8fb4bc610 100644 --- a/pc/.gitignore +++ b/pc/.gitignore @@ -1 +1,2 @@ *.pc +*.pc.tmp diff --git a/pc/hidapi-backend-specific.pc.in b/pc/hidapi-backend-specific.pc.in new file mode 100644 index 000000000..ecf1b6e7c --- /dev/null +++ b/pc/hidapi-backend-specific.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: @HIDAPI_BACKEND_NAME@ +Description: @HIDAPI_BACKEND_DESCRIPTION@ +URL: https://github.com/libusb/hidapi +Version: @VERSION@ +Libs: -L${libdir} -l@HIDAPI_BACKEND_LIBRARY_NAME@ +Cflags: -I${includedir}/hidapi diff --git a/pc/hidapi-hidraw.pc.in b/pc/hidapi-hidraw.pc.in deleted file mode 100644 index 28b9fe681..000000000 --- a/pc/hidapi-hidraw.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: hidapi-hidraw -Description: C Library for USB/Bluetooth HID device access from Linux, Mac OS X, FreeBSD, and Windows. This is the hidraw implementation. -URL: https://github.com/libusb/hidapi -Version: @VERSION@ -Libs: -L${libdir} -lhidapi-hidraw -Cflags: -I${includedir}/hidapi diff --git a/pc/hidapi-libusb.pc.in b/pc/hidapi-libusb.pc.in deleted file mode 100644 index d51e98f2b..000000000 --- a/pc/hidapi-libusb.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: hidapi-libusb -Description: C Library for USB HID device access from Linux, Mac OS X, FreeBSD, and Windows. This is the libusb implementation. -URL: https://github.com/libusb/hidapi -Version: @VERSION@ -Libs: -L${libdir} -lhidapi-libusb -Cflags: -I${includedir}/hidapi diff --git a/pc/hidapi-netbsd.pc.in b/pc/hidapi-netbsd.pc.in deleted file mode 100644 index fcb5ca215..000000000 --- a/pc/hidapi-netbsd.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: hidapi-netbsd -Description: C Library for USB/Bluetooth HID device access from Linux, Mac OS X, FreeBSD, and Windows. This is the netbsd implementation. -URL: https://github.com/libusb/hidapi -Version: @VERSION@ -Libs: -L${libdir} -lhidapi-netbsd -Cflags: -I${includedir}/hidapi diff --git a/pc/hidapi.pc.in b/pc/hidapi.pc.in index 75b11a5dd..f9aaf82c1 100644 --- a/pc/hidapi.pc.in +++ b/pc/hidapi.pc.in @@ -7,5 +7,5 @@ Name: hidapi Description: C Library for USB/Bluetooth HID device access from Linux, Mac OS X, FreeBSD, and Windows. URL: https://github.com/libusb/hidapi Version: @VERSION@ -Libs: -L${libdir} -lhidapi +Libs: -L${libdir} -l@HIDAPI_LIB_NAME@ Cflags: -I${includedir}/hidapi diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c5f4def97..fc804fd54 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -55,9 +55,16 @@ endif() # Helper(s) function(hidapi_configure_pc PC_IN_FILE) + set(oneValueArgs OUTPUT_NAME LIBRARY_NAME DESCRIPTION) + cmake_parse_arguments(HIDAPI_PC "" "${oneValueArgs}" "" ${ARGN}) file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/pc") set(VERSION "${VERSION}${VERSION_SUFFIX}") + if(HIDAPI_PC_LIBRARY_NAME) + set(HIDAPI_LIB_NAME "${HIDAPI_PC_LIBRARY_NAME}") + else() + set(HIDAPI_LIB_NAME "hidapi") + endif() set(prefix "${CMAKE_INSTALL_PREFIX}") set(exec_prefix "\${prefix}") if(IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}") @@ -71,7 +78,14 @@ function(hidapi_configure_pc PC_IN_FILE) set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}") endif() - get_filename_component(PC_IN_FILENAME "${PC_IN_FILE}" NAME_WE) + if(HIDAPI_PC_OUTPUT_NAME) + set(PC_IN_FILENAME "${HIDAPI_PC_OUTPUT_NAME}") + else() + get_filename_component(PC_IN_FILENAME "${PC_IN_FILE}" NAME_WE) + endif() + set(HIDAPI_BACKEND_NAME "${PC_IN_FILENAME}") + set(HIDAPI_BACKEND_DESCRIPTION "${HIDAPI_PC_DESCRIPTION}") + set(HIDAPI_BACKEND_LIBRARY_NAME "${HIDAPI_LIB_NAME}") set(PC_FILE "${CMAKE_CURRENT_BINARY_DIR}/pc/${PC_IN_FILENAME}.pc") configure_file("${PC_IN_FILE}" "${PC_FILE}" @ONLY) if(HIDAPI_INSTALL_TARGETS) @@ -187,6 +201,11 @@ endif() add_library(hidapi::hidapi ALIAS hidapi_${EXPORT_ALIAS}) +get_target_property(HIDAPI_LIB_NAME hidapi_${EXPORT_ALIAS} OUTPUT_NAME) +hidapi_configure_pc("${PROJECT_ROOT}/pc/hidapi.pc.in" + LIBRARY_NAME "${HIDAPI_LIB_NAME}" +) + if(HIDAPI_INSTALL_TARGETS) include(CMakePackageConfigHelpers) set(EXPORT_DENERATED_LOCATION "${CMAKE_BINARY_DIR}/export_generated") diff --git a/tests/pkg-config/Makefile.am b/tests/pkg-config/Makefile.am new file mode 100644 index 000000000..ca003c25f --- /dev/null +++ b/tests/pkg-config/Makefile.am @@ -0,0 +1,5 @@ +noinst_PROGRAMS = hidapi-pkg-config-test + +hidapi_pkg_config_test_SOURCES = test.c +hidapi_pkg_config_test_CPPFLAGS = $(HIDAPI_CFLAGS) +hidapi_pkg_config_test_LDADD = $(HIDAPI_LIBS) diff --git a/tests/pkg-config/configure.ac b/tests/pkg-config/configure.ac new file mode 100644 index 000000000..c3473011b --- /dev/null +++ b/tests/pkg-config/configure.ac @@ -0,0 +1,11 @@ +AC_PREREQ([2.69]) +AC_INIT([hidapi-pkg-config-test], [1.0]) +AC_CONFIG_SRCDIR([test.c]) +AM_INIT_AUTOMAKE([foreign]) + +AC_PROG_CC +PKG_PROG_PKG_CONFIG +PKG_CHECK_MODULES([HIDAPI], [hidapi]) + +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT diff --git a/tests/pkg-config/test.c b/tests/pkg-config/test.c new file mode 100644 index 000000000..d934ac0e6 --- /dev/null +++ b/tests/pkg-config/test.c @@ -0,0 +1,6 @@ +#include + +int main(void) +{ + return hid_version() ? 0 : 1; +} diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt index 005978366..d820f1ffb 100644 --- a/windows/CMakeLists.txt +++ b/windows/CMakeLists.txt @@ -61,7 +61,11 @@ if(HIDAPI_INSTALL_TARGETS) ) endif() -hidapi_configure_pc("${PROJECT_ROOT}/pc/hidapi.pc.in") +hidapi_configure_pc("${PROJECT_ROOT}/pc/hidapi-backend-specific.pc.in" + OUTPUT_NAME "hidapi-winapi" + LIBRARY_NAME "hidapi" + DESCRIPTION "C Library for USB/Bluetooth HID device access from Linux, Mac OS X, FreeBSD, and Windows. This is the WinAPI implementation." +) if(HIDAPI_WITH_TESTS) add_subdirectory(test)