diff --git a/CMakeLists.txt b/CMakeLists.txt index f5898e81..1b718701 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,5 @@ cmake_minimum_required(VERSION 3.9) # CMP0069 NEW +include(GNUInstallDirs) message(STATUS "cmake version ${CMAKE_VERSION}") if (NOT CMAKE_BUILD_TYPE) @@ -32,24 +33,15 @@ set(SIMDJSON_LIB_VERSION "0.3.1" CACHE STRING "simdjson library version") set(SIMDJSON_LIB_SOVERSION "1" CACHE STRING "simdjson library soversion") option(SIMDJSON_COMPETITION "Compile competitive benchmarks" ON) -option(SIMDJSON_IMPLEMENTATION_HASWELL "Include the haswell implementation" ON) -option(SIMDJSON_IMPLEMENTATION_WESTMERE "Include the westmere implementation" ON) -option(SIMDJSON_IMPLEMENTATION_ARM64 "Include the arm64 implementation" ON) -option(SIMDJSON_IMPLEMENTATION_FALLBACK "Include the fallback implementation" ON) if(NOT MSVC) option(SIMDJSON_BUILD_STATIC "Build a static library" OFF) # turning it on disables the production of a dynamic library else() option(SIMDJSON_BUILD_STATIC "Build a static library" ON) # turning it on disables the production of a dynamic library endif() -option(SIMDJSON_SANITIZE "Sanitize addresses" OFF) option(SIMDJSON_GOOGLE_BENCHMARKS "compile the Google Benchmark benchmarks" OFF) -option(SIMDJSON_ENABLE_THREADS "enable threaded operation" ON) -option(SIMDJSON_NO_EXCEPTIONS "Disable simdjson's exception-throwing interface" OFF) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/tools/cmake") -find_package(Options) - # # Create the top level simdjson library (must be done at this level to use both src/ and include/ # directories) @@ -61,12 +53,12 @@ add_subdirectory(src) # # Compile tools / tests / benchmarks # +enable_testing() + add_library(test-data INTERFACE) target_compile_definitions(test-data INTERFACE SIMDJSON_TEST_DATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/jsonchecker/") target_compile_definitions(test-data INTERFACE SIMDJSON_BENCHMARK_DATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/jsonexamples/") -enable_testing() - add_subdirectory(dependencies) add_subdirectory(tools) add_subdirectory(tests) @@ -79,6 +71,11 @@ if(ENABLE_FUZZING) add_subdirectory(fuzz) endif() +if(${CMAKE_C_COMPILER_ID} MATCHES "Intel") # icc / icpc + # prevent shared libraries from depending on Intel provided libraries + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -static-intel") +endif() + set(CPACK_PACKAGE_VENDOR "Daniel Lemire") set(CPACK_PACKAGE_CONTACT "lemire@gmail.com") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Parsing gigabytes of JSON per second") diff --git a/README.md b/README.md index 98523548..e2c3353a 100644 --- a/README.md +++ b/README.md @@ -167,7 +167,8 @@ For the video inclined,
Funding ------- -The work is supported by the Natural Sciences and Engineering Research Council of Canada under grant number RGPIN-2017-03910. +The work is supported by the Natural Sciences and Engineering Research Council of Canada under grant +number RGPIN-2017-03910. [license]: LICENSE [license img]: https://img.shields.io/badge/License-Apache%202-blue.svg diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt index 7e06d982..23d1373e 100644 --- a/include/CMakeLists.txt +++ b/include/CMakeLists.txt @@ -1,2 +1,71 @@ +# +# simdjson headers and flags required to compile them +# + +add_library(simdjson-headers INTERFACE) + +# Include directory +target_include_directories(simdjson-headers INTERFACE + $ + $) + +# Flags absolutely needed to compile simdjson at all +target_compile_features(simdjson-headers INTERFACE cxx_std_17) +if(MSVC) # Windows + # C++ standard flags + target_compile_options(simdjson-headers INTERFACE /std:c++17) + # Base flags + target_compile_options(simdjson-headers INTERFACE /nologo) + # Warning flags + target_compile_options(simdjson-headers INTERFACE /W3 /D_CRT_SECURE_NO_WARNINGS /wd4005 /wd4996 /wd4267 /wd4244 /wd4113) +else() # Linux + # Base flags + target_compile_options(simdjson-headers INTERFACE -fPIC) + # C++ standard flags + target_compile_options(simdjson-headers INTERFACE -std=c++17) + # Warning flags + target_compile_options(simdjson-headers INTERFACE -Wall -Wextra -Wsign-compare -Wshadow -Wwrite-strings -Wpointer-arith -Winit-self) + # Debug and release specific flags + target_compile_options(simdjson-headers INTERFACE $<$:-ggdb>) + target_compile_options(simdjson-headers INTERFACE $<$:-O3 -DNDEBUG>) +endif() + + +# Optional flags +option(SIMDJSON_IMPLEMENTATION_HASWELL "Include the haswell implementation" ON) +option(SIMDJSON_IMPLEMENTATION_WESTMERE "Include the westmere implementation" ON) +option(SIMDJSON_IMPLEMENTATION_ARM64 "Include the arm64 implementation" ON) +option(SIMDJSON_IMPLEMENTATION_FALLBACK "Include the fallback implementation" ON) + +option(SIMDJSON_EXCEPTIONS "Enable simdjson's exception-throwing interface" ON) +if(NOT SIMDJSON_EXCEPTIONS) + message(STATUS "simdjson exception interface turned off. Code that does not check error codes will not compile.") + target_compile_definitions(simdjson-headers INTERFACE SIMDJSON_EXCEPTIONS=0) +endif() + +option(SIMDJSON_ENABLE_THREADS "Enable threaded operation" ON) +if(SIMDJSON_ENABLE_THREADS) + find_package(Threads REQUIRED) + target_link_libraries(simdjson-headers INTERFACE Threads::Threads) +endif() + +option(SIMDJSON_SANITIZE "Sanitize addresses" OFF) +if(SIMDJSON_SANITIZE) + # Not sure which + target_compile_options(simdjson-headers INTERFACE -fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined -fno-sanitize-recover=all) + target_link_libraries(simdjson-headers INTERFACE -fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined -fno-sanitize-recover=all) + + # Ubuntu bug for GCC 5.0+ (safe for all versions) + if (CMAKE_COMPILER_IS_GNUCC) + target_link_libraries(simdjson-headers INTERFACE -fuse-ld=gold) + endif() +endif() + +install(TARGETS simdjson-headers + EXPORT simdjson-headers-config + INCLUDES DESTINATION include) +install(EXPORT simdjson-headers-config + FILE simdjson-headers-config.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/simdjson) install(DIRECTORY simdjson DESTINATION include FILES_MATCHING PATTERN *.h) install(FILES simdjson.h DESTINATION include) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 70270fbe..6bcbccdf 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,6 @@ -include(GNUInstallDirs) +# +# simdjson as a library +# if(SIMDJSON_BUILD_STATIC) MESSAGE( STATUS "Building a static library." ) @@ -6,34 +8,34 @@ if(SIMDJSON_BUILD_STATIC) else() MESSAGE( STATUS "Building a dynamic library." ) add_library(simdjson SHARED "") + target_compile_definitions(simdjson INTERFACE SIMDJSON_USING_LIBRARY=1) + if(MSVC) + MESSAGE( STATUS "Building a Windows DLL using Visual Studio, exporting all symbols automatically." ) + set_target_properties(simdjson PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS 1) + endif() endif() target_sources(simdjson PRIVATE simdjson.cpp) +target_link_libraries(simdjson PUBLIC simdjson-headers) target_include_directories(simdjson PRIVATE .) -target_include_directories(simdjson PUBLIC $) -if(SIMDJSON_NO_EXCEPTIONS) - message(STATUS "simdjson exception interface turned off. Code that does not check error codes will not compile.") - target_compile_definitions(simdjson PUBLIC SIMDJSON_EXCEPTIONS=0) +if(NOT MSVC) + ## We output the library at the root of the current directory where cmake is invoked + ## This is handy but Visual Studio will happily ignore us + set_target_properties(simdjson PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + MESSAGE( STATUS "Library output directory (does not apply to Visual Studio): " ${CMAKE_BINARY_DIR}) endif() -if(${CMAKE_C_COMPILER_ID} MATCHES "Intel") # icc / icpc - # prevent shared libraries from depending on Intel provided libraries - target_link_options(simdjson PUBLIC "-static-intel") -endif() - -if(SIMDJSON_ENABLE_THREADS) - find_package(Threads REQUIRED) - target_link_libraries(simdjson PRIVATE Threads::Threads) -endif() - -# For targets that want to include the source directly +# +# simdjson to be compiled into your exe as source (you must #include simdjson.cpp) +# add_library(simdjson-source INTERFACE) +target_link_libraries(simdjson-source INTERFACE simdjson-headers) target_include_directories(simdjson-source INTERFACE .) -target_include_directories(simdjson-source INTERFACE $) +# # Installation - +# install(TARGETS simdjson EXPORT simdjson-config ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} @@ -46,25 +48,3 @@ install(EXPORT simdjson-config NAMESPACE simdjson:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/simdjson ) - -if(NOT MSVC) -## We output the library at the root of the current directory where cmake is invoked -## This is handy but Visual Studio will happily ignore us -set_target_properties(simdjson PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) -MESSAGE( STATUS "Library output directory (does not apply to Visual Studio): " ${CMAKE_BINARY_DIR}) -endif() - -if(NOT SIMDJSON_BUILD_STATIC) - target_compile_definitions(simdjson INTERFACE SIMDJSON_USING_LIBRARY=1) -endif() - -if(MSVC AND (NOT SIMDJSON_BUILD_STATIC)) - if (CMAKE_VERSION VERSION_LESS 3.4) - MESSAGE( STATUS "To build a Windows DLL using Visual Studio, you may need cmake 3.4 or better." ) - endif() - MESSAGE( STATUS "Building a Windows DLL using Visual Studio, exporting all symbols automatically." ) - set_target_properties(simdjson - PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS 1) -endif() -