makefile 1.9 KB

12345678910111213141516171819202122
  1. Compiler=g++
  2. Compiler_flags=-pedantic-errors -Wall -Weffc++ -Wextra -Wsign-conversion
  3. Compiler_libs_flags=-lncurses
  4. Cpp_version=-std=c++20
  5. Include_dir=includes
  6. Src_dir=src
  7. Cpp_files=$(shell ls $(Src_dir) | grep \.cpp)
  8. Cpp_files_with_paths=$(wildcard $(Src_dir)/*.cpp )
  9. Cpp_files_in_subdirs_with_paths=$(wildcard $(Src_dir)/**/*.cpp ) # Find all cpp in dirs and subdirs ( src/menu/menu.cpp src/point/point.cpp ) список путей ко всем cpp-файлам в каталоге Src_dir и его подкаталогах.
  10. Include_dirs=$(wildcard $(Include_dir)/*) # Find all header dirs and subdirs ( includes/menu includes/point ) список путей ко всем каталогам, содержащим заголовочные файлы.
  11. # g++ src/main.cpp src/menu/menu.cpp src/point/point.cpp -o main -std=c++20 -pedantic-errors -Wall -Weffc++ -Wextra -Wsign-conversion -lncurses -Iincludes/menu -Iincludes/point; g++ src/menu.cpp src/menu/menu.cpp src/point/point.cpp -o menu -std=c++20 -pedantic-errors -Wall -Weffc++ -Wextra -Wsign-conversion -lncurses -Iincludes/menu -Iincludes/point;
  12. # Put all headers dirs in option -I for g++: $(foreach dir, $(Include_dirs), -I$(dir))
  13. # $^ = $(Cpp_files_in_subdirs_with_paths)
  14. ${Cpp_files}: $(Cpp_files_in_subdirs_with_paths) # говорит make, что все файлы перечисленные в Cpp_files ( src/main.cpp src/menu.cpp ) должны быть собраны с использованием файлов, указанных в $Cpp_files_in_subdirs_with_paths ( src/menu/menu.cpp src/point/point.cpp )
  15. $(foreach cpp_file, $(Cpp_files), $(Compiler) ${Src_dir}/$(cpp_file) $^ -o $(basename $(cpp_file)) $(Cpp_version) $(Compiler_flags) $(Compiler_libs_flags) $(foreach dir, $(Include_dirs), -I$(dir));)
  16. clean:
  17. $(foreach bin_file, $(basename $(Cpp_files)), rm -rvf ${bin_file};)