make:オーバーライド: コマンドが見つかりません

make:オーバーライド: コマンドが見つかりません

make clean私の努力の過程で書くすべての出力がクリーンアップされていることを確認する特定の変数:

clean-lib:
    override ARCH=32
    rm -rf $(NEWLIB)$(LIBNAME).so  $(NEWLIB)$(LIBNAME).a
    override ARCH=64
    rm -rf $(NEWLIB)$(LIBNAME).so  $(NEWLIB)$(LIBNAME).a

LIBNAME次のように構成されます。

ARCH=64
PROJNAME=libWebSightR220
LIBNAME=$(PROJNAME)x$(ARCH)

ユーザーはバージョン32を使用する必要がありますmake lib ARCH=32。変更されたARCH投票コード:

make: override: Command not found

また、makeを更新しようとしましたが、すでに最新です。

XXXXX@debianvirtualbox:~/$ make --version
GNU Make 4.0
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

答え1

これは使用しているmakeのバージョンとは関係ありません。 「target:dependent」行の後に入力したコマンドはシェルを介して実行され、名前付きLinuxコマンドはまったくありませんoverrideoverride内部makeコマンドなので、この場所には表示できません。次のように動作します。

override ARCH=64
all:
    echo $(ARCH)

編集:必要なものを達成する方法(少なくともGNU makeを使用して)は次のとおりです。

all:
    $(eval override ARCH=32)
    echo $(ARCH)
    $(eval override ARCH=64)
    echo $(ARCH)

ところで、この方法で、make ARCH=45両方ともARCH=45 make「32\n64」を出力し、前者がなければoverride「45\n45」を出力し、後者のみ「32\n64」を出力します。

答え2

Makeはビルドレシピラインの変数割り当てを評価しません。これは厳密に言えばシェルコードです。

GNU Makeでは、次のものを使用できます。ターゲットごとの変数の割り当て特定のターゲットを更新するルールの実行中に変数の値を一時的に変更します。これを利用するために、ルールを2つの部分に分けます。

.PHONY: clean-lib-32 clean-lib-64 clean-lib

clean-lib: clean-lib-32 clean-lib-64

# Target-specific assignments
clean-lib-32: ARCH := 32
clean-lib-64: ARCH := 64

clean-lib-32 clean-lib-64:
        rm -rf $(NEWLIB)$(LIBNAME).so  $(NEWLIB)$(LIBNAME).a

これが機能するには、NEWLIB即時変数ではなく遅延変数でなければなりません。言い換えれば:

NEWLIB = whatever$(ARCH)whateverelse

# NOT this:
NEWLIB := whatever$(ARCH)whateverelse

=置き換えられたときに拡張される拡張されていないテキスト(マクロに似ています)を保存するために作成された変数と、後で置き換えられたときに追加の拡張を含まない拡張:=テキストを保存する変数を使用します。もちろん、$(ARCH)ターゲット固有の割り当てが適用されるようにするには、後のステップで代替操作を実行する必要があります。

完全なテストケース:

$ cat Makefile
.PHONY: clean-lib-32 clean-lib-64 clean-lib

NEWLIB = newlib/
LIBNAME = lib-$(ARCH)

clean-lib: clean-lib-32 clean-lib-64

# Target-specific assignments
clean-lib-32: ARCH := 32
clean-lib-64: ARCH := 64

clean-lib-32 clean-lib-64:
        echo rm -rf $(NEWLIB)$(LIBNAME).so  $(NEWLIB)$(LIBNAME).a

特定のターゲットを使用して32ビットライブラリをクリーンアップできます。

$ make clean-lib-32
echo rm -rf newlib/lib-32.so  newlib/lib-32.a
rm -rf newlib/lib-32.so newlib/lib-32.a

64ビットライブラリでも同様です。

$ make clean-lib-64
echo rm -rf newlib/lib-64.so  newlib/lib-64.a
rm -rf newlib/lib-64.so newlib/lib-64.a

共通の目標を使用してclean-lib両方を整理できます。

$ make clean-lib
echo rm -rf newlib/lib-32.so  newlib/lib-32.a
rm -rf newlib/lib-32.so newlib/lib-32.a
echo rm -rf newlib/lib-64.so  newlib/lib-64.a
rm -rf newlib/lib-64.so newlib/lib-64.a

関連情報