ハックのようなものですが、コンパイラ ラッパーとvpath
.
私たちが持っているとしましょうfoo.c
:
#include <stdio.h>
int main() {
printf("hi there\n");
return 0;
}
とbar.c
:
int bar() {
return 1;
}
vpath %.o obj
Makefile の中に置くと、オブジェクト ファイルのディレクトリmake
内を調べるように指示されます。ただし、オブジェクト ファイルをディレクトリobj/
に書き込むようにコンパイラに指示する必要があります。にはそのようなオプションはありませんが、 を使用する必要はありません。変更されたコマンド ラインで呼び出す独自のコンパイラ ラッパーを作成できます。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
ます。
次に、Makefile は次のとおりです。
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
。
これを本番環境で使用できるようにするには、多少の調整が必要です。Python などのわかりやすい言語でスクリプトを書き直す必要があるかもしれませんが、これで作業を開始できます。