2017-12-14 25 views
2

모든 폴더의 내용을 종속성으로 갖고 싶습니다. 규칙이 호출되면 내 폴더가 만들어집니다.폴더의 내용이 메이크 파일 규칙 종속성

create-content: 
mkdir -p sample_dir/subdir1 
touch sample_dir/file1 
touch sample_dir/subdir1/file2 

list-content: create-content $(shell find sample_dir) 
echo $^ 

나는이 출력을 싶습니다

make list-content 
create-content sample_dir sample_dir/file1 sample_dir/subdir1 sample_dir/subdir1/file2 

그러나 나는이 :

make list-content 
create-content 

문제는 규칙이 실행 중일 때 shell 기능 make하지 호출된다는 것이다. create-content 전에 shell이 호출되므로 디렉토리가 아직 존재하지 않습니다. 이것을 해결할 수 있습니까?

감사합니다.

+0

$ 대신 $를 사용하면 나중에 평가할 수 있지만 필자는이 순간을 직접 테스트 할 수 없다는 것을 기억합니다. – FrankM

+0

아니요. 'SECONDEXPANSION : '을 (를) 이미 시도했지만 작동하지 않습니다 ... – jquilez

+0

빈 규칙에 대해 자세히 알아보기 -> list-content : create-content list-content-impl 두 번째 확장을 완료해야합니다. 콘텐츠를 만든 후에는 생각합니다. – FrankM

답변

1

대답은 아니오 ... 예.

아니요, make는 첫 번째 레서피를 실행하기 전에 모든 종속성 그래프를 빌드하기 때문에 그렇게 할 수 없습니다. 따라서, 만약 레시피가 의존성 그래프의 새로운 노드를 생성한다면, make가 알아 차리기에는 너무 늦다.

그러나 간단한 해결 방법이 있습니다. make를 호출하여 make (재귀 적 make)를 호출하십시오. 많은 사람들이 말하는 것에도 불구하고 재귀 적 make가 항상 해로운 것은 아닙니다. 그것은 때로는 특정 문제에 대한 유일한 해결책이기도합니다. 이것은 귀하의 경우입니다. 그리고 메이크업 매직 (조건문)의 비트와 함께 두 개의 서로 다른 행동이 sample_dir의 존재에 따라 이것을 숨길 수 :

create-content: 
    @mkdir -p sample_dir/subdir1 && \ 
    touch sample_dir/file1 && \ 
    touch sample_dir/subdir1/file2 

ifeq ($(wildcard sample_dir),) 
list-content: create-content 
    @$(MAKE) --no-print-directory [email protected] 
else 
list-content: create-content $(shell find sample_dir) 
    @echo $^ 
endif 

지금, list-content의 전제 조건이 완료됩니다. 데모 :

$ rm -rf sample_dir 
$ make list-content 
create-content sample_dir sample_dir/file1 sample_dir/subdir1 sample_dir/subdir1/file2 
$ make list-content 
create-content sample_dir sample_dir/file1 sample_dir/subdir1 sample_dir/subdir1/file2 
+0

좋아, 이건 가능하다면, 알고 싶었어! 트릭을 가져 주셔서 감사합니다! – jquilez