project(rjp++) cmake_minimum_required(VERSION 3.0.2) include(GNUInstallDirs) set(rjp++_VERSION_MAJOR ${rjp_VERSION_MAJOR}) set(rjp++_VERSION_MINOR ${rjp_VERSION_MINOR}) set(rjp++_VERSION_REVISION ${rjp_VERSION_REVISION}) set(INCLUDE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/include) include_directories("${INCLUDE_PATH}") option(ENABLE_SHARED "Build shared library" OFF) option(BUILD_TESTS "Build test programs" OFF) option(ENABLE_PROFILING "Enable asan" OFF) mark_as_advanced(ENABLE_PROFILING) set(SOURCE_LIST "src/allocator.cpp" "src/array.cpp" "src/integral.cpp" "src/object.cpp" "src/rjp.cpp" "src/string.cpp" "src/string_val.cpp" "src/value.cpp" "src/vget_proxy.cpp" "src/container.cpp") if(ENABLE_SHARED) set(RJP++_LIBFLAGS "-lrjp++ -lrexy") add_library(rjp++ SHARED ${SOURCE_LIST}) set_target_properties(rjp++ PROPERTIES SOVERSION "${rjp_VERSION_MAJOR}.${rjp_VERSION_MINOR}.${rjp_VERSION_REVISION}") else() set(RJP++_LIBFLAGS "-lrjp++ -lrjp -lrexy") add_library(rjp++ STATIC ${SOURCE_LIST}) endif() configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/pc/rjp++.pc.cmake.in" "${CMAKE_CURRENT_SOURCE_DIR}/pc/rjp++.pc" @ONLY ) set_target_properties(rjp++ PROPERTIES PUBLIC_HEADER ${INCLUDE_PATH}/rjp.hpp) set(CPP_HEADERS ${INCLUDE_PATH}/array.hpp ${INCLUDE_PATH}/integral.hpp ${INCLUDE_PATH}/iterator.hpp ${INCLUDE_PATH}/member.hpp ${INCLUDE_PATH}/object.hpp ${INCLUDE_PATH}/parse.hpp ${INCLUDE_PATH}/string.hpp ${INCLUDE_PATH}/string_val.hpp ${INCLUDE_PATH}/value.hpp ${INCLUDE_PATH}/rjp_util.hpp ${INCLUDE_PATH}/dispatch.hpp ${INCLUDE_PATH}/container.hpp) 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() if(BUILD_TESTS) enable_testing() add_subdirectory(tests) endif() set_target_properties(rjp++ PROPERTIES COMPILE_FLAGS -std=c++17) target_compile_options(rjp++ PRIVATE -Wall -Wextra -pedantic) target_link_libraries(rjp++ rjp -lrexy) install(TARGETS rjp++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) install(FILES ${CPP_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/rjp++) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/pc/rjp++.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig" ) add_custom_target(uninstall_rjp++ cat install_manifest.txt | xargs rm)