web-dev-qa-db-ja.com

makeターゲットから別のターゲットを手動で呼び出す方法は?

次のようなメイクファイルが欲しいです。

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

必要条件のようなものですか?

31

あなたが書いたように、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)を指定する必要があります。

11
bobbogo

注:この回答は、特定のメイクファイル内の異なるターゲットの堅牢な再帰呼び出しの側面に焦点を当てています。

ジャックケリーの役立つ答え を補完するために、ここに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である必要があります。

再帰呼び出し(「サブメイク」)を扱うマニュアルセクションへのリンクは次のとおりです。

57
mklement0

Makeのほとんどのバージョンは、再帰呼び出しに使用できる変数$(MAKE)を設定します。

26
Jack Kelly