예를 들어 다음과 같은 파일 트리가 있습니다.
foo/1213.csv
foo/7789.csv
far/8471.csv
far/7811.csv
boo/8109.csv
bar/2778.csv
bar/3334.csv
bar/1337.csv
이제 해당 디렉터리의 모든 파일 에 의존하는 각 디렉터리에 대한 내부 디렉터리를 foo far boo bar
만들고 싶습니다 .qux.json
*.csv
지금까지는 그다지 어렵지 않을 것입니다. 저는 다음과 같은 것이 효과가 있을 것이라고 믿습니다(제가 틀렸다면 정정해 주십시오):
%/qux.json: %/*.csv
my-script.py -o $@ $^
내가 막히는 점은 규칙의 "클래스"가 거의 없고 각 클래스가 다음과 같이 서로 다른 레시피를 가질 때입니다.
CLASS1=foo far
CLASS2=boo bar
$(patsubst %,%/qux.json,$(CLASS1)): $(patsubst %,%/*.csv,$(CLASS1))
my-script1.py -o $@ $^
$(patsubst %,%/qux.json,$(CLASS2)): $(patsubst %,%/*.csv,$(CLASS2))
my-script2.py -o $@ $^
그러나 작업이 make foo/qux.json
실패하고 표시됩니다 make: *** No rule to make target 'far/*.csv', needed by 'foo/qux.json'. Stop.
.
나는 다음과 같은 다양한 것을 시도했습니다.
$(patsubst %,%/qux.json,$(CLASS1)): $(wildcard $(patsubst %/qux.json,%/*.csv,$@))
my-script1.py -o $@ $
주사위가 없습니다.
기본적으로 여러 유형의 하위 디렉터리가 있습니다. 각 멤버를 makefile 변수에 열거할 수 있습니다. 각 하위 디렉터리에는 임의의 수의 입력 csv 파일이 포함되어 있습니다. 각 디렉토리의 모든 csv 파일에서 json 파일을 만들고 싶습니다. 그러나 각 유형의 디렉토리에는 서로 다른 스크립트를 실행해야 합니다.
설명서를 읽어보고 man
, 인터넷에서 검색도 해봤지만, 이는 어떤 검색 결과에도 너무 구체적이어서 매뉴얼을 통해 알아내기가 어려웠습니다.
답변1
이 기능은 항상 나에게 더 명확해 보입니다 %
.
CLASS1=foo far
CLASS2=boo bar
define f
$1/qux.json: $(wildcard $1/*.csv)
$2
endef
$(foreach i, $(CLASS1), $(eval $(call f, $i,my-script1.py -o $$@ $$^)))
$(foreach i, $(CLASS2), $(eval $(call f, $i,my-script2.py -o $$@ $$^)))
하지만진짜, 작성하는 데 시간이 덜 걸립니다.
foo/qux.json: $(wildcard foo/*.csv)
my-script1.py -o $@ $^
boo/qux.json: $(wildcard boo/*.csv)
my-script2.py -o $@ $^
far/qux.json: $(wildcard far/*.csv)
my-script1.py -o $@ $^
bar/qux.json: $(wildcard bar/*.csv)
my-script2.py -o $@ $^