2013-06-25 2 views
0

먼저이 문제를 해결할 수있는 방법이 많아서 제목이 매우 일반적입니다. 그러나, 나는 깨끗한과 깔끔한 ​​방법을 찾고 있어요.Makefile : expand dependencies

상황 :
I가 동일한 두 객체 파일 위치 독립적 (-fPIC 컴파일)는 후자의 foo.ofoo-pi.o을 갖는다. 둘 다 foo.hbar.h에 의존합니다.

문제점 :
코드 중복없이 foo*.o에서 bar.h으로 종속성을 선언하려면 어떻게해야합니까?

솔루션 지금까지 :
$(shell bash -c 'echo -ne foo{-pi,}.o'): bar.h
$(addsuffix .o, $(addprefix fo, o-pi o)): bar.h
foo.o foo-pi.o: bar.h

첫 번째 솔루션은 bash를 지원하지 않는 시스템에없는 이식, 두 번째는 내가 알아낼 방법 수 없기 때문에 더러운 솔루션입니다 addprefix에 빈 문자열을 사용하십시오. 세 번째 해결책은 내가 피하고 싶은 foo의 중복 된 언급을 포함합니다.

+2

PIC와 비 PIC 코드를 구별하기 위해 이름 바꾸기를 사용하는 대신 두 가지 유형의 객체를 다른 하위 디렉토리 (예 :'obj /'및'obj.PIC /')에 넣고 이름을 동일하게 두는 것을 고려하십시오. 그건 당신이 쉽게하려고하는 것을 많이 만들 수 있습니다 ... – twalberg

+0

사실,하지만 사양은 그것을 허용하지 않습니다. – Danyel

답변

1

먼저 쉘의 backtick과 같이 쉘 함수가 항상 후행 줄 바꿈을 제거하기 때문에 echo -en을 사용할 필요가 없습니다. 그러나 후행 줄 바꿈을 생략해야하는 경우에도 echo 대신 printf 프로그램을 사용할 수 있습니다. printf은 어디에서나 다른 옵션 인 echo에 전달하는 것보다 훨씬 휴대 성이 높고 안정성이 높습니다.

둘째, 총 addsuffix/addprefix보다는 foreach 함수를 사용할 수 있습니다. 당신이 가지고있는 문제는 당신이 한 단어를 두 단어로 바꾸려고한다는 것인데, 그 기능은 (patsubst와 같은 더 일반적인 것들과 마찬가지로) 그렇게하지 않습니다. 시도 : $(foreach F,foo,$F $F-pi.o): dep.h

셋째, 개인적으로는 노력이 적고 읽기가 쉽기 때문에 개인적으로 작성했습니다.