Skip to content

Commit bf48d3e

Browse files
committed
update CMake structure
1 parent ecf9d43 commit bf48d3e

File tree

13 files changed

+246
-118
lines changed

13 files changed

+246
-118
lines changed

.cmake/settings.cmake

+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# language: CMake
2+
3+
# Set local vars from .cmake/settings.json
4+
file(READ "${CMAKE_CURRENT_LIST_DIR}/settings.json" REPO_JSON)
5+
6+
string(JSON JSON_LEN LENGTH ${REPO_JSON})
7+
math(EXPR JSON_LEN "${JSON_LEN} - 1")
8+
9+
foreach(INDEX RANGE ${JSON_LEN})
10+
string(JSON JSON_KEY MEMBER ${REPO_JSON} ${INDEX})
11+
string(JSON JSON_VALUE GET ${REPO_JSON} "${JSON_KEY}")
12+
13+
string(REGEX REPLACE "\\[|\\]|\"| " "" JSON_VALUE "${JSON_VALUE}")
14+
string(REPLACE "," ";" JSON_VALUE "${JSON_VALUE}")
15+
16+
set("${JSON_KEY}" "${JSON_VALUE}")
17+
endforeach()
18+
19+
# Project setup
20+
set(REPO_FOLDER ${CMAKE_CURRENT_LIST_DIR})
21+
22+
get_filename_component(PROJECT_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME)
23+
project(${PROJECT_NAME} LANGUAGES ${REPO_LANGUAGES})
24+
25+
find_library(${LIB_NAME} ../)
26+
27+
# Set language settings
28+
if("CXX" IN_LIST REPO_LANGUAGES)
29+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
30+
string(REPLACE ";" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
31+
32+
# less speed, more warnings = less potential errors in code (?)
33+
# set(CMAKE_CXX_FLAGS " -Wall -Wextra -pedantic -std=c++23 -O2 -Wfloat-equal -Wconversion -Wlogical-op -Wduplicated-cond")
34+
# source: https://codeforces.com/blog/entry/15547?locale=ru
35+
endif()
36+
37+
if("C" IN_LIST REPO_LANGUAGES)
38+
set(CMAKE_C_STANDARD_REQUIRED ON)
39+
string(REPLACE ";" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
40+
endif()
41+
42+
# Functions
43+
44+
# Copy non-source subproject files to binary folder.
45+
#
46+
# Args:
47+
# EXCEPT_FILES_LIST_NAME: Name of list of file names to avoid copying
48+
#
49+
# Does:
50+
# This function copies all files from current source directory
51+
# (specified by CMAKE_CURRENT_SOURCE_DIR) to project's binary directory
52+
# (specified by PROJECT_BINARY_DIR), excluding files that match source
53+
# and header file formats (specified by SOURCES_FORMAT and HEADERS_FORMAT).
54+
function(CopyExtraFiles EXCEPT_FILES_LIST_NAME)
55+
file(GLOB_RECURSE EXTRA_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*")
56+
file(GLOB_RECURSE PROJECT_FILES ${SOURCES_FORMAT} ${HEADERS_FORMAT})
57+
58+
list(REMOVE_ITEM EXTRA_FILES ${PROJECT_FILES} ${${EXCEPT_FILES_LIST_NAME}})
59+
60+
file(COPY ${EXTRA_FILES} DESTINATION ${PROJECT_BINARY_DIR})
61+
endfunction()
62+
63+
# Gets last element of list.
64+
#
65+
# Args:
66+
# LIST_NAME: Name of list to get last element from.
67+
# LAST_ELEM_OUTPUT: name of variable to store last element in.
68+
#
69+
# Returns:
70+
# Stores last element of list in output_variable.
71+
# If list is empty, sets LAST_ELEM_OUTPUT to NOTFOUND.
72+
function(LastElement LIST_NAME LAST_ELEM_OUTPUT)
73+
list(LENGTH "${LIST_NAME}" LIST_LEN)
74+
math(EXPR LIST_LAST "${LIST_LEN} - 1")
75+
list(GET "${LIST_NAME}" ${LIST_LAST} LAST_ELEM)
76+
77+
set(${LAST_ELEM_OUTPUT} "${LAST_ELEM}" PARENT_SCOPE)
78+
endfunction()

.cmake/settings.json

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"REPO_LANGUAGES": [
3+
"CXX"
4+
],
5+
"CMAKE_CXX_STANDARD": 23,
6+
"CMAKE_CXX_FLAGS": [
7+
"-Wall",
8+
"-Wextra",
9+
"-pedantic",
10+
"-std=c++23",
11+
"-O2"
12+
],
13+
"HEADERS_FORMAT": [
14+
"*.hpp",
15+
"*.h"
16+
],
17+
"SOURCES_FORMAT": [
18+
"*.cpp"
19+
],
20+
"LIB_NAME": "lib",
21+
"LESSON_PREFIX": "lesson_",
22+
"TASK_PREFIXES": [
23+
"task_",
24+
"example_"
25+
]
26+
}

.gitignore

+46
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# C++ objects and libs
12
# Prerequisites
23
*.d
34

@@ -13,6 +14,7 @@
1314

1415
# Compiled Dynamic libraries
1516
*.so
17+
*.so.*
1618
*.dylib
1719
*.dll
1820

@@ -31,5 +33,49 @@
3133
*.out
3234
*.app
3335

36+
# Qt-es
37+
object_script.*.Release
38+
object_script.*.Debug
39+
*_plugin_import.cpp
40+
/.qmake.cache
41+
/.qmake.stash
42+
*.pro.user
43+
*.pro.user.*
44+
*.qbs.user
45+
*.qbs.user.*
46+
*.moc
47+
moc_*.cpp
48+
moc_*.h
49+
qrc_*.cpp
50+
ui_*.h
51+
*.qmlc
52+
*.jsc
53+
Makefile*
54+
*build-*
55+
*.qm
56+
*.prl
57+
*_qmlcache.qrc
58+
59+
# Qt unit tests
60+
target_wrapper.*
61+
62+
# QtCreator
63+
*.autosave
64+
65+
# QtCreator Qml
66+
*.qmlproject.user
67+
*.qmlproject.user.*
68+
69+
# QtCreator CMake
70+
CMakeLists.txt.user*
71+
72+
# QtCreator 4.8< compilation database
73+
compile_commands.json
74+
75+
# QtCreator local machine specific files for imported projects
76+
*creator.user*
77+
3478
# Folders
3579
build/
80+
.vscode/*
81+
!.vscode/settings.json

.vscode/settings.json

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
{
22
"cSpell.words": [
3+
"dylib",
34
"endforeach",
5+
"endfunction",
6+
"qmlc",
7+
"qmlcache",
8+
"qmlproject",
9+
"smod",
10+
"SUBDIRS",
411
"SUBFOLDERS",
512
"SUBPROJECT",
613
"Wconversion",
714
"Wduplicated",
815
"Wextra",
916
"Wfloat",
10-
"Wlogical"
17+
"Wlogical",
18+
"Wpedantic"
1119
]
1220
}

CMakeLists.txt

+9-26
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,20 @@
11
# language: CMake
22

3-
# --------------------------------- Project setup ---------------------------------
4-
cmake_minimum_required(VERSION 3.20)
3+
cmake_minimum_required(VERSION 3.25)
54

6-
get_filename_component(PROJECT_NAME ${CMAKE_CURRENT_LIST_DIR} NAME)
7-
project(${PROJECT_NAME} LANGUAGES CXX)
5+
project(project)
6+
include(.cmake/settings.cmake)
87

9-
# --------------------------------- Set C++ settings ---------------------------------
10-
set(CMAKE_CXX_STANDARD 23)
11-
set(CMAKE_CXX_STANDARD_REQUIRED ON)
12-
set(CMAKE_CXX_FLAGS "-Wall -Wextra -pedantic -std=c++23 -O2")
8+
# Lesson folders
9+
file(GLOB_RECURSE DIRS LIST_DIRECTORIES true ".")
1310

14-
# less speed, more warnings = less potential errors in code
15-
# flags using source: https://codeforces.com/blog/entry/15547?locale=ru
16-
# set(CMAKE_CXX_FLAGS " -Wall -Wextra -pedantic -std=c++23 -O2 -Wfloat-equal -Wconversion -Wlogical-op -Wduplicated-cond")
17-
18-
# --------------------------------- Set CMake settings ---------------------------------
19-
set(CMAKE_INCLUDE_CURRENT_DIR ON)
20-
21-
# --------------------------------- Libraries --------------------------------
22-
# find_package()
23-
24-
# --------------------------------- Add subdirectories --------------------------------
25-
file(GLOB_RECURSE SUBDIRS LIST_DIRECTORIES true ".")
26-
27-
foreach(DIR ${SUBDIRS})
11+
foreach(DIR ${DIRS})
2812
if(IS_DIRECTORY ${DIR})
29-
if(${DIR} MATCHES "${PROJECT_NAME}/lesson_[^/]*$")
30-
# message(${DIR})
13+
if(${DIR} MATCHES "${PROJECT_NAME}/${LESSON_PREFIX}[^/]*$")
3114
add_subdirectory(${DIR})
3215
endif()
3316
endif()
3417
endforeach()
3518

36-
# Lib
37-
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/lib)
19+
# Library
20+
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${LIB_NAME})

lesson_1/CMakeLists.txt

+32-38
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,51 @@
11
# language: CMake
22

3-
# --------------------------------- Project setup ---------------------------------
4-
cmake_minimum_required(VERSION 3.20)
3+
include(${REPO_FOLDER}/settings.cmake)
54

6-
get_filename_component(PROJECT_NAME ${CMAKE_CURRENT_LIST_DIR} NAME)
7-
project(${PROJECT_NAME} LANGUAGES CXX)
5+
# Libraries
6+
set(GLOBAL_LIBS shape_lib)
87

9-
# --------------------------------- Set C++ settings ---------------------------------
10-
set(CMAKE_CXX_STANDARD 23)
11-
set(CMAKE_CXX_STANDARD_REQUIRED ON)
12-
set(CMAKE_CXX_FLAGS "-Wall -Wextra -pedantic -std=c++23 -O2")
8+
# find_library(shape_lib ../)
9+
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/example_shape_lib/shape_lib)
1310

14-
# less speed, more warnings = less potential errors in code
15-
# flags using source: https://codeforces.com/blog/entry/15547?locale=ru
16-
# set(CMAKE_CXX_FLAGS " -Wall -Wextra -pedantic -std=c++23 -O2 -Wfloat-equal -Wconversion -Wlogical-op -Wduplicated-cond")
11+
# Add executable
12+
file(GLOB_RECURSE SUBDIRS LIST_DIRECTORIES true ".")
1713

18-
# --------------------------------- Set CMake settings ---------------------------------
19-
set(CMAKE_INCLUDE_CURRENT_DIR ON)
14+
string(REPLACE ";" "|" PREFIX "${TASK_PREFIXES}")
2015

21-
# --------------------------------- Libraries --------------------------------
22-
add_subdirectory(example_shape_lib/shape_lib)
23-
24-
# --------------------------------- Add executable --------------------------------
25-
file(GLOB_RECURSE SUBFOLDERS LIST_DIRECTORIES true ".")
26-
27-
find_library(Lib ../)
28-
29-
foreach(SUBDIR ${SUBFOLDERS})
16+
foreach(SUBDIR ${SUBDIRS})
3017
if(IS_DIRECTORY ${SUBDIR})
31-
if("${SUBDIR}" MATCHES "${PROJECT_NAME}/(task|example)_[^/]*$")
18+
if("${SUBDIR}" MATCHES "${PROJECT_NAME}/(${PREFIX})[^/]*$")
3219
get_filename_component(SUBPROJECT_NAME ${SUBDIR} NAME)
3320
set(SUBPROJECT_NAME "${PROJECT_NAME}_${SUBPROJECT_NAME}")
3421

35-
# files only in one subfolder
36-
file(GLOB SUBPROJECT_SOURCES "${SUBDIR}/*.hpp" "${SUBDIR}/*.cpp")
22+
# (files only in one subfolder)
23+
file(GLOB SUBPROJECT_SOURCES
24+
${SUBDIR}/${HEADERS_FORMAT}
25+
${SUBDIR}/${SOURCES_FORMAT}
26+
)
27+
28+
set(SUBPROJECT_SOURCES)
29+
30+
foreach(ITEM_HEADER IN LISTS HEADERS_FORMAT)
31+
file(GLOB ITEM_HEADER_FORMAT_SOURCES ${SUBDIR}/${ITEM_HEADER})
32+
list(APPEND SUBPROJECT_SOURCES ${ITEM_HEADER_FORMAT_SOURCES})
33+
endforeach()
34+
35+
foreach(ITEM_SOURCE IN LISTS SOURCES_FORMAT)
36+
file(GLOB ITEM_SOURCE_FORMAT_SOURCES ${SUBDIR}/${ITEM_SOURCE})
37+
list(APPEND SUBPROJECT_SOURCES ${ITEM_SOURCE_FORMAT_SOURCES})
38+
endforeach()
3739

3840
add_executable(${SUBPROJECT_NAME} ${SUBPROJECT_SOURCES})
3941

40-
target_link_libraries(${SUBPROJECT_NAME} PRIVATE Lib)
42+
target_link_libraries(${SUBPROJECT_NAME} PRIVATE ${LIB_NAME} ${GLOBAL_LIBS})
43+
target_include_directories(${SUBPROJECT_NAME} PRIVATE ${REPO_FOLDER}/${LIB_NAME})
4144
endif()
4245
endif()
4346
endforeach()
4447

45-
# --------------------------------- Copy extra files --------------------------------
46-
file(GLOB_RECURSE EXTRA_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*")
47-
file(GLOB_RECURSE PROJECT_FILES "*.cpp" "*.h" "*.hpp" "*.sh" "*.o*" "*.e*" "*.md")
48-
49-
list(REMOVE_ITEM EXTRA_FILES ${PROJECT_FILES})
50-
51-
file(COPY ${EXTRA_FILES} DESTINATION ${PROJECT_BINARY_DIR})
52-
53-
# --------------------------------- For this project --------------------------------
54-
find_library(shape_lib ../)
48+
# For this project
49+
CopyExtraFiles({})
5550

56-
target_link_libraries("${PROJECT_NAME}_example_shape_lib" PRIVATE shape_lib)
57-
target_include_directories("${PROJECT_NAME}_example_shape_lib" PRIVATE example_shape_lib/shape_lib)
51+
target_include_directories("${PROJECT_NAME}_example_shape_lib" PRIVATE example_shape_lib/shape_lib)

lesson_1/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# Lesson 1: 07.02.2025
22

33
`target_include_directories` - позволяет указать области, где искать .hpp файлы
4+
45
`vector::emplace_back` - конструирует объект по месту

lesson_1/example_shape_lib/shape_lib/CMakeLists.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON)
2222
# find_package()
2323

2424
# --------------------------------- Add executable --------------------------------
25-
find_library(Lib ../)
25+
find_library(lib ../)
2626

2727
file(GLOB SOURCES "*.hpp" "*.cpp")
2828

2929
add_library(${PROJECT_NAME} ${SOURCES})
30-
target_link_libraries(${PROJECT_NAME} PRIVATE Lib)
30+
target_link_libraries(${PROJECT_NAME} PRIVATE lib)

0 commit comments

Comments
 (0)