11# Copyright (C) 2018-2021 Intel Corporation
22# SPDX-License-Identifier: Apache-2.0
3- #
3+ # With additions of Luxonis
4+
45cmake_minimum_required (VERSION 3.2 )
6+
7+ include ("cmake/HunterGate.cmake" )
8+ HunterGate (
9+ URL "https://github.com/cpp-pm/hunter/archive/v0.23.320.tar.gz"
10+ SHA1 "9b4e732afd22f40482c11ad6342f7d336634226f"
11+ LOCAL # Local config for dependencies
12+ )
13+
14+ ### Constants
515set (TARGET_NAME "XLink" )
16+ set (TARGET_PUBLIC_NAME "XLinkPublic" )
17+
18+ # Create project
619project (${TARGET_NAME} LANGUAGES C CXX )
720
21+ set (PROJECT_EXPORT_GROUP "${PROJECT_NAME} Targets" )
22+
23+ # Set default installation directory
24+ if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
25+ set (CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR} /install" CACHE PATH "Installation Directory" FORCE )
26+ endif ()
27+
828include (cmake/XLink.cmake )
929include (cmake/Flags.cmake )
1030
11- # Add option - MX ID naming instead of usb port
12- option (XLINK_USE_MX_ID_NAME "Use MX ID name instead of usb port" ON )
1331# Build examples
1432option (XLINK_BUILD_EXAMPLES "Build XLink examples" OFF )
1533# Build tests
1634option (XLINK_BUILD_TESTS "Build XLink tests" OFF )
35+ # Debug option
36+ set (XLINK_LIBUSB_LOCAL "" CACHE STRING "Path to local libub source to use instead of Hunter" )
37+ # Debug option
38+ option (XLINK_LIBUSB_SYSTEM "Use system libusb library instead of Hunter" OFF )
39+
40+ if (XLINK_LIBUSB_LOCAL AND XLINK_LIBUSB_SYSTEM)
41+ message (FATAL_ERROR "XLINK_LIBUSB_LOCAL and XLINK_LIBUSB_SYSTEM options are mutually exclusive!" )
42+ endif ()
1743
44+ message (STATUS "Configuring XLink with the following options:" )
45+ message (STATUS " XLINK_BUILD_EXAMPLES: ${XLINK_BUILD_EXAMPLES} " )
46+ message (STATUS " XLINK_BUILD_TESTS: ${XLINK_BUILD_TESTS} " )
47+ message (STATUS " XLINK_LIBUSB_LOCAL: ${XLINK_LIBUSB_LOCAL} " )
48+ message (STATUS " XLINK_LIBUSB_SYSTEM: ${XLINK_LIBUSB_SYSTEM} " )
49+
50+ # Create library target
1851add_library (${TARGET_NAME} ${XLINK_SOURCES} )
1952add_flag_source (src/shared/XLinkDevice.c "-Werror=switch-enum" )
53+ get_cmake_property (is_multi_config GENERATOR_IS_MULTI_CONFIG )
54+ if (is_multi_config)
55+ set_target_properties (${TARGET_NAME} PROPERTIES DEBUG_POSTFIX "d" )
56+ endif ()
2057
21- if (WIN32 )
22- target_compile_definitions (${TARGET_NAME} PRIVATE WIN32_LEAN_AND_MEAN )
23- else ()
58+ # Add dependencies
59+ include (cmake/XLinkDependencies.cmake )
60+
61+ if (XLINK_LIBUSB_SYSTEM)
62+ # Find system libusb
63+ find_path (LIBUSB_INCLUDE_DIR NAMES libusb.h PATH_SUFFIXES "include" "libusb" "libusb-1.0" )
64+ find_library (LIBUSB_LIBRARY NAMES usb-1.0 PATH_SUFFIXES "lib" )
65+ if (NOT LIBUSB_INCLUDE_DIR OR NOT LIBUSB_LIBRARY)
66+ message (FATAL_ERROR "libusb is required" )
67+ endif ()
2468 target_include_directories (${TARGET_NAME}
2569 PRIVATE "${LIBUSB_INCLUDE_DIR} "
2670 )
27-
2871 target_link_libraries (${TARGET_NAME}
29- PRIVATE Threads::Threads
3072 PUBLIC ${LIBUSB_LIBRARY}
3173 )
74+ else ()
75+ # Link to CMake libusb
76+ target_link_libraries (${TARGET_NAME} PRIVATE usb-1.0 )
77+ if (WIN32 AND NOT MINGW)
78+ target_link_libraries (${TARGET_NAME} PRIVATE delayimp.lib Pathcch.lib )
79+ # workaround https://gitlab.kitware.com/cmake/cmake/-/issues/20022
80+ target_link_options (${TARGET_NAME} PUBLIC "$<LINK_ONLY :/DELAYLOAD :libusb -1.0$<$<CONFIG :Debug >:d >.dll >" )
81+ endif ()
82+ endif ()
83+
84+ if (WIN32 )
85+ target_compile_definitions (${TARGET_NAME} PRIVATE WIN32_LEAN_AND_MEAN )
86+ else ()
87+ find_package (Threads REQUIRED )
88+ target_link_libraries (${TARGET_NAME} PRIVATE Threads::Threads )
3289endif ()
3390
3491if (MINGW)
@@ -41,25 +98,38 @@ if(MINGW)
4198 )
4299endif ()
43100
101+ if (ANDROID )
102+ find_library (log -lib log )
103+ target_link_libraries (${TARGET_NAME} PRIVATE ${log-lib} )
104+ endif ()
105+
106+ # Create public "interface" library (no linking)
107+ add_library (${TARGET_PUBLIC_NAME} INTERFACE )
108+ target_include_directories (${TARGET_PUBLIC_NAME} INTERFACE
109+ "$<INSTALL_INTERFACE :include >"
110+ "$<BUILD_INTERFACE :${XLINK_INCLUDE} >"
111+ )
112+
113+ # Link to headers (public, as itself also needs the headers)
114+ target_link_libraries (${TARGET_NAME} PUBLIC ${TARGET_PUBLIC_NAME} )
115+
44116target_include_directories (${TARGET_NAME}
45- PUBLIC
46- $<INSTALL_INTERFACE :include >
47- "$<BUILD_INTERFACE :${XLINK_INCLUDE} >"
48117 PRIVATE
49118 ${XLINK_PLATFORM_INCLUDE}
50119 ${XLINK_PRIVATE_INCLUDE}
51120 ${XLINK_INCLUDE} /XLink
52- )
121+ )
122+
123+ if (XLINK_LIBUSB_LOCAL)
124+ target_compile_definitions (${TARGET_NAME} PRIVATE XLINK_LIBUSB_LOCAL )
125+ endif ()
53126
54127target_compile_definitions (${TARGET_NAME}
55128 PRIVATE
56129 HAVE_STRUCT_TIMESPEC
57130 _CRT_SECURE_NO_WARNINGS
58131 USE_USB_VSC
59132 USE_TCP_IP
60- PUBLIC
61- __PC__
62- XLINK_USE_MX_ID_NAME=${XLINK_USE_MX_ID_NAME}
63133)
64134
65135if (ENABLE_MYRIAD_NO_BOOT)
@@ -68,7 +138,48 @@ if (ENABLE_MYRIAD_NO_BOOT)
68138 NO_BOOT )
69139endif ()
70140
141+ # Set C99 standard
71142set_property (TARGET ${TARGET_NAME} PROPERTY C_STANDARD 99 )
143+ # Set compiler features (c++11), and disables extensions (g++11)
144+ set_property (TARGET ${TARGET_NAME} PROPERTY CXX_STANDARD 11 )
145+ set_property (TARGET ${TARGET_NAME} PROPERTY CXX_STANDARD_REQUIRED ON )
146+ set_property (TARGET ${TARGET_NAME} PROPERTY CXX_EXTENSIONS OFF )
147+ # Add interface transitive property (C++11) to public library
148+ if (${CMAKE_VERSION} VERSION_LESS "3.8.0" )
149+ target_compile_features (${TARGET_PUBLIC_NAME} INTERFACE cxx_range_for )
150+ else ()
151+ target_compile_features (${TARGET_PUBLIC_NAME} INTERFACE cxx_std_11 )
152+ endif ()
153+
154+ # Add flags
155+ add_default_flags (${TARGET_NAME} )
156+
157+ # Check if pthread_getname_np exists
158+ if (NOT WIN32 )
159+ include (CheckSymbolExists )
160+ set (_TMP_CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} " )
161+ set (_TMP_CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES} " )
162+ set (_TMP_CMAKE_C_FLAGS "${CMAKE_C_FLAGS} " )
163+ list (APPEND CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE)
164+ list (APPEND CMAKE_REQUIRED_LIBRARIES "-lpthread" )
165+ # This flag breaks check_symbol_exists()
166+ string (REPLACE " -Werror " " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS} " )
167+
168+ # perfom check for pthread_getname_np symbol
169+ check_symbol_exists (pthread_getname_np pthread.h HAVE_PTHREAD_GETNAME_NP )
170+
171+ set (CMAKE_REQUIRED_DEFINITIONS "${_TMP_CMAKE_REQUIRED_DEFINITIONS} " )
172+ set (CMAKE_REQUIRED_LIBRARIES "${_TMP_CMAKE_REQUIRED_LIBRARIES} " )
173+ set (CMAKE_C_FLAGS "${_TMP_CMAKE_C_FLAGS} " )
174+ unset (_TMP_CMAKE_REQUIRED_DEFINITIONS)
175+ unset (_TMP_CMAKE_REQUIRED_LIBRARIES)
176+ unset (_TMP_CMAKE_C_FLAGS)
177+
178+ # Set the define
179+ if (HAVE_PTHREAD_GETNAME_NP)
180+ target_compile_definitions (${TARGET_NAME} PRIVATE HAVE_PTHREAD_GETNAME_NP )
181+ endif ()
182+ endif ()
72183
73184# Examples
74185if (XLINK_BUILD_EXAMPLES)
@@ -80,21 +191,48 @@ if(XLINK_BUILD_TESTS)
80191 add_subdirectory (tests )
81192endif ()
82193
194+ # Installation
195+
83196include (GNUInstallDirs )
84- install (TARGETS ${TARGET_NAME}
85- EXPORT "${TARGET_NAME} Config"
86- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
87- ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
88- )
89197
90- install (DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} )
198+ # Export targets (capability to import current build directory)
199+ export (TARGETS ${TARGET_NAME} ${TARGET_PUBLIC_NAME} FILE "${PROJECT_NAME} Targets.cmake" )
200+
201+ # Dependencies file
202+ configure_file ("cmake/${PROJECT_NAME} Dependencies.cmake" ${PROJECT_NAME} Dependencies.cmake COPYONLY )
203+
204+ # Configure config file (one for exporting build directory, one for installation)
205+ if (${HUNTER_INSTALL_PREFIX} )
206+ file (RELATIVE_PATH XLINK_DEPENDENCIES_INSTALLATION_PATH_REL "${CMAKE_CURRENT_BINARY_DIR} " "${HUNTER_INSTALL_PREFIX} " )
207+ endif ()
208+
209+ configure_file (cmake/${PROJECT_NAME}Config.cmake.in ${PROJECT_NAME} Config.cmake @ONLY )
210+
211+ # Config for installation
212+ set (XLINK_DEPENDENCIES_INSTALLATION_PATH_REL "./dependencies" )
213+ configure_file (cmake/${PROJECT_NAME}Config.cmake.in _install/${PROJECT_NAME}Config.cmake @ONLY )
91214
92- set (config_install_dir "${CMAKE_INSTALL_LIBDIR} /cmake/${TARGET_NAME} " )
93- export (TARGETS
94- ${TARGET_NAME}
95- FILE "${config_install_dir} /${TARGET_NAME} Config.cmake"
215+ # Install targets
216+ install (
217+ TARGETS ${TARGET_NAME} ${TARGET_PUBLIC_NAME}
218+ EXPORT ${PROJECT_EXPORT_GROUP}
219+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR} "
220+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR} "
221+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR} "
222+ )
223+ #Install include folder
224+ install (DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} )
225+ # Install Hunter dependencies
226+ if (NOT XLINK_LIBUSB_LOCAL AND NOT XLINK_LIBUSB_SYSTEM)
227+ install (DIRECTORY "${HUNTER_INSTALL_PREFIX} /" DESTINATION "${CMAKE_INSTALL_LIBDIR} /cmake/${PROJECT_NAME} /dependencies" )
228+ endif ()
229+ # Install export group (information about targets)
230+ install (EXPORT ${PROJECT_EXPORT_GROUP}
231+ DESTINATION "${CMAKE_INSTALL_LIBDIR} /cmake/${PROJECT_NAME} "
96232)
97- install (EXPORT
98- "${TARGET_NAME} Config"
99- DESTINATION "${config_install_dir} "
233+ # Install CMake specific files
234+ install (FILES
235+ "${CMAKE_CURRENT_BINARY_DIR} /_install/${PROJECT_NAME} Config.cmake"
236+ "${CMAKE_CURRENT_BINARY_DIR} /${PROJECT_NAME} Dependencies.cmake"
237+ DESTINATION "${CMAKE_INSTALL_LIBDIR} /cmake/${PROJECT_NAME} "
100238)
0 commit comments