-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
164 lines (127 loc) · 6.87 KB
/
CMakeLists.txt
File metadata and controls
164 lines (127 loc) · 6.87 KB
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
cmake_minimum_required (VERSION 3.26)
project (bplan DESCRIPTION "Budget Planner (UA)"
HOMEPAGE_URL "https://github.com/Challanger524/bplan"
LANGUAGES CXX)
# # # List : options # # #
#option(BUILD_SHARED_LIBS "Build using shared libraries" NO)
# # # Setup: project # # #
add_executable (${PROJECT_NAME})
target_include_directories(${PROJECT_NAME} PRIVATE "${PROJECT_SOURCE_DIR}/include"
"${PROJECT_SOURCE_DIR}/src" )
target_precompile_headers (${PROJECT_NAME} PRIVATE "${PROJECT_SOURCE_DIR}/src/config.hpp") # force include to all source files
set_target_properties (${PROJECT_NAME} PROPERTIES
CXX_STANDARD 23
CXX_STANDARD_REQUIRED ON
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}$<0:>" # deal with resource depsendencies ($<0:> - dummy gen-expression to enforce exact value):
EXPORT_COMPILE_COMMANDS ON
)
# # Apply: compile definitions # #
target_compile_definitions(${PROJECT_NAME} PRIVATE "${_DEFINITIONS_}")
# # Gather: sources # #
file(GLOB_RECURSE SOURCE_FILES_ CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/src/*.cpp")
list(FILTER SOURCE_FILES_ EXCLUDE REGEX ".*\\/_.*\\..*") # exclude files starting with uncderscore `_<file>`: https://regex101.com/r/DT6qGi/1
target_sources (${PROJECT_NAME} PRIVATE ${SOURCE_FILES_})
# # Apply: compiler and linker flags (from: CMakePresets.json) # #
target_link_options (${PROJECT_NAME} PRIVATE "${_FLAGS_LINKER_}") # flags: linker
# flags: compiler & linker (mutual)
target_link_options (${PROJECT_NAME} PRIVATE "${_FLAGS_COMP_LINK_}") #
target_compile_options(${PROJECT_NAME} PRIVATE "${_FLAGS_COMP_LINK_}") #
# flags: compliler
target_compile_options(${PROJECT_NAME} PRIVATE "${_FLAGS_COMPILE_0_}" #
"${_FLAGS_COMPILE_1_}" #
"${_FLAGS_COMPILE_2_}") #
# # Setup: libraries # #
find_package(OpenGL REQUIRED)
set(GLFW_BUILD_EXAMPLES NO CACHE BOOL "" FORCE)
set(GLFW_BUILD_TESTS NO CACHE BOOL "" FORCE)
set(GLFW_BUILD_DOCS NO CACHE BOOL "" FORCE)
add_subdirectory("deps/glfw")
# Setup: ImGui library #
set(IMGUI_SOURCE_DIR_ "${CMAKE_SOURCE_DIR}/deps/imgui")
set(IMGUI_BACKENDS_SOURCE_FILES_ "${IMGUI_SOURCE_DIR_}/backends/imgui_impl_glfw.cpp" # :2 api-dependend includes!
"${IMGUI_SOURCE_DIR_}/backends/imgui_impl_opengl3.cpp")
file(GLOB IMGUI_SOURCE_FILES_ "${IMGUI_SOURCE_DIR_}/*.cpp")
add_library (imgui STATIC ${IMGUI_SOURCE_FILES_} ${IMGUI_BACKENDS_SOURCE_FILES_})
target_include_directories(imgui SYSTEM PUBLIC "${IMGUI_SOURCE_DIR_}"
PRIVATE "${CMAKE_SOURCE_DIR}/deps/glfw/include")
target_compile_definitions(imgui PRIVATE IMGUI_USER_CONFIG="${PROJECT_SOURCE_DIR}/src/conf/imconfig.h")
set_target_properties (imgui PROPERTIES CXX_STANDARD 11 CXX_STANDARD_REQUIRED ON)
# Setup: SQLite ORM #
set(SQLITE_ORM_ENABLE_CXX_20 ON CACHE BOOL "" FORCE)
add_subdirectory("${CMAKE_SOURCE_DIR}/deps/sqlite_orm") # depends on 'SQLite' that must be visible to `find_package()`
# https://discourse.cmake.org/t/correct-usage-of-findsqlite3-module-in-windows/174
## Pre-Setup: ODBC ##
if(MINGW)
set(ODBC_INCLUDE_DIR "" CACHE PATH "[MinGW] prevent '../Windows Kits/..' inclusion from VS dev env")
endif()
# Setup: odbc-cpp-wrapper (C++ Wrapper for ODBC) #
find_package(ODBC REQUIRED)
file(GLOB_RECURSE ODBCCPP_SOURCE_FILES_ "${CMAKE_SOURCE_DIR}/deps/odbc-cpp-wrapper/src/*.cpp")
add_library (odbccpp STATIC ${ODBCCPP_SOURCE_FILES_})
target_include_directories(odbccpp SYSTEM PUBLIC "${CMAKE_SOURCE_DIR}/deps/odbc-cpp-wrapper/src")
target_compile_definitions(odbccpp PUBLIC ODBC_STATIC)
target_link_libraries (odbccpp PUBLIC ODBC::ODBC)
set_target_properties (odbccpp PROPERTIES CXX_STANDARD 11 CXX_STANDARD_REQUIRED ON)
# Setup: nanodbc (C++ wrapper for the native C ODBC API) #
set(NANODBC_ENABLE_UNICODE NO CACHE BOOL "" FORCE)
set(NANODBC_ENABLE_BOOST NO CACHE BOOL "" FORCE) # depends on NANODBC_ENABLE_UNICODE
add_subdirectory("deps/nanodbc")
# Setup: Boost:: #
if(NOT EXISTS "${_BOOST_SOURCE_DIR_}/boost.png")
message(FATAL_ERROR
"_BOOST_SOURCE_DIR_='${_BOOST_SOURCE_DIR_}' - invalid boost path\n"
"-D_BOOST_SOURCE_DIR_=<boost_path> define must be passed to the cmake command")
endif()
list(APPEND BOOST_INCLUDE_LIBRARIES config beast)
# ::beast # file:///./src/lib/src_beast.cpp
target_compile_definitions(${PROJECT_NAME} PRIVATE "BOOST_BEAST_SEPARATE_COMPILATION")
# ::locale
if (MINGW AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set(BOOST_LOCALE_ENABLE_STD OFF CACHE BOOL "" FORCE)
set(BOOST_LOCALE_ENABLE_WINAPI YES CACHE BOOL "" FORCE)
list(APPEND BOOST_INCLUDE_LIBRARIES locale)
target_link_libraries(${PROJECT_NAME} Boost::locale)
endif()
add_subdirectory("${_BOOST_SOURCE_DIR_}" "${CMAKE_BINARY_DIR}/deps/boost" EXCLUDE_FROM_ALL)
# [Workaround] https://github.com/boostorg/beast/issues/672#issuecomment-318225620
# Link missing: `ws2_32` library for windows sockets with boost::asio
if (MINGW)
target_link_libraries(boost_asio INTERFACE ws2_32) # mswsock wsock32
endif()
# # Apply: project dependencies # #
target_link_libraries (${PROJECT_NAME} OpenGL::GL glfw imgui sqlite_orm::sqlite_orm Boost::beast odbccpp nanodbc)
target_include_directories(${PROJECT_NAME} SYSTEM PRIVATE
"${CMAKE_SOURCE_DIR}/deps"
"${CMAKE_SOURCE_DIR}/deps/rapidcsv/src"
"${CMAKE_SOURCE_DIR}/deps/sqlite_orm/include/sqlite_orm"
) # rooted dirs will be treated as SYSTEM, even if opposite stated explicitly (with: -I)
if (MINGW AND CMAKE_CXX_COMPILER_ID STREQUAL GNU)
target_link_libraries(${PROJECT_NAME} stdc++exp) # std:: print, println #? new preset var ${_LINK_LIBRARIES_} ?
endif()
# # Add: custom build targets # #
add_custom_target( ${PROJECT_NAME}-clean
COMMENT "Target `${PROJECT_NAME}` - clean"
COMMAND ${CMAKE_COMMAND} -E rm -rf -- "${PROJECT_BINARY_DIR}/CMakeFiles/${PROJECT_NAME}.dir/src/"
)
###Stash###
#set(CMAKE_VERBOSE_MAKEFILE ON CACHE BOOL "" FORCE) # debug compiling
# debug file(GLOB_RECURSE)
#string (REPLACE ";" "\n" SOURCE_FILES_ "${SOURCE_FILES_}")
#message(FATAL_ERROR ${SOURCE_FILES_})
#cmake_path(GET CMAKE_CACHEFILE_DIR FILENAME PRESET_)
#message(${CMAKE_CACHEFILE_DIR})
#message(${PRESET_})
#[[
add_custom_target( ${PROJECT_NAME}-rebuild
COMMENT "Target `${PROJECT_NAME}` - rebuild"
DEPENDS ${PROJECT_NAME}-clean
COMMAND ${CMAKE_COMMAND} --build "." --target ${PROJECT_NAME}
USES_TERMINAL # enables instant console output
)#]]
#[[ Same as `-clean`, but uses cmake script and can accept list of files/folders
add_custom_target( ${PROJECT_NAME}-clean-batch
COMMENT "Target `${PROJECT_NAME}` - clean-batch:"
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMAND ${CMAKE_COMMAND} -DFILES_="${PROJECT_BINARY_DIR}/CMakeFiles/${PROJECT_NAME}.dir/src/"
-P "misc/cmake/remove_recurse.cmake"
)#]]