CMakeLists.txt 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. # SExp - A S-Expression Parser for C++
  2. # Copyright (C) 2015 Ingo Ruhnke <grumbel@gmail.com>
  3. #
  4. # This program is free software: you can redistribute it and/or modify
  5. # it under the terms of the GNU General Public License as published by
  6. # the Free Software Foundation, either version 3 of the License, or
  7. # (at your option) any later version.
  8. #
  9. # This program is distributed in the hope that it will be useful,
  10. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. # GNU General Public License for more details.
  13. #
  14. # You should have received a copy of the GNU General Public License
  15. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. cmake_minimum_required(VERSION 3.0)
  17. project(sexp VERSION 0.1.0)
  18. include(GNUInstallDirs)
  19. option(WARNINGS "Switch on extra warnings" OFF)
  20. option(WERROR "Turn warnings into errors" OFF)
  21. option(USE_LOCALE "Use C++ locale support" OFF)
  22. option(USE_CXX17 "Use C++17 features" OFF)
  23. if(WARNINGS)
  24. if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  25. set(WARNINGS_CXX_FLAGS "${WARNINGS_CXX_FLAGS}"
  26. -Weverything
  27. # flags that we deliberately ignore
  28. -Wno-c++98-compat
  29. -Wno-c++98-compat-pedantic
  30. -Wno-float-equal
  31. -Wno-padded
  32. -Wno-weak-vtables
  33. -Wno-disabled-macro-expansion
  34. -Wno-documentation
  35. -Wno-reserved-id-macro
  36. -Wno-sign-conversion
  37. -Wno-unreachable-code-break
  38. -Wno-unused-parameter
  39. -Wno-covered-switch-default
  40. -Wno-global-constructors
  41. -Wno-zero-as-null-pointer-constant
  42. )
  43. elseif(CMAKE_COMPILER_IS_GNUCXX)
  44. set(WARNINGS_CXX_FLAGS ${WARNINGS_CXX_FLAGS}
  45. -pedantic -Wall -Wextra -Wno-c++0x-compat -Wnon-virtual-dtor
  46. -Wshadow -Wcast-qual -Winit-self -Wno-unused-parameter
  47. -Weffc++ -Wconversion -Wold-style-cast)
  48. # -Winline -Wfloat-equal -Wunreachable-code
  49. endif()
  50. endif()
  51. if(WERROR)
  52. if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  53. set(WARNINGS_CXX_FLAGS ${WARNINGS_CXX_FLAGS}
  54. -Werror)
  55. endif()
  56. endif()
  57. if(CMAKE_VERSION VERSION_GREATER 3.6)
  58. if (USE_CLANG_TIDY)
  59. find_program(
  60. CLANG_TIDY_EXE
  61. NAMES "clang-tidy"
  62. DOC "Path to clang-tidy executable"
  63. )
  64. if(NOT CLANG_TIDY_EXE)
  65. message(FATAL_ERROR "clang-tidy not found.")
  66. else()
  67. message(STATUS "clang-tidy found: ${CLANG_TIDY_EXE}")
  68. set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_EXE}")
  69. endif()
  70. endif()
  71. endif()
  72. if(USE_CXX17)
  73. add_compile_options(-std=c++17)
  74. add_definitions(-DSEXP_USE_CXX17)
  75. else()
  76. add_compile_options(-std=c++11)
  77. endif()
  78. if(USE_LOCALE)
  79. add_definitions(-DSEXP_USE_LOCALE)
  80. endif()
  81. file(GLOB SEXP_SOURCES src/*.cpp)
  82. file(GLOB SEXP_HEADER_SOURCES include/sexp/*.hpp)
  83. add_library(sexp ${SEXP_SOURCES})
  84. set_target_properties(sexp PROPERTIES PUBLIC_HEADER "${SEXP_HEADER_SOURCES}")
  85. target_compile_options(sexp PRIVATE ${WARNINGS_CXX_FLAGS})
  86. target_include_directories(sexp SYSTEM PUBLIC include)
  87. install(TARGETS sexp
  88. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  89. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  90. PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sexp)
  91. if(BUILD_TESTS)
  92. find_package(Threads REQUIRED)
  93. # build gtest
  94. # ${CMAKE_CURRENT_SOURCE_DIR} in include_directories is needed to generate -isystem instead of -I flags
  95. add_library(gtest_main STATIC ${CMAKE_CURRENT_SOURCE_DIR}/external/googletest/googletest/src/gtest_main.cc)
  96. target_include_directories(gtest_main SYSTEM PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/external/googletest/googletest/include/)
  97. add_library(gtest STATIC ${CMAKE_CURRENT_SOURCE_DIR}/external/googletest/googletest/src/gtest-all.cc)
  98. target_include_directories(gtest SYSTEM PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/external/googletest/googletest/)
  99. target_include_directories(gtest SYSTEM PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/external/googletest/googletest/include/)
  100. set_target_properties(gtest_main PROPERTIES CXX_CLANG_TIDY "")
  101. set_target_properties(gtest PROPERTIES CXX_CLANG_TIDY "")
  102. # build sexp tests
  103. file(GLOB TEST_SEXP_SOURCES tests/*.cpp)
  104. add_executable(test_sexp ${TEST_SEXP_SOURCES})
  105. target_compile_options(test_sexp PRIVATE ${WARNINGS_CXX_FLAGS})
  106. target_include_directories(test_sexp PUBLIC src/)
  107. target_link_libraries(test_sexp
  108. gtest gtest_main
  109. sexp
  110. ${CMAKE_THREAD_LIBS_INIT})
  111. # add 'make test' target, use 'make test ARGS="-V"' or 'ctest -V' for verbose
  112. enable_testing()
  113. add_test(NAME test_sexp
  114. WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  115. COMMAND test_sexp)
  116. endif()
  117. if(BUILD_BENCHMARKS)
  118. # build google-benchmark
  119. include_directories(${PROJECT_SOURCE_DIR}/src)
  120. file(GLOB BENCHMARK_SOURCES external/benchmark/src/*.cc)
  121. add_library(benchmark ${BENCHMARK_SOURCES})
  122. target_compile_definitions(benchmark PRIVATE -DHAVE_STD_REGEX)
  123. target_compile_options(benchmark PRIVATE -std=c++1y)
  124. target_include_directories(benchmark SYSTEM PUBLIC
  125. ${CMAKE_CURRENT_SOURCE_DIR}/external/benchmark/include)
  126. set_target_properties(benchmark PROPERTIES CXX_CLANG_TIDY "")
  127. # build benchmarks
  128. file(GLOB BENCHMARKSOURCES benchmarks/*.cpp)
  129. foreach(SOURCE ${BENCHMARKSOURCES})
  130. get_filename_component(SOURCE_BASENAME ${SOURCE} NAME_WE)
  131. add_executable(${SOURCE_BASENAME} ${SOURCE})
  132. target_link_libraries(${SOURCE_BASENAME} benchmark sexp ${CMAKE_THREAD_LIBS_INIT})
  133. set_target_properties(${SOURCE_BASENAME} PROPERTIES
  134. RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/benchmarks/")
  135. target_compile_options(${SOURCE_BASENAME} PRIVATE -std=c++1y ${WARNINGS_CXX_FLAGS})
  136. endforeach(SOURCE)
  137. endif()
  138. # EOF #