-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt
133 lines (113 loc) · 4.73 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
###############################################################################
## Action #9
cmake_minimum_required(VERSION 3.17.0) # version can be different
###############################################################################
set(CMAKE_C_COMPILER /usr/bin/clang)
set(CMAKE_CXX_COMPILER /usr/bin/clang++)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_FLAGS "-g -O0 -std=c++11 -stdlib=libc++ -U__STRICT_ANSI__ -fprofile-instr-generate -fcoverage-mapping")
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
###############################################################################
project(CppADT)
include_directories(googletest/include) # this is so we can #include <gtest/gtest.h>
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
include(FetchContent)
FetchContent_Declare(
googletest
URL https://github.com/google/googletest/archive/609281088cfefc76f9d0ce82e1ff6c30cc3591e5.zip
)
FetchContent_MakeAvailable(googletest)
###############################################################################
add_executable(tests)
target_include_directories(tests PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_sources(tests PUBLIC
List.cpp
tests/tests.cpp
)
target_link_libraries(tests PRIVATE gtest) # link google test to this executable
set_property(TARGET tests PROPERTY CXX_STANDARD 11)
###############################################################################
add_custom_target(coverage
COMMAND tests
COMMAND llvm-profdata merge -sparse default.profraw -o cumulative.profdata
COMMAND llvm-cov show -ignore-filename-regex='../google*/*' -ignore-filename-regex='../json/*' -format="html" ./tests -instr-profile=cumulative.profdata > coverageLines.html
COMMAND llvm-cov report -show-region-summary=false -ignore-filename-regex='../google*/*' -ignore-filename-regex='../json/*' ./tests -instr-profile=cumulative.profdata > coverageSummary.txt
COMMAND cat coverageSummary.txt
)
add_dependencies(coverage tests)
enable_testing()
include(GoogleTest)
gtest_discover_tests(tests)
###############################################################################
#Add target to build documents
set(DOXYGEN_INPUT ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile)
#set the output directory of the documentation
set(DOXYGEN_OUTPUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/docs)
# sanity check...
message("Doxygen Output ${DOXYGEN_OUTPUT_DIR}")
find_package(Doxygen)
###############################################################################
if(DOXYGEN_FOUND)
# create the output directory where the documentation will live
file(MAKE_DIRECTORY ${DOXYGEN_OUTPUT_DIR})
# configure our Doxygen configuration file. This will be the input to the doxygen
# executable
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile
${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY)
# now add the custom target. This will create a build target called 'document'
# in your project
ADD_CUSTOM_TARGET(document
COMMAND ${CMAKE_COMMAND} -E echo_append "Building API Documentation..."
COMMAND ${CMAKE_COMMAND} -E make_directory ${DOXYGEN_OUTPUT_DIR}
COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_INPUT}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND ${CMAKE_COMMAND} -E echo "Done."
WORKING_DIRECTORY ${DOXYGEN_OUTPUT_DIR})
endif(DOXYGEN_FOUND)
###############################################################################
#Add target to format code
if(NOT CLANG_FORMAT)
find_program(CLANG_FORMAT "clang-format")
endif()
if(CLANG_FORMAT)
file(GLOB_RECURSE ALL_CXX_SOURCE_FILES
${PROJECT_SOURCE_DIR}/*.cpp
${PROJECT_SOURCE_DIR}/*.h
${PROJECT_SOURCE_DIR}/tests/*.cpp
)
add_custom_target(
${PROJECT_NAME}_format
COMMAND clang-format -i -style=file ${ALL_CXX_SOURCE_FILES}
)
if(NOT TARGET format)
add_custom_target(format)
endif()
add_dependencies(format ${PROJECT_NAME}_format)
endif()
###############################################################################
#Add target to format code
if(NOT CLANG_ANALYZE)
find_program(CLANG_ANALYZE "clang-tidy")
endif()
if(CLANG_ANALYZE)
file(GLOB_RECURSE ALL_CXX_SOURCE_FILES
${PROJECT_SOURCE_DIR}/*.cpp
${PROJECT_SOURCE_DIR}/*.h
${PROJECT_SOURCE_DIR}/tests/*.cpp
)
add_custom_target(
${PROJECT_NAME}_analyze
COMMAND clang-tidy -p . ${ALL_CXX_SOURCE_FILES}
)
if(NOT TARGET analyze)
add_custom_target(analyze)
endif()
add_dependencies(analyze ${PROJECT_NAME}_analyze)
endif()
# Format code _before_ building so that formatting will not change
# the code after compiling the code. If the code is modified after
# compile, then the build system will think the code needs to be
# compiled again.
add_dependencies(tests format)