2009-08-23 13 views
0

私はprojectというディレクトリを持っています。トップレベルのディレクトリにあるMakefileの問題、サブディレクトリのソース

clientserverという2つのサブディレクトリと、Makefileというメイクファイルがあります。

clientおよびserverにはそれぞれclient.cおよびserver.cというソースファイルがあります。

私は、そのディレクトリに属する​​ソースのサブディレクトリに別個のメイクファイルを持っていません。すべてのビルドは単一のmakefileで行います。 Makefileコードは、今、私はmake cntを実行し、それが問題はそれ以降のすべてのmake cntのコマンドは、私が変更していないよにもかかわらず、再びそれをコンパイルし、上記のテキストを出力して終了です

cc -W -Wall -g -pthread ./client/client.c -o ./client/client.out 

を答えた

FLAGS = -W -Wall -g -pthread 

SERV =./server/server.c  #My server code 
CLI =./client/client.c  #My client code 

build:svr cnt 

svr: $(SERV) 
    cc $(FLAGS) $(SERV) -o ./server/server.out 
cnt: $(CLI) 
    cc $(FLAGS) $(CLI) -o ./client/client.out 

です./client/client.c

私はここにいます。何をすべきかわからない。私が何をしたいか

は次のとおりです。make cnt

  • make svrclient/ディレクトリ
  • client/client.cと出力にその実行可能ファイルをコンパイルし、server/ディレクトリ内server/server.cと出力にその実行可能ファイルをコンパイルします。
  • そしてmake, compile bothサーバー/ server.c andクライアント/ client.c`と出力とのそれぞれのディレクトリでの実行ファイル

しかし、私はsvrと呼ばれる任意の実行可能ファイルを持っていると `私は問題をCNTないので持つことは解決されない。

私は./client/client.out代わりのcntにターゲットを変更してmake client/client.outを呼び出した場合、それは私が必要とするまさに、大丈夫だと思うが、私は私の端末で長いコマンドmake client/client.outを入力する必要はありません

私が持っている回避策次のようになります。

cnt: $(CLI) 
     cc $(FLAGS) $(CLI) -o cnt 
     cp cnt ./client/client.out 

しかし、それにはあまり満足していません。私がやりたいことは本当にシンプルで、それを実行するのに便利な方法があるはずです。だから私はどうすればいいのですか?

答えて

2

あなたが望むものを策定しましょう。 `cnt 'という名前のターゲットが再構築されないようにしたい。あなたが書いたメークファイルは、ルール内のシェルコマンドでのみ表示されるため、client.outファイルについては何も知らない。 makeプログラムはシェルコマンドから情報を読み取ることはありません。そこでは置換が行われて実行されます。

makefileが再構築するターゲットを選択すると( `cnt 'はこれらのターゲットの1つです)、ターゲットファイルの更新時間とその前提条件の更新時間を比較します。`` make cnt ''を実行した時点でという名前のファイルがありません、soという名前のターゲットは更新が必要とみなされます。コマンドが実行され、という名前のファイル(cnt)が生成されないため、次のmake runは更新のためにそれを考慮します。

解決策は2つあります。最初の方法は、ルールコマンドが生成するファイルと同じ名前のターゲットを与えることです。したがって、あなたはこのようになるかもしれません:

client/client.out: $(CLI) 
    cc $(FLAGS) $(CLI) -o ./client/client.out 

あなたのquestioinは、ディレクトリとはまったく関係ありません。 .PHONY指令についても読んで、ccの代わりに$(CC)を使用し、gnu make manualを読んでください。これは非常に役に立つかもしれません。

+0

ありがとうございます。 – nagre

0

ことは、これを試してみてください:

 
SERVO =./server/server.out 
CLIO =./client/client.out 

.PHONY: srv cnt build 
build: svr cnt 
svr: $(SERVO) 
cnt: $(CLIO) 

$(SERVO) $(CLIO): %.out : %.c 
    cc $(FLAGS) $^ -o [email protected] 

今、あなたはSRVを作ることができ、はCNT、または単にを行います。
少し洗練されたことがありますが、これで十分です。

+0

私はそれに従うことができません。私はメイクファイルを作成するのに多くの経験を持っていないので、あとでマニュアルを読むと思います。今すぐ私はクライアントのディレクトリにcntをコピーするつもりです。ありがとう – nagre

+0

しかし、本当に必要かどうか、毎回client.outをリメイクします。 – Beta

関連する問題