次のようなメイクファイルが欲しいです。
cudaLib :
# Create shared library with nvcc
ocelotLib :
# Create shared library for gpuocelot
build-cuda : cudaLib
make build
build-ocelot : ocelotLib
make build
build :
# build and link with the shared library
つまり*Lib
タスクは、デバイスまたはgpuocelotでそれぞれcudaを直接実行するライブラリを作成します。
両方のビルドタスクについて、同じビルドステップを実行する必要がありますが、ライブラリの作成のみが異なります。
Makeを直接実行する代替方法はありますか?
make build
必要条件のようなものですか?
あなたが書いたように、build
ターゲットは、オセロットまたはcudaビルドを行ったかどうかに応じて異なることをする必要があります。これは、何らかの方法でbuild
をパラメーター化する必要があると言う別の方法です。関連する変数を使用して、個別のビルドターゲット(既に持っているものと同じ)をお勧めします。何かのようなもの:
build-cuda: cudaLib
build-ocelot: ocelotLib
build-cuda build-ocelot:
Shell commands
which invoke ${opts-$@}
コマンドラインでmake build-cuda
(say)と入力します。最初にcudaLib
をビルドしてから、build-cuda
のレシピを実行します。シェルを呼び出す前にマクロを展開します。この場合、$@
はbuild-cuda
であるため、${opts-$@}
は最初に${opts-build-cuda}
に展開されます。 Makeは${opts-build-cuda}
を展開します。メイクファイルの他の場所でopts-build-cuda
(そしてもちろんその姉妹opts-build-ocelot
)を定義します。
追伸build-cuda
et以来al。実際のファイルではないので、make(.PHONY: build-cuda
)を指定する必要があります。
注:この回答は、特定のメイクファイル内の異なるターゲットの堅牢な再帰呼び出しの側面に焦点を当てています。
ジャックケリーの役立つ答え を補完するために、ここにGNU $(MAKE)
toの使用を示すメイクファイルスニペットがあります。 robustly同じmakefileで異なるターゲットを呼び出します(同じmake
バイナリが呼び出され、同じmakefileがターゲットになっていることを確認します)。
_# Determine this makefile's path.
# Be sure to place this BEFORE `include` directives, if any.
THIS_FILE := $(lastword $(MAKEFILE_LIST))
target:
@echo $@ # print target name
@$(MAKE) -f $(THIS_FILE) other-target # invoke other target
other-target:
@echo $@ # print target name
_
出力:
_$ make target
target
other-target
_
$(lastword $(MAKEFILE_LIST))
および_-f ...
_を使用すると、makeが明示的なパス(_-f ...
_)で渡された場合でも、$(MAKE)
コマンドが同じmakefileを使用することが保証されます。元々呼び出された。
注:GNU make
には再帰呼び出しの機能があります-たとえば、変数$(MAKE)
はそれらを有効にするために特別に存在します-呼び出しに焦点がありますsubordinatemakefile。samemakefileで別のターゲットを呼び出すときではありません。
とはいえ、上記の回避策は多少面倒で不明瞭ですが、通常の機能を使用するため、robustである必要があります。
再帰呼び出し(「サブメイク」)を扱うマニュアルセクションへのリンクは次のとおりです。
Makeのほとんどのバージョンは、再帰呼び出しに使用できる変数$(MAKE)
を設定します。