-1

メイクファイルを試したところ、No such file or directory, but my directory is right there, というエラーが表示されました。ありがとう。

私のプロジェクト構造:

dev |--- ev
    |--- display
    |--- install ( makefile is here, try to call makefiles in ev and display folder)

私のメイクファイル:

 MODULES :=ev display 
 SRC_DIR   :=$(addprefix ../, $(MODULES))
 BUILD_DIR:=$(addsuffix /build, $(SRC_DIR))
 x:=../ev                               ------> add temporarily just for test, 
                                        ------> the same error if x:=$(HOME)/dev/ev

 INSTALL_DIR:=EX Frameworks Add-ons
 INSTALL_DIR:=$(addprefix $(HOME)/EX/, $(INSTALL_DIR))


 vpath %.cpp %.java $(SRC_DIR)

 .PHONY: all clean

 checkdirs: $(INSTALL_DIR)

 $(INSTALL_DIR):
      @echo "INSTALL DIR"
      @mkdir -p $@ 


 define make-goal
 $1:
      @echo "start building each part"
      cd $@ && make -f Makefile_new.osx clean
      cd $@ && make -f Makefile_new.osx package
 endef


 clean:
     @echo "clean up"

     @echo "BUILD_DIR IS $(BUILD_DIR)"
     @rm -rf $(BUILD_DIR)


   all:
     @echo "start build subdirectory"
     @echo "SRC_DIR IS $(SRC_DIR)"

     @echo "x is $(x)"
     $(call make-goal, $(x)))   ----> when it comes to here, I got error message

エラーメッセージ:

x is ../ev
../x:
make: ../ev:: No such file or directory.

インストールフォルダーからこのmakefileを呼び出すと、インストールフォルダーから$(x)が見つからないため、相対パスについてだと思いますが、ev(Install / ev)という名前のフォルダーを作成しようとすると、まだ取得しました同じエラー。

ここで見逃した基本的なものに違いないと思いますが、それは何ですか。

ありがとう。

アップデート:

複数のサブプロジェクトを含むプロジェクトを構築しようとしています。構造は次のとおりです。

dev |---- ev
    |---- edf
    |----- dt
    |------af 
    |------Install

Install の内部には、最上位にある makefile があります。Install フォルダ内の makefile は、別のサブジェクトをビルドするために他のフォルダ内の makefile を呼び出します。

理想的には、ソースに触れずにすべてのサブ プロジェクトをビルドしたいと考えています。私のソースには、c++ と Java コードが含まれています。

4

1 に答える 1

2

あなたが何をしようとしているのかは明らかではありません。また、いくつかのインデントの問題により、確信は持てませんがmake-goal、make ルールのテンプレートを含む変数を定義し、それをターゲット$(call ...)のレシピ内で使用しているようです。allそれは機能しません: 別の make ルールのレシピ内に make ルールを作成することはできません!

これが失敗する理由は$(call ...)、 がターゲットのレシピに追加されたコンテンツに展開されているallためです。そのため、新しい make ルールを作成する代わりに、結果をシェル スクリプトとして扱っています。最初の行は$1:で、 を渡した../evので、make はエラーが示すとおりにコマンドを実行しようとして../ev:います。

より高いレベルでやりたいことを説明していただければ、それを行う方法についていくつかのアイデアを提供できます。

到着予定時刻:

allターゲットにサブディレクトリも作成させたいだけなら、この複雑な GNU make の高度な機能は必要ありません。そのようなものは、グルレベルのメイクファイルを作成する場合にのみ必要です。単純な「別のターゲットが終了した後にターゲットを構築する」ことは、make が行うように設計された正確なことです。それを行うために特別なことは何も必要ありません。

例えば:

.PHONY: all $(SRC_DIR)
all: $(SRC_DIR)

$(SRC_DIR):
        @echo "start building $@"
        cd $@ && $(MAKE) -f Makefile_new.osx clean
        cd $@ && $(MAKE) -f Makefile_new.osx package

これはまだかなり非標準的な設定ですが、希望どおりに機能すると思います。allターゲットをメイクファイルの最初のターゲットに移動するか、make all明示的に実行する必要があることに注意してください。コマンド ラインで特定のターゲットを指定しない限り、make はメイクファイルの最初のターゲットのみをビルドします。

于 2013-07-16T16:10:20.233 に答える