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)

用户预计用于make lib ARCH=3232 版本。我的改变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:dependency”行之后放置的命令是通过 shell 执行的,并且根本没有名为 的 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=45ARCH=45 make都会输出“32\n64”,没有override前者会输出“45\n45”,只有后者会输出“32\n64”。

答案2

Make 不会评估构建配方行中的变量分配;它们是严格的 shell 代码。

在 GNU Make 中,您可以使用特定于目标的变量赋值在执行更新给定目标的规则时临时更改变量的值。为了利用这一点,我们将规则分为两部分:

.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

相关内容