Эффективное использование GNU Make

       

"Разнесение" файлов с исходными текстами по директориям


Приведенный в предыдущем параграфе make-файл вполне работоспособен и с успехом может быть использован для сборки небольших программ. Однако, с увеличением размера программы, становится не очень удобным хранить все файлы с исходными текстами в одном каталоге. В таком случае я предпочитаю "разносить" их по разным директориям, отражающим логическую структуру проекта. Для этого нужно немного модифицировать make-файл. Чтобы неявное правило

%.o: %.cpp gcc -c $<

осталось работоспособным, я использую переменную VPATH, в которой перечисляются все директории, где могут располагаться исходные тексты. В следующем примере я поместил файлы Editor.cpp и Editor.h в каталог Editor, а файлы TextLine.cpp и TextLine.h в каталог TextLine:

  • example_4-multidir /
  • main.cpp
  • main.h
  • Editor /
  • Editor.cpp
  • Editor.h
  • TextLine /
    • TextLine.cpp
    • TextLine.h
    • Makefile Вот как выглядит Makefile для этого примера:
    • # # example_4-multidir/Makefile # # Пример "разнесения" исходных текстов по разным директориям # source_dirs := . Editor TextLine search_wildcards := $(addsuffix /*.cpp,$(source_dirs)) iEdit: $(notdir $(patsubst %.cpp,%.o,$(wildcard $(search_wildcards)))) gcc $^ -o $@ VPATH := $(source_dirs) %.o: %.cpp gcc -c -MD $(addprefix -I,$(source_dirs)) $< include $(wildcard *.d)

      По сравнению с предыдущим вариантом make-файла он претерпел следующие изменения:

      • Для хранения списка директорий с исходными текстами я завел отдельную переменную source_dirs, поскольку этот список понадобится указывать в нескольких местах.
      • Шаблон поиска для функции wildcard (переменная search_wildcards) строится "динамически" исходя из списка директорий source_dirs
      • Используется переменная VPATH для того, чтобы шаблонное правило могло искать файлы исходных текстов в указанном списке директорий
      • Компилятору разрешается искать заголовочные файлы во всех директориях с исходными текстами. Для этого используется функция addprefix и флажок -I компилятора GCC.
      • При формировании списка объектных файлов, из имен исходных файлов "убирается" имя каталога, где они расположены (с помощью функции notdir)



      Содержание раздела