2017-11-17 6 views
0

나는 메이크 내부의 목표 중 하나의 전략으로 보입니다 내부의 일부 파일을 검색하고 복사하는 루프 중첩을 사용하려고 작동하지에 대한 중첩 :루프 메이크

DIR = $(DIR_A) $(DIR_B) 

install: 
     for dirs in $(DIR); do \ 
     for file in $(shell find $(dirs) -type f -and -not -path "*/.svn*" | sed -e "s|$(dirs)||"); do \ 
     folder=$${file%/*}; \ 
      $(INSTALL) -d $(DEST_DIR)$$folder/log; \ 
      $(INSTALL) $(dirs)/$$file $(DEST_DIR)$$folder/log; \ 
     done \ 
     done 

그러나 $ (DIRS) 변수 두 번째 for 루프에서 항상 비어있는 것으로 평가되고 현재 작업 디렉토리는 $ (DIR)의 첫 번째 디렉토리 경로 대신 "찾기"로 전달됩니다.

누군가가 누락 된 경우 제안 할 수 있습니까?

감사합니다.

답변

1

find 명령의 $(dirs)은 make 변수 dirs에 대한 make에 의해 확장되어 비어있는 문자열입니다. 쉘 변수를 참조하려면, 당신은 $ 탈출해야합니다

for file in $$(find $${dirs} -type f -and \ 
     -not -path "*/.svn*" | sed -e "s|$${dirs}||"); do 

을하지만,이 작업을 수행하지 않습니다. 설치하려는 파일을 명시 적으로 나열하는 것이 훨씬 깔끔합니다. 많은 경우 Makefile을 생성하는 스크립트를 작성하는 것이 좋습니다. 당신이하고있는 일은 허약 한 혼란입니다.

+0

나는 첫 번째 for 루프 바로 다음에 "dirs"의 값을 반향 추가하려고 시도했다. 하지만 비어있는 것으로 평가됩니다 : – sbunny

+0

'$ (dir)'을 쉘 변수 참조로 사용할 수 없습니다 : 쉘 변수는 괄호를 사용할 수 없습니다. 그것은'$ dir' 또는'$ {dir}'중 하나 여야합니다. make 명령에서'$$ dir' 또는'$$ {dir} '이어야합니다. '$ (dirs)'에 맞음. – MadScientist

+0

@MadScientist 네, 물론입니다. 그 점을 지적 해 주셔서 감사합니다! –

0

당신은 몇 가지 오류를 만들었습니다, 당신은 거의 불가능 리터로를 해결하기 위해 찾을 것이다 사연을 당신이 한 번에 모든 것을 해결하려는 주장한다.

단계적으로 시도해 보겠습니다. DIR_ADIR_Bnorthsouth이라고 가정합니다. 명령 줄에서이 작업을 시도하는 경우 : 당신이 메이크 규칙으로 그것을하려고하면

north 
south 

:

for dirs in north south; do echo $dirs; done 

가 올바른 출력을 얻을 것이다 다시

install: 
    for dirs in $(DIR); do echo $$dirs; done 

, 그것을 올바르게 작동합니다.

당신이 당신의 메이크 조리법을 시도하는 경우 :

install: 
    for dirs in $(DIR); do \ for file in $(shell ls $$dirs); do \ echo "file is $$file"; \ done \ done 

만들기가 dirs 아직 값이 할당되지 않은 경우, 쉘에 전체 for 명령을 전달하기 전에 $(shell ...) 명령을 확장 있기 때문에, 실패합니다. 감각적 인 쉘 명령을 구성하는 한 가지 방법은 백틱을 사용하는 것입니다.

for dirs in north south; do for file in `ls $dirs`; do echo "file is $file"; done done 

이 방법은 명령 행에서 작동합니다. 주변에 빌드 된 메이크 파일 규칙 :

install: 
    for dirs in $(DIR); do for file in `ls $$dirs`; do echo "file is $$file"; done done 

도 작동합니다.

이렇게하면 메이크 파일을 다시 작성할 수 있습니다.