2016-08-25 3 views
0

문서를 올바르게 작성했다는 것을 이해하면 목표 패턴에 % 문자를 한 번만 사용할 수 있습니다! 같은패턴 규칙에 여러 %가있는 Gnu make?

내 모습 내 목표는 조건을 직면하고있다 : 나는 /home/ecc_map_1st_map.gff: map.fpp 만들기와 일치하는 것을 시도하고있다

$(Home)/ecc_%_1st_%.gff: %.fpp

그리고 때마다하는 것은 그 패턴을 찾을 수 없습니다 뿌려줍니다.

나는이 때문에 두 번 (완벽 $(Home)/ecc_map_1st_%.gff: %.fpp 룬)

내가 하나 개의 대상 두 %를 사용할 수있는 어쨌든 거기를 %를 사용하는 것을 알고!?

감사

+2

파일 이름에'map'을 두 번 사용해야 할 필요가 있습니까? – igagis

답변

0

를 두 패턴을 가질 수 없습니다. 가장 좋은 방법은 대상 이름에 map을 두 번 사용하지 않는 것입니다.

.SECONDEXPANSION: 
$(Home)/ecc_%.gff: $$(word 1,$$(subst _, ,$$*)).fpp 

일반적으로 당신이 automatic variables 같은 전제 조건에 $*로를 사용할 수 없지만 보조 확장은 그냥 것을 수행 할 수 있습니다

당신이해야하는 경우, 당신은 GNU가 만들어 사용하고, secondary expansion 유용 할 수 있습니다 . $ 대신 $$을 사용 했으므로 첫 번째 패스가 아닌 두 번째 패스에서 실제 확장이 수행됩니다.

$(Home)/ecc_map_1st_map.gff이라고 말하면됩니다. $* 변수가 줄기가됩니다 (예 : map_1st_map). 그런 다음 $(subst _, ,...)은 공백으로 밑줄을 바꿔 map 1st map을 얻습니다. 이제 $(word N,...)은 거기에서 N 번째로 공백으로 구분 된 단어를 추출합니다. 첫 번째 단어는 첫 번째 map이고 두 번째 단어는 1st이고 두 번째 단어는 두 번째 map입니다. 나는 첫 번째 것을 고르고있다.

물론 이것은 매우 안절부절하고 원하는 대상과 정확하게 일치한다는 것을 보장하지 않습니다 ($(Home)/ecc_map_2nd_notmap__foo.gff은 일치하고 map.fpp). 당신은 더 검사를 할 수있는 (중간에 1st을, 다른 두 일치해야 함)과 구제 :

extract-name = $(call extract-name-helper,$1,$(word 1,$(subst _, ,$1))) 
extract-name-helper = $(if $(filter $2_1st_$2,$1),$2,$(error Invalid .gff target)) 

.SECONDEXPANSION: 
ecc_%.gff: $$(call extract-name,$$*).fpp 

을하지만 그것은 합리적인 해결책처럼 보이지 않는다.

마무리하면 비슷한 이름의 파일이없는 경우 첫 번째 해결 방법이 효과적입니다. 또한 대상 이름을 미리 아는 경우 명시적인 패턴 규칙을 사용하여 대상 이름을 더 안전하게 만들 수 있습니다 (또는 심지어 on the fly 생성).