Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions CMake/CleanDirectoryList.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# - Removes duplicate entries and non-directories from a provided list
#
# clean_directory_list(<listvar> [<additional list items>...])
#
# Requires CMake 2.6 or newer (uses the 'function' command)
#
# Original Author:
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright Iowa State University 2009-2010.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)

if(__clean_directory_list)
return()
endif()
set(__clean_directory_list YES)

function(clean_directory_list _var)
# combine variable's current value with additional list items
set(_in ${${_var}} ${ARGN})

if(_in)
# Initial list cleaning
list(REMOVE_DUPLICATES _in)

# Grab the absolute path of each actual directory
set(_out)
foreach(_dir ${_in})
if(IS_DIRECTORY "${_dir}")
get_filename_component(_dir "${_dir}" ABSOLUTE)
file(TO_CMAKE_PATH "${_dir}" _dir)
list(APPEND _out "${_dir}")
endif()
endforeach()

if(_out)
# Clean up the output list now
list(REMOVE_DUPLICATES _out)
endif()

# return _out
set(${_var} "${_out}" PARENT_SCOPE)
endif()
endfunction()
288 changes: 288 additions & 0 deletions CMake/FindWinHID.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,288 @@
# - try to find Windows HID support, part of the WDK/DDK
#
# Cache Variables: (probably not for direct use in your scripts)
# WINHID_INCLUDE_DIR
# WINHID_CRT_INCLUDE_DIR
# WINHID_LIBRARY
#
# Non-cache variables you might use in your CMakeLists.txt:
# WINHID_FOUND
# WINHID_INCLUDE_DIRS
# WINHID_LIBRARIES
#
# Requires these CMake modules:
# FindPackageHandleStandardArgs (known included with CMake >=2.6.2)
# PrefixListGlob
# CleanDirectoryList
# MinGWSearchPathExtras
# FindWindowsSDK
#
# Original Author:
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright Iowa State University 2009-2010.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)

if(NOT WIN32)
find_package_handle_standard_args(WinHID
"Skipping search for Windows HID on non-Windows platform"
WIN32)
return()
endif()

if(MSVC)
if( (NOT WINHID_ROOT_DIR) AND (NOT ENV{DDKROOT} STREQUAL "") )
set(WINHID_ROOT_DIR "$ENV{DDKROOT}")
endif()
endif()

set(WINHID_ROOT_DIR
"${WINHID_ROOT_DIR}"
CACHE
PATH
"Directory to search")

set(_deps_check)
set(_need_crt_dir)
if(MSVC)

find_package(WindowsSDK)
set(WINSDK_LIBDIRS)
if(WINDOWSSDK_FOUND)
get_windowssdk_library_dirs_multiple(WINSDK_LIBDIRS ${WINDOWSSDK_PREFERRED_FIRST_DIRS})
foreach(WINSDKDIR ${WINDOWSSDK_DIRS})
get_windowssdk_library_dirs(${WINSDKDIR} WINSDK_CURRENT_LIBDIRS)
list(APPEND WINSDK_LIBDIRS ${WINSDK_CURRENT_LIBDIRS})
endforeach()
endif()

if(CMAKE_SIZEOF_VOID_P MATCHES "8")
set(_arch amd64) # what the architecture used to be called
set(_arch8 x64) # what the WDK for Win8+ calls this architecture
else()
set(_arch i386) # what the architecture used to be called
set(_arch8 x86) # what the WDK for Win8+ calls this architecture
endif()
include(PrefixListGlob)
include(CleanDirectoryList)
prefix_list_glob(_prefixed
"*/"
"$ENV{SYSTEMDRIVE}/WinDDK/"
"$ENV{ProgramFiles}/Windows Kits/"
"c:/WinDDK/")
clean_directory_list(_prefixed)
find_library(WINHID_LIBRARY
NAMES
hid
libhid
PATHS
"${WINHID_ROOT_DIR}"
${WINSDK_LIBDIRS}
${_prefixed}
PATH_SUFFIXES
"lib/w2k/${_arch}" # Win2k min requirement
"lib/wxp/${_arch}" # WinXP min requirement
"lib/wnet/${_arch}" # Win Server 2003 min requirement
"lib/wlh/${_arch}" # Win Vista ("Long Horn") min requirement
"lib/wlh/um/${_arch8}" # Win Vista ("Long Horn") min requirement
"lib/win7/${_arch}" # Win 7 min requirement
"lib/win7/um/${_arch8}" # Win 7 min requirement
"lib/win8/${_arch}" # Win 8 min requirement
"lib/win8/um/${_arch8}" # Win 8 min requirement
)
# Might want to look close to the library first for the includes.
if(WINHID_LIBRARY)
get_filename_component(WINHID_LIBRARY_DIR "${WINHID_LIBRARY}" PATH)
if(WINDOWSSDK_FOUND)
get_windowssdk_from_component("${WINHID_LIBRARY}" _USED_WINSDK)
set(WINHID_LIBRARY_FROM_WINDOWSSDK ON)
get_windowssdk_include_dirs(${_USED_WINSDK} WINHID_INCLUDE_HINTS)
endif()
endif()

find_library(WINHID_SETUPAPI_LIBRARY
NAMES
setupapi
HINTS
"${WINHID_LIBRARY_DIR}"
PATHS
"${WINHID_ROOT_DIR}"
${WINSDK_LIBDIRS}
${_prefixed}
PATH_SUFFIXES
"lib/w2k/${_arch}" # Win2k min requirement
"lib/wxp/${_arch}" # WinXP min requirement
"lib/wnet/${_arch}" # Win Server 2003 min requirement
"lib/wlh/${_arch}" # Win Vista ("Long Horn") min requirement
"lib/wlh/um/${_arch8}" # Win Vista ("Long Horn") min requirement
"lib/win7/${_arch}" # Win 7 min requirement
"lib/win7/um/${_arch8}" # Win 7 min requirement
"lib/win8/${_arch}" # Win 8 min requirement
"lib/win8/um/${_arch8}" # Win 8 min requirement
)

if(WINHID_LIBRARY AND NOT WINHID_LIBRARY_FROM_WINDOWSSDK)
set(_basedir "${WINHID_LIBRARY_DIR}")
set(_prevdir)
while(NOT IS_DIRECTORY "${_basedir}/lib" AND NOT (_basedir STREQUAL _prevdir))
set(_prevdir "${_basedir}")
get_filename_component(_basedir "${_basedir}/.." ABSOLUTE)
endwhile()

set(WINHID_INCLUDE_HINTS "${_basedir}")

if(EXISTS "${_basedir}/inc")
find_path(WINHID_CRT_INCLUDE_DIR # otherwise you get weird compile errors
NAMES
stdio.h
HINTS
"${_basedir}"
PATHS
"${WINHID_ROOT_DIR}"
PATH_SUFFIXES
inc/crt
NO_DEFAULT_PATH)
list(APPEND _deps_check WINHID_CRT_INCLUDE_DIR)
set(_need_crt_dir ON)
endif()
endif()
find_path(WINHID_INCLUDE_DIR
NAMES
hidsdi.h
HINTS
${WINHID_INCLUDE_HINTS}
PATHS
"${WINHID_ROOT_DIR}"
PATH_SUFFIXES
inc/ddk
inc/api
inc/w2k
inc/wxp
inc/wnet
include/shared)
else()
# This is the non-MSVC path.
if(MINGW)
include(MinGWSearchPathExtras)

find_library(WINHID_LIBRARY
NAMES
libhid
HINTS
"${WINHID_ROOT_DIR}"
${MINGWSEARCH_LIBRARY_DIRS}
/mingw
PATH_SUFFIXES
lib
lib/w32api)
find_library(WINHID_SETUPAPI_LIBRARY
NAMES
libsetupapi
HINTS
"${WINHID_ROOT_DIR}"
${MINGWSEARCH_LIBRARY_DIRS}
/mingw
PATH_SUFFIXES
lib
lib/w32api)
else()
find_library(WINHID_LIBRARY
NAMES
hid
libhid
HINTS
"${WINHID_ROOT_DIR}"
/mingw
PATH_SUFFIXES
lib
lib/w32api)
find_library(WINHID_SETUPAPI_LIBRARY
NAMES
setupapi
libsetupapi
HINTS
"${WINHID_ROOT_DIR}"
/mingw
PATH_SUFFIXES
lib
lib/w32api)
endif()
find_path(WINHID_INCLUDE_DIR
NAMES
hidsdi.h
PATHS
"${WINHID_ROOT_DIR}"
${MINGWSEARCH_INCLUDE_DIRS}
/mingw
PATH_SUFFIXES
include/w32api/ddk
include/ddk
ddk)
endif()

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(WinHID
DEFAULT_MSG
WINHID_LIBRARY
WINHID_SETUPAPI_LIBRARY
WINHID_INCLUDE_DIR
${_deps_check})

if(WINHID_FOUND)
if(MSVC)
set(_winreq)
if(WINHID_LIBRARY MATCHES "[Ll]ib/w2k")
set(_winreq "Windows 2000")
elseif(WINHID_LIBRARY MATCHES "[Ll]ib/wxp")
set(_winreq "Windows XP")
elseif(WINHID_LIBRARY MATCHES "[Ll]ib/wnet")
set(_winreq "Windows Server 2003")
elseif(WINHID_LIBRARY MATCHES "[Ll]ib/wlh")
set(_winreq "Windows Vista")
elseif(WINHID_LIBRARY MATCHES "[Ll]ib/win7")
set(_winreq "Windows 7")
elseif(WINHID_LIBRARY MATCHES "[Ll]ib/win8")
set(_winreq "Windows 8")
set(_winreq_uncertain ON)
elseif(WINHID_LIBRARY MATCHES "[Ll]ib/winv6.3")
set(_winreq "Windows 8.1")
set(_winreq_uncertain ON)
elseif(WINHID_LIBRARY MATCHES "[Ll]ib/10.0")
set(_winreq "Windows 10")
set(_winreq_uncertain ON)
endif()
if(NOT "${WINHID_MIN_WINDOWS_VER}" STREQUAL "${_winreq}")
if(NOT WinHID_FIND_QUIETLY)
if(NOT _winreq)
message("Couldn't determine if the WINHID_LIBRARY would result in a minimum version compatibility requirement.")
elseif(_winreq_uncertain)
message(STATUS
"Found WINHID_LIBRARY in the Windows SDK for ${_winreq} , which may or may not affect minimum compatible Windows version.")
else()
message(STATUS
"Linking against WINHID_LIBRARY will enforce this minimum version: ${_winreq}")
endif()
endif()
set(WINHID_MIN_WINDOWS_VER "${_winreq}" CACHE INTERNAL "" FORCE)
endif()
endif()
set(WINHID_LIBRARIES "${WINHID_LIBRARY}" "${WINHID_SETUPAPI_LIBRARY}")
if(_need_crt_dir)
set(WINHID_INCLUDE_DIRS
"${WINHID_CRT_INCLUDE_DIR}"
"${WINHID_INCLUDE_DIR}")
else()
# Don't need that CRT include dir for WDK 8+
set(WINHID_INCLUDE_DIRS
"${WINHID_INCLUDE_DIR}")
endif()
mark_as_advanced(WINHID_ROOT_DIR)
endif()

mark_as_advanced(WINHID_INCLUDE_DIR
WINHID_CRT_INCLUDE_DIR
WINHID_LIBRARY)
Loading