3

私が取り組んでいるプロジェクトは、ルート Makefile を含む 1 つのフォルダーと、それぞれが独自の Makefile を含むサブフォルダーである多くのサブプロジェクトに編成されています。

ルートの Makefile は、各サブディレクトリに対して make を呼び出します (make -Cコマンド)。オブジェクト ファイルは、ソース ファイルと同じレベルで生成されます。

オブジェクト ファイルの生成 (および取得) を指定された build_dir にリダイレクトするルートの make コマンドを注文したいと思います。これを行う簡単な方法はありますか?(すべてのサブプロジェクトのすべての Makefile を変更する代わりに)。

4

3 に答える 3

2

ハックのようなものですが、コンパイラ ラッパーとvpath.

私たちが持っているとしましょうfoo.c

#include <stdio.h>

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

bar.c:

int bar() {
    return 1;
}

vpath %.o objMakefile の中に置くと、オブジェクト ファイルのディレクトリmake内を調べるように指示されます。ただし、オブジェクト ファイルをディレクトリobj/に書き込むようにコンパイラに指示する必要があります。にはそのようなオプションはありませんが、 を使用する必要はありません。変更されたコマンド ラインで呼び出す独自のコンパイラ ラッパーを作成できます。obj/gccgccgcc

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 などのわかりやすい言語でスクリプトを書き直す必要があるかもしれませんが、これで作業を開始できます。

于 2012-11-22T18:12:13.217 に答える
1

すべての Makefile を変更できないようにする解決策はありません。

Makefiles とmakeは魔法ではありません。Makefileには、各ソース ファイルのコンパイルに使用されるコマンド ラインが含まれています。したがって、指定したディレクトリにすべてのオブジェクト ファイルを生成できるようにするには、オブジェクト ファイルの配置場所を示すオプションを追加して、このコマンド ラインを変更するために every を変更する必要がありMakefileます。

于 2012-11-22T10:45:29.410 に答える
0

に似たフォールバックターゲットのようなものを意味しますか

%:
    make -C $(dir $@) $(notdir $@)

できるように

make somedir/sometarget

?

于 2012-11-22T10:45:04.637 に答える