project(rjp) cmake_minimum_required(VERSION 3.0.2) include(GNUInstallDirs) set(rjp_VERSION_MAJOR 1) set(rjp_VERSION_MINOR 1) set(rjp_VERSION_REVISION 0) set(INCLUDE_PATH ${CMAKE_SOURCE_DIR}/include) include_directories("${INCLUDE_PATH}") set(RJP_LIBFLAGS "-lrjp") option(ENABLE_DIAGNOSTICS "Print diagnostic messages when parsing json to help identify issues" ON) option(ENABLE_SHARED "Build shared library" ON) option(ENABLE_C++ "Build C++ wrapper library" OFF) option(BUILD_TESTS "Build test programs" OFF) option(ENABLE_PROFILING "Enable asan" OFF) mark_as_advanced(ENABLE_PROFILING) set(SOURCE_LIST "src/rjp_lex.c" "src/rjp_ordered_object.c" "src/rjp_unordered_object.c" "src/rjp_parse.c" "src/output.c" "src/rjp_array.c" "src/rjp.c" "src/rjp_object.c" "src/rjp_string.c" "src/tree.c") if(ENABLE_SHARED) add_library(rjp SHARED ${SOURCE_LIST}) set_target_properties(rjp PROPERTIES SOVERSION "${rjp_VERSION_MAJOR}.${rjp_VERSION_MINOR}") else() add_library(rjp STATIC ${SOURCE_LIST}) endif() set_target_properties(rjp PROPERTIES VERSION "${rjp_VERSION_MAJOR}.${rjp_VERSION_MINOR}.${rjp_VERSION_REVISION}") if(ENABLE_DIAGNOSTICS) set(RJP_ENABLE_DIAGNOSTICS 1) endif() if(ENABLE_PROFILING) target_compile_options(rjp PRIVATE -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls) target_link_options(rjp PRIVATE -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls) endif() set_target_properties(rjp PROPERTIES PUBLIC_HEADER ${INCLUDE_PATH}/rjp.h) target_compile_options(rjp PRIVATE -Wall -Wextra -pedantic) install(TARGETS rjp ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/pc/rjp.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig" ) if(ENABLE_C++) add_subdirectory(rjp++) endif() if(BUILD_TESTS) enable_testing() add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --force-new-ctest-process --verbose --output-on-failure ) add_subdirectory(tests) endif() configure_file( "${INCLUDE_PATH}/config.h.in" "${INCLUDE_PATH}/config.h" ) configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/pc/rjp.pc.cmake.in" "${CMAKE_CURRENT_SOURCE_DIR}/pc/rjp.pc" @ONLY ) add_custom_target(uninstall cat install_manifest.txt | xargs rm)