1# Copyright (c) 2018-2022 Yubico AB. All rights reserved. 2# Use of this source code is governed by a BSD-style 3# license that can be found in the LICENSE file. 4# SPDX-License-Identifier: BSD-2-Clause 5 6# detect AppleClang; needs to come before project() 7cmake_policy(SET CMP0025 NEW) 8 9project(libfido2 C) 10cmake_minimum_required(VERSION 3.0) 11# Set PIE flags for POSITION_INDEPENDENT_CODE targets, added in CMake 3.14. 12if(POLICY CMP0083) 13 cmake_policy(SET CMP0083 NEW) 14endif() 15 16include(CheckCCompilerFlag) 17include(CheckFunctionExists) 18include(CheckLibraryExists) 19include(CheckSymbolExists) 20include(CheckIncludeFiles) 21include(CheckTypeSize) 22include(GNUInstallDirs) 23include(CheckPIESupported OPTIONAL RESULT_VARIABLE CHECK_PIE_SUPPORTED) 24if(CHECK_PIE_SUPPORTED) 25 check_pie_supported(LANGUAGES C) 26endif() 27 28set(CMAKE_POSITION_INDEPENDENT_CODE ON) 29set(CMAKE_COLOR_MAKEFILE OFF) 30set(CMAKE_VERBOSE_MAKEFILE ON) 31set(FIDO_MAJOR "1") 32set(FIDO_MINOR "13") 33set(FIDO_PATCH "0") 34set(FIDO_VERSION ${FIDO_MAJOR}.${FIDO_MINOR}.${FIDO_PATCH}) 35 36option(BUILD_TESTS "Build the regress tests" ON) 37option(BUILD_EXAMPLES "Build example programs" ON) 38option(BUILD_MANPAGES "Build man pages" ON) 39option(BUILD_SHARED_LIBS "Build a shared library" ON) 40option(BUILD_STATIC_LIBS "Build a static library" ON) 41option(BUILD_TOOLS "Build tool programs" ON) 42option(FUZZ "Enable fuzzing instrumentation" OFF) 43option(USE_HIDAPI "Use hidapi as the HID backend" OFF) 44option(USE_PCSC "Enable experimental PCSC support" OFF) 45option(USE_WINHELLO "Abstract Windows Hello as a FIDO device" ON) 46option(NFC_LINUX "Enable NFC support on Linux" ON) 47 48add_definitions(-D_FIDO_MAJOR=${FIDO_MAJOR}) 49add_definitions(-D_FIDO_MINOR=${FIDO_MINOR}) 50add_definitions(-D_FIDO_PATCH=${FIDO_PATCH}) 51 52if(BUILD_SHARED_LIBS) 53 set(_FIDO2_LIBRARY fido2_shared) 54elseif(BUILD_STATIC_LIBS) 55 set(_FIDO2_LIBRARY fido2) 56else() 57 message(FATAL_ERROR "Nothing to build (BUILD_*_LIBS=OFF)") 58endif() 59 60if(CYGWIN OR MSYS OR MINGW) 61 set(WIN32 1) 62endif() 63 64if(WIN32) 65 add_definitions(-DWIN32_LEAN_AND_MEAN -D_WIN32_WINNT=0x0600) 66endif() 67 68if(APPLE) 69 set(CMAKE_INSTALL_NAME_DIR 70 "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") 71endif() 72 73if(NOT MSVC) 74 set(FIDO_CFLAGS "${FIDO_CFLAGS} -D_POSIX_C_SOURCE=200809L") 75 set(FIDO_CFLAGS "${FIDO_CFLAGS} -D_BSD_SOURCE") 76 if(APPLE) 77 set(FIDO_CFLAGS "${FIDO_CFLAGS} -D_DARWIN_C_SOURCE") 78 set(FIDO_CFLAGS "${FIDO_CFLAGS} -D__STDC_WANT_LIB_EXT1__=1") 79 elseif((CMAKE_SYSTEM_NAME STREQUAL "Linux") OR MINGW OR CYGWIN) 80 set(FIDO_CFLAGS "${FIDO_CFLAGS} -D_GNU_SOURCE") 81 set(FIDO_CFLAGS "${FIDO_CFLAGS} -D_DEFAULT_SOURCE") 82 elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" OR 83 CMAKE_SYSTEM_NAME STREQUAL "MidnightBSD") 84 set(FIDO_CFLAGS "${FIDO_CFLAGS} -D__BSD_VISIBLE=1") 85 elseif(CMAKE_SYSTEM_NAME STREQUAL "NetBSD") 86 set(FIDO_CFLAGS "${FIDO_CFLAGS} -D_NETBSD_SOURCE") 87 endif() 88 set(FIDO_CFLAGS "${FIDO_CFLAGS} -std=c99") 89 set(CMAKE_C_FLAGS "${FIDO_CFLAGS} ${CMAKE_C_FLAGS}") 90endif() 91 92check_c_compiler_flag("-Wshorten-64-to-32" HAVE_SHORTEN_64_TO_32) 93check_c_compiler_flag("-Werror -fstack-protector-all" HAVE_STACK_PROTECTOR_ALL) 94 95check_include_files(cbor.h HAVE_CBOR_H) 96check_include_files(endian.h HAVE_ENDIAN_H) 97check_include_files(err.h HAVE_ERR_H) 98check_include_files(openssl/opensslv.h HAVE_OPENSSLV_H) 99check_include_files(signal.h HAVE_SIGNAL_H) 100check_include_files(sys/random.h HAVE_SYS_RANDOM_H) 101check_include_files(unistd.h HAVE_UNISTD_H) 102 103check_symbol_exists(arc4random_buf stdlib.h HAVE_ARC4RANDOM_BUF) 104check_symbol_exists(asprintf stdio.h HAVE_ASPRINTF) 105check_symbol_exists(clock_gettime time.h HAVE_CLOCK_GETTIME) 106check_symbol_exists(explicit_bzero string.h HAVE_EXPLICIT_BZERO) 107check_symbol_exists(freezero stdlib.h HAVE_FREEZERO) 108check_symbol_exists(getline stdio.h HAVE_GETLINE) 109check_symbol_exists(getopt unistd.h HAVE_GETOPT) 110check_symbol_exists(getpagesize unistd.h HAVE_GETPAGESIZE) 111check_symbol_exists(getrandom sys/random.h HAVE_GETRANDOM) 112check_symbol_exists(memset_s string.h HAVE_MEMSET_S) 113check_symbol_exists(readpassphrase readpassphrase.h HAVE_READPASSPHRASE) 114check_symbol_exists(recallocarray stdlib.h HAVE_RECALLOCARRAY) 115check_symbol_exists(strlcat string.h HAVE_STRLCAT) 116check_symbol_exists(strlcpy string.h HAVE_STRLCPY) 117check_symbol_exists(strsep string.h HAVE_STRSEP) 118check_symbol_exists(sysconf unistd.h HAVE_SYSCONF) 119check_symbol_exists(timespecsub sys/time.h HAVE_TIMESPECSUB) 120check_symbol_exists(timingsafe_bcmp string.h HAVE_TIMINGSAFE_BCMP) 121 122set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) 123try_compile(HAVE_POSIX_IOCTL 124 "${CMAKE_CURRENT_BINARY_DIR}/posix_ioctl_check.o" 125 "${CMAKE_CURRENT_SOURCE_DIR}/openbsd-compat/posix_ioctl_check.c" 126 COMPILE_DEFINITIONS "-Werror -Woverflow -Wsign-conversion") 127 128list(APPEND CHECK_VARIABLES 129 HAVE_ARC4RANDOM_BUF 130 HAVE_ASPRINTF 131 HAVE_CBOR_H 132 HAVE_CLOCK_GETTIME 133 HAVE_ENDIAN_H 134 HAVE_ERR_H 135 HAVE_FREEZERO 136 HAVE_GETLINE 137 HAVE_GETOPT 138 HAVE_GETPAGESIZE 139 HAVE_GETRANDOM 140 HAVE_MEMSET_S 141 HAVE_OPENSSLV_H 142 HAVE_POSIX_IOCTL 143 HAVE_READPASSPHRASE 144 HAVE_RECALLOCARRAY 145 HAVE_SIGNAL_H 146 HAVE_STRLCAT 147 HAVE_STRLCPY 148 HAVE_STRSEP 149 HAVE_SYSCONF 150 HAVE_SYS_RANDOM_H 151 HAVE_TIMESPECSUB 152 HAVE_TIMINGSAFE_BCMP 153 HAVE_UNISTD_H 154) 155 156foreach(v ${CHECK_VARIABLES}) 157 if (${v}) 158 add_definitions(-D${v}) 159 endif() 160endforeach() 161 162if(HAVE_EXPLICIT_BZERO AND NOT FUZZ) 163 add_definitions(-DHAVE_EXPLICIT_BZERO) 164endif() 165 166if(UNIX) 167 add_definitions(-DHAVE_DEV_URANDOM) 168endif() 169 170 171if(MSVC) 172 if((NOT CBOR_INCLUDE_DIRS) OR (NOT CBOR_LIBRARY_DIRS) OR 173 (NOT CRYPTO_INCLUDE_DIRS) OR (NOT CRYPTO_LIBRARY_DIRS) OR 174 (NOT ZLIB_INCLUDE_DIRS) OR (NOT ZLIB_LIBRARY_DIRS)) 175 message(FATAL_ERROR "please define " 176 "{CBOR,CRYPTO,ZLIB}_{INCLUDE,LIBRARY}_DIRS when " 177 "building under msvc") 178 endif() 179 if(BUILD_TESTS AND BUILD_SHARED_LIBS AND 180 ((NOT CBOR_BIN_DIRS) OR (NOT ZLIB_BIN_DIRS) OR (NOT CRYPTO_BIN_DIRS))) 181 message(FATAL_ERROR "please define {CBOR,CRYPTO,ZLIB}_BIN_DIRS " 182 "when building tests") 183 endif() 184 if(NOT CBOR_LIBRARIES) 185 set(CBOR_LIBRARIES cbor) 186 endif() 187 if(NOT ZLIB_LIBRARIES) 188 set(ZLIB_LIBRARIES zlib1) 189 endif() 190 if(NOT CRYPTO_LIBRARIES) 191 set(CRYPTO_LIBRARIES crypto) 192 endif() 193 194 set(MSVC_DISABLED_WARNINGS_LIST 195 "C4152" # nonstandard extension used: function/data pointer 196 # conversion in expression; 197 "C4200" # nonstandard extension used: zero-sized array in 198 # struct/union; 199 "C4201" # nonstandard extension used: nameless struct/union; 200 "C4204" # nonstandard extension used: non-constant aggregate 201 # initializer; 202 "C4706" # assignment within conditional expression; 203 "C4996" # The POSIX name for this item is deprecated. Instead, 204 # use the ISO C and C++ conformant name; 205 "C6287" # redundant code: the left and right subexpressions are identical 206 ) 207 # The construction in the following 3 lines was taken from LibreSSL's 208 # CMakeLists.txt. 209 string(REPLACE "C" " -wd" MSVC_DISABLED_WARNINGS_STR 210 ${MSVC_DISABLED_WARNINGS_LIST}) 211 string(REGEX REPLACE "[/-]W[1234][ ]?" "" CMAKE_C_FLAGS ${CMAKE_C_FLAGS}) 212 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MP -W4 -WX ${MSVC_DISABLED_WARNINGS_STR}") 213 set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /Od /Z7 /guard:cf /sdl /RTCcsu") 214 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Zi /guard:cf /sdl") 215 if(USE_WINHELLO) 216 add_definitions(-DUSE_WINHELLO) 217 endif() 218 set(NFC_LINUX OFF) 219else() 220 include(FindPkgConfig) 221 pkg_search_module(CBOR libcbor) 222 pkg_search_module(CRYPTO libcrypto) 223 pkg_search_module(ZLIB zlib) 224 225 if(NOT CBOR_FOUND AND NOT HAVE_CBOR_H) 226 message(FATAL_ERROR "could not find libcbor") 227 endif() 228 if(NOT CRYPTO_FOUND AND NOT HAVE_OPENSSLV_H) 229 message(FATAL_ERROR "could not find libcrypto") 230 endif() 231 if(NOT ZLIB_FOUND) 232 message(FATAL_ERROR "could not find zlib") 233 endif() 234 235 if(NOT CBOR_LIBRARIES) 236 set(CBOR_LIBRARIES "cbor") 237 endif() 238 if(NOT CRYPTO_LIBRARIES) 239 set(CRYPTO_LIBRARIES "crypto") 240 endif() 241 242 if(CMAKE_SYSTEM_NAME STREQUAL "Linux") 243 pkg_search_module(UDEV libudev REQUIRED) 244 set(UDEV_NAME "udev") 245 # If using hidapi, use hidapi-hidraw. 246 set(HIDAPI_SUFFIX -hidraw) 247 if(NOT HAVE_CLOCK_GETTIME) 248 # Look for clock_gettime in librt. 249 check_library_exists(rt clock_gettime "time.h" 250 HAVE_CLOCK_GETTIME) 251 if (HAVE_CLOCK_GETTIME) 252 add_definitions(-DHAVE_CLOCK_GETTIME) 253 set(BASE_LIBRARIES ${BASE_LIBRARIES} rt) 254 endif() 255 endif() 256 else() 257 set(NFC_LINUX OFF) 258 endif() 259 260 if(MINGW) 261 # MinGW is stuck with a flavour of C89. 262 add_definitions(-DFIDO_NO_DIAGNOSTIC) 263 add_definitions(-DWC_ERR_INVALID_CHARS=0x80) 264 add_compile_options(-Wno-unused-parameter) 265 endif() 266 267 if(FUZZ) 268 set(USE_PCSC ON) 269 add_definitions(-DFIDO_FUZZ) 270 endif() 271 272 # If building with PCSC, look for pcsc-lite. 273 if(USE_PCSC AND NOT (APPLE OR CYGWIN OR MSYS OR MINGW)) 274 pkg_search_module(PCSC libpcsclite REQUIRED) 275 set(PCSC_LIBRARIES pcsclite) 276 endif() 277 278 if(USE_HIDAPI) 279 add_definitions(-DUSE_HIDAPI) 280 pkg_search_module(HIDAPI hidapi${HIDAPI_SUFFIX} REQUIRED) 281 set(HIDAPI_LIBRARIES hidapi${HIDAPI_SUFFIX}) 282 endif() 283 284 if(NFC_LINUX) 285 add_definitions(-DUSE_NFC) 286 endif() 287 288 if(WIN32) 289 if(USE_WINHELLO) 290 add_definitions(-DUSE_WINHELLO) 291 endif() 292 else() 293 set(USE_WINHELLO OFF) 294 endif() 295 296 add_compile_options(-Wall) 297 add_compile_options(-Wextra) 298 add_compile_options(-Werror) 299 add_compile_options(-Wshadow) 300 add_compile_options(-Wcast-qual) 301 add_compile_options(-Wwrite-strings) 302 add_compile_options(-Wmissing-prototypes) 303 add_compile_options(-Wbad-function-cast) 304 add_compile_options(-Wimplicit-fallthrough) 305 add_compile_options(-pedantic) 306 add_compile_options(-pedantic-errors) 307 308 set(EXTRA_CFLAGS "-Wconversion -Wsign-conversion") 309 310 if(WIN32) 311 add_compile_options(-Wno-type-limits) 312 add_compile_options(-Wno-cast-function-type) 313 endif() 314 315 if(HAVE_SHORTEN_64_TO_32) 316 add_compile_options(-Wshorten-64-to-32) 317 endif() 318 319 if(HAVE_STACK_PROTECTOR_ALL) 320 add_compile_options(-fstack-protector-all) 321 endif() 322 323 set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g2") 324 set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -fno-omit-frame-pointer") 325 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -D_FORTIFY_SOURCE=2") 326 327 if(CRYPTO_VERSION VERSION_GREATER_EQUAL 3.0) 328 add_definitions(-DOPENSSL_API_COMPAT=0x10100000L) 329 endif() 330 331 if(NOT FUZZ) 332 set(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Wframe-larger-than=2047") 333 endif() 334endif() 335 336# Avoid https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66425 337if(CMAKE_COMPILER_IS_GNUCC) 338 add_compile_options(-Wno-unused-result) 339endif() 340 341# Decide which keyword to use for thread-local storage. 342if(CMAKE_COMPILER_IS_GNUCC OR 343 CMAKE_C_COMPILER_ID STREQUAL "Clang" OR 344 CMAKE_C_COMPILER_ID STREQUAL "AppleClang") 345 set(TLS "__thread") 346elseif(WIN32) 347 set(TLS "__declspec(thread)") 348endif() 349add_definitions(-DTLS=${TLS}) 350 351if(USE_PCSC) 352 add_definitions(-DUSE_PCSC) 353endif() 354 355# export list 356if(APPLE AND (CMAKE_C_COMPILER_ID STREQUAL "Clang" OR 357 CMAKE_C_COMPILER_ID STREQUAL "AppleClang")) 358 # clang + lld 359 string(CONCAT CMAKE_SHARED_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS} 360 " -exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/src/export.llvm") 361elseif(NOT MSVC) 362 # clang/gcc + gnu ld 363 if(FUZZ) 364 string(CONCAT CMAKE_SHARED_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS} 365 " -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/fuzz/export.gnu") 366 else() 367 string(CONCAT CMAKE_SHARED_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS} 368 " -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/src/export.gnu") 369 endif() 370 if(NOT WIN32) 371 string(CONCAT CMAKE_SHARED_LINKER_FLAGS 372 ${CMAKE_SHARED_LINKER_FLAGS} 373 " -Wl,-z,noexecstack -Wl,-z,relro,-z,now") 374 string(CONCAT CMAKE_EXE_LINKER_FLAGS 375 ${CMAKE_EXE_LINKER_FLAGS} 376 " -Wl,-z,noexecstack -Wl,-z,relro,-z,now") 377 if(FUZZ) 378 file(STRINGS fuzz/wrapped.sym WRAPPED_SYMBOLS) 379 foreach(s ${WRAPPED_SYMBOLS}) 380 string(CONCAT CMAKE_SHARED_LINKER_FLAGS 381 ${CMAKE_SHARED_LINKER_FLAGS} 382 " -Wl,--wrap=${s}") 383 endforeach() 384 endif() 385 endif() 386else() 387 string(CONCAT CMAKE_SHARED_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS} 388 " /def:\"${CMAKE_CURRENT_SOURCE_DIR}/src/export.msvc\"") 389endif() 390 391include_directories(${PROJECT_SOURCE_DIR}/src) 392include_directories(${CBOR_INCLUDE_DIRS}) 393include_directories(${CRYPTO_INCLUDE_DIRS}) 394include_directories(${HIDAPI_INCLUDE_DIRS}) 395include_directories(${PCSC_INCLUDE_DIRS}) 396include_directories(${UDEV_INCLUDE_DIRS}) 397include_directories(${ZLIB_INCLUDE_DIRS}) 398 399link_directories(${CBOR_LIBRARY_DIRS}) 400link_directories(${CRYPTO_LIBRARY_DIRS}) 401link_directories(${HIDAPI_LIBRARY_DIRS}) 402link_directories(${PCSC_LIBRARY_DIRS}) 403link_directories(${UDEV_LIBRARY_DIRS}) 404link_directories(${ZLIB_LIBRARY_DIRS}) 405 406message(STATUS "BASE_LIBRARIES: ${BASE_LIBRARIES}") 407message(STATUS "BUILD_EXAMPLES: ${BUILD_EXAMPLES}") 408message(STATUS "BUILD_MANPAGES: ${BUILD_MANPAGES}") 409message(STATUS "BUILD_SHARED_LIBS: ${BUILD_SHARED_LIBS}") 410message(STATUS "BUILD_STATIC_LIBS: ${BUILD_STATIC_LIBS}") 411message(STATUS "BUILD_TOOLS: ${BUILD_TOOLS}") 412message(STATUS "CBOR_INCLUDE_DIRS: ${CBOR_INCLUDE_DIRS}") 413message(STATUS "CBOR_LIBRARIES: ${CBOR_LIBRARIES}") 414message(STATUS "CBOR_LIBRARY_DIRS: ${CBOR_LIBRARY_DIRS}") 415if(BUILD_TESTS) 416 message(STATUS "CBOR_BIN_DIRS: ${CBOR_BIN_DIRS}") 417endif() 418message(STATUS "CBOR_VERSION: ${CBOR_VERSION}") 419message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") 420message(STATUS "CMAKE_C_COMPILER: ${CMAKE_C_COMPILER}") 421message(STATUS "CMAKE_C_COMPILER_ID: ${CMAKE_C_COMPILER_ID}") 422message(STATUS "CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}") 423message(STATUS "CMAKE_CROSSCOMPILING: ${CMAKE_CROSSCOMPILING}") 424message(STATUS "CMAKE_GENERATOR_PLATFORM: ${CMAKE_GENERATOR_PLATFORM}") 425message(STATUS "CMAKE_HOST_SYSTEM_NAME: ${CMAKE_HOST_SYSTEM_NAME}") 426message(STATUS "CMAKE_HOST_SYSTEM_PROCESSOR: ${CMAKE_HOST_SYSTEM_PROCESSOR}") 427message(STATUS "CMAKE_INSTALL_LIBDIR: ${CMAKE_INSTALL_LIBDIR}") 428message(STATUS "CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}") 429message(STATUS "CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}") 430message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}") 431message(STATUS "CMAKE_SYSTEM_VERSION: ${CMAKE_SYSTEM_VERSION}") 432message(STATUS "CRYPTO_INCLUDE_DIRS: ${CRYPTO_INCLUDE_DIRS}") 433message(STATUS "CRYPTO_LIBRARIES: ${CRYPTO_LIBRARIES}") 434message(STATUS "CRYPTO_LIBRARY_DIRS: ${CRYPTO_LIBRARY_DIRS}") 435if(BUILD_TESTS) 436 message(STATUS "CRYPTO_BIN_DIRS: ${CRYPTO_BIN_DIRS}") 437endif() 438message(STATUS "CRYPTO_VERSION: ${CRYPTO_VERSION}") 439message(STATUS "FIDO_VERSION: ${FIDO_VERSION}") 440message(STATUS "FUZZ: ${FUZZ}") 441if(FUZZ) 442 message(STATUS "FUZZ_LDFLAGS: ${FUZZ_LDFLAGS}") 443endif() 444message(STATUS "ZLIB_INCLUDE_DIRS: ${ZLIB_INCLUDE_DIRS}") 445message(STATUS "ZLIB_LIBRARIES: ${ZLIB_LIBRARIES}") 446message(STATUS "ZLIB_LIBRARY_DIRS: ${ZLIB_LIBRARY_DIRS}") 447if(BUILD_TESTS) 448 message(STATUS "ZLIB_BIN_DIRS: ${ZLIB_BIN_DIRS}") 449endif() 450message(STATUS "ZLIB_VERSION: ${ZLIB_VERSION}") 451if(USE_HIDAPI) 452 message(STATUS "HIDAPI_INCLUDE_DIRS: ${HIDAPI_INCLUDE_DIRS}") 453 message(STATUS "HIDAPI_LIBRARIES: ${HIDAPI_LIBRARIES}") 454 message(STATUS "HIDAPI_LIBRARY_DIRS: ${HIDAPI_LIBRARY_DIRS}") 455 message(STATUS "HIDAPI_VERSION: ${HIDAPI_VERSION}") 456endif() 457message(STATUS "PCSC_INCLUDE_DIRS: ${PCSC_INCLUDE_DIRS}") 458message(STATUS "PCSC_LIBRARIES: ${PCSC_LIBRARIES}") 459message(STATUS "PCSC_LIBRARY_DIRS: ${PCSC_LIBRARY_DIRS}") 460message(STATUS "PCSC_VERSION: ${PCSC_VERSION}") 461message(STATUS "TLS: ${TLS}") 462message(STATUS "UDEV_INCLUDE_DIRS: ${UDEV_INCLUDE_DIRS}") 463message(STATUS "UDEV_LIBRARIES: ${UDEV_LIBRARIES}") 464message(STATUS "UDEV_LIBRARY_DIRS: ${UDEV_LIBRARY_DIRS}") 465message(STATUS "UDEV_RULES_DIR: ${UDEV_RULES_DIR}") 466message(STATUS "UDEV_VERSION: ${UDEV_VERSION}") 467message(STATUS "USE_HIDAPI: ${USE_HIDAPI}") 468message(STATUS "USE_PCSC: ${USE_PCSC}") 469message(STATUS "USE_WINHELLO: ${USE_WINHELLO}") 470message(STATUS "NFC_LINUX: ${NFC_LINUX}") 471 472if(BUILD_TESTS) 473 enable_testing() 474endif() 475 476add_subdirectory(src) 477 478if(BUILD_TESTS) 479 add_subdirectory(regress) 480endif() 481if(BUILD_EXAMPLES) 482 add_subdirectory(examples) 483endif() 484if(BUILD_TOOLS) 485 add_subdirectory(tools) 486endif() 487if(BUILD_MANPAGES) 488 add_subdirectory(man) 489endif() 490 491if(NOT WIN32) 492 if(FUZZ) 493 add_subdirectory(fuzz) 494 endif() 495 if(CMAKE_SYSTEM_NAME STREQUAL "Linux") 496 add_subdirectory(udev) 497 endif() 498endif() 499