2016-10-17 2 views
-1

У меня есть структура репозитория, где зависимости могут быть либо svn: external'd либо в этом репозитории, либо в суперрепозитории, который имеет svn: external'd this. Внешние уровни находятся только на одном уровне, поэтому, если мое репо экстернализируется суперрепозитарием, тогда мне нужно определить, где найти зависимость на более высоком уровне, и скопировать все соответствующие данные. Если зависимость действительно найдена в моем собственном репозитории, тогда мне нужно ее построить.Итерация каталогов и условий в make-файлах

У меня возникли проблемы с созданием рецепта makefile для этого. Вот что у меня есть до сих пор:

DEPENDENCIES = dep1 dep2 
ROOTDIR = . 

deps : 
    for dep in $(DEPENDENCIES); do \ 
     if [ -e $(ROOTDIR)/ext/$$dep ]; then \ 
      depdir = $(ROOTDIR)/ext/$$dep; \ 
      $(MAKE) -C $depdir; \ 
     elif [ -e $(ROOTDIR)/../$$dep ]; then \ 
      depdir = $(ROOTDIR)/../$$dep; \ 
     else \ 
      $(error Could not find dependency: $$dep) \ 
     fi \ 
     cp $$depdir/bin/* $(ROOTDIR)/bin; \ 
     cp $$depdir/lib/* $(ROOTDIR)/lib; \ 
     cp $$depdir/inc/$$dep $(ROOTDIR)/inc/$$dep; \ 
    done 

Первой проблемой является строка $ (ошибка). Я бы хотел, чтобы у вас была ошибка, но это явно не подчинено утверждениям состояния bash. Это выход:

$ make deps 
makefile:108: *** Could not find dependency: $dep. Stop. 

Если я комментирую что-то заявление, то я до сих пор имеют проблемы

$ make deps 
for dep in dep1 dep2; do \ 
     if [ -e ./ext/$dep ]; then \ 
/bin/sh: -c: line 2: syntax error: unexpected end of file 
make: *** [makefile:106: deps] Error 1 

Может кто-нибудь дать некоторые советы относительно того, как это сделать? Я использую GNU make в обеих средах cygwin и linux.

Редактировать: Я бы предпочел сохранить это как можно ближе (и как мало материала оболочки). Я думаю, что я немного поближе, но все равно нужно повторить это для каждого элемента в $ (ЗАВИСИМОСТИ).

DEPENDENCIES = foo bar 
ROOTDIR = . 
EXTDIR = $(ROOTDIR)/ext 
BINDIR = $(ROOTDIR)/bin 
INCDIR = $(ROOTDIR)/inc 

# Need a foreach DEP in $(DEPENDENCIES) here 
ifneq("$(wildcard $(EXTDIR)/$(DEP))","") 
DEPDIR = $(EXTDIR)/$(DEP) 
BUILDDEP = $(MAKE) -C $(DEPDIR)/build 
else ifneq("$(wildcard $(ROOTDIR)../$(dep))", "") 
DEPDIR = $(ROOTDIR)/../$(dep) 
else 
$(error Could not find dependency: $(DEP)) 
endif 

$(DEPDIR) : 
    $(BUILDDEP) 
    cp $(DEPDIR)/bin/* $(BINDIR) 
    cp $(DEPDIR)/inc/$(DEP)/* $(INCDIR)/$(DEP) 

Edit2: Я думаю, что я все ближе. Следующее выглядит больше похоже на то, что я хочу, но у него все еще есть проблемы: 1) Я не знаю, как назвать каждый рецепт 2) Он не дает ошибку, если он не находит всех зависимостей 3) It не позволяет мне диктовать порядок сборки 4) он не разрешает мне фильтр, чтобы использовать только папки, перечисленные в зависимости (это делает все папки)

ifneq "$(wildcard $(EXTDIR)/%/build)" "" 
$(EXTDIR)/%: 
    $(MAKE) -C $(EXTDIR)/%/build 
    cp $(EXTDIR)/%/bin/* $(BINDIR) 
    cp $(EXTDIR)/%/int/*.a $(INTDIR) 
    cp $(EXTDIR)/%/inc/%/* $(INCDIR)/% 
endif 

ifneq "$(wildcard $(ROOTDIR)/../%/build)" "" 
DEPDIR = $(ROOTDIR)/.. 
$(DEPDIR)/%: 
    cp $(DEPDIR)/%/bin/* $(BINDIR) 
    cp $(DEPDIR)/%/int/*.a $(INTDIR) 
    cp $(DEPDIR)/%/inc/%/* $(INCDIR)/% 
endif 

Edit3 После того, как сказали, что я пытался решить слишком много проблем сразу, я сводил его к этому:

DEPENDENCIES = dep1 dep2 dep3 

for each DEP in $(DEPENDENCIES) 

$(DEP) : 
    $(MAKE) -C ../ext/$(DEP) 

Как создать рецепт ($ (DEP)) для каждого элемента в $ (ЗАВИСИМОСТИ)?

+1

Вы пишете скрипт оболочки, а не Makefile: там нет правил. Включите его в сценарий оболочки! – reinierpost

+0

Вы пытаетесь решить слишком много проблем сразу. Попробуйте сделать это из командной строки (т.е. без Make), и если у вас возникнут проблемы с ее частью, уменьшите эту проблему до ее ядра (например, как я могу сбросить ошибку в bash?), И если вы не можете решить эта проблема, спросите об этом здесь. – Beta

+0

Мне легко сделать это из командной строки. Тем не менее, я бы предпочел использовать make так, чтобы: A) Эта структура может быть обобщена и легко настроена для использования другими разработчиками. B) Я не застрял в g ++ и Linux.Мы также хотели бы разработать в Windows с MinGW, и поэтому Bash не является хорошим языком для меня. – Stewart

ответ

0

Решено. Это решает проблему выше:

DEPENDENCIES = dep1 dep2 dep3 
$(DEPENDENCIES) : 
    $(MAKE) -C ../ext/[email protected] 

Ответ очень прост. Хотелось бы, чтобы я знал достаточно об этом, чтобы задать более разборчивый вопрос.