2016-07-31 3 views
0

나는이 타겟을 가지고있다. 그것의 의도는 소스뿐만 아니라 출력 디렉토리에 의존하는 것이다. 나는 파일 이름을 자르고 디렉토리에게 그것의를 떠나 this을 사용디렉토리에 따라 타겟을 변경하는 변수들

build/%.o: src/%.cpp build/${%%/*}/ 
     $(CC) $(CFLAGS) -o [email protected] $^ 

을 다음 디렉토리 대상합니다. 그것은 단지 끝나는 있도록

%/: 
     mkdir -p [email protected] 

문제는, ${%%/*}가 교체되지 않는 dir을 build/folder/folder/ 대신 build//으로 만듭니다.

+0

'$ {varname %% glob} '구문은 GNU make가 아닌 셸일뿐입니다. 그렇다면 패턴 규칙에서 작동 할 수 없습니다. – Jens

+0

@Jens 그것이 작동되도록하는 방법을 찾아야합니다. –

답변

2
.SECONDEXPANSION: 

build/%.o: src/%.c | $$(dir [email protected])/.dirstamp 
    echo [email protected] 

%/.dirstamp: 
    mkdir -p $(@D) 
    touch [email protected] 

해야합니다.

참고 :

  • 사용 |을; 단지 존재의 문제는, 디렉토리 스탬프가 .dirstamp를 사용
  • 최신 버전 인 여부를

당신은 .dirstamp.SECONDARY로 표시 할 수 있습니다 더 신뢰할 수있다. 불행히도 gnumake은 와일드 카드를 지원하지 않으므로 모두를 열거하거나 모든 타겟을 다음과 같이 처리해야합니다. .SECONDARY

+0

정말로'.dirstamp'가 필요 없습니다. '/ .'만으로도 충분합니다 ('$$ (dir $$ @) /.'및'% /.') – MadScientist

+0

'.SECONDARY'가 사용되지 않을 때 필요합니다. 그렇지 않으면, make는 디렉토리에서 실패한'rm build/dir'을 시도 할 수 있습니다. – ensc

+0

참. 디렉토리를 makefile의 어디에서나 타겟으로 언급하면이를 해결할 수 있습니다. 예 : 'makedirs : somedir /'와 같은 새로운 가짜 규칙. anotherdir/.' 등 – MadScientist

관련 문제