The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Выпуск сборочного инструментария qbs 1.4.0, развиваемого про..., opennews (?), 28-Апр-15, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


14. "Выпуск сборочного инструментария qbs 1.4.0, развиваемого про..."  +/
Сообщение от user (??), 29-Апр-15, 12:38 
Кстати, какие сборочные инструменты нормально понимают генерацию сразу нескольких файлов?

Все реализации make в этом месте сделаны через задницу, хотя стандарт не запрещает сделать правильно.

Ответить | Правка | Наверх | Cообщить модератору

16. "Выпуск сборочного инструментария qbs 1.4.0, развиваемого про..."  +/
Сообщение от anon2 (?), 29-Апр-15, 19:50 
> Кстати, какие сборочные инструменты нормально понимают генерацию сразу нескольких файлов?
> Все реализации make в этом месте сделаны через задницу, хотя стандарт не
> запрещает сделать правильно.

реализация генерации сразу нескольких файлов на gnu make:

empty :=
define newline
$(empty)
$(empty)
endef

# processed multi-target rules
MULTI_TARGETS:=

# to count each call of $(MULTI_TARGET)
MULTI_TARGET_NUM:=

# when some tool generates many files, call the tool only once
# $1 - list of generated files
# $2 - prerequisites
# $3 - rule
define MULTI_TARGET_RULE
$1: $2;\
  $$(if $$(filter $(words $(MULTI_TARGET_NUM)),$$(MULTI_TARGETS)),,$$(eval MULTI_TARGETS += $(words \
  $(MULTI_TARGET_NUM)))$$(info generating: $$@)$$(subst $$$$(newline),$$(newline),$(subst \
  $$(newline),$$$$(newline),$3$(foreach x,$1,$$(newline)touch $x))))
MULTI_TARGET_NUM += 1
endef

MULTI_TARGET_SEQ = $(if $(word 2,$1),$(word 2,$1): $(firstword $1)$(newline)$(call MULTI_TARGET_SEQ,$(wordlist 2,999999,$1)))

# NOTE: don't use $@ in rule because it may have different values,
#       don't use $(lastword $^) - tail of list of prerequisites may have different values
MULTI_TARGET_CHECK = $(if $(filter-out $(words x$3x),$(words x$(subst $$@, ,$3)x)),$(info Warning: don't use $$@ in rule:$(newline)$3))$(if \
  $(filter-out $(words x$(strip $3)x),$(words x$(subst $$(lastword $$^), 1 ,$(strip $3))x)),$(info Warning: don't use $$(lastword $$^) in rule:$(newline)$3))

# when some tool generates many files, call the tool only once
# $1 - list of generated files
# $2 - prerequisites
# $3 - rule
MULTI_TARGET = $(MULTI_TARGET_CHECK)$(eval $(MULTI_TARGET_SEQ)$(MULTI_TARGET_RULE))

$(call MULTI_TARGET,a1 a2 a3 a4 a5,dep1 dep2 dep3,echo 1 > a1; echo 2 > a2; echo 3 > a3; echo 4 > a4; echo 5 > a5)

dep1 dep2 dep3:; touch $@

all: a1 a2 a3 a4 a5

clean:; rm -f dep1 dep2 dep3 a1 a2 a3 a4 a5

Проверка:
$ make -f multi.mk -j5

touch dep1
touch dep2
touch dep3
generating: a1
echo 1 > a1; echo 2 > a2; echo 3 > a3; echo 4 > a4; echo 5 > a5
touch a1
touch a2
touch a3
touch a4
touch a5


Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру