Skip to content

Commit d209b7e

Browse files
committed
Merge branch 'develop'
2 parents eef5a51 + 1d344de commit d209b7e

53 files changed

Lines changed: 3596 additions & 3256 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,9 @@
11
.vscode/
22
build/
3+
4+
#git
5+
*.orig
6+
*_REMOTE_*
7+
*_LOCAL_*
8+
*_BACKUP_*
9+
*_BASE_*

CMakeLists.txt

Lines changed: 166 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,91 @@
11
# Copyright (C) 2018-2021 Intel Corporation
22
# SPDX-License-Identifier: Apache-2.0
3-
#
3+
# With additions of Luxonis
4+
45
cmake_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
515
set(TARGET_NAME "XLink")
16+
set(TARGET_PUBLIC_NAME "XLinkPublic")
17+
18+
# Create project
619
project(${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+
828
include(cmake/XLink.cmake)
929
include(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
1432
option(XLINK_BUILD_EXAMPLES "Build XLink examples" OFF)
1533
# Build tests
1634
option(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
1851
add_library(${TARGET_NAME} ${XLINK_SOURCES})
1952
add_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)
3289
endif()
3390

3491
if(MINGW)
@@ -41,25 +98,38 @@ if(MINGW)
4198
)
4299
endif()
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+
44116
target_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

54127
target_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

65135
if (ENABLE_MYRIAD_NO_BOOT)
@@ -68,7 +138,48 @@ if (ENABLE_MYRIAD_NO_BOOT)
68138
NO_BOOT)
69139
endif()
70140

141+
# Set C99 standard
71142
set_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
74185
if(XLINK_BUILD_EXAMPLES)
@@ -80,21 +191,48 @@ if(XLINK_BUILD_TESTS)
80191
add_subdirectory(tests)
81192
endif()
82193

194+
# Installation
195+
83196
include(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

Comments
 (0)