Итерация по спискам в Make-файлах?

Да, я уже некоторое время использую LightSwitch & amp; Есть несколько разработчиков, которые действительно продвигают то, что может LS, к его пределам.

Хотя он был задуман как «ведомственный» инструмент приложения, ряд профессиональных разработчиков (таких как я) признали, что он может быть очень полезным инструментом в нашем наборе инструментов разработки.

Подходит для каждой сложной ситуации? Не обязательно, но часто это скорее вопрос привыкания делать что-то «LightSwitch», а не то, как мы это делали в прошлом.

Если вам нужна дополнительная информация, есть довольно активный форум MSDN, посвященный LS (в настоящее время бета-версия 2)

http://social.msdn.microsoft.com/Forums/en/lightswitchgeneral / темы

Янн

11
задан Dylan 10 June 2009 в 20:21
поделиться

6 ответов

Make-файлы по своей сути декларативны, поэтому я не думаю, что make сам предоставляет то, что вы хотите. Однако вы, похоже, хотите связать некоторые строковые значения с конкретными целями, поэтому, возможно, будет интересна функция Целевые значения конкретных переменных программы GNU make. Это выдержка из руководства:

Есть еще одна особенность целевые переменные: когда вы определить целевую переменную, это значение переменной также действует для всех зависимостей этой цели (если эти зависимости не отменяют его с их собственными целевыми значение переменной). Так, например, такой оператор:

prog: CFLAGS = -g

prog: prog.o foo.o bar.o

установит CFLAGS на -g в команда скрипт для проги , но он также будет установите CFLAGS на -g в команде скрипты, создающие prog.o, foo.o, и bar.o, и любые командные скрипты которые создают свои зависимости.

Если вы еще не читали его, руководство GNU make чертовски хорошо.

Редактировать: Чтобы сделать то, о чем вы просили в своем комментарии:

dog: ANIMAL=dog.c BULLY=pull_tail SOUND=bark

используйте:

dog: ANIMAL=dog.c 
dog: BULLY=pull_tail 
dog: SOUND=bark
12
ответ дан 3 December 2019 в 02:41
поделиться

Я бы посмотрел в руководстве GNU Make по foreach . вот несколько случайных фрагментов, которые я использовал в другом проекте ... пример неполный, но, может быть, он даст вам некоторые идеи? Я мог бы почистить это позже, если у меня будет больше времени ...

REMAKE_PROGS:= dog duck cow

XYZs = \
    dog.c  pull_tail bark  \
    duck.c chase     quack \
    cow.c  tip       moo

$(foreach src, $(XYZs), $(eval $MAKE $(src))

$(REMAKE_PROGS):
        @echo "\n# === $@ linking\n"
        $(call compile,$@,$(OBJS_$@),$(CXX),$(MPICXX),$(LDFLAGS) $(LIBS) $(SYSLIBS) $(OTHER_LIB) $(EXTRA_LD_FLAGS))
        @echo "\n# --- $@ compiled\n"

define compile
  @mkdir -p $(dir $(1))
  $(if ${ANNOUNCE},@echo "\n# +++ ${MAKECMDGOALS} compiling\n" $(eval ANNOUNCE=))
  $(call compiler,$(1),NOMPI,$(3),$(4))
  $(eval MY_FLAGS=$(FLAGS_$(1)) $(5))
  $(if $(filter %xlf %xlf90,$(COMPILER_$(1))),$(eval MY_FLAGS:=$(MY_FLAGS:-D%=-WF,-D%)))
  $(strip $(COMPILER_$(1)) $(2) $(MY_FLAGS) -o $(1) )
endef
9
ответ дан 3 December 2019 в 02:41
поделиться

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

XYZs = \
    dog.c:pull_tail:bark  \
    duck.c:chase:quack \
    cow.c:tip:moo

all:
    @- $(foreach XYZ,$(XYZs), \
        $(eval X = $(word 1,$(subst :, ,$(XYZ)))) \
        $(eval Y = $(word 2,$(subst :, ,$(XYZ)))) \
        $(eval Z = $(word 3,$(subst :, ,$(XYZ)))) \
        \
        $(CC) $X -o bully/$Y ; \
        ln bully/$Y sounds/$Z ; \
    )

Кто-нибудь может сделать лучше?

7
ответ дан 3 December 2019 в 02:41
поделиться

Вы можете использовать правила по умолчанию для набора файлов с тем же расширением, что и для компиляции каждого файла c в o . Конечно, вы не ограничены какими-либо специальными расширениями файлов. Для компиляции набора файлов .c вы можете сделать это следующим образом:

OBJS = foo.o bar.o baz.o
OUT = myprog

all: $(OBJS)
        $(SILENT) echo "LD $@"
        $(SILENT) $(CPP) -o $(OUT) $^ $(LDFLAGS)

%.o: %.c
        $(SILENT) echo "CC $<"
        $(SILENT) $(CC) $(CCOPTS) -o $@ -c $<
0
ответ дан 3 December 2019 в 02:41
поделиться

None that I know of, but that is because you're trying to force make to work ans an imperative language, when that is not what it is.

In GNU make you'd probably want to do something like:

pull_tail : SOUND=bark
pull_tail : dog.c 
        $(CC) $< -o $^
        ln $@ $(SOUND)

chase : SOUND=quack
chase : duck.c 
        $(CC) $< -o $^
        ln $@ $(SOUND)

...

Or better yet, redefine the default rule for .c files to handle the linking for you, but the strange structure of your names (the program names don't have a lexical relationship to the source names) makes that hard.

If what you want to be able to rebuild this quickly without an lot of hand editing, you probably want to write a script to regenerate the makefile framgment from data and use the include feature of GNU make...

2
ответ дан 3 December 2019 в 02:41
поделиться

Вы делаете это в обратном порядке.

Вы пытаетесь относиться к make как к сценарию. Это не так, это набор правил о том, как создать X с учетом Y. Затем движок make выясняет, что должно произойти, чтобы получить этот результат.

В приведенном примере вам действительно следует использовать сценарий для генерации шаги. Возможно, вызовет это из make, но пусть make обрабатывает CC.

1
ответ дан 3 December 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: