2013-06-18 5 views
1

Вместо плоской структуры моего кода в настоящее время я хочу организовать ее в модули, содержащиеся в подпапках (и, возможно, вложенных подпапках, если модули становятся достаточно большими).Какая система сборки сделает это наиболее «естественно»?

Каждый модуль будет иметь один или несколько единиц перевода, каждый из которых будет производить файл .o. Конечной целью было бы вытеснить все эти объектные файлы в статическую библиотеку (пока).

Я использую простой «make», и он уже достаточно сложный.
Есть ли система, в которой указанная модель приходит естественным образом или с гораздо меньшими усилиями по сравнению с написанием файлов make-файлов вручную? (Если вы собираетесь рекомендовать cmake, мне нужны некоторые подсказки, как я уже пробовал, и не мог найти подходящее решение.)

+0

В чем проблема с 'make'? –

+0

Громоздкий, и я думаю, невежество с моей стороны. Я не могу найти простой способ сделать это, используя make. – manasij7479

+0

ОК - ответ на вопрос GNU make. Дайте мне знать, если вы хотите получить больше объяснений. Я уверен, что кто-то, кто знает больше о cmake или что-то еще, ответит в конце концов. –

ответ

2

Некоторые парафразные биты из файла моего текущего проекта, которые могут помочь вам с добрым старым старомодным GNU Make:

SOURCEDIR := dir1 dir2/subdir1 dir3 dir4 dir5/subdir1 dir6/subdir1 
SOURCES := $(foreach srcdir,$(SOURCEDIR),$(wildcard $(srcdir)/*.c)) 
OBJECTS := $(patsubst %.c,build/%.o,$(SOURCES)) 
OBJDIRS := $(addprefix build/,$(SOURCEDIR)) 
MAKEDEPS := $(patsubst %.c,build/%.d,$(SOURCES)) 

all: example 

$(OBJDIRS): 
    -mkdir -p [email protected] 

build: $(OBJDIRS) 

build/%.o : %.c | build 
    cc -MMD -c -o [email protected] $< 

example: $(OBJECTS) 
    cc -o [email protected] $(OBJECTS) 

-include $(MAKEDEPS) 

в сущности, он строит все исходные файлы, найденные в указанных каталогах в объектные файлы, расположенные в подкаталогах build каталога в иерархии, который параллелен их расположение исходного каталога (важно, если от нескольких источников файлы имеют одинаковое имя), а затем связывает результаты с исполняемым файлом example.

В качестве бонуса генерируется динамическая зависимость и включение через переменную MAKEDEPS и флаг -MMD.

+0

Спасибо. Этот подстановочный знак - это то, с чем я споткнулся. – manasij7479

+0

В конечном итоге (при необходимости) вам придется изменить его, чтобы использовать рекурсивные make-файлы в папках, но это не должно представлять большой проблемы. – manasij7479

+0

Рекурсивные make-файлы имеют свой собственный набор боли, но в зависимости от того, насколько велик ваш проект, все должно быть в порядке. –

0

Это действительно зависит от ваших целей: сборка пакетов обычно предназначена для аудитории, а не для исполнителя. Часто они принимают во внимание разрозненные среды, в которые люди развертывают. Я играл с «tup», который казался скорее способом создания исполняемого файла как можно быстрее после редактирования. «Premake», похоже, снимается на нескольких платформах, но я обнаружил, что параметры компилятора не более просвещены, чем у Cmake.

Похоже, что вы нашли хорошего наставника Makefile, поэтому я оставлю свои наблюдения.

 Смежные вопросы

  • Нет связанных вопросов^_^