create initial structure + cmakelists (thanks claude)
This commit is contained in:
@@ -0,0 +1,3 @@
|
|||||||
|
build/
|
||||||
|
build*/
|
||||||
|
.DS_Store
|
||||||
+765
@@ -0,0 +1,765 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.21)
|
||||||
|
|
||||||
|
project(bravais
|
||||||
|
VERSION 0.1.0
|
||||||
|
DESCRIPTION "Sans-IO C library for the Bravais VPN protocol (post-quantum handshake, DPLPMTUD, transport shaping)"
|
||||||
|
HOMEPAGE_URL "https://bravais.org"
|
||||||
|
LANGUAGES C)
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Platform guard: POSIX-only for now.
|
||||||
|
#
|
||||||
|
# libbravais itself is sans-IO and makes no syscalls, so the *sources* should
|
||||||
|
# port to Windows unchanged. Two things in this file do not:
|
||||||
|
#
|
||||||
|
# - the whole flag machinery below is GCC/Clang; MSVC needs its own branch
|
||||||
|
# (/W4, /analyze, /fsanitize=address, /GS, /guard:cf)
|
||||||
|
# - static and shared cannot share OUTPUT_NAME on Windows, because the DLL's
|
||||||
|
# import library is also bravais.lib and would collide with the static one
|
||||||
|
#
|
||||||
|
# Port bravaisd's platform backends first; this can wait.
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
if(WIN32)
|
||||||
|
message(FATAL_ERROR "libbravais has no MSVC/Windows build yet (the sources are portable; this file is not).")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Options
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
option(BRAVAIS_BUILD_STATIC "Build libbravais.a" ON)
|
||||||
|
option(BRAVAIS_BUILD_SHARED "Build libbravais.so" ON)
|
||||||
|
option(BRAVAIS_BUILD_TESTS "Build libbravais tests" OFF)
|
||||||
|
option(BRAVAIS_BUILD_FUZZERS "Build libbravais fuzz targets (needs Clang)" OFF)
|
||||||
|
option(BRAVAIS_BUILD_EXAMPLES "Build libbravais example programs" OFF)
|
||||||
|
|
||||||
|
if(NOT BRAVAIS_BUILD_STATIC AND NOT BRAVAIS_BUILD_SHARED)
|
||||||
|
message(FATAL_ERROR "Both BRAVAIS_BUILD_STATIC and BRAVAIS_BUILD_SHARED are OFF; nothing to build.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Crypto is a hard dependency of proto/ and crypto/, but not of util/ or wire/.
|
||||||
|
# Turn this off to bootstrap the cursor and the frame parser on a machine
|
||||||
|
# without liboqs installed; turn it back on before writing a line of crypto/.
|
||||||
|
option(BRAVAIS_ENABLE_CRYPTO "Link libsodium and liboqs (required for crypto/ and proto/)" ON)
|
||||||
|
|
||||||
|
# The warning set, the sanitizers and the custom configurations below are for
|
||||||
|
# working *on* bravais, not for working *with* it. A project that vendors us via
|
||||||
|
# add_subdirectory() wants a library, not our -Werror policy or an ASan runtime
|
||||||
|
# it never asked for, so the whole developer flag machinery defaults to
|
||||||
|
# top-level builds. Force it on with -DBRAVAIS_DEVELOPER_BUILD=ON if you are
|
||||||
|
# vendoring bravais and want it built the way we build it.
|
||||||
|
option(BRAVAIS_DEVELOPER_BUILD
|
||||||
|
"Build bravais with its own warning set, configurations and instrumentation"
|
||||||
|
${PROJECT_IS_TOP_LEVEL})
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Feature macros so POSIX/BSD calls resolve under -std=c23. On glibc,
|
||||||
|
# _POSIX_C_SOURCE + _DEFAULT_SOURCE expose them; on macOS, _POSIX_C_SOURCE
|
||||||
|
# alone *hides* BSD extensions, so _DARWIN_C_SOURCE is added to restore the
|
||||||
|
# full set.
|
||||||
|
#
|
||||||
|
# libbravais is sans-IO and should need none of this: no sockets, no clocks
|
||||||
|
# (the caller passes nowMs), no file descriptors. It is defined anyway so that
|
||||||
|
# a stray <endian.h> or a libsodium header expecting a POSIX environment does
|
||||||
|
# not fail oddly, and so tests/ and bravaisd can reuse the same list. If you
|
||||||
|
# find yourself *needing* one of these in src/, that is a sans-IO violation --
|
||||||
|
# fix the code, not this list.
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
set(BRAVAIS_FEATURE_DEFS _POSIX_C_SOURCE=200809L _DEFAULT_SOURCE)
|
||||||
|
if(APPLE)
|
||||||
|
list(APPEND BRAVAIS_FEATURE_DEFS _DARWIN_C_SOURCE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Build configuration
|
||||||
|
#
|
||||||
|
# cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug # -Og -g3, ASan + UBSan
|
||||||
|
# cmake -S . -B build-strict -DCMAKE_BUILD_TYPE=Strict # Debug plus -Werror
|
||||||
|
# cmake -S . -B build-analyzer -DCMAKE_BUILD_TYPE=Analyzer # -Og -g3, GCC -fanalyzer
|
||||||
|
# cmake -S . -B build-release -DCMAKE_BUILD_TYPE=Release # -O3, _FORTIFY_SOURCE
|
||||||
|
#
|
||||||
|
# Debug finds memory bugs at run time, Analyzer finds them at compile time,
|
||||||
|
# Release survives them. Strict is Debug with warnings promoted to errors -- the
|
||||||
|
# configuration CI should gate on, kept separate so a new warning never blocks
|
||||||
|
# someone mid-debugging. The warning set is identical in all four; only the
|
||||||
|
# instrumentation and the error policy differ.
|
||||||
|
#
|
||||||
|
# Debug and Analyzer are separate configurations rather than one Debug build
|
||||||
|
# with everything switched on, because the two tools actively interfere: ASan's
|
||||||
|
# instrumentation inflates the CFG enough that -fanalyzer exhausts its
|
||||||
|
# exploration budget and silently stops reporting.
|
||||||
|
#
|
||||||
|
# ThreadSanitizer is deliberately absent: it cannot be combined with ASan, so it
|
||||||
|
# would need a third configuration of its own. libbravais is single-threaded by
|
||||||
|
# design -- a bravais_conn_t is owned by one thread and the library spawns
|
||||||
|
# none -- so TSan belongs in bravaisd's build, not here.
|
||||||
|
#
|
||||||
|
# MemorySanitizer is also absent, and is more tempting than TSan: a parser fed
|
||||||
|
# attacker-controlled bytes is exactly what MSan is for. It needs every
|
||||||
|
# dependency rebuilt instrumented (libsodium and liboqs included) or it drowns
|
||||||
|
# in false positives, so it is a separate build tree with its own toolchain
|
||||||
|
# file, not a configuration here.
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
set(BRAVAIS_CUSTOM_CONFIGS Strict Analyzer)
|
||||||
|
set(BRAVAIS_BUILD_TYPES Debug Strict Analyzer Release RelWithDebInfo MinSizeRel)
|
||||||
|
|
||||||
|
if(BRAVAIS_DEVELOPER_BUILD)
|
||||||
|
get_property(BRAVAIS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||||
|
if(BRAVAIS_MULTI_CONFIG)
|
||||||
|
foreach(_cfg IN LISTS BRAVAIS_CUSTOM_CONFIGS)
|
||||||
|
if(NOT "${_cfg}" IN_LIST CMAKE_CONFIGURATION_TYPES)
|
||||||
|
list(APPEND CMAKE_CONFIGURATION_TYPES ${_cfg})
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
elseif(NOT CMAKE_BUILD_TYPE)
|
||||||
|
set(CMAKE_BUILD_TYPE Debug CACHE STRING "Build type" FORCE)
|
||||||
|
message(STATUS "No CMAKE_BUILD_TYPE specified; defaulting to Debug")
|
||||||
|
endif()
|
||||||
|
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS ${BRAVAIS_BUILD_TYPES})
|
||||||
|
|
||||||
|
# Strict and Analyzer are custom configurations, so CMake has no built-in
|
||||||
|
# flags for them. Both inherit Debug's, and imported targets need a mapping
|
||||||
|
# because they only ship Debug/Release/NOCONFIG. liboqs and libsodium both
|
||||||
|
# arrive as imported targets, so this mapping is load-bearing here in a way
|
||||||
|
# it was not when the only dependency was Threads::Threads.
|
||||||
|
foreach(_cfg IN LISTS BRAVAIS_CUSTOM_CONFIGS)
|
||||||
|
string(TOUPPER ${_cfg} _cfg_upper)
|
||||||
|
set(CMAKE_C_FLAGS_${_cfg_upper} "${CMAKE_C_FLAGS_DEBUG}"
|
||||||
|
CACHE STRING "Flags used by the C compiler during ${_cfg} builds.")
|
||||||
|
mark_as_advanced(CMAKE_C_FLAGS_${_cfg_upper})
|
||||||
|
foreach(_linker EXE SHARED MODULE STATIC)
|
||||||
|
set(CMAKE_${_linker}_LINKER_FLAGS_${_cfg_upper} "${CMAKE_${_linker}_LINKER_FLAGS_DEBUG}"
|
||||||
|
CACHE STRING "Flags used by the linker during ${_cfg} builds.")
|
||||||
|
mark_as_advanced(CMAKE_${_linker}_LINKER_FLAGS_${_cfg_upper})
|
||||||
|
endforeach()
|
||||||
|
set(CMAKE_MAP_IMPORTED_CONFIG_${_cfg_upper} Debug "" Release RelWithDebInfo)
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Debug, Strict and Analyzer share the developer flag set (-Og -g3, warnings).
|
||||||
|
set(BRAVAIS_IS_DEBUGLIKE "$<OR:$<CONFIG:Debug>,$<CONFIG:Strict>,$<CONFIG:Analyzer>>")
|
||||||
|
# Debug and Strict are the runtime-instrumented pair; Analyzer must stay clean
|
||||||
|
# of sanitizers or -fanalyzer goes quiet (see above).
|
||||||
|
set(BRAVAIS_IS_SANITIZED "$<OR:$<CONFIG:Debug>,$<CONFIG:Strict>>")
|
||||||
|
|
||||||
|
# The Strict configuration always errors on warnings; this option additionally
|
||||||
|
# promotes them in Debug and Analyzer. OFF by default even though the tree is
|
||||||
|
# clean today, so a new compiler version's new warning never blocks someone
|
||||||
|
# mid-debugging -- build Strict when you want the gate.
|
||||||
|
option(BRAVAIS_WERROR "Debug/Analyzer: treat warnings as errors (always on in Strict)" OFF)
|
||||||
|
option(BRAVAIS_ENABLE_SANITIZERS "Debug/Strict configs: AddressSanitizer + UndefinedBehaviorSanitizer" ON)
|
||||||
|
option(BRAVAIS_ENABLE_ANALYZER "Analyzer config: the compiler's static analyzer (GCC -fanalyzer)" ON)
|
||||||
|
option(BRAVAIS_ENABLE_HARDENING "All configs: stack protector, _FORTIFY_SOURCE, RELRO/NOW, CFI" ON)
|
||||||
|
option(BRAVAIS_ENABLE_LTO "Optimized configs: link-time optimization" OFF)
|
||||||
|
|
||||||
|
# How much of the control-flow path -fanalyzer prints per report. 1 lists only
|
||||||
|
# the state transitions (opened here / first close here / leaks here), which is
|
||||||
|
# what you want while triaging; raise it when a report needs the branch-by-branch
|
||||||
|
# path that explains how it got there. GCC silently accepts out-of-range values,
|
||||||
|
# so validate here instead.
|
||||||
|
set(BRAVAIS_ANALYZER_VERBOSITY 1 CACHE STRING "Analyzer config: -fanalyzer path detail, 0 (terse) to 5 (full)")
|
||||||
|
set_property(CACHE BRAVAIS_ANALYZER_VERBOSITY PROPERTY STRINGS 0 1 2 3 4 5)
|
||||||
|
if(NOT BRAVAIS_ANALYZER_VERBOSITY MATCHES "^[0-5]$")
|
||||||
|
message(FATAL_ERROR
|
||||||
|
"BRAVAIS_ANALYZER_VERBOSITY must be an integer from 0 to 5, got '${BRAVAIS_ANALYZER_VERBOSITY}'")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Flag probing
|
||||||
|
#
|
||||||
|
# Most of the interesting memory diagnostics below only exist from a certain
|
||||||
|
# GCC/Clang version onwards, and several are architecture specific. Probe every
|
||||||
|
# flag instead of gating on compiler version, so an older or foreign toolchain
|
||||||
|
# silently gets the subset it understands rather than failing to configure.
|
||||||
|
#
|
||||||
|
# A flag the driver merely tolerates is not a flag that does anything (Clang
|
||||||
|
# accepts -fstack-clash-protection on arm64 and then ignores it), so the probe
|
||||||
|
# promotes "argument unused" to an error where the compiler supports that.
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
include(CheckCCompilerFlag)
|
||||||
|
include(CheckLinkerFlag)
|
||||||
|
|
||||||
|
check_c_compiler_flag(-Werror=unused-command-line-argument BRAVAIS_HAS_WERROR_UNUSED_ARG)
|
||||||
|
if(BRAVAIS_HAS_WERROR_UNUSED_ARG)
|
||||||
|
set(BRAVAIS_FLAG_PROBE_STRICT "-Werror=unused-command-line-argument")
|
||||||
|
else()
|
||||||
|
set(BRAVAIS_FLAG_PROBE_STRICT "")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
function(bravais_append_supported_c_flags out_var)
|
||||||
|
set(_accepted ${${out_var}})
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "${BRAVAIS_FLAG_PROBE_STRICT}")
|
||||||
|
foreach(_flag IN LISTS ARGN)
|
||||||
|
string(MAKE_C_IDENTIFIER "BRAVAIS_HAS_CFLAG_${_flag}" _cache_var)
|
||||||
|
check_c_compiler_flag("${_flag}" ${_cache_var})
|
||||||
|
if(${_cache_var})
|
||||||
|
list(APPEND _accepted "${_flag}")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
set(${out_var} "${_accepted}" PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# Instrumentation such as -fsanitize=address has to reach the linker as well,
|
||||||
|
# and is only usable if the matching runtime library actually exists, so the
|
||||||
|
# probe hands the flag to both halves of the try-compile.
|
||||||
|
#
|
||||||
|
# Flags are also probed cumulatively, in the order given: some are only legal in
|
||||||
|
# the presence of an earlier one (-fsanitize=pointer-compare is rejected unless
|
||||||
|
# -fsanitize=address is already on the command line), and probing it alone would
|
||||||
|
# quietly drop it.
|
||||||
|
function(bravais_append_supported_instrument_flags out_var)
|
||||||
|
set(_accepted ${${out_var}})
|
||||||
|
set(_context "")
|
||||||
|
foreach(_flag IN LISTS ARGN)
|
||||||
|
string(MAKE_C_IDENTIFIER "BRAVAIS_HAS_INSTRUMENT_${_flag}" _cache_var)
|
||||||
|
string(JOIN " " CMAKE_REQUIRED_FLAGS ${BRAVAIS_FLAG_PROBE_STRICT} ${_context})
|
||||||
|
set(CMAKE_REQUIRED_LINK_OPTIONS ${_context} "${_flag}")
|
||||||
|
check_c_compiler_flag("${_flag}" ${_cache_var})
|
||||||
|
if(${_cache_var})
|
||||||
|
list(APPEND _accepted "${_flag}")
|
||||||
|
list(APPEND _context "${_flag}")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
set(${out_var} "${_accepted}" PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(bravais_append_supported_link_flags out_var)
|
||||||
|
set(_accepted ${${out_var}})
|
||||||
|
foreach(_flag IN LISTS ARGN)
|
||||||
|
string(MAKE_C_IDENTIFIER "BRAVAIS_HAS_LDFLAG_${_flag}" _cache_var)
|
||||||
|
check_linker_flag(C "${_flag}" ${_cache_var})
|
||||||
|
if(${_cache_var})
|
||||||
|
list(APPEND _accepted "${_flag}")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
set(${out_var} "${_accepted}" PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Flag sets
|
||||||
|
#
|
||||||
|
# The per-config sets are applied through generator expressions so multi-config
|
||||||
|
# generators (Xcode, VS) work too.
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
set(BRAVAIS_C_WARNINGS "")
|
||||||
|
set(BRAVAIS_C_FLAGS_DEBUGLIKE "")
|
||||||
|
set(BRAVAIS_C_FLAGS_OPTIMIZED "")
|
||||||
|
# The two instrumentation sets, each owned by one configuration and never both.
|
||||||
|
set(BRAVAIS_SANITIZER_FLAGS "")
|
||||||
|
set(BRAVAIS_ANALYZER_FLAGS "")
|
||||||
|
# Instrumentation that must be handed to the linker as well.
|
||||||
|
set(BRAVAIS_INSTRUMENT_COMPILE "")
|
||||||
|
set(BRAVAIS_INSTRUMENT_LINK "")
|
||||||
|
set(BRAVAIS_WERROR_FLAG -Werror)
|
||||||
|
|
||||||
|
# No MSVC branch: the WIN32 guard above makes this file unreachable there.
|
||||||
|
if(BRAVAIS_DEVELOPER_BUILD)
|
||||||
|
# Portable warning set, memory-safety first.
|
||||||
|
#
|
||||||
|
# -Wconversion and -Wsign-conversion matter more here than in most C
|
||||||
|
# projects: this library spends its life converting between size_t lengths,
|
||||||
|
# uint64_t varints and the narrow fields of a wire format, and a silent
|
||||||
|
# truncation in that path is a parser bug by another name.
|
||||||
|
bravais_append_supported_c_flags(BRAVAIS_C_WARNINGS
|
||||||
|
-Wall
|
||||||
|
-Wextra
|
||||||
|
-Wpedantic
|
||||||
|
-Wshadow
|
||||||
|
-Wconversion
|
||||||
|
-Wsign-conversion
|
||||||
|
-Wcast-qual
|
||||||
|
-Wcast-align
|
||||||
|
-Wstrict-prototypes
|
||||||
|
-Wmissing-prototypes
|
||||||
|
-Wold-style-definition
|
||||||
|
-Wbad-function-cast
|
||||||
|
-Wwrite-strings
|
||||||
|
-Wformat=2
|
||||||
|
-Wnull-dereference
|
||||||
|
-Wdouble-promotion
|
||||||
|
-Wfloat-equal
|
||||||
|
-Wvla
|
||||||
|
-Wstack-protector
|
||||||
|
-Wpointer-arith
|
||||||
|
-Wundef
|
||||||
|
-Winit-self
|
||||||
|
-Wmissing-include-dirs
|
||||||
|
-Wswitch-enum
|
||||||
|
)
|
||||||
|
|
||||||
|
if(CMAKE_C_COMPILER_ID MATCHES "GNU")
|
||||||
|
# GCC-only diagnostics. The -W*=N forms ask for the strictest level:
|
||||||
|
# more false positives, but they catch out-of-bounds writes, dangling
|
||||||
|
# pointers and double frees that -Wall/-Wextra walk straight past.
|
||||||
|
bravais_append_supported_c_flags(BRAVAIS_C_WARNINGS
|
||||||
|
-Warray-bounds=2
|
||||||
|
-Wstringop-overflow=4
|
||||||
|
-Wstringop-truncation
|
||||||
|
-Wformat-overflow=2
|
||||||
|
-Wformat-truncation=2
|
||||||
|
-Wuse-after-free=3
|
||||||
|
-Wdangling-pointer=2
|
||||||
|
-Wfree-nonheap-object
|
||||||
|
-Walloc-zero
|
||||||
|
-Walloca
|
||||||
|
-Wduplicated-cond
|
||||||
|
-Wduplicated-branches
|
||||||
|
-Wlogical-op
|
||||||
|
-Wjump-misses-init
|
||||||
|
-Wtrampolines
|
||||||
|
-Wflex-array-member-not-at-end
|
||||||
|
)
|
||||||
|
# -fanalyzer is a whole-path symbolic execution pass (leaks, double
|
||||||
|
# free, use-after-free, NULL derefs across function boundaries). It is
|
||||||
|
# the only reason the Analyzer configuration exists.
|
||||||
|
if(BRAVAIS_ENABLE_ANALYZER)
|
||||||
|
bravais_append_supported_c_flags(BRAVAIS_ANALYZER_FLAGS
|
||||||
|
-fanalyzer-verbosity=${BRAVAIS_ANALYZER_VERBOSITY}
|
||||||
|
-fanalyzer
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
elseif(CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||||
|
# Clang-only diagnostics. Clang has no in-compiler equivalent of
|
||||||
|
# -fanalyzer, so the Analyzer config is simply an uninstrumented Debug
|
||||||
|
# build here -- which is exactly the base `scan-build cmake --build
|
||||||
|
# build-analyzer` wants.
|
||||||
|
bravais_append_supported_c_flags(BRAVAIS_C_WARNINGS
|
||||||
|
-Warray-bounds-pointer-arithmetic
|
||||||
|
-Wconditional-uninitialized
|
||||||
|
-Wshift-sign-overflow
|
||||||
|
-Wassign-enum
|
||||||
|
-Wcomma
|
||||||
|
-Wloop-analysis
|
||||||
|
-Wthread-safety
|
||||||
|
-Wover-aligned
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# -Og keeps the code steppable while still running the optimizer passes
|
||||||
|
# that -Wmaybe-uninitialized / -Wstringop-* rely on; at -O0 those warnings
|
||||||
|
# go quiet. -fno-omit-frame-pointer buys readable sanitizer backtraces.
|
||||||
|
bravais_append_supported_c_flags(BRAVAIS_C_FLAGS_DEBUGLIKE
|
||||||
|
-Og
|
||||||
|
-g3
|
||||||
|
-fno-omit-frame-pointer
|
||||||
|
)
|
||||||
|
if(BRAVAIS_WERROR)
|
||||||
|
list(APPEND BRAVAIS_C_FLAGS_DEBUGLIKE ${BRAVAIS_WERROR_FLAG})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(BRAVAIS_ENABLE_HARDENING)
|
||||||
|
bravais_append_supported_c_flags(BRAVAIS_C_FLAGS_DEBUGLIKE
|
||||||
|
-fstack-protector-strong
|
||||||
|
)
|
||||||
|
# _FORTIFY_SOURCE needs an optimized build to see through the buffer
|
||||||
|
# sizes, and it fights ASan's interceptors, so it is Release-only.
|
||||||
|
bravais_append_supported_c_flags(BRAVAIS_C_FLAGS_OPTIMIZED
|
||||||
|
-U_FORTIFY_SOURCE
|
||||||
|
-D_FORTIFY_SOURCE=3
|
||||||
|
-fstack-protector-strong
|
||||||
|
-fstack-clash-protection
|
||||||
|
)
|
||||||
|
bravais_append_supported_instrument_flags(BRAVAIS_INSTRUMENT_COMPILE
|
||||||
|
-fcf-protection=full # x86_64 CET
|
||||||
|
-mbranch-protection=standard # aarch64 BTI/PAC
|
||||||
|
)
|
||||||
|
bravais_append_supported_link_flags(BRAVAIS_INSTRUMENT_LINK
|
||||||
|
"LINKER:-z,relro"
|
||||||
|
"LINKER:-z,now"
|
||||||
|
"LINKER:-z,noexecstack"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(BRAVAIS_ENABLE_SANITIZERS)
|
||||||
|
# Everything that composes with ASan. LeakSanitizer is not listed
|
||||||
|
# because ASan already includes it where it is supported, and
|
||||||
|
# -fsanitize=leak cannot be combined with -fsanitize=address.
|
||||||
|
# -fno-sanitize-recover makes UB abort instead of printing and
|
||||||
|
# continuing, so a bad shift or overflow cannot be ignored in CI.
|
||||||
|
#
|
||||||
|
# pointer-compare/pointer-subtract are inert unless
|
||||||
|
# ASAN_OPTIONS=detect_invalid_pointer_pairs=2 is set at run time. Do not
|
||||||
|
# set it on macOS/arm64: that runtime check misfires there and reports
|
||||||
|
# invalid-pointer-pair against 0xfffffffffffffff0 for code containing no
|
||||||
|
# pointer comparison at all. The compile flags stay because they cost
|
||||||
|
# nothing and the check is sound on Linux.
|
||||||
|
bravais_append_supported_instrument_flags(BRAVAIS_SANITIZER_FLAGS
|
||||||
|
-fsanitize=address
|
||||||
|
-fsanitize-address-use-after-scope
|
||||||
|
-fsanitize=pointer-compare
|
||||||
|
-fsanitize=pointer-subtract
|
||||||
|
-fsanitize=undefined
|
||||||
|
-fsanitize=bounds-strict
|
||||||
|
-fno-sanitize-recover=undefined
|
||||||
|
-fno-omit-frame-pointer
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Each instrumentation set belongs to exactly one configuration. Keeping
|
||||||
|
# them in separate configs is the point of the Analyzer build, so never
|
||||||
|
# emit both.
|
||||||
|
if(BRAVAIS_SANITIZER_FLAGS)
|
||||||
|
list(APPEND BRAVAIS_INSTRUMENT_COMPILE "$<${BRAVAIS_IS_SANITIZED}:${BRAVAIS_SANITIZER_FLAGS}>")
|
||||||
|
list(APPEND BRAVAIS_INSTRUMENT_LINK "$<${BRAVAIS_IS_SANITIZED}:${BRAVAIS_SANITIZER_FLAGS}>")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(BRAVAIS_ENABLE_LTO)
|
||||||
|
include(CheckIPOSupported)
|
||||||
|
check_ipo_supported(RESULT BRAVAIS_IPO_SUPPORTED OUTPUT BRAVAIS_IPO_ERROR)
|
||||||
|
if(NOT BRAVAIS_IPO_SUPPORTED)
|
||||||
|
message(WARNING "LTO requested but unsupported by this toolchain: ${BRAVAIS_IPO_ERROR}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Applies the developer flag set to one of our targets. Deliberately a function
|
||||||
|
# rather than an INTERFACE library: the library targets go through
|
||||||
|
# install(EXPORT), and even a PRIVATE link to an INTERFACE target lands in
|
||||||
|
# INTERFACE_LINK_LIBRARIES as $<LINK_ONLY:...>, at which point CMake refuses to
|
||||||
|
# generate the export set unless that target is exported too. A function has no
|
||||||
|
# such footprint. Visible in tests/ and fuzz/ because add_subdirectory()
|
||||||
|
# inherits functions defined before the call.
|
||||||
|
function(bravais_apply_build_flags target)
|
||||||
|
# Before the gate: strict C23 is what bravais targets, not a developer
|
||||||
|
# nicety.
|
||||||
|
#
|
||||||
|
# target_compile_features(c_std_23) alone is not enough to pin the dialect.
|
||||||
|
# It only states a *lower bound*, so when the compiler's own default already
|
||||||
|
# meets it CMake emits no -std flag at all - and C_EXTENSIONS is only
|
||||||
|
# consulted when a flag is emitted. GCC 16 defaults to gnu23, so it would
|
||||||
|
# silently build with extensions on while AppleClang (default C17) got
|
||||||
|
# -std=c2x. Setting C_STANDARD explicitly makes the dialect identical on
|
||||||
|
# both. The compile feature stays as well: it is what propagates the C23
|
||||||
|
# requirement to consumers, which these properties do not.
|
||||||
|
set_target_properties(${target} PROPERTIES
|
||||||
|
C_STANDARD 23
|
||||||
|
C_STANDARD_REQUIRED ON
|
||||||
|
C_EXTENSIONS OFF
|
||||||
|
)
|
||||||
|
if(NOT BRAVAIS_DEVELOPER_BUILD)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
# Our warning policy and our dialect are nobody else's business, so these
|
||||||
|
# stay PRIVATE and never reach INTERFACE_COMPILE_OPTIONS.
|
||||||
|
target_compile_options(${target} PRIVATE
|
||||||
|
"${BRAVAIS_C_WARNINGS}"
|
||||||
|
"$<${BRAVAIS_IS_DEBUGLIKE}:${BRAVAIS_C_FLAGS_DEBUGLIKE}>"
|
||||||
|
"$<$<NOT:${BRAVAIS_IS_DEBUGLIKE}>:${BRAVAIS_C_FLAGS_OPTIMIZED}>"
|
||||||
|
# The static analyzer runs only in its own configuration, and never
|
||||||
|
# alongside the sanitizers.
|
||||||
|
"$<$<CONFIG:Analyzer>:${BRAVAIS_ANALYZER_FLAGS}>"
|
||||||
|
# Strict is Debug with the warning set turned into a build gate.
|
||||||
|
"$<$<CONFIG:Strict>:${BRAVAIS_WERROR_FLAG}>"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Instrumentation is different: it is not a policy, it is an ABI. An
|
||||||
|
# ASan-instrumented libbravais.a emits calls to __asan_* that only resolve
|
||||||
|
# if the *final* link line also carries -fsanitize=address, so a consumer of
|
||||||
|
# a Debug/Strict build must inherit the flags or it fails to link with a
|
||||||
|
# wall of undefined ___asan_* symbols.
|
||||||
|
#
|
||||||
|
# libbravais.so does resolve its own __asan_* at link time, so it would
|
||||||
|
# build either way -- but an ASan DSO loaded by an uninstrumented executable
|
||||||
|
# needs the runtime initialised first, which means LD_PRELOAD and a bad
|
||||||
|
# afternoon. Propagating the flags to consumers of the shared library too
|
||||||
|
# makes the sane case automatic and the insane case someone else's explicit
|
||||||
|
# choice. Hence PUBLIC on both library kinds, PRIVATE on executables, which
|
||||||
|
# are link leaves.
|
||||||
|
get_target_property(_target_type ${target} TYPE)
|
||||||
|
if(_target_type STREQUAL "STATIC_LIBRARY" OR _target_type STREQUAL "SHARED_LIBRARY")
|
||||||
|
set(_instrument_scope PUBLIC)
|
||||||
|
else()
|
||||||
|
set(_instrument_scope PRIVATE)
|
||||||
|
endif()
|
||||||
|
target_compile_options(${target} ${_instrument_scope} "${BRAVAIS_INSTRUMENT_COMPILE}")
|
||||||
|
target_link_options(${target} ${_instrument_scope} "${BRAVAIS_INSTRUMENT_LINK}")
|
||||||
|
if(BRAVAIS_ENABLE_LTO AND BRAVAIS_IPO_SUPPORTED)
|
||||||
|
set_target_properties(${target} PROPERTIES
|
||||||
|
INTERPROCEDURAL_OPTIMIZATION_RELEASE ON
|
||||||
|
INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO ON
|
||||||
|
INTERPROCEDURAL_OPTIMIZATION_MINSIZEREL ON
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Dependencies
|
||||||
|
#
|
||||||
|
# libsodium: X25519, ChaCha20-Poly1305, BLAKE2b, HKDF, constant-time compare,
|
||||||
|
# sodium_memzero. Found via pkg-config; it ships no CMake package.
|
||||||
|
# liboqs: ML-KEM-768. Ships a CMake config package.
|
||||||
|
#
|
||||||
|
# Both are PRIVATE link dependencies. The public header exposes neither, so a
|
||||||
|
# consumer of libbravais never needs their include directories -- and the
|
||||||
|
# static-library case still links them transitively because CMake records
|
||||||
|
# PRIVATE deps of a static library as $<LINK_ONLY:...> in the export.
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
if(BRAVAIS_ENABLE_CRYPTO)
|
||||||
|
find_package(PkgConfig REQUIRED)
|
||||||
|
pkg_check_modules(SODIUM IMPORTED_TARGET libsodium>=1.0.18)
|
||||||
|
find_package(liboqs CONFIG)
|
||||||
|
|
||||||
|
if(NOT SODIUM_FOUND OR NOT liboqs_FOUND)
|
||||||
|
message(FATAL_ERROR
|
||||||
|
"libbravais needs libsodium (found: ${SODIUM_FOUND}) and liboqs (found: ${liboqs_FOUND}).\n"
|
||||||
|
" Debian/Ubuntu: apt install libsodium-dev, then build liboqs from source\n"
|
||||||
|
" macOS: brew install libsodium liboqs\n"
|
||||||
|
"To bootstrap util/ and wire/ without them, reconfigure with "
|
||||||
|
"-DBRAVAIS_ENABLE_CRYPTO=OFF.")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Sources
|
||||||
|
#
|
||||||
|
# One list, two targets. Uncomment each group as it lands; CMake errors at
|
||||||
|
# configure time on a source file that does not exist yet, which is a feature
|
||||||
|
# (it keeps this list honest) and an annoyance (it means editing here as you
|
||||||
|
# go). Order mirrors the build order in docs/ROADMAP.md: wire before crypto,
|
||||||
|
# crypto before proto.
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
set(GLOB_RECURSE BRAVAIS_SOURCES
|
||||||
|
src/util/*.c
|
||||||
|
src/wire/*.c
|
||||||
|
)
|
||||||
|
|
||||||
|
if(BRAVAIS_ENABLE_CRYPTO)
|
||||||
|
set (GLOB_RECURSE BRAVAIS_SOURCES
|
||||||
|
${BRAVAIS_SOURCES}
|
||||||
|
src/crypto/*.c
|
||||||
|
src/proto/*.c
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Library targets
|
||||||
|
#
|
||||||
|
# Static and shared are built as two targets from one source list, which
|
||||||
|
# compiles every translation unit twice. The obvious alternative -- one OBJECT
|
||||||
|
# library consumed by both -- saves that, but $<TARGET_OBJECTS:> does not carry
|
||||||
|
# usage requirements, so the include directories, compile features and link
|
||||||
|
# dependencies would have to be restated on all three targets, and the object
|
||||||
|
# library has to join the export set for install(EXPORT) to generate at all.
|
||||||
|
# For a library this size, compiling twice is cheaper than that bookkeeping.
|
||||||
|
#
|
||||||
|
# Both get POSITION_INDEPENDENT_CODE: the shared library needs it, and the
|
||||||
|
# static one gets linked into bravaisd, which is built PIE.
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
set(BRAVAIS_LIB_TARGETS "")
|
||||||
|
|
||||||
|
if(BRAVAIS_BUILD_STATIC)
|
||||||
|
add_library(bravais_static STATIC ${BRAVAIS_SOURCES})
|
||||||
|
add_library(bravais::static ALIAS bravais_static)
|
||||||
|
list(APPEND BRAVAIS_LIB_TARGETS bravais_static)
|
||||||
|
set_target_properties(bravais_static PROPERTIES OUTPUT_NAME bravais)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(BRAVAIS_BUILD_SHARED)
|
||||||
|
add_library(bravais_shared SHARED ${BRAVAIS_SOURCES})
|
||||||
|
add_library(bravais::shared ALIAS bravais_shared)
|
||||||
|
list(APPEND BRAVAIS_LIB_TARGETS bravais_shared)
|
||||||
|
# SOVERSION tracks the major version, which is 0 -- and 0.x explicitly
|
||||||
|
# promises nothing about ABI. Bump the minor on every ABI break while the
|
||||||
|
# major is 0, and start taking SOVERSION seriously at 1.0.
|
||||||
|
set_target_properties(bravais_shared PROPERTIES
|
||||||
|
OUTPUT_NAME bravais
|
||||||
|
VERSION ${PROJECT_VERSION}
|
||||||
|
SOVERSION ${PROJECT_VERSION_MAJOR}
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# `bravais::bravais` is what consumers should link. It follows the usual CMake
|
||||||
|
# convention and resolves to the shared library when both are built.
|
||||||
|
if(BRAVAIS_BUILD_SHARED)
|
||||||
|
add_library(bravais::bravais ALIAS bravais_shared)
|
||||||
|
else()
|
||||||
|
add_library(bravais::bravais ALIAS bravais_static)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Symbol visibility
|
||||||
|
#
|
||||||
|
# Everything is hidden by default and the public API is opted in one symbol at
|
||||||
|
# a time with BRAVAIS_API, generated below. This is the one place where the
|
||||||
|
# static and shared builds genuinely differ, and getting it wrong is how a
|
||||||
|
# library ends up exporting its own bravais_internal_* helpers forever.
|
||||||
|
#
|
||||||
|
# bravais.h: BRAVAIS_API bravais_result_t bravais_conn_new(...);
|
||||||
|
# static consumers: BRAVAIS_STATIC_DEFINE makes BRAVAIS_API expand to nothing
|
||||||
|
#
|
||||||
|
# The generated header lands in the build tree and is installed alongside the
|
||||||
|
# hand-written ones.
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
include(GenerateExportHeader)
|
||||||
|
|
||||||
|
if(BRAVAIS_BUILD_SHARED)
|
||||||
|
set(BRAVAIS_EXPORT_HEADER_TARGET bravais_shared)
|
||||||
|
else()
|
||||||
|
set(BRAVAIS_EXPORT_HEADER_TARGET bravais_static)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
generate_export_header(${BRAVAIS_EXPORT_HEADER_TARGET}
|
||||||
|
BASE_NAME BRAVAIS
|
||||||
|
EXPORT_MACRO_NAME BRAVAIS_API
|
||||||
|
NO_EXPORT_MACRO_NAME BRAVAIS_LOCAL
|
||||||
|
DEPRECATED_MACRO_NAME BRAVAIS_DEPRECATED
|
||||||
|
STATIC_DEFINE BRAVAIS_STATIC_DEFINE
|
||||||
|
EXPORT_FILE_NAME ${CMAKE_CURRENT_BINARY_DIR}/include/bravais/export.h
|
||||||
|
)
|
||||||
|
|
||||||
|
foreach(_target IN LISTS BRAVAIS_LIB_TARGETS)
|
||||||
|
set_target_properties(${_target} PROPERTIES
|
||||||
|
C_VISIBILITY_PRESET hidden
|
||||||
|
VISIBILITY_INLINES_HIDDEN ON
|
||||||
|
POSITION_INDEPENDENT_CODE ON
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(${_target}
|
||||||
|
PUBLIC
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
|
||||||
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||||
|
)
|
||||||
|
|
||||||
|
# PUBLIC, so consumers of bravais::bravais are compiled as C23 too. This is
|
||||||
|
# exported as INTERFACE_COMPILE_FEATURES, which means consumers need CMake
|
||||||
|
# 3.21 or newer to understand it. bravais_apply_build_flags() turns
|
||||||
|
# extensions off, asking for -std=c2x rather than -std=gnu2x; the feature
|
||||||
|
# macros above put back everything strict mode hides.
|
||||||
|
target_compile_features(${_target} PUBLIC c_std_23)
|
||||||
|
|
||||||
|
# PRIVATE: only the library translation units need these.
|
||||||
|
target_compile_definitions(${_target} PRIVATE ${BRAVAIS_FEATURE_DEFS})
|
||||||
|
|
||||||
|
if(BRAVAIS_ENABLE_CRYPTO)
|
||||||
|
target_link_libraries(${_target} PRIVATE PkgConfig::SODIUM OQS::oqs)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
bravais_apply_build_flags(${_target})
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
# A consumer linking the static library must see BRAVAIS_API as empty, or the
|
||||||
|
# declarations carry a dllimport/visibility attribute that does not match what
|
||||||
|
# was compiled. PUBLIC so it reaches them through the export.
|
||||||
|
if(BRAVAIS_BUILD_STATIC)
|
||||||
|
target_compile_definitions(bravais_static PUBLIC BRAVAIS_STATIC_DEFINE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Optional subdirectories
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
if(BRAVAIS_BUILD_EXAMPLES)
|
||||||
|
add_subdirectory(examples)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(BRAVAIS_BUILD_TESTS)
|
||||||
|
enable_testing()
|
||||||
|
add_subdirectory(tests)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Fuzzers link the static library so libFuzzer's -fsanitize=fuzzer sees every
|
||||||
|
# translation unit's coverage instrumentation. They need Clang; GCC has no
|
||||||
|
# libFuzzer.
|
||||||
|
if(BRAVAIS_BUILD_FUZZERS)
|
||||||
|
if(NOT CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||||
|
message(FATAL_ERROR
|
||||||
|
"BRAVAIS_BUILD_FUZZERS needs Clang (libFuzzer); this is ${CMAKE_C_COMPILER_ID}. "
|
||||||
|
"Reconfigure with -DCMAKE_C_COMPILER=clang.")
|
||||||
|
endif()
|
||||||
|
if(NOT BRAVAIS_BUILD_STATIC)
|
||||||
|
message(FATAL_ERROR "BRAVAIS_BUILD_FUZZERS needs BRAVAIS_BUILD_STATIC=ON.")
|
||||||
|
endif()
|
||||||
|
add_subdirectory(fuzz)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Install / export (skipped when consumed via add_subdirectory()).
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
if(PROJECT_IS_TOP_LEVEL)
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
include(CMakePackageConfigHelpers)
|
||||||
|
|
||||||
|
install(TARGETS ${BRAVAIS_LIB_TARGETS}
|
||||||
|
EXPORT bravaisTargets
|
||||||
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
|
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Hand-written public headers.
|
||||||
|
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/
|
||||||
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||||
|
FILES_MATCHING PATTERN "*.h"
|
||||||
|
)
|
||||||
|
|
||||||
|
# ...and the generated one.
|
||||||
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/include/bravais/export.h
|
||||||
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/bravais
|
||||||
|
)
|
||||||
|
|
||||||
|
install(EXPORT bravaisTargets
|
||||||
|
FILE bravaisTargets.cmake
|
||||||
|
NAMESPACE bravais::
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/bravais
|
||||||
|
)
|
||||||
|
|
||||||
|
configure_package_config_file(
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/cmake/bravaisConfig.cmake.in
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/bravaisConfig.cmake
|
||||||
|
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/bravais
|
||||||
|
)
|
||||||
|
|
||||||
|
write_basic_package_version_file(
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/bravaisConfigVersion.cmake
|
||||||
|
VERSION ${PROJECT_VERSION}
|
||||||
|
COMPATIBILITY SameMajorVersion
|
||||||
|
)
|
||||||
|
|
||||||
|
install(FILES
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/bravaisConfig.cmake
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/bravaisConfigVersion.cmake
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/bravais
|
||||||
|
)
|
||||||
|
|
||||||
|
# pkg-config, for the consumers who are not using CMake. Cheap to ship and
|
||||||
|
# the thing a distro packager will ask for first.
|
||||||
|
configure_file(
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/cmake/bravais.pc.in
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/bravais.pc
|
||||||
|
@ONLY
|
||||||
|
)
|
||||||
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/bravais.pc
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Configuration summary
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
if(BRAVAIS_DEVELOPER_BUILD)
|
||||||
|
message(STATUS "bravais: version ${PROJECT_VERSION}")
|
||||||
|
message(STATUS "bravais: build type ${CMAKE_BUILD_TYPE}")
|
||||||
|
message(STATUS "bravais: compiler ${CMAKE_C_COMPILER_ID} ${CMAKE_C_COMPILER_VERSION}")
|
||||||
|
message(STATUS "bravais: C standard C23 (extensions off)")
|
||||||
|
message(STATUS "bravais: libraries static=${BRAVAIS_BUILD_STATIC} shared=${BRAVAIS_BUILD_SHARED}")
|
||||||
|
message(STATUS "bravais: crypto ${BRAVAIS_ENABLE_CRYPTO}")
|
||||||
|
message(STATUS "bravais: warnings-as-err ${BRAVAIS_WERROR} (always on in Strict)")
|
||||||
|
message(STATUS "bravais: sanitizers [Debug/Strict] ${BRAVAIS_SANITIZER_FLAGS}")
|
||||||
|
message(STATUS "bravais: static analyzer [Analyzer] ${BRAVAIS_ANALYZER_FLAGS}")
|
||||||
|
message(STATUS "bravais: hardening ${BRAVAIS_ENABLE_HARDENING}")
|
||||||
|
message(STATUS "bravais: LTO ${BRAVAIS_ENABLE_LTO}")
|
||||||
|
if(NOT BRAVAIS_ENABLE_CRYPTO)
|
||||||
|
message(STATUS "bravais: NOTE - crypto is OFF; crypto/ and proto/ are not built. "
|
||||||
|
"This is a bootstrap configuration, not a usable library.")
|
||||||
|
endif()
|
||||||
|
if(CMAKE_BUILD_TYPE STREQUAL "Analyzer" AND NOT BRAVAIS_ANALYZER_FLAGS)
|
||||||
|
message(STATUS "bravais: NOTE - Analyzer config has no static analyzer on "
|
||||||
|
"${CMAKE_C_COMPILER_ID}; reconfigure with -DCMAKE_C_COMPILER=gcc "
|
||||||
|
"or run scan-build over this build tree")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
message(STATUS "bravais: consumed as a subproject; developer flags off "
|
||||||
|
"(-DBRAVAIS_DEVELOPER_BUILD=ON to enable)")
|
||||||
|
endif()
|
||||||
@@ -0,0 +1,501 @@
|
|||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
Version 2.1, February 1999
|
||||||
|
|
||||||
|
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||||
|
<https://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
[This is the first released version of the Lesser GPL. It also counts
|
||||||
|
as the successor of the GNU Library Public License, version 2, hence
|
||||||
|
the version number 2.1.]
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
Licenses are intended to guarantee your freedom to share and change
|
||||||
|
free software--to make sure the software is free for all its users.
|
||||||
|
|
||||||
|
This license, the Lesser General Public License, applies to some
|
||||||
|
specially designated software packages--typically libraries--of the
|
||||||
|
Free Software Foundation and other authors who decide to use it. You
|
||||||
|
can use it too, but we suggest you first think carefully about whether
|
||||||
|
this license or the ordinary General Public License is the better
|
||||||
|
strategy to use in any particular case, based on the explanations below.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom of use,
|
||||||
|
not price. Our General Public Licenses are designed to make sure that
|
||||||
|
you have the freedom to distribute copies of free software (and charge
|
||||||
|
for this service if you wish); that you receive source code or can get
|
||||||
|
it if you want it; that you can change the software and use pieces of
|
||||||
|
it in new free programs; and that you are informed that you can do
|
||||||
|
these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
distributors to deny you these rights or to ask you to surrender these
|
||||||
|
rights. These restrictions translate to certain responsibilities for
|
||||||
|
you if you distribute copies of the library or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of the library, whether gratis
|
||||||
|
or for a fee, you must give the recipients all the rights that we gave
|
||||||
|
you. You must make sure that they, too, receive or can get the source
|
||||||
|
code. If you link other code with the library, you must provide
|
||||||
|
complete object files to the recipients, so that they can relink them
|
||||||
|
with the library after making changes to the library and recompiling
|
||||||
|
it. And you must show them these terms so they know their rights.
|
||||||
|
|
||||||
|
We protect your rights with a two-step method: (1) we copyright the
|
||||||
|
library, and (2) we offer you this license, which gives you legal
|
||||||
|
permission to copy, distribute and/or modify the library.
|
||||||
|
|
||||||
|
To protect each distributor, we want to make it very clear that
|
||||||
|
there is no warranty for the free library. Also, if the library is
|
||||||
|
modified by someone else and passed on, the recipients should know
|
||||||
|
that what they have is not the original version, so that the original
|
||||||
|
author's reputation will not be affected by problems that might be
|
||||||
|
introduced by others.
|
||||||
|
|
||||||
|
Finally, software patents pose a constant threat to the existence of
|
||||||
|
any free program. We wish to make sure that a company cannot
|
||||||
|
effectively restrict the users of a free program by obtaining a
|
||||||
|
restrictive license from a patent holder. Therefore, we insist that
|
||||||
|
any patent license obtained for a version of the library must be
|
||||||
|
consistent with the full freedom of use specified in this license.
|
||||||
|
|
||||||
|
Most GNU software, including some libraries, is covered by the
|
||||||
|
ordinary GNU General Public License. This license, the GNU Lesser
|
||||||
|
General Public License, applies to certain designated libraries, and
|
||||||
|
is quite different from the ordinary General Public License. We use
|
||||||
|
this license for certain libraries in order to permit linking those
|
||||||
|
libraries into non-free programs.
|
||||||
|
|
||||||
|
When a program is linked with a library, whether statically or using
|
||||||
|
a shared library, the combination of the two is legally speaking a
|
||||||
|
combined work, a derivative of the original library. The ordinary
|
||||||
|
General Public License therefore permits such linking only if the
|
||||||
|
entire combination fits its criteria of freedom. The Lesser General
|
||||||
|
Public License permits more lax criteria for linking other code with
|
||||||
|
the library.
|
||||||
|
|
||||||
|
We call this license the "Lesser" General Public License because it
|
||||||
|
does Less to protect the user's freedom than the ordinary General
|
||||||
|
Public License. It also provides other free software developers Less
|
||||||
|
of an advantage over competing non-free programs. These disadvantages
|
||||||
|
are the reason we use the ordinary General Public License for many
|
||||||
|
libraries. However, the Lesser license provides advantages in certain
|
||||||
|
special circumstances.
|
||||||
|
|
||||||
|
For example, on rare occasions, there may be a special need to
|
||||||
|
encourage the widest possible use of a certain library, so that it becomes
|
||||||
|
a de-facto standard. To achieve this, non-free programs must be
|
||||||
|
allowed to use the library. A more frequent case is that a free
|
||||||
|
library does the same job as widely used non-free libraries. In this
|
||||||
|
case, there is little to gain by limiting the free library to free
|
||||||
|
software only, so we use the Lesser General Public License.
|
||||||
|
|
||||||
|
In other cases, permission to use a particular library in non-free
|
||||||
|
programs enables a greater number of people to use a large body of
|
||||||
|
free software. For example, permission to use the GNU C Library in
|
||||||
|
non-free programs enables many more people to use the whole GNU
|
||||||
|
operating system, as well as its variant, the GNU/Linux operating
|
||||||
|
system.
|
||||||
|
|
||||||
|
Although the Lesser General Public License is Less protective of the
|
||||||
|
users' freedom, it does ensure that the user of a program that is
|
||||||
|
linked with the Library has the freedom and the wherewithal to run
|
||||||
|
that program using a modified version of the Library.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow. Pay close attention to the difference between a
|
||||||
|
"work based on the library" and a "work that uses the library". The
|
||||||
|
former contains code derived from the library, whereas the latter must
|
||||||
|
be combined with the library in order to run.
|
||||||
|
|
||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License Agreement applies to any software library or other
|
||||||
|
program which contains a notice placed by the copyright holder or
|
||||||
|
other authorized party saying it may be distributed under the terms of
|
||||||
|
this Lesser General Public License (also called "this License").
|
||||||
|
Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
A "library" means a collection of software functions and/or data
|
||||||
|
prepared so as to be conveniently linked with application programs
|
||||||
|
(which use some of those functions and data) to form executables.
|
||||||
|
|
||||||
|
The "Library", below, refers to any such software library or work
|
||||||
|
which has been distributed under these terms. A "work based on the
|
||||||
|
Library" means either the Library or any derivative work under
|
||||||
|
copyright law: that is to say, a work containing the Library or a
|
||||||
|
portion of it, either verbatim or with modifications and/or translated
|
||||||
|
straightforwardly into another language. (Hereinafter, translation is
|
||||||
|
included without limitation in the term "modification".)
|
||||||
|
|
||||||
|
"Source code" for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For a library, complete source code means
|
||||||
|
all the source code for all modules it contains, plus any associated
|
||||||
|
interface definition files, plus the scripts used to control compilation
|
||||||
|
and installation of the library.
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running a program using the Library is not restricted, and output from
|
||||||
|
such a program is covered only if its contents constitute a work based
|
||||||
|
on the Library (independent of the use of the Library in a tool for
|
||||||
|
writing it). Whether that is true depends on what the Library does
|
||||||
|
and what the program that uses the Library does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Library's
|
||||||
|
complete source code as you receive it, in any medium, provided that
|
||||||
|
you conspicuously and appropriately publish on each copy an
|
||||||
|
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||||
|
all the notices that refer to this License and to the absence of any
|
||||||
|
warranty; and distribute a copy of this License along with the
|
||||||
|
Library.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy,
|
||||||
|
and you may at your option offer warranty protection in exchange for a
|
||||||
|
fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Library or any portion
|
||||||
|
of it, thus forming a work based on the Library, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The modified work must itself be a software library.
|
||||||
|
|
||||||
|
b) You must cause the files modified to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
c) You must cause the whole of the work to be licensed at no
|
||||||
|
charge to all third parties under the terms of this License.
|
||||||
|
|
||||||
|
d) If a facility in the modified Library refers to a function or a
|
||||||
|
table of data to be supplied by an application program that uses
|
||||||
|
the facility, other than as an argument passed when the facility
|
||||||
|
is invoked, then you must make a good faith effort to ensure that,
|
||||||
|
in the event an application does not supply such function or
|
||||||
|
table, the facility still operates, and performs whatever part of
|
||||||
|
its purpose remains meaningful.
|
||||||
|
|
||||||
|
(For example, a function in a library to compute square roots has
|
||||||
|
a purpose that is entirely well-defined independent of the
|
||||||
|
application. Therefore, Subsection 2d requires that any
|
||||||
|
application-supplied function or table used by this function must
|
||||||
|
be optional: if the application does not supply it, the square
|
||||||
|
root function must still compute square roots.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Library,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Library, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote
|
||||||
|
it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Library.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Library
|
||||||
|
with the Library (or with a work based on the Library) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||||
|
License instead of this License to a given copy of the Library. To do
|
||||||
|
this, you must alter all the notices that refer to this License, so
|
||||||
|
that they refer to the ordinary GNU General Public License, version 2,
|
||||||
|
instead of to this License. (If a newer version than version 2 of the
|
||||||
|
ordinary GNU General Public License has appeared, then you can specify
|
||||||
|
that version instead if you wish.) Do not make any other change in
|
||||||
|
these notices.
|
||||||
|
|
||||||
|
Once this change is made in a given copy, it is irreversible for
|
||||||
|
that copy, so the ordinary GNU General Public License applies to all
|
||||||
|
subsequent copies and derivative works made from that copy.
|
||||||
|
|
||||||
|
This option is useful when you wish to copy part of the code of
|
||||||
|
the Library into a program that is not a library.
|
||||||
|
|
||||||
|
4. You may copy and distribute the Library (or a portion or
|
||||||
|
derivative of it, under Section 2) in object code or executable form
|
||||||
|
under the terms of Sections 1 and 2 above provided that you accompany
|
||||||
|
it with the complete corresponding machine-readable source code, which
|
||||||
|
must be distributed under the terms of Sections 1 and 2 above on a
|
||||||
|
medium customarily used for software interchange.
|
||||||
|
|
||||||
|
If distribution of object code is made by offering access to copy
|
||||||
|
from a designated place, then offering equivalent access to copy the
|
||||||
|
source code from the same place satisfies the requirement to
|
||||||
|
distribute the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
5. A program that contains no derivative of any portion of the
|
||||||
|
Library, but is designed to work with the Library by being compiled or
|
||||||
|
linked with it, is called a "work that uses the Library". Such a
|
||||||
|
work, in isolation, is not a derivative work of the Library, and
|
||||||
|
therefore falls outside the scope of this License.
|
||||||
|
|
||||||
|
However, linking a "work that uses the Library" with the Library
|
||||||
|
creates an executable that is a derivative of the Library (because it
|
||||||
|
contains portions of the Library), rather than a "work that uses the
|
||||||
|
library". The executable is therefore covered by this License.
|
||||||
|
Section 6 states terms for distribution of such executables.
|
||||||
|
|
||||||
|
When a "work that uses the Library" uses material from a header file
|
||||||
|
that is part of the Library, the object code for the work may be a
|
||||||
|
derivative work of the Library even though the source code is not.
|
||||||
|
Whether this is true is especially significant if the work can be
|
||||||
|
linked without the Library, or if the work is itself a library. The
|
||||||
|
threshold for this to be true is not precisely defined by law.
|
||||||
|
|
||||||
|
If such an object file uses only numerical parameters, data
|
||||||
|
structure layouts and accessors, and small macros and small inline
|
||||||
|
functions (ten lines or less in length), then the use of the object
|
||||||
|
file is unrestricted, regardless of whether it is legally a derivative
|
||||||
|
work. (Executables containing this object code plus portions of the
|
||||||
|
Library will still fall under Section 6.)
|
||||||
|
|
||||||
|
Otherwise, if the work is a derivative of the Library, you may
|
||||||
|
distribute the object code for the work under the terms of Section 6.
|
||||||
|
Any executables containing that work also fall under Section 6,
|
||||||
|
whether or not they are linked directly with the Library itself.
|
||||||
|
|
||||||
|
6. As an exception to the Sections above, you may also combine or
|
||||||
|
link a "work that uses the Library" with the Library to produce a
|
||||||
|
work containing portions of the Library, and distribute that work
|
||||||
|
under terms of your choice, provided that the terms permit
|
||||||
|
modification of the work for the customer's own use and reverse
|
||||||
|
engineering for debugging such modifications.
|
||||||
|
|
||||||
|
You must give prominent notice with each copy of the work that the
|
||||||
|
Library is used in it and that the Library and its use are covered by
|
||||||
|
this License. You must supply a copy of this License. If the work
|
||||||
|
during execution displays copyright notices, you must include the
|
||||||
|
copyright notice for the Library among them, as well as a reference
|
||||||
|
directing the user to the copy of this License. Also, you must do one
|
||||||
|
of these things:
|
||||||
|
|
||||||
|
a) Accompany the work with the complete corresponding
|
||||||
|
machine-readable source code for the Library including whatever
|
||||||
|
changes were used in the work (which must be distributed under
|
||||||
|
Sections 1 and 2 above); and, if the work is an executable linked
|
||||||
|
with the Library, with the complete machine-readable "work that
|
||||||
|
uses the Library", as object code and/or source code, so that the
|
||||||
|
user can modify the Library and then relink to produce a modified
|
||||||
|
executable containing the modified Library. (It is understood
|
||||||
|
that the user who changes the contents of definitions files in the
|
||||||
|
Library will not necessarily be able to recompile the application
|
||||||
|
to use the modified definitions.)
|
||||||
|
|
||||||
|
b) Use a suitable shared library mechanism for linking with the
|
||||||
|
Library. A suitable mechanism is one that (1) uses at run time a
|
||||||
|
copy of the library already present on the user's computer system,
|
||||||
|
rather than copying library functions into the executable, and (2)
|
||||||
|
will operate properly with a modified version of the library, if
|
||||||
|
the user installs one, as long as the modified version is
|
||||||
|
interface-compatible with the version that the work was made with.
|
||||||
|
|
||||||
|
c) Accompany the work with a written offer, valid for at
|
||||||
|
least three years, to give the same user the materials
|
||||||
|
specified in Subsection 6a, above, for a charge no more
|
||||||
|
than the cost of performing this distribution.
|
||||||
|
|
||||||
|
d) If distribution of the work is made by offering access to copy
|
||||||
|
from a designated place, offer equivalent access to copy the above
|
||||||
|
specified materials from the same place.
|
||||||
|
|
||||||
|
e) Verify that the user has already received a copy of these
|
||||||
|
materials or that you have already sent this user a copy.
|
||||||
|
|
||||||
|
For an executable, the required form of the "work that uses the
|
||||||
|
Library" must include any data and utility programs needed for
|
||||||
|
reproducing the executable from it. However, as a special exception,
|
||||||
|
the materials to be distributed need not include anything that is
|
||||||
|
normally distributed (in either source or binary form) with the major
|
||||||
|
components (compiler, kernel, and so on) of the operating system on
|
||||||
|
which the executable runs, unless that component itself accompanies
|
||||||
|
the executable.
|
||||||
|
|
||||||
|
It may happen that this requirement contradicts the license
|
||||||
|
restrictions of other proprietary libraries that do not normally
|
||||||
|
accompany the operating system. Such a contradiction means you cannot
|
||||||
|
use both them and the Library together in an executable that you
|
||||||
|
distribute.
|
||||||
|
|
||||||
|
7. You may place library facilities that are a work based on the
|
||||||
|
Library side-by-side in a single library together with other library
|
||||||
|
facilities not covered by this License, and distribute such a combined
|
||||||
|
library, provided that the separate distribution of the work based on
|
||||||
|
the Library and of the other library facilities is otherwise
|
||||||
|
permitted, and provided that you do these two things:
|
||||||
|
|
||||||
|
a) Accompany the combined library with a copy of the same work
|
||||||
|
based on the Library, uncombined with any other library
|
||||||
|
facilities. This must be distributed under the terms of the
|
||||||
|
Sections above.
|
||||||
|
|
||||||
|
b) Give prominent notice with the combined library of the fact
|
||||||
|
that part of it is a work based on the Library, and explaining
|
||||||
|
where to find the accompanying uncombined form of the same work.
|
||||||
|
|
||||||
|
8. You may not copy, modify, sublicense, link with, or distribute
|
||||||
|
the Library except as expressly provided under this License. Any
|
||||||
|
attempt otherwise to copy, modify, sublicense, link with, or
|
||||||
|
distribute the Library is void, and will automatically terminate your
|
||||||
|
rights under this License. However, parties who have received copies,
|
||||||
|
or rights, from you under this License will not have their licenses
|
||||||
|
terminated so long as such parties remain in full compliance.
|
||||||
|
|
||||||
|
9. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Library or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Library (or any work based on the
|
||||||
|
Library), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Library or works based on it.
|
||||||
|
|
||||||
|
10. Each time you redistribute the Library (or any work based on the
|
||||||
|
Library), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute, link with or modify the Library
|
||||||
|
subject to these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties with
|
||||||
|
this License.
|
||||||
|
|
||||||
|
11. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Library at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Library by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Library.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under any
|
||||||
|
particular circumstance, the balance of the section is intended to apply,
|
||||||
|
and the section as a whole is intended to apply in other circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
12. If the distribution and/or use of the Library is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Library under this License may add
|
||||||
|
an explicit geographical distribution limitation excluding those countries,
|
||||||
|
so that distribution is permitted only in or among countries not thus
|
||||||
|
excluded. In such case, this License incorporates the limitation as if
|
||||||
|
written in the body of this License.
|
||||||
|
|
||||||
|
13. The Free Software Foundation may publish revised and/or new
|
||||||
|
versions of the Lesser General Public License from time to time.
|
||||||
|
Such new versions will be similar in spirit to the present version,
|
||||||
|
but may differ in detail to address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Library
|
||||||
|
specifies a version number of this License which applies to it and
|
||||||
|
"any later version", you have the option of following the terms and
|
||||||
|
conditions either of that version or of any later version published by
|
||||||
|
the Free Software Foundation. If the Library does not specify a
|
||||||
|
license version number, you may choose any version ever published by
|
||||||
|
the Free Software Foundation.
|
||||||
|
|
||||||
|
14. If you wish to incorporate parts of the Library into other free
|
||||||
|
programs whose distribution conditions are incompatible with these,
|
||||||
|
write to the author to ask for permission. For software which is
|
||||||
|
copyrighted by the Free Software Foundation, write to the Free
|
||||||
|
Software Foundation; we sometimes make exceptions for this. Our
|
||||||
|
decision will be guided by the two goals of preserving the free status
|
||||||
|
of all derivatives of our free software and of promoting the sharing
|
||||||
|
and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||||
|
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||||
|
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||||
|
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||||
|
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||||
|
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||||
|
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||||
|
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||||
|
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||||
|
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||||
|
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||||
|
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||||
|
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||||
|
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||||
|
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||||
|
DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Libraries
|
||||||
|
|
||||||
|
If you develop a new library, and you want it to be of the greatest
|
||||||
|
possible use to the public, we recommend making it free software that
|
||||||
|
everyone can redistribute and change. You can do so by permitting
|
||||||
|
redistribution under these terms (or, alternatively, under the terms of the
|
||||||
|
ordinary General Public License).
|
||||||
|
|
||||||
|
To apply these terms, attach the following notices to the library. It is
|
||||||
|
safest to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least the
|
||||||
|
"copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the library's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||||
|
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||||
|
|
||||||
|
<signature of Moe Ghoul>, 1 April 1990
|
||||||
|
Moe Ghoul, President of Vice
|
||||||
|
|
||||||
|
That's all there is to it!
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
prefix=@CMAKE_INSTALL_PREFIX@
|
||||||
|
exec_prefix=${prefix}
|
||||||
|
libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@
|
||||||
|
includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
|
||||||
|
|
||||||
|
Name: bravais
|
||||||
|
Description: @CMAKE_PROJECT_DESCRIPTION@
|
||||||
|
URL: @CMAKE_PROJECT_HOMEPAGE_URL@
|
||||||
|
Version: @PROJECT_VERSION@
|
||||||
|
Libs: -L${libdir} -lbravais
|
||||||
|
Libs.private: -lsodium -loqs
|
||||||
|
Cflags: -I${includedir}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
@PACKAGE_INIT@
|
||||||
|
|
||||||
|
include(CMakeFindDependencyMacro)
|
||||||
|
|
||||||
|
# libsodium and liboqs are PRIVATE link dependencies, so a consumer of the
|
||||||
|
# shared library never sees them. A consumer of the *static* library does: the
|
||||||
|
# archive carries unresolved crypto_* and OQS_* symbols that only the final link
|
||||||
|
# line can satisfy, and CMake recorded them as $<LINK_ONLY:...> in the export
|
||||||
|
# set. Resolve them here so `find_package(bravais)` works for both.
|
||||||
|
if(@BRAVAIS_ENABLE_CRYPTO@)
|
||||||
|
find_dependency(PkgConfig)
|
||||||
|
pkg_check_modules(SODIUM REQUIRED IMPORTED_TARGET libsodium>=1.0.18)
|
||||||
|
find_dependency(liboqs CONFIG)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include("${CMAKE_CURRENT_LIST_DIR}/bravaisTargets.cmake")
|
||||||
|
|
||||||
|
check_required_components(bravais)
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
#ifndef BRAVAIS_H
|
||||||
|
#define BRAVAIS_H
|
||||||
|
|
||||||
|
#endif // BRAVAIS_H
|
||||||
Reference in New Issue
Block a user