2012-11-22 2 views
3

내가하는 프로젝트는 루트 Makefile이있는 하나의 폴더에 구성되어 있으며 각 하위 프로젝트는 자체 메이크 파일을 포함하는 하위 폴더입니다.Makefile 프로젝트를 사용하여 오브젝트 파일 생성을 지정된 디렉토리로 리디렉션하는 ** 간단한 ** 방법이 있습니까?

루트 메이크 파일은 각 서브 디렉토리 (make -C 명령)에 make를 호출합니다. 오브젝트 파일은 소스 파일과 동일한 레벨에서 생성됩니다.

루트 make 명령을 사용하여 개체 파일 생성 (및 검색)을 지정된 build_dir로 리디렉션하고 싶습니다. 이 작업을 수행하는 간단한 방법이 있습니까? (모든 하위 프로젝트의 모든 Makefile을 수정하는 대신).

+0

소스 디렉토리에서 오브젝트 파일을 분리하는 경우에만 문제가 있습니까? – Kamath

+0

@AUZKamath 예. –

+0

루트 메이크 파일에 명령을 입력하여 개체 파일을 빌드 한 후 * 이동 *시킬 수 있습니다. 이것은 해킹이지만 작동 할 것입니다. – Beta

답변

2

일종의 해킹이지만 컴파일러 래퍼와 vpath의 조합으로이 작업을 수행 할 수 있습니다.

우리가 foo.c가 있다고 가정 :

#include <stdio.h> 

int main() { 
    printf("hi there\n"); 
    return 0; 
} 

bar.c : 메이크 내부 vpath %.o obj 퍼팅

int bar() { 
    return 1; 
} 

을 오브젝트 파일에 대한 obj/ 디렉토리 내에보고 make을 말할 것이다. 그러나 컴파일러에게 객체 파일을 obj/ 디렉토리에 쓰도록 지시해야합니다. gcc에는 이러한 옵션이 없지만 gcc을 사용할 필요는 없으며 수정 된 명령 줄을 사용하여 gcc을 호출하는 자체 컴파일러 래퍼를 작성할 수 있습니다.

cc-wrapper :

#!/bin/bash 

OUTDIR=obj 

# 

function push() { 
    # usage: push ARRAYNAME ARG 
    # adds ARG to the end of ARRAY 
    eval $1[\${#$1[@]}]="\$2" 
} 

ARGS=() 
change_dir=false 

mkdir -p "${OUTDIR}" 

for ((i = 1; i <= $#; i++)); do 
     eval arg="\${$i}" 
     if $change_dir; then 
     arg="${OUTDIR}/${arg}" 
     change_dir=false 
     fi 
     if [ -e "${OUTDIR}/${arg}" ]; then 
      arg="${OUTDIR}/${arg}" 
     fi 
     if [ "${arg}" = "-o" ]; then 
     change_dir=true 
     fi 
     push ARGS "${arg}" 
done 

echo gcc "${ARGS[@]}" 
exec gcc "${ARGS[@]}" 

그것은 추한 쉘 스크립트,하지만 그것을하고있어 모든 일부 인수를 수정입니다 : 이전 인수했다 -o는,이의 시작 obj/를 추가하는 경우

  • 현재 인수가 obj/의 파일이면 시작 부분에 obj/을 추가하십시오.

다음으로 gcc을 호출하십시오.

그런 다음 메이크 파일은 다음과 같습니다

CC=./cc-wrapper 

vpath foo obj 
vpath %.o obj 

foo: foo.o bar.o 

clean:: 
    rm -rf foo.o bar.o foo obj 

지금, 모든 객체는 obj/에 가서 make 트랙이 제대로 종속성.

제작 준비를 위해 약간의 튜닝이 필요합니다. 아마 파이썬 같은 이해하기 쉬운 언어로 스크립트를 다시 작성하고 싶을 것입니다. 그러나 이것이 도움이 될 것입니다.

+0

나는 GLOBAL 변수 VPATH와 CXX를 두 가지 더 많이 따랐습니다. CXX는 '-o'g ++ 옵션을 찾고 올바른 경로를 추가하는 내 자신의 scipt를 가리 킵니다. 어쨌든 모두에게 thnx, 지금 그것은 나를 위해 작동합니다. –

0

당신은 그래서 당신은

make somedir/sometarget 

을 할 수

%: 
    make -C $(dir [email protected]) $(notdir [email protected]) 

와 유사한 대체 대상 같은 것을 의미합니까?

+0

죄송하지만 그것이 내가 의미하는 것이 아닙니다. 다시 말해, 나는 다음과 같은 질문을 던졌다. 오브젝트 파일이 생성되는 "대상"디렉토리를 ** 오버라이드 할 수 있는가? 내가 더 명확한 지 모르겠다. –

+0

Makefile을 수정해야하는지 여부는 그 내용에 따라 다릅니다. 컴파일 커맨드에'-o $ targetdir/....'과 같은 것이 있으면'$ targetdir'의 값을 넘겨 줄 수 있습니다. 그렇지 않으면 makefile에서 작업하거나 목적. –

2

모든 Makefile을 수정할 수있는 해결책이 없습니다.

Makefilemake은 마법이 아닙니다. Makefile에는 각 소스 파일을 컴파일하는 데 사용되는 명령 행이 들어 있습니다. 따라서 지정된 디렉토리에있는 모든 오브젝트 파일을 생성하려면 Makefile을 수정하여이 명령 줄을 변경하여 에 대해에 오브젝트 파일을 배치하는 옵션을 추가해야합니다.

관련 문제