-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCMakeLists.txt
152 lines (133 loc) · 5.51 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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# ======================================== CMAKE SETUP ========================================
cmake_minimum_required(VERSION 3.16)
# generate compile commands json
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# set c++ standards as global variables
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# hack to avoid DNDEBUG which removes wires for some reason
if (MSVC)
# also do it for MSVC, not sure if needed
set(CMAKE_CXX_FLAGS_RELEASE "/O2")
else()
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
endif()
# ======================================== PROJECT SETUP ========================================
project(Gatality)
# Set directories
set(SOURCE_DIR "${CMAKE_SOURCE_DIR}/src")
set(UI_DIR "${CMAKE_SOURCE_DIR}/src")
set(EXTERNAL_DIR "${CMAKE_SOURCE_DIR}/external")
set(RESOURCES_DIR "${CMAKE_SOURCE_DIR}/resources")
# Find source files
file(GLOB_RECURSE PROJECT_SOURCES
"${UI_DIR}/*.ui"
"${UI_DIR}/*.qrc"
"${SOURCE_DIR}/*.cpp"
)
# ======================================== DEPENDENCY SETUP ========================================
# Initialize QT
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOUIC_SEARCH_PATHS ${UI_DIR})
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets)
# KDDockWidgets
set(KDDockWidgets_QT6 ON)
set(KDDockWidgets_STATIC ON)
add_subdirectory(external/KDDockWidgets EXCLUDE_FROM_ALL)
# CPPLocate (they have extreme cmake goofyness)
set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
set(BUILD_SHARED_LIBS OFF)
set(OPTION_BUILD_TESTS OFF) # these are cpplocate's tests
add_subdirectory(external/cpplocate EXCLUDE_FROM_ALL)
# JSON
set(GATALITY_JSON_LIB_NAME "json")
add_library(${GATALITY_JSON_LIB_NAME} INTERFACE)
target_include_directories(${GATALITY_JSON_LIB_NAME} INTERFACE "${EXTERNAL_DIR}/json/")
# Google Testing
add_subdirectory("${EXTERNAL_DIR}/googletest" SYSTEM EXCLUDE_FROM_ALL)
# ===================================== CREATE APP EXECUTABLE ========================================
# Platform specific business before add_executable
if(APPLE) # MacOS
# Icon
set(ICON_PATH "${RESOURCES_DIR}/gateIcon.icns")
set(MACOSX_BUNDLE_ICON_FILE "gateIcon.icns")
set_source_files_properties(${ICON_PATH} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
list(APPEND PROJECT_SOURCES ${ICON_PATH})
elseif (WIN32) # Windows
# Icon
set(ICON_PATH "${RESOURCES_DIR}/icon.rc")
list(APPEND PROJECT_SOURCES ${ICON_PATH})
endif()
# Add executable
set(EXTERNAL_LINKS
cpplocate::cpplocate
Qt6::Core Qt6::Gui Qt6::Widgets
KDAB::kddockwidgets
${GATALITY_JSON_LIB_NAME}
)
add_executable(${PROJECT_NAME} ${PROJECT_SOURCES})
target_include_directories(${PROJECT_NAME} PRIVATE ${SOURCE_DIR} ${UI_DIR})
target_link_libraries(${PROJECT_NAME} PRIVATE ${EXTERNAL_LINKS})
target_precompile_headers(${PROJECT_NAME} PRIVATE "${SOURCE_DIR}/precompiled.h")
# Platform specific business after add_executable
if(APPLE) # MacOS
set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE TRUE)
# Bundle Properties
set_target_properties(${PROJECT_NAME} PROPERTIES
MACOSX_BUNDLE TRUE
# indentification
MACOSX_BUNDLE_BUNDLE_NAME "Gatality"
MACOSX_BUNDLE_GUI_IDENTIFIER "com.logic-graph-creator.Gatality"
MACOSX_BUNDLE_NAME "Gatality"
MACOSX_BUNDLE_COPYRIGHT "MIT License" # this needs changing
# version info
MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION}"
MACOSX_BUNDLE_VERSION "${PROJECT_VERSION}"
MACOSX_BUNDLE_INFO_VERSION "6.0"
# Dev Region
MACOSX_BUNDLE_DEVELOPMENT_REGION "English"
# Doc Types that macos can handle
MACOSX_BUNDLE_DOCUMENT_TYPES "json;JSON File;Editor;${MACOSX_BUNDLE_GUI_IDENTIFIER}.json;txt;Text File;Editor;${MACOSX_BUNDLE_GUI_IDENTIFIER}.txt;circuit;Circuit File;Editor;${MACOSX_BUNDLE_GUI_IDENTIFIER}.cir;circuit;Circuit File;Editor;${MACOSX_BUNDLE_GUI_IDENTIFIER}.circuit;"
# Application category
MACOSX_BUNDLE_INFO_STRING "Logic Gate Sandbox Application"
MACOSX_BUNDLE_LONG_VERSION_STRING "${PROJECT_VERSION}"
)
set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "")
elseif (WIN32) # Windows
if (CMAKE_BUILD_TYPE MATCHES Release) # If release build
# Set WIN32_EXECUTABLE (Disables Console)
set_target_properties(${PROJECT_NAME} PROPERTIES WIN32_EXECUTABLE TRUE)
endif ()
endif()
# ==================================== CREATE TESTING EXECUTABLE ============================================
set(TEST_DIR "${CMAKE_SOURCE_DIR}/tests")
set(TEST_FILES)
file(GLOB_RECURSE TEST_FILES
# "${UI_DIR}/*.ui"
# "${UI_DIR}/*.qrc"
"${SOURCE_DIR}/backend/*.cpp"
"${SOURCE_DIR}/computerAPI/*.cpp"
# "${SOURCE_DIR}/gui/*.cpp"
"${SOURCE_DIR}/keybinds/*.cpp"
"${SOURCE_DIR}/logging/*.cpp"
"${SOURCE_DIR}/util/*.cpp"
"${TEST_DIR}/*.cpp"
)
set(EXTERNAL_LINKS_TESTS
cpplocate::cpplocate
Qt6::Core Qt6::Gui Qt6::Widgets
gtest gtest_main
${GATALITY_JSON_LIB_NAME}
)
add_executable(${PROJECT_NAME}_tests EXCLUDE_FROM_ALL ${TEST_FILES})
target_include_directories(${PROJECT_NAME}_tests PRIVATE ${SOURCE_DIR} ${UI_DIR} ${TEST_DIR})
target_link_libraries(${PROJECT_NAME}_tests PRIVATE ${EXTERNAL_LINKS_TESTS})
target_precompile_headers(${PROJECT_NAME}_tests PRIVATE "${SOURCE_DIR}/precompiled.h")
# ======================================= RESOURCE COPYING =========================================
# We copy the resources directory to the location of the output executable. This is our solution for "resource installing" until we fully set up cpack solution
set(COPIED_RESOURCES_DIR "$<TARGET_FILE_DIR:${PROJECT_NAME}>/resources")
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory "${RESOURCES_DIR}" "${COPIED_RESOURCES_DIR}"
COMMENT "Copying resource directory"
)