2016-10-17 4 views
-1

私はリポジトリ構造を持っていますが、このリポジトリまたはsvn:externalを使ってスーパーリポジトリに依存することができます。外部は深いレベルなので、リポジトリがスーパーリポジトリに外部化されている場合、上位レベルで依存関係を見つける場所を検出し、すべての関連データをコピーできるようにする必要があります。依存関係が自分のリポジトリに実際に見つかった場合、それを構築する必要があります。メイクファイルのディレクトリと条件を反復する

これを行うためのメイクファイルレシピを作成する際に問題が発生しています。これまで私がこれまで持っていたことは次のとおりです。

DEPENDENCIES = dep1 dep2 
ROOTDIR = . 

deps : 
    for dep in $(DEPENDENCIES); do \ 
     if [ -e $(ROOTDIR)/ext/$$dep ]; then \ 
      depdir = $(ROOTDIR)/ext/$$dep; \ 
      $(MAKE) -C $depdir; \ 
     elif [ -e $(ROOTDIR)/../$$dep ]; then \ 
      depdir = $(ROOTDIR)/../$$dep; \ 
     else \ 
      $(error Could not find dependency: $$dep) \ 
     fi \ 
     cp $$depdir/bin/* $(ROOTDIR)/bin; \ 
     cp $$depdir/lib/* $(ROOTDIR)/lib; \ 
     cp $$depdir/inc/$$dep $(ROOTDIR)/inc/$$dep; \ 
    done 

最初の問題は$(エラー)です。私はエラーをスローすることができるようにしたいが、これは明らかにbash条件文の対象にはならない。これが出力されます:

$ make deps 
makefile:108: *** Could not find dependency: $dep. Stop. 

私はelse文は、その後、私はまだトラブルに

$ make deps 
for dep in dep1 dep2; do \ 
     if [ -e ./ext/$dep ]; then \ 
/bin/sh: -c: line 2: syntax error: unexpected end of file 
make: *** [makefile:106: deps] Error 1 

を抱えていることをコメントアウトした場合、誰かがこれを実現する方法に関するいくつかのヒントを提供してもらえますか?私はcygwinとlinuxの両方の環境でGNU makeを実行しています。

を編集してください。できるだけ近くに保存することをお勧めします。私は少し近づいたと思いますが、$(DEPENDENCIES)の各項目についてこれを繰り返す必要があります。

DEPENDENCIES = foo bar 
ROOTDIR = . 
EXTDIR = $(ROOTDIR)/ext 
BINDIR = $(ROOTDIR)/bin 
INCDIR = $(ROOTDIR)/inc 

# Need a foreach DEP in $(DEPENDENCIES) here 
ifneq("$(wildcard $(EXTDIR)/$(DEP))","") 
DEPDIR = $(EXTDIR)/$(DEP) 
BUILDDEP = $(MAKE) -C $(DEPDIR)/build 
else ifneq("$(wildcard $(ROOTDIR)../$(dep))", "") 
DEPDIR = $(ROOTDIR)/../$(dep) 
else 
$(error Could not find dependency: $(DEP)) 
endif 

$(DEPDIR) : 
    $(BUILDDEP) 
    cp $(DEPDIR)/bin/* $(BINDIR) 
    cp $(DEPDIR)/inc/$(DEP)/* $(INCDIR)/$(DEP) 

EDIT2: 私は私が近づいていると思います。次のようになりますが、それでも問題はあります: 1)各レシピの呼び出し方法がわかりません 2)すべての依存関係が見つからない場合はエラーが発生しません。 3)Itそれは私が依存関係に記載されているフォルダのみを使用するようにフィルタリングすることはできません)私はビルド順序 4を指示することはできません(それはすべてのフォルダ)を行い言われた後EDIT3が 私がしようとしていた

ifneq "$(wildcard $(EXTDIR)/%/build)" "" 
$(EXTDIR)/%: 
    $(MAKE) -C $(EXTDIR)/%/build 
    cp $(EXTDIR)/%/bin/* $(BINDIR) 
    cp $(EXTDIR)/%/int/*.a $(INTDIR) 
    cp $(EXTDIR)/%/inc/%/* $(INCDIR)/% 
endif 

ifneq "$(wildcard $(ROOTDIR)/../%/build)" "" 
DEPDIR = $(ROOTDIR)/.. 
$(DEPDIR)/%: 
    cp $(DEPDIR)/%/bin/* $(BINDIR) 
    cp $(DEPDIR)/%/int/*.a $(INTDIR) 
    cp $(DEPDIR)/%/inc/%/* $(INCDIR)/% 
endif 

一度に多くの問題を解決するには、私はこれを以下に減らしました:

DEPENDENCIES = dep1 dep2 dep3 

for each DEP in $(DEPENDENCIES) 

$(DEP) : 
    $(MAKE) -C ../ext/$(DEP) 

$(DEPENDENCIES)の各アイテムのレシピ($(DEP))を作成するにはどうすればよいですか?

+1

あなたはMakefileではなくシェルスクリプトを書いています。ルールはありません。それをシェルスクリプトに変換してください! – reinierpost

+0

あなたは同時に多くの問題を解決しようとしています。コマンドラインから(Makeを使わずに)これをやってみてください。その一部に問題がある場合は、その問題をコアに減らしてください(たとえば、bashでエラーをどのように投げますか?)、解決できない場合その問題は、ここでそれについて尋ねる。 – Beta

+0

これはコマンドラインから簡単に実行できます。しかし、私はmakeを使って次のようにしたいと考えています: A)このフレームワークは一般化され、他の開発者が使うように簡単に設定することができます。 B)g ++とLinuxに悩まされていません。私たちはまた、MinGWを使ってWindowsで開発したいので、Bashは私にとって使いやすい言語ではありません。 – Stewart

答えて

0

解決済み。これは上記の問題を解決します:

DEPENDENCIES = dep1 dep2 dep3 
$(DEPENDENCIES) : 
    $(MAKE) -C ../ext/[email protected] 

答えは非常に簡単です。わかりやすい質問をするためにこのことについて十分に知っていればいいと思う。

関連する問題