makefile将命令分配给
我可能很愚蠢,但我不能在我的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
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
变量,必须使用GNUmake
扩展。使用中有两个扩展::=
立即赋值,它在定义点而不是在使用点评估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,很可能您没有GNUmake
。在这种情况下,您需要:
确保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?也许您没有GNUmake
?我没有指出解决方案是使用GNUmake
扩展到make
。是的,我正在使用GNU make。我没有意识到GNU和BSD make之间有区别。无论如何,根据pkg的信息,它是gmake-3.82,当你运行make--version
时,它确认了GNU make?很好!我不知道。迟做总比不做强:)谢谢。谢谢!!这在FreeBSD=)的新端口中帮助我解决了复杂的倍频程依赖关系
TEST!=pwd
all:
echo ${TEST}