web-dev-qa-db-ja.com

Make "filename"を実行するときにデフォルトの引数をgccに変更する方法はありますか

これを間違ったスタックに投稿した場合は、ご容赦ください。 Makefileがディレクトリにないファイルに対してmakeを実行するたびに、makeは引き続き機能し、ソースコードをコンパイルしますが、引数のみを使用します:gcc filename.c -o filename

たとえば、make testディレクトリにtest.cを指定すると、次のようになります。gcc test.c -o test

これを変更したいので、Makefileなしでmakeを実行するときはいつでも、代わりにgcc -ggdb -std=c99 -Wall -Werror -o filename filename.c -lcs50 -lm

また、この変更は永続的であり、ディレクトリを再起動または変更しても変更されません。

私は現在、AMD 64ビットプロセッサでCrunchbang Weezyを実行しています。

6
Anfernee

CFLAGS環境変数が必要です。

例えば:

$ export CFLAGS='-ggdb3'
$ make test
cc -ggdb3    test.c   -o test
4
Patrick

一般にmake testと入力すると、Makefileがない場合、makeツールはVanillaコンパイルコマンドを使用しようとします。

次のtest.cがあるとします。

$ cat test.c 
#include <stdio.h>
int main()
{
    printf( "I am alive!  Beware.\n" );
    return 0;
}

Makefileなしでmake testを実行すると、次のような動作になります。

$ make test
cc     test.c   -o test

注:以降の実行では次の結果になります:

$ make test
make: `test' is up to date.

テスト実行:

$ ./test 
I am alive!  Beware.

Make testと入力している場合は、どこかにMakefileが必要です。 Makefileがないディレクトリでそのコマンドを実行すると、次のようになります。

$ make test
make: *** No rule to make target `test'.  Stop.

CFLAGSの使用

makeのデフォルトのコマンドラインオプションを上書きしたい場合は、次のようにすることができます:

$ export CFLAGS="-ggdb -std=c99 -Wall -Werror -lcs50 -lm"

makeを実行すると、次のようになります。

$ make test
cc -ggdb -std=c99 -Wall -Werror -lcs50 -lm    test.c   -o test

参考文献

3
slm

[編集]

GNUのmanページから:

-fオプションが存在しない場合、makeはmakefileをGNUmakefile、makefile、およびMakefileの順に検索します。

引数を渡すことは、たとえばCFLAGSなどの変数がMakefileで定義されている場合にのみ可能です。

CC=gcc
CFLAGS=-g -O -Wall -Werror

all: foo

foo: foo.o
    $(CC) $(CFLAGS) $<

ここでは、変数をオーバーライドすることができます

$ make CFLAGS="-ggdb -std=c99 -Wall -Werror"
gcc -ggdb -std=c99 -Wall -Werror   -c -o foo.o foo.c
gcc -ggdb -std=c99 -Wall -Werror foo.o

ただし、Makefileを編集する方が簡単です。

1
user55518

それはあなたが持っている正確なmake(1)と使用されているmakefileに依存します。

たとえば、GNU makeは、デフォルトのルールとマクロのセットを理解しやすくします。つまり、マクロCCはCコンパイラの名前、CXXはC++の名前、CFLAGSはCCのフラグ、CXXFLAGSはCXX。

また、多数のデフォルトルールも定義しています。つまり、$(CC) $(CFLAGS) -c foo.cを呼び出してfoo.oからfoo.cを作成し、$(CC) $(CFLAGS) -o foo foo.oを実行してfoo.oから実行可能なfooを作成します。繰り返しになりますが、makeの他のバージョンでは、他のデフォルトのマクロとルールが定義されている場合があります(ただし、CCとCFLAGSは普遍的なようです)。

no makefileがある場合、GNU makeは上記のルールを使用します。たとえば、次のようにtst.cからtstを作成して、マクロをオーバーライドできます。

make CC=clang CFLAGS='-O2 -g -Wall' tst

私の頭の上では、他の人がどのように反応するのかわかりません。makefileがないときに他の人がエラーを出しているのを覚えているようです。

Makefileがある場合(いくつかの異なる名前と呼ばれる場合があります。少なくともmakefileMakefileのマニュアルを確認してください)、マクロ定義とそれが定義するルールが引き継ぎます。 Most makefilesはそうではないので、上記のコマンドで逃げることができます。しかし、保証はありません。通常はINSTALL、READMEまたはいくつかのバリエーション)と呼ばれるファイル、またはmakefile自体の指示を確認します。

そして最後に、いくつかの代替案があります(デフォルトの制御ファイルは、ほとんどmakefileのバリエーションと呼ばれます)が、make(1)はほとんど普遍的なものであるため、その使用法はどこかに文書化する必要があります。

0
vonbrand