これを間違ったスタックに投稿した場合は、ご容赦ください。 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を実行しています。
CFLAGS
環境変数が必要です。
例えば:
$ export CFLAGS='-ggdb3'
$ make test
cc -ggdb3 test.c -o test
一般に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.
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
[編集]
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を編集する方が簡単です。
それはあなたが持っている正確な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がある場合(いくつかの異なる名前と呼ばれる場合があります。少なくともmakefile
とMakefile
のマニュアルを確認してください)、マクロ定義とそれが定義するルールが引き継ぎます。 Most makefilesはそうではないので、上記のコマンドで逃げることができます。しかし、保証はありません。通常はINSTALL、READMEまたはいくつかのバリエーション)と呼ばれるファイル、またはmakefile自体の指示を確認します。
そして最後に、いくつかの代替案があります(デフォルトの制御ファイルは、ほとんどmakefile
のバリエーションと呼ばれます)が、make(1)
はほとんど普遍的なものであるため、その使用法はどこかに文書化する必要があります。