2017-02-21 16 views
0

나는 쉘 명령은 다음과 같은 출력의 경로를 추출한다차 확장과 두 메이크는

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

이 개 달러 기호 (보조 확장)으로 명령을 다음 규칙으로 확장됩니다.

/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 

그래도 괜찮습니다.하지만 두 번째로 사용하면 다음과

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

명령 번째 메이크로부터 제 메이크 시작 : 처음 시작 메이크 다음 규칙

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

로 확장되고 오류가 occures

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

두 번째 메이크 파일 (내가 만든 첫 번째 파일을 시작하는 명령) (bash)은 다음과 같습니다.

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

두 메이크 파일 모두 .SECONDEXPANSION:을 사용합니다. 나는 실수를 볼 수 없다.

이제 막혔습니다. 이 확장 프로그램의 문제점은 무엇입니까?

GNU make에는 몇 가지 마법 규칙이 있으며 어쩌면 $(MAKE) 행에 매개 변수를 추가해야합니까?

+0

재귀 적으로? "재미"처럼 들립니다. – melpomene

+0

', SECONDEXPANSION'은 규칙의 전제 조건 평가에만 관련됩니다. 그것은 조리법의 내용에 절대적으로 아무런 영향을 미치지 않습니다. 여기에 우리가 당신을 도울 수없는 정보가 주어지면, 당신이 우리에게 말하지 않은 다른 것이 있습니다. 개별 명령을 실행하고 출력을 인쇄하여 차이점을 확인하는 것이 좋습니다. 아마도 명령 행에 추가 한 변수 중 하나가 gdk-pixbuf-query-loaders 동작을 변경하는 것입니다.$ (info $ (shell $ (PREFIX)/bin/gdk-pixbuf-query-loaders))'를 추가하고 make를 호출하는 두 가지 방법을 비교하십시오. – MadScientist

답변

0

해결책을 찾았습니다. 내 전체 규칙은 너무 복잡하므로 내 솔루션을 설명하는 간단한 코드를 게시합니다. 폴더가 이전에 작성되지 않은 경우,

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 ...)을 폴더를 생성하고 사용하는 규칙을 가지고있다. 이 경우 $(shell ...)은 빈 문자열로 확장됩니다. 그리고 고양이 명령은 실패합니다. 우리는 이것이 확장 문제가 아니라는 것을 여기서 알 수 있습니다. 그것은 타이밍 문제입니다.

이 솔루션은 두 부분으로이 규칙을 파괴하는 것입니다

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] 

좋아, 나는 해결책을 가지고 있습니다. 그러나 왜 내 첫 메이크 파일이 작동하고 첫 번째 메이크 파일을 시작한 두 번째 메이크 파일이 실패했는지 궁금합니다. 이것이 제가이 문제를 게시 한 이유입니다. 그래도 GNU make 마술을 좋아하는 것 같습니다.

제게는 해결되었지만 더 나은 해결책이 있다고 생각되면 의견을 말하거나 더 나은 해결책을 제시하십시오.