makefile将命令分配给

makefile将命令分配给,makefile,freebsd,Makefile,Freebsd,我可能很愚蠢,但我不能在我的Makefile中完成最基本的变量赋值 TEST = $(pwd); all: echo $(TEST) 当我在FreeBSD(v9.1)中从Bash(v4.2.42)运行“makeall”时,我得到: 不知道我搞砸了什么。我还尝试使用$(shell…)分配变量,结果相同 如果我使用倒勾(`),则基本赋值可以工作,但它不存储结果,而是存储命令。这在以下示例Makefile中中断: SERVERIP = `ifconfig em0 | grep -E 'in

我可能很愚蠢,但我不能在我的Makefile中完成最基本的变量赋值

TEST = $(pwd);

all:
    echo $(TEST)
当我在FreeBSD(v9.1)中从Bash(v4.2.42)运行“makeall”时,我得到:

不知道我搞砸了什么。我还尝试使用$(shell…)分配变量,结果相同

如果我使用倒勾(`),则基本赋值可以工作,但它不存储结果,而是存储命令。这在以下示例Makefile中中断:

SERVERIP = `ifconfig em0 | grep -E 'inet.[0-9]' | awk '{ print $$2}'`

all:
    echo $(SERVERIP)
    sed -e 's/%LISTENIP%/${SERVERIP}/g' test.conf > work/test.conf.tmp
结果是:

[pete@pete] ~/make
echo `ifconfig em0 | grep -E 'inet.[0-9]' | awk '{ print $2}'`
10.128.28.151
sed -e 's/%LISTENIP%/`ifconfig em0 | grep -E 'inet.[0-9]' | awk '{ print $2}'`/g' test.conf > work/test.conf.tmp
sed: 1: "s/%LISTENIP%/`ifconfig  ...": unescaped newline inside substitute pattern
*** [all] Error code 1
您可以看到,基本变量赋值似乎有效,但当您将结果插入sed时,它将插入整个命令而不是结果,这会中断

有什么想法吗


皮特。

这是一个测试生成文件,与您的类似。
ifconfig
命令已放置在$(shell…)命令中,结果存储在
SERVERIP

TOP:= $(shell pwd)
SERVERIP:= $(shell ifconfig en1 | grep -E 'inet.[0-9]' | awk '{ print $$2}')
LISTENIP:=240.12.4.63

all:
     echo $(SERVERIP)
     sed -e 's/$(LISTENIP)/$(SERVERIP)/g' test.conf > work/test.conf.tmp
生成文件包含:

TEST = $(pwd);

all:
    echo $(TEST)
第一行将
make
变量
pwd
中的值加上分号分配给
make
变量
测试。这条规则与此相呼应。我想你忘了,
$(…)
make
shell
都很重要。假设您希望回显
pwd
命令的输出,则使用双美元,因此
make
将其扩展为一美元:

TEST = $$(pwd)

all:
    echo $(TEST)

要将shell命令的输出放入
make
变量,必须使用GNU
make
扩展。使用中有两个扩展:
:=
立即赋值,它在定义点而不是在使用点评估
SERVERIP
的值;和
$(shell…cmd…
,用于运行shell命令并捕获其输出

SERVERIP := $(shell ifconfig em0 | grep -E 'inet.[0-9]' | awk '{ print $$2}')

all:
    echo ${SERVERIP}
    sed -e 's/%LISTENIP%/${SERVERIP}/g' test.conf > work/test.conf.tmp
这应该行得通。关于
sed
正则表达式中的换行符的原始错误是奇数;反勾号应该已经从
ifconfig
管道的输出中删除了尾随的换行符。然而,如果事实上返回了多行,那么您的内部仍然有一个新行,证明来自
sed
的投诉是合理的

这就产生了投诉:

SERVERIP = `printf "%s\n" a b c`

all:
    echo $(SERVERIP)
    sed -e "s/%LISTENIP%/${SERVERIP}/g" test.conf > work/test.conf.tmp
这项工作:

SERVERIP = `printf "%s\n" c`

all:
    echo $(SERVERIP)
    sed -e "s/%LISTENIP%/${SERVERIP}/g" test.conf > work/test.conf.tmp

由于您使用的是FreeBSD,很可能您没有GNU
make
。在这种情况下,您需要:

  • 确保
    ifconfig
    命令管道仅产生一行输出
  • 使用如下
    make
    命令:

    SERVERIP = `ifconfig em0 | grep -E 'inet.[0-9]' | awk '{ print $$2}'`
    
    all:
        echo ${SERVERIP}
        sed -e "s/%LISTENIP%/${SERVERIP}/g" test.conf > work/test.conf.tmp
    
    如果满足条件1,则可使用任何版本的
    make


  • 也许答案太晚了,但我希望我能帮助(其他人)

    如果您不想安装GNU的
    make
    ,您可以使用
    =

    TEST!=pwd
    all:
        echo ${TEST}
    
    会有用的。解释非常简单,请仔细阅读,尤其是“变量分配”部分中的“变量分配修饰符”

    变量赋值修饰符

    可用于为变量赋值的五个运算符是 具体如下:

    !=展开该值并将其传递给shell以执行和 将结果分配给变量。结果中有新行吗 将替换为空格


    我将其复制到一个空白的Makefile中,但echo$(SERVERIP)实际上并没有生成任何输出。如果我在shell中运行该命令,它将返回一个IP。这可能是我的服务器配置中的一个怪癖吗?哦,我想我的网络接口名称和你的不同。抱歉,我忘记将其更改回您的接口名称。你的em0我的en1。是的,我改变了,但仍然没有快乐。运行下面的Makefile(在显示echo命令本身之后)返回一个空行:@SERVERIP=$$(ifconfig em0 | grep-E'inet.[0-9]'| awk'{print$$2}')all:echo$(SERVERIP)Oops!我把它塞满了。抱歉,在分配SERVERIP之前,如果我没有包含@,它会回显IP。我的错,对不起!但是,如果我尝试运行sed,那么它会给我命令字符串,而不是命令的值$(ifconfig…还有您使用的make的哪个版本?我在GNU make v3.81上。我注意到Jonathan已经修改了他的解决方案-也许这可以解决您的问题。我在第二个示例(sed)上测试了这一点)但是它实际上并没有提供命令的值,而是命令本身,它破坏了sed。也就是说,与上面相同的结果。谢谢mate。我复制了:=示例,但不幸的是它回显了一个空行,sed将ListNip标记替换为零。您使用的是FreeBSD?也许您没有GNU
    make
    ?我没有指出解决方案是使用GNU
    make
    扩展到
    make
    。是的,我正在使用GNU make。我没有意识到GNU和BSD make之间有区别。无论如何,根据pkg的信息,它是gmake-3.82,当你运行
    make--version
    时,它确认了GNU make?很好!我不知道。迟做总比不做强:)谢谢。谢谢!!这在FreeBSD=)的新端口中帮助我解决了复杂的倍频程依赖关系
    TEST!=pwd
    all:
        echo ${TEST}