Да, я уже некоторое время использую LightSwitch & amp; Есть несколько разработчиков, которые действительно продвигают то, что может LS, к его пределам.
Хотя он был задуман как «ведомственный» инструмент приложения, ряд профессиональных разработчиков (таких как я) признали, что он может быть очень полезным инструментом в нашем наборе инструментов разработки.
Подходит для каждой сложной ситуации? Не обязательно, но часто это скорее вопрос привыкания делать что-то «LightSwitch», а не то, как мы это делали в прошлом.
Если вам нужна дополнительная информация, есть довольно активный форум MSDN, посвященный LS (в настоящее время бета-версия 2)
http://social.msdn.microsoft.com/Forums/en/lightswitchgeneral / темы
Янн
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
Я бы посмотрел в руководстве 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
Спасибо за подсказки - после некоторого взлома я думаю, что это больше то, на что я надеялся:
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 ; \
)
Кто-нибудь может сделать лучше?
Вы можете использовать правила по умолчанию для набора файлов с тем же расширением, что и для компиляции каждого файла 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 $<
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...
Вы делаете это в обратном порядке.
Вы пытаетесь относиться к make как к сценарию. Это не так, это набор правил о том, как создать X с учетом Y. Затем движок make выясняет, что должно произойти, чтобы получить этот результат.
В приведенном примере вам действительно следует использовать сценарий для генерации шаги. Возможно, вызовет это из make, но пусть make обрабатывает CC.