Detection and versioning of operating systems, compilers, architecture, and SIMD extensions are traditionally done using messy preprocessor macros.
SPY is a C++20 library that gathers this information and provides a constexpr compatible interface. This replaces #ifdef spaghetti with clean, compile-time control flow.
SPY turns compile-time detection into simple boolean checks:
#include <spy/spy.hpp>
#include <iostream>
int main()
{
// Check Compiler
if constexpr( spy::compiler == spy::clang_ )
{
std::cout << "Optimizing with Clang version " << spy::compiler.version << "\n";
}
// Check Architecture
if constexpr( spy::architecture == spy::amd64_ )
{
std::cout << "Running on x86-64\n";
}
// Check SIMD capabilities (hierarchical)
if constexpr( spy::simd_instruction_set >= spy::avx2_ )
{
std::cout << "AVX2 or better is available\n";
}
}SPY detects and versions a wide range of environments:
| Category | Supported Detection |
|---|---|
| Compilers | GCC, Clang, MSVC, Intel (Classic & OneAPI), NVCC, Emscripten |
| Architectures | x86, AMD64, ARM (incl. AArch64), PowerPC, RISC-V, WebAssembly |
| SIMD | SSE1-4.2, AVX, AVX2, AVX512, Neon, ASIMD, SVE, SVE2, VMX, VSX, RVV, SIMD128 |
| OS | Windows, Linux, macOS, Android, iOS, BSD, Emscripten, CUDA |
You can grab the standalone single-header file from the standalone branch.
wget https://github.com/jfalcou/spy/raw/standalone/spy.hppSPY has no dependencies, making it easy to fetch compile-time:
include(FetchContent)
FetchContent_Declare(
spy
GIT_REPOSITORY [https://github.com/jfalcou/spy.git](https://github.com/jfalcou/spy.git)
GIT_TAG v2.0.0 # Replace with latest tag
)
FetchContent_MakeAvailable(spy)
target_link_libraries(your_target PRIVATE spy::spy)CPMAddPackage(
NAME spy
GITHUB_REPOSITORY jfalcou/spy
GIT_TAG v2.0.0
)
target_link_libraries(your_target PRIVATE spy::spy)The complete API documentation can be found here.
This project is licensed under the Boost Software License 1.0.
