From a6479690a3717bc53e62614a68f063e315a50c08 Mon Sep 17 00:00:00 2001 From: Vitali Lovich Date: Tue, 6 Sep 2011 11:46:00 +0100 Subject: [contrib] add non-officially supported CMake support --- .gitignore | 2 +- CMakeLists.txt | 49 ++++++++++++++++ cmake/modules/FindCoreFoundation.cmake | 17 ++++++ cmake/modules/FindIOKit.cmake | 20 +++++++ cmake/modules/LibFindMacros.cmake | 99 ++++++++++++++++++++++++++++++++ examples/CMakeLists.txt | 27 +++++++++ libusb/CMakeLists.txt | 100 ++++++++++++++++++++++++++++++++ libusb/config.cmake | 97 +++++++++++++++++++++++++++++++ libusb/config.h.cmake | 37 ++++++++++++ libusb/libusb-1.0.pc.cmake | 11 ++++ libusb/os/CMakeLists.txt | 101 +++++++++++++++++++++++++++++++++ 11 files changed, 559 insertions(+), 1 deletion(-) create mode 100644 CMakeLists.txt create mode 100644 cmake/modules/FindCoreFoundation.cmake create mode 100644 cmake/modules/FindIOKit.cmake create mode 100644 cmake/modules/LibFindMacros.cmake create mode 100644 examples/CMakeLists.txt create mode 100644 libusb/CMakeLists.txt create mode 100644 libusb/config.cmake create mode 100644 libusb/config.h.cmake create mode 100644 libusb/libusb-1.0.pc.cmake create mode 100644 libusb/os/CMakeLists.txt diff --git a/.gitignore b/.gitignore index d382111..1bb7437 100644 --- a/.gitignore +++ b/.gitignore @@ -16,7 +16,7 @@ configure aclocal.m4 compile config.guess -config.h* +config.h config.log config.status config.sub diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..493e3e1 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,49 @@ +cmake_minimum_required(VERSION 2.6) + +# Can be removed once CMake >= 2.8.4 is required +# this has to be set before the project directive +set(CMAKE_LEGACY_CYGWIN_WIN32 0) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules") + +project(libusb) + +option(WITHOUT_EXPERIMENTAL_WARNING "Disable the warning that CMake build is experimental whenever CMake is run" OFF) +if (NOT WITHOUT_EXPERIMENTAL_WARNING) + message(WARNING "The CMake build system is not officially endorsed. Support may or may not be provided on the libusb-devel@sourceforge.net mailing list") +endif() + +option(WITH_SHARED "Build a shared library" ON) +option(WITH_STATIC "Build a static library" OFF) +option(WITH_DOCS "Build the documentation" OFF) + +option(WITH_DEBUG_LOG "enable debug logging" OFF) + +# if debug logging is enabled, by default enable logging +option(WITH_LOGGING "if false, disable all logging" ON) + +# enable examples by default if building with maintainer mode +option(WITH_EXAMPLES "build example applications" ${WITH_MAINTAINER_MODE}) + +option(WITHOUT_PTHREADS "force pthreads to not be used. if on, then they are used based on detection logic" OFF) + +set(LIBUSB_MAJOR 1) +set(LIBUSB_MINOR 0) +set(LIBUSB_MICRO 8) + +macro(append_compiler_flags) + foreach(FLAG IN ITEMS ${ARGN}) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAG}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAG}") + endforeach() +endmacro() + +if (WITH_DOCS) + add_subdirectory(docs) +endif () + +if (WITH_EXAMPLES) + add_subdirectory(examples) +endif() + +add_subdirectory(libusb) diff --git a/cmake/modules/FindCoreFoundation.cmake b/cmake/modules/FindCoreFoundation.cmake new file mode 100644 index 0000000..d998e89 --- /dev/null +++ b/cmake/modules/FindCoreFoundation.cmake @@ -0,0 +1,17 @@ +# CoreFoundation_INCLUDE_DIR +# CoreFoundation_LIBRARIES +# CoreFoundation_FOUND +include(LibFindMacros) + +find_path(CoreFoundation_INCLUDE_DIR + CoreFoundation.h + PATH_SUFFIXES CoreFoundation +) + +find_library(CoreFoundation_LIBRARY + NAMES CoreFoundation +) + +set(CoreFoundation_PROCESS_INCLUDES CoreFoundation_INCLUDE_DIR) +set(CoreFoundation_PROCESS_LIBS CoreFoundation_LIBRARY) +libfind_process(CoreFoundation) diff --git a/cmake/modules/FindIOKit.cmake b/cmake/modules/FindIOKit.cmake new file mode 100644 index 0000000..584e225 --- /dev/null +++ b/cmake/modules/FindIOKit.cmake @@ -0,0 +1,20 @@ +# IOKit_INCLUDE_DIR +# IOKit_LIBRARIES +# IOKit_FOUND +include(LibFindMacros) + +# IOKit depends on CoreFoundation +find_package(CoreFoundation REQUIRED) + +find_path(IOKit_INCLUDE_DIR + IOKitLib.h + PATH_SUFFIXES IOKit +) + +find_library(IOKit_LIBRARY + NAMES IOKit +) + +set(IOKit_PROCESS_INCLUDES IOKit_INCLUDE_DIR CoreFoundation_INCLUDE_DIR) +set(IOKit_PROCESS_LIBS IOKit_LIBRARY CoreFoundation_LIBRARIES) +libfind_process(IOKit) diff --git a/cmake/modules/LibFindMacros.cmake b/cmake/modules/LibFindMacros.cmake new file mode 100644 index 0000000..69975c5 --- /dev/null +++ b/cmake/modules/LibFindMacros.cmake @@ -0,0 +1,99 @@ +# Works the same as find_package, but forwards the "REQUIRED" and "QUIET" arguments +# used for the current package. For this to work, the first parameter must be the +# prefix of the current package, then the prefix of the new package etc, which are +# passed to find_package. +macro (libfind_package PREFIX) + set (LIBFIND_PACKAGE_ARGS ${ARGN}) + if (${PREFIX}_FIND_QUIETLY) + set (LIBFIND_PACKAGE_ARGS ${LIBFIND_PACKAGE_ARGS} QUIET) + endif (${PREFIX}_FIND_QUIETLY) + if (${PREFIX}_FIND_REQUIRED) + set (LIBFIND_PACKAGE_ARGS ${LIBFIND_PACKAGE_ARGS} REQUIRED) + endif (${PREFIX}_FIND_REQUIRED) + find_package(${LIBFIND_PACKAGE_ARGS}) +endmacro (libfind_package) + +# CMake developers made the UsePkgConfig system deprecated in the same release (2.6) +# where they added pkg_check_modules. Consequently I need to support both in my scripts +# to avoid those deprecated warnings. Here's a helper that does just that. +# Works identically to pkg_check_modules, except that no checks are needed prior to use. +macro (libfind_pkg_check_modules PREFIX PKGNAME) + if (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) + include(UsePkgConfig) + pkgconfig(${PKGNAME} ${PREFIX}_INCLUDE_DIRS ${PREFIX}_LIBRARY_DIRS ${PREFIX}_LDFLAGS ${PREFIX}_CFLAGS) + else (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) + find_package(PkgConfig) + if (PKG_CONFIG_FOUND) + pkg_check_modules(${PREFIX} ${PKGNAME}) + endif (PKG_CONFIG_FOUND) + endif (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) +endmacro (libfind_pkg_check_modules) + +# Do the final processing once the paths have been detected. +# If include dirs are needed, ${PREFIX}_PROCESS_INCLUDES should be set to contain +# all the variables, each of which contain one include directory. +# Ditto for ${PREFIX}_PROCESS_LIBS and library files. +# Will set ${PREFIX}_FOUND, ${PREFIX}_INCLUDE_DIRS and ${PREFIX}_LIBRARIES. +# Also handles errors in case library detection was required, etc. +macro (libfind_process PREFIX) + # Skip processing if already processed during this run + if (NOT ${PREFIX}_FOUND) + # Start with the assumption that the library was found + set (${PREFIX}_FOUND TRUE) + + # Process all includes and set _FOUND to false if any are missing + foreach (i ${${PREFIX}_PROCESS_INCLUDES}) + if (${i}) + set (${PREFIX}_INCLUDE_DIRS ${${PREFIX}_INCLUDE_DIRS} ${${i}}) + mark_as_advanced(${i}) + else (${i}) + set (${PREFIX}_FOUND FALSE) + endif (${i}) + endforeach (i) + + # Process all libraries and set _FOUND to false if any are missing + foreach (i ${${PREFIX}_PROCESS_LIBS}) + if (${i}) + set (${PREFIX}_LIBRARIES ${${PREFIX}_LIBRARIES} ${${i}}) + mark_as_advanced(${i}) + else (${i}) + set (${PREFIX}_FOUND FALSE) + endif (${i}) + endforeach (i) + + # Print message and/or exit on fatal error + if (${PREFIX}_FOUND) + if (NOT ${PREFIX}_FIND_QUIETLY) + message (STATUS "Found ${PREFIX} ${${PREFIX}_VERSION}") + endif (NOT ${PREFIX}_FIND_QUIETLY) + else (${PREFIX}_FOUND) + if (${PREFIX}_FIND_REQUIRED) + foreach (i ${${PREFIX}_PROCESS_INCLUDES} ${${PREFIX}_PROCESS_LIBS}) + message("${i}=${${i}}") + endforeach (i) + message (FATAL_ERROR "Required library ${PREFIX} NOT FOUND.\nInstall the library (dev version) and try again. If the library is already installed, use ccmake to set the missing variables manually.") + endif (${PREFIX}_FIND_REQUIRED) + endif (${PREFIX}_FOUND) + endif (NOT ${PREFIX}_FOUND) +endmacro (libfind_process) + +macro(libfind_library PREFIX basename) + set(TMP "") + if(MSVC80) + set(TMP -vc80) + endif(MSVC80) + if(MSVC90) + set(TMP -vc90) + endif(MSVC90) + set(${PREFIX}_LIBNAMES ${basename}${TMP}) + if(${ARGC} GREATER 2) + set(${PREFIX}_LIBNAMES ${basename}${TMP}-${ARGV2}) + string(REGEX REPLACE "\\." "_" TMP ${${PREFIX}_LIBNAMES}) + set(${PREFIX}_LIBNAMES ${${PREFIX}_LIBNAMES} ${TMP}) + endif(${ARGC} GREATER 2) + find_library(${PREFIX}_LIBRARY + NAMES ${${PREFIX}_LIBNAMES} + PATHS ${${PREFIX}_PKGCONF_LIBRARY_DIRS} + ) +endmacro(libfind_library) + diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt new file mode 100644 index 0000000..d73d729 --- /dev/null +++ b/examples/CMakeLists.txt @@ -0,0 +1,27 @@ +include(CheckFunctionExists) +include(FindThreads) + +check_function_exists(sigaction HAVE_SIGACTION) + +if (WITH_SHARED) + set(LIBUSB_LIBRARY usb-1.0) +else() + set(LIBUSB_LIBRARY usb-1.0-static) +endif() + +include_directories(../libusb) + +add_executable(lsusb lsusb.c) +target_link_libraries(lsusb ${LIBUSB_LIBRARY}) +add_executable(xusb xusb.c) +target_link_libraries(xusb ${LIBUSB_LIBRARY}) + +if (HAVE_SIGACTION) + add_executable(dpfp dpfp.c) + target_link_libraries(dpfp ${LIBUSB_LIBRARY}) + + if (CMAKE_USE_PTHREADS_INIT) + add_executable(dpfp_threaded dpfp_threaded.c) + target_link_libraries(dpfp_threaded ${LIBUSB_LIBRARY}) + endif() +endif() diff --git a/libusb/CMakeLists.txt b/libusb/CMakeLists.txt new file mode 100644 index 0000000..a1b18fa --- /dev/null +++ b/libusb/CMakeLists.txt @@ -0,0 +1,100 @@ +add_subdirectory(os) + +include(config.cmake) +include(FindThreads) + +set (LIBUSB_COMMON + core.c + descriptor.c + io.c + sync.c + libusb-1.0.rc + libusb-1.0.def +) + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/os) + +if (CMAKE_THREAD_LIBS_INIT) + list(APPEND LIBUSB_LIBRARIES ${CMAKE_THREAD_LIBS_INIT}) +endif() + +# The CLEAN_DIRECT_OUTPUT property setting can be removed once CMake >= 2.8.4 +if (WITH_SHARED) + add_library(usb-1.0 + SHARED + ${LIBUSB_COMMON} + ${LIBUSB_PLATFORM} + ) + + if (MSVC) + set_target_properties(usb-1.0 PROPERTIES PREFIX "lib") + set_target_properties(usb-1.0 PROPERTIES IMPORT_PREFIX "lib") + set_target_properties(usb-1.0 PROPERTIES IMPORT_SUFFIX ".dll.lib") + endif() + + set_target_properties(usb-1.0 PROPERTIES + CLEAN_DIRECT_OUTPUT 1 + PUBLIC_HEADER libusb.h + VERSION "${LIBUSB_MAJOR}.${LIBUSB_MINOR}.${LIBUSB_MICRO}" + SOVERSION "${LIBUSB_MAJOR}.${LIBUSB_MINOR}.${LIBUSB_MICRO}" + ) + + if (DEFINED LIBUSB_LIBRARIES) + message("Linking shared library against ${LIBUSB_LIBRARIES}") + target_link_libraries(usb-1.0 + ${LIBUSB_LIBRARIES} + ) + endif() + + list(APPEND LIBUSB_LIBTARGETS usb-1.0) +endif() + +if (WITH_STATIC) + add_library(usb-1.0-static + STATIC + ${LIBUSB_COMMON} + ${LIBUSB_PLATFORM} + ) + + set_target_properties(usb-1.0-static PROPERTIES + PREFIX "lib" + OUTPUT_NAME "usb-1.0" + CLEAN_DIRECT_OUTPUT 1 + PUBLIC_HEADER libusb.h + VERSION "${LIBUSB_MAJOR}.${LIBUSB_MINOR}.${LIBUSB_MICRO}" + SOVERSION "${LIBUSB_MAJOR}.${LIBUSB_MINOR}.${LIBUSB_MICRO}" + ) + + if (DEFINED LIBUSB_LIBRARIES) + target_link_libraries(usb-1.0-static + ${LIBUSB_LIBRARIES} + ) + endif() + + list(APPEND LIBUSB_LIBTARGETS usb-1.0-static) +endif() + +install(TARGETS ${LIBUSB_LIBTARGETS} EXPORT libusb-1 + PUBLIC_HEADER DESTINATION include/libusb-1.0 + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION lib +) +install(EXPORT libusb-1 DESTINATION lib/libusb) + +foreach(LIB IN LISTS LIBUSB_LIBRARIES) + if (LIB MATCHES .framework$) + get_filename_component(LIB "${LIB}" NAME) + set(LIB "-Wl,-framework,${LIB}") + elseif (LIB MATCHES .dylib$) + get_filename_component(LIBDIR "${LIB}" PATH) + get_filename_component(LIB "${LIB}" NAME) + string(REGEX REPLACE "lib(.*).dylib$" "\\1" LIB "${LIB}") + set(LIB "-L${LIBDIR} -l${LIB}") + endif() + set(LIBUSB_LIB_DEPENDS "${LIBUSB_LIB_DEPENDS} ${LIB}") +endforeach() + +configure_file(libusb-1.0.pc.cmake "${CMAKE_CURRENT_BINARY_DIR}/libusb-1.0.pc" @ONLY) +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libusb-1.0.pc" DESTINATION lib/pkgconfig) diff --git a/libusb/config.cmake b/libusb/config.cmake new file mode 100644 index 0000000..f064121 --- /dev/null +++ b/libusb/config.cmake @@ -0,0 +1,97 @@ +include(CheckCXXCompilerFlag) +include(CheckIncludeFiles) +include(CheckTypeSize) + +if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) + if (NOT OS_WINDOWS) + # mingw appears to print a bunch of warnings about this + check_cxx_compiler_flag("-fvisibility=hidden" HAVE_VISIBILITY) + endif() + check_cxx_compiler_flag("-Wno-pointer-sign" HAVE_WARN_NO_POINTER_SIGN) + + set(_GNU_SOURCE 1 CACHE INTERNAL "" FORCE) + + unset(ADDITIONAL_CC_FLAGS) + + if (HAVE_VISIBILITY) + list(APPEND ADDITIONAL_CC_FLAGS -fvisibility=hidden) + endif() + + if (HAVE_WARN_NO_POINTER_SIGN) + list(APPEND ADDITIONAL_CC_FLAGS -Wno-pointer-sign) + endif() + + append_compiler_flags( + -std=gnu99 + -Wall + -Wundef + -Wunused + -Wstrict-prototypes + -Werror-implicit-function-declaration + -Wshadow + ${ADDITIONAL_CC_FLAGS} + ) +else(MSVC) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) + append_compiler_flags(/Wp64) +endif() + +check_include_files(sys/timerfd.h USBI_TIMERFD_AVAILABLE) +check_type_size(struct timespec STRUCT_TIMESPEC) + +if (HAVE_VISIBILITY) + set(DEFAULT_VISIBILITY "__attribute__((visibility(\"default\")))" CACHE INTERNAL "visibility attribute to function decl" FORCE) +else() + set(DEFAULT_VISIBILITY "" CACHE INTERNAL "visibility attribute to function decl" FORCE) +endif() + +if (NOT WITHOUT_POLL_H) + check_include_files(poll.h HAVE_POLL_H) +else() + set(HAVE_POLL_H FALSE CACHE INTERNAL "poll.h explicitely disabled" FORCE) +endif() + +if (HAVE_POLL_H) + list(APPEND CMAKE_EXTRA_INCLUDE_FILES "poll.h") + check_type_size(nfds_t NFDS_T) + unset(CMAKE_EXTRA_INCLUDE_FILES) +else() + set(HAVE_NFDS_T FALSE CACHE INTERNAL "poll.h not found - assuming no nfds_t (windows)" FORCE) + set(NFDS_T "" CACHE INTERNAL "" FORCE) +endif() + +if (HAVE_NFDS_T) + set(POLL_NFDS_TYPE nfds_t CACHE INTERNAL "the poll nfds types for this platform" FORCE) +else() + set(POLL_NFDS_TYPE "unsigned int" CACHE INTERNAL "the poll nfds for this platform" FORCE) +endif() + +if (OS_WINDOWS) + macro(copy_header_if_missing HEADER VARIABLE ALTERNATIVE_DIR) + check_include_files(${HEADER} ${VARIABLE}) + if (NOT ${VARIABLE}) + message(STATUS "Missing ${HEADER} - grabbing from ${ALTERNATIVE_DIR}") + file(COPY "${ALTERNATIVE_DIR}/${HEADER}" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/") + endif() + endmacro() + + # Only VS 2010 has stdint.h + copy_header_if_missing(stdint.h HAVE_STDINT_H ../msvc) + copy_header_if_missing(inttypes.h HAVE_INTTYPES_H ../msvc) +endif() + +set(ENABLE_DEBUG_LOGGING ${WITH_DEBUG_LOG} CACHE INTERNAL "enable debug logging (WITH_DEBUG_LOGGING)" FORCE) +set(ENABLE_LOGGING ${WITH_LOGGING} CACHE INTERNAL "enable logging (WITH_LOGGING)" FORCE) +set(PACKAGE "libusb" CACHE INTERNAL "The package name" FORCE) +set(PACKAGE_BUGREPORT "libusb-devel@lists.sourceforge.net" CACHE INTERNAL "Where to send bug reports" FORCE) +set(PACKAGE_VERSION "${LIBUSB_MAJOR}.${LIBUSB_MINOR}.${LIBUSB_MICRO}" CACHE INTERNAL "package version" FORCE) +set(PACKAGE_STRING "${PACKAGE} ${PACKAGE_VERSION}" CACHE INTERNAL "package string" FORCE) +set(PACKAGE_URL "http://www.libusb.org" CACHE INTERNAL "package url" FORCE) +set(PACKAGE_TARNAME "libusb" CACHE INTERNAL "tarball name" FORCE) +set(VERSION "${PACKAGE_VERSION}" CACHE INTERNAL "version" FORCE) + +configure_file(config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h @ONLY) +message(STATUS "Generated configuration file in ${CMAKE_CURRENT_BINARY_DIR}/config.h") + +# for generated config.h +include_directories(${CMAKE_CURRENT_BINARY_DIR}) diff --git a/libusb/config.h.cmake b/libusb/config.h.cmake new file mode 100644 index 0000000..cc6b3c3 --- /dev/null +++ b/libusb/config.h.cmake @@ -0,0 +1,37 @@ +#ifndef LIBUSB_CONFIG_H +#define LIBUSB_CONFIG_H + +#define DEFAULT_VISIBILITY @DEFAULT_VISIBILITY@ + +#cmakedefine ENABLE_DEBUG_LOGGING + +#cmakedefine ENABLE_LOGGING + +#define LIBUSB_MAJOR @LIBUSB_MAJOR@ + +#define LIBUSB_MINOR @LIBUSB_MINOR@ + +#define LIBUSB_MICRO @LIBUSB_MINOR@ + +#cmakedefine _GNU_SOURCE 1 + +#define PACKAGE @PACKAGE@ +#define PACKAGE_BUGREPORT @PACKAGE_BUGREPORT@ +#define PACKAGE_STRING @PACKAGE_STRING@ +#define PACKAGE_URL @PACKAGE_URL@ +#define PACKAGE_VERSION @PACKAGE_VERSION@ +#define PACKAGE_TARNAME @PACKAGE_TARNAME@ + +#define VERSION @VERSION@ + +#cmakedefine OS_LINUX +#cmakedefine OS_DARWIN +#cmakedefine OS_WINDOWS +#cmakedefine THREADS_POSIX +#cmakedefine USBI_TIMERFD_AVAILABLE +#cmakedefine HAVE_STRUCT_TIMESPEC +#cmakedefine HAVE_POLL_H +#cmakedefine HAVE_SYS_TIME_H +#define POLL_NFDS_TYPE @POLL_NFDS_TYPE@ + +#endif /* LIBUSB_CONFIG_H */ diff --git a/libusb/libusb-1.0.pc.cmake b/libusb/libusb-1.0.pc.cmake new file mode 100644 index 0000000..6bf58d0 --- /dev/null +++ b/libusb/libusb-1.0.pc.cmake @@ -0,0 +1,11 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +libdir=@CMAKE_INSTALL_PREFIX@/lib@ +includedir=@CMAKE_INSTALL_PREFIX@/include@ + +Name: libusb-1.0 +Description: C API for USB device access from Linux, Mac OS X and Windows userspace +Version: @VERSION@ +Libs: -L${libdir} -lusb-1.0 +Libs.private: @LIBUSB_LIB_DEPENDS@ +Cflags: -I${includedir}/libusb-1.0 + diff --git a/libusb/os/CMakeLists.txt b/libusb/os/CMakeLists.txt new file mode 100644 index 0000000..1172c9b --- /dev/null +++ b/libusb/os/CMakeLists.txt @@ -0,0 +1,101 @@ +include(FindThreads) + +set(PTHREADS_ENABLED FALSE) +if (CMAKE_USE_PTHREADS_INIT) + set(PTHREADS_ENABLED TRUE) +endif() + +if (WIN32 OR "${CMAKE_SYSTEM_NAME}" STREQUAL "CYGWIN") + set(OS_WINDOWS 1 CACHE INTERNAL "controls config.h macro definition" FORCE) + + # Enable MingW support for RC language (for CMake pre-2.8) + if (MINGW) + set(CMAKE_RC_COMPILER_INIT windres) + set(CMAKE_RC_COMPILE_OBJECT " -O coff -i -o ") + endif() + enable_language(RC) + + if ("${CMAKE_SYSTEM_NAME}" STREQUAL "CYGWIN") + message(STATUS "Detected cygwin") + set(PTHREADS_ENABLED TRUE) + set(WITHOUT_POLL_H TRUE CACHE INTERNAL "Disable using poll.h even if it's available - use windows poll instead fo cygwin's" FORCE) + endif() + + list(APPEND PLATFORM_SRC + poll_windows.c + windows_usb.c + ) + + if (PTHREADS_ENABLED AND NOT WITHOUT_PTHREADS) + list(APPEND PLATFORM_SRC threads_posix) + else() + list(APPEND PLATFORM_SRC threads_windows.c) + endif() +elseif (APPLE) + # Apple != OSX alone + set(OS_DARWIN 1 CACHE INTERNAL "controls config.h macro definition" FORCE) + + if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") + set(PLATFORM_SRC + darwin_usb.c + threads_posix.c + ) + + find_package(IOKit REQUIRED) + list(APPEND LIBUSB_LIBRARIES ${IOKit_LIBRARIES}) + + # Currently only objc_registerThreadWithCollector requires linking against it + # which is only for MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 + include(CheckCSourceCompiles) + check_c_source_compiles( +"#include +int main() +{ +#if !(MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) +#error \"Don't need objc\" +#endif +} +" NEED_OBJC_REGISTER_THREAD_WITH_COLLECTOR) + + if (NEED_OBJC_REGISTER_THREAD_WITH_COLLECTOR) + find_library(LIBOBJC objc) + if (NOT LIBOBJC) + message(SEND_ERROR "Need objc library but can't find it") + else() + list(APPEND LIBUSB_LIBRARIES ${LIBOBJC}) + endif() + endif() + endif() +elseif (UNIX) + # Unix is for all *NIX systems including OSX + if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") + set(OS_LINUX 1 CACHE INTERNAL "controls config.h macro definition" FORCE) + + set(PLATFORM_SRC + linux_usbfs.c + threads_posix.c + ) + + list(APPEND LIBUSB_LIBRARIES rt) + endif() +endif() + +if (NOT PLATFORM_SRC) + message(FATAL_ERROR "Unsupported platform ${CMAKE_SYSTEM_NAME}. Currently only support Windows, OSX, & Linux.") +endif() + +# the paths are relative to this directory but used in the parent directory, +# so we have to adjust the paths +foreach(SRC IN LISTS PLATFORM_SRC) + list(APPEND LIBUSB_PLATFORM ${CMAKE_CURRENT_SOURCE_DIR}/${SRC}) +endforeach() + +# export one level up so that the generic +# libusb parts know what the platform bits are supposed to be +set(LIBUSB_PLATFORM ${LIBUSB_PLATFORM} PARENT_SCOPE) +set(LIBUSB_LIBRARIES ${LIBUSB_LIBRARIES} PARENT_SCOPE) + +if (WITHOUT_PTHREADS) + set(PTHREADS_ENABLED FALSE) +endif() +set(THREADS_POSIX ${PTHREADS_ENABLED} CACHE INTERNAL "use pthreads" FORCE) -- cgit v1.2.1