aboutsummaryrefslogtreecommitdiff
path: root/CMakeLists.txt
blob: ff4b349016bf3777b3b0b6bfdcdaccb64aa05212 (plain)
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
# cmake -DCMAKE_CXX_INCLUDE_WHAT_YOU_USE=include-what-you-use -B build . && cmake --build build -j
cmake_minimum_required(VERSION 3.24)

set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)

project(Webdir)
option(WEBDIR_BUILD_TESTS "Build unit tests" OFF)

include(FetchContent)
FetchContent_Declare(
  libmw
  GIT_REPOSITORY https://github.com/MetroWind/libmw.git
)

FetchContent_Declare(
  cxxopts
  GIT_REPOSITORY https://github.com/jarro2783/cxxopts.git
  GIT_TAG v3.1.1
)

FetchContent_Declare(
  ryml
  GIT_REPOSITORY https://github.com/biojppm/rapidyaml.git
  GIT_TAG
  GIT_SHALLOW FALSE  # ensure submodules are checked out
)

FetchContent_Declare(
  spdlog
  GIT_REPOSITORY https://github.com/gabime/spdlog.git
  GIT_TAG v1.12.0
)

FetchContent_Declare(
  json
  GIT_REPOSITORY https://github.com/nlohmann/json.git
  # TODO: Use 3.12.1.
  #
  # Temporarily swtich to develop because of
  # https://github.com/nlohmann/json/issues/4756.
  GIT_TAG develop
)

FetchContent_Declare(
  inja
  GIT_REPOSITORY https://github.com/pantor/inja.git
  GIT_TAG main
)

set(SPDLOG_USE_STD_FORMAT ON)
set(LIBMW_BUILD_URL ON)
set(LIBMW_BUILD_SQLITE ON)
set(LIBMW_BUILD_HTTP_SERVER ON)
set(INJA_USE_EMBEDDED_JSON FALSE)
set(INJA_BUILD_TESTS FALSE)
FetchContent_MakeAvailable(libmw ryml spdlog cxxopts json inja)

if(WEBDIR_BUILD_TESTS)
  FetchContent_Declare(
    googletest
    URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.tar.gz
  )
  FetchContent_MakeAvailable(googletest)
endif()

set(SOURCE_FILES
  src/app.cpp
  src/app.hpp
  src/config.cpp
  src/config.hpp
  src/data.cpp
  src/data.hpp
)

set(LIBS
  cxxopts
  mw::mw
  mw::url
  mw::sqlite
  mw::http-server
  ryml::ryml
  spdlog::spdlog
)

set(INCLUDES
  ${libmw_SOURCE_DIR}/includes
  ${json_SOURCE_DIR}/single_include
  ${inja_SOURCE_DIR}/single_include/inja
)

add_executable(webdir ${SOURCE_FILES} src/main.cpp)
set_property(TARGET webdir PROPERTY CXX_STANDARD 23)
set_property(TARGET webdir PROPERTY CXX_EXTENSIONS FALSE)

set_property(TARGET webdir PROPERTY COMPILE_WARNING_AS_ERROR TRUE)
target_compile_options(webdir PRIVATE -Wall -Wextra -Wpedantic)
target_include_directories(webdir PRIVATE ${INCLUDES})
target_link_libraries(webdir PRIVATE ${LIBS})

if(WEBDIR_BUILD_TESTS)
  set(TEST_FILES
    src/data_mock.hpp
    src/data_test.cpp
    src/app_test.cpp
  )

  # ctest --test-dir build
  add_executable(webdir_test ${SOURCE_FILES} ${TEST_FILES})
  set_property(TARGET webdir_test PROPERTY CXX_STANDARD 23)
  set_property(TARGET webdir_test PROPERTY COMPILE_WARNING_AS_ERROR TRUE)
  target_compile_options(webdir_test PRIVATE -Wall -Wextra -Wpedantic)
  target_include_directories(webdir_test PRIVATE
    ${INCLUDES}
    ${googletest_SOURCE_DIR}/googletest/include
    ${googletest_SOURCE_DIR}/googlemock/include
  )

  target_link_libraries(webdir_test PRIVATE
    ${LIBS}
    GTest::gtest_main
    GTest::gmock_main
  )

  enable_testing()
  include(GoogleTest)
  gtest_discover_tests(webdir_test
    # Need this so that the unit tests can find the templates.
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
endif()