2016-10-27 12 views
0

私は1つのファイルをコンパイルするのに使うメイクファイルを持っています。引数を渡す必要があるときは、target = targetFileを使用します。makefile引数をfooなしで使う=

スクリプトは、引数を取り、引数と同じ値を持っており、それをコンパイルしている(同じディレクトリ内)のファイルを探します。

は、私は単一のC++ファイルを使用uhuntとUVAから問題を、コンパイルするためにこれを使用しています。ですから、私は複数のソースファイルに対して複数のmakefileを必要としません。複数のソースファイルのための単一のmakefileは私がmakefileを作った理由です。また、私は、ファイルの拡張子が含まれていない、私はすべての私のソースファイルの拡張子を持つ

ここで私が持っているコードは、これまで

OBJS = $(target).o 
CC = g++ 
CFLAGS = -Wall -g -std=c++11 
INCLUDE = -I./$(target) 

#default command to run 
all : Main-$(target) clean run 

#compile and build 
Main-$(target) : $(OBJS) 
    $(CC) $(CFLAGS) $^ -o [email protected] 
%.o : %.cpp 
    $(CC) -c $(CFLAGS) $< 

#remove object and any other garbage files. 
clean: 
    rm -rf -d $(target).o *~ *% *# .#* 

#remove the compiled file 
clean-all: 
    $(clean) rm Main-$(target) 

#run the compiled file 
run: 
    ./Main-$(target) 

だ私はコンパイルするために使用するコマンドがあり、 make target=sourceFile

をCPPことが私は最後にしたいことはある: make sourceFile

J

make sourceFile clean

make sourceFile clean-all:サイドノート、清潔できれいな-allコマンドを使用するために、私は私が使用できるかどうか、私は好む

make target=sourceFile clean

make target=sourceFile clean-all

を使用UST

+0

おそらく、共通の部分をインクルードできるテンプレートに移動し、必要な特定のターゲットだけを提供する狭いメインメークファイルを持っているかもしれません。 –

答えて

0

共通のMakefile変数MAKECMDGOALSを使用することができますmakeに渡されたすべてのターゲットを保持します。

$(MAKECMDGOALS): 
     $(CC) $(CFLAGS) [email protected] -o [email protected] 

ラインがMAKECMDGOALSに各単語のための個別のビルドターゲットを生成します。ここ

CC = g++ 
CFLAGS = -Wall -g 
MAKECMDGOALS := $(filter-out clean, $(MAKECMDGOALS)) 

.PHONY: $(MAKECMDGOALS) 
$(MAKECMDGOALS): 
     $(CC) $(CFLAGS) [email protected] -o [email protected] 

clean: 
     rm -f *.o 

このバリアントを試してみてください。

注意、我々は「クリーン」なものを取り除くためのターゲットであることを知って、このMakefileを必要はなく、Main-cleanを構築しようとします。このため、フィルタアウト機能を使用してMAKECMDGOALSからcleanを削除しました。

我々はmake a b cleanを実行するのであれば、ビルドシステムが自動的に

+0

コードを少し修正しました。元のコードは、コンパイルされていたファイルのフォルダを作成していました。変更されたコード[Github Gist](https://gist.github.com/Clumsy-Coder/4de8cae3e845728c2d169aaa3e1e429d) –

0

免責をMain-aMain-bを構築して、すでに書かれcleanターゲットを使用するためにターゲットが生成されます - これはメイクの非標準的な使用であるため、オープンしますすべての種類のコーナーケースをアップするので、私はそれをお勧めしません。これはmakeを呼び出すシェルスクリプトに適しています。それは言われて...それは興味深い質問です。

make xxx cleanを実行することはできません。xxxをビルドしようとしません(再帰的なmakeを使用して本当に不快なクルーをしない限り、そこには行かない)。%-cleanが短い茎を持ち、かつmakeターゲットがclean-で始まる場合、そのためには%よりも優先されること

%:Main-% 

Main-%:%.cpp 
    $(CC) $(CFLAGS) $< -o [email protected] 

clean-%: 
    rm Main-$* 

お知らせは次のようにあなたは、しかしmake clean-xxxような何かを行うことができます。

関連する問題