私はリポジトリ構造を持っていますが、このリポジトリまたは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))を作成するにはどうすればよいですか?
あなたはMakefileではなくシェルスクリプトを書いています。ルールはありません。それをシェルスクリプトに変換してください! – reinierpost
あなたは同時に多くの問題を解決しようとしています。コマンドラインから(Makeを使わずに)これをやってみてください。その一部に問題がある場合は、その問題をコアに減らしてください(たとえば、bashでエラーをどのように投げますか?)、解決できない場合その問題は、ここでそれについて尋ねる。 – Beta
これはコマンドラインから簡単に実行できます。しかし、私はmakeを使って次のようにしたいと考えています: A)このフレームワークは一般化され、他の開発者が使うように簡単に設定することができます。 B)g ++とLinuxに悩まされていません。私たちはまた、MinGWを使ってWindowsで開発したいので、Bashは私にとって使いやすい言語ではありません。 – Stewart