일종의 해킹이지만 컴파일러 래퍼와 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
트랙이 제대로 종속성.
제작 준비를 위해 약간의 튜닝이 필요합니다. 아마 파이썬 같은 이해하기 쉬운 언어로 스크립트를 다시 작성하고 싶을 것입니다. 그러나 이것이 도움이 될 것입니다.
소스 디렉토리에서 오브젝트 파일을 분리하는 경우에만 문제가 있습니까? – Kamath
@AUZKamath 예. –
루트 메이크 파일에 명령을 입력하여 개체 파일을 빌드 한 후 * 이동 *시킬 수 있습니다. 이것은 해킹이지만 작동 할 것입니다. – Beta