2017-02-21 39 views
0

У меня есть команда с двумя знаками доллара (вторичное расширение)Вторичное расширение и два Makefiles

$(PREFIX)/bin/gdk-pixbuf-query-loaders > $(shell $(PREFIX)/bin/gdk-pixbuf-query-loaders | awk -F "=" '/LoaderDir/ {print $$2}' | tr -d ' ')/../loaders.cache 

Команда оболочка должна извлечь путь из следующего выхода:

... 
# LoaderDir = /home/redux/x-libs/i686-nptl-linux-gnu/lib/gdk-pixbuf-2.0/2.10.0/loaders 
... 

При запуске сделать то правило расширится до следующей команды:

/home/redux/x-libs/i686-nptl-linux-gnu/bin/gdk-pixbuf-query-loaders > /home/redux/x-libs/i686-nptl-linux-gnu/lib/gdk-pixbuf-2.0/2.10.0/loaders/../loaders.cache 

Это нормально, но если я использую вторую команду Makefile, который запускает первый, то правило расширяется до

/home/redux/x-libs/i686-nptl-linux-gnu/bin/gdk-pixbuf-query-loaders > /../loaders.cache 

и встретилась ошибка:

/bin/sh: 11: cannot create /../loaders.cache: Permission denied 

Команда для запуска первого файла из второго Makefile выглядит следующим образом:

$(MAKE) -f $(makefile_path)/build_libs_for_host.mk .print_and_write_triplets $(RULES) JOBS=$(JOBS) HOST=$(patsubst build_host_%,%,[email protected]) 

И команда (в bash) для запуска второго файла makefile (который запускает первый, который я создал):

time make -f ~/_dev/_pro/second.mk all RULES=build_gdk_pixbuf JOBS=-j4 |& tee ~/log_20170221_x-libs.txt 

Оба make-файла используют .SECONDEXPANSION:. Я не вижу ошибки.

Теперь я застрял. Что случилось с этим расширением?

У GNU make есть некоторые магические правила, и, возможно, мне нужно добавить параметр в строку $(MAKE)?

+0

Рекурсивный дизайн? Звучит забавно". – melpomene

+0

', SECONDEXPANSION' относится только к оценке предпосылок правил; это абсолютно не влияет на содержание рецептов. Учитывая информацию здесь, мы не можем вам помочь, есть еще кое-что, что вы нам не сказали. Я рекомендую запускать отдельные команды и печатать их выходные данные, чтобы узнать, в чем разница. Возможно, одна из переменных, добавленных в командную строку, изменяет поведение gdk-pixbuf-query-loaders.Добавьте '$ (info $ (shell $ (PREFIX)/bin/gdk-pixbuf-query-loaders))' и сравните два способа вызова make. – MadScientist

ответ

0

Я нашел решение. Мое полное правило слишком сложное, поэтому я публикую упрощенный код, чтобы объяснить свое решение.

Во-первых у нас есть правило, которое создает папку и использует $(shell ...) в одной команде:

all: 
    mkdir -p $(PREFIX) && \ 
    cd $(PREFIX) && \ 
    cat $(PREFIX)/../$(INPUT) > $(shell cat $(PREFIX)/../$(INPUT) | awk -F "=" '/LoaderDir/ {print $$2}' | tr -d ' ')/./loaders.cache 
    touch [email protected] 
    @echo [DONE] 

Это может потерпеть неудачу, если папка не была создана ранее. В этом случае $(shell ...) расширится до пустой строки. И команда cat не сработает. Мы видим здесь, что это не проблема расширения. Это проблема времени.

Решение нарушить это правило на две части:

all_pass1: 
    mkdir -p $(PREFIX) && \ 
    touch [email protected] 
    @echo [DONE] 

all_pass2: all_pass1 
    cd $(PREFIX) && \ 
    cat $(PREFIX)/../$(INPUT) > $(shell cat $(PREFIX)/../$(INPUT) | awk -F "=" '/LoaderDir/ {print $$2}' | tr -d ' ')/./loaders.cache 
    touch [email protected] 
    @echo [DONE] 

Хорошо у меня есть решение. Но мне интересно, почему мой первый make-файл работал, а второй, который начал первый сбой. И вот почему я опубликовал эту проблему. Мне все еще кажется, что некоторые GNU делают магию.

Для меня это решительно, но не стесняйтесь комментировать или предлагать лучшее решение, если вы думаете, что есть лучший.

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

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