- 主题:makefile里调用sed,这转义真比较头疼
linux,要在某个makefile里调用sed,把另外一个makefile里的如下两行:
FREETYPE_CFLAGS = -I/usr/include/freetype2 -I/usr/include/libpng16
FREETYPE_LIBS = -lfreetype
替换为
FREETYPE_CFLAGS = -I$(OUTPUT)/freetype/include -I$(OUTPUT)/png/include
FREETYPE_LIBS = -L$(OUTPUT)/freetype/lib -lfreetype
简单说,就是某个软件用autoconf生成的makefile,configure.ac里面用PKG_CHECK_MODULES()找到了系统目录下的freetype库,我要把它替换成我自己目录下的freetype库。
麻烦的地方在于,
make、bash都对某些特殊符号存在转义,比如make将$$视为$,导致sed检测到命令格式错误:
sed --debug -i 's#^FREETYPE_CFLAGS .*$#FREETYPE_CFLAGS = -I$$(OUTPUT)/freetype/include -I$$(OUTPUT)/png/include#' ./Makefile && \
sed --debug -i 's#^FREETYPE_LIBS .*$#FREETYPE_LIBS = -L$$(OUTPUT)/freetype/lib -lfreetype#' ./Makefile && \
sed:-e 表达式 #1,字符 96:未终止的“s”命令
加上sed --debug也无济于事。
编辑:
搞定了,有个$没转义为$$。正确的:
sed --debug -i 's#^FREETYPE_CFLAGS .*$$#FREETYPE_CFLAGS = -I$$(OUTPUT)/freetype/include -I$$(OUTPUT)/png/include#' ./Makefile
sed --debug -i 's#^FREETYPE_LIBS .*$$#FREETYPE_LIBS = -L$$(OUTPUT)/freetype/lib -lfreetype#' ./Makefile
--
修改:z16166 FROM 114.241.225.*
FROM 114.241.225.*
如果你在makefile里用define, 那么需要4个$来转义
--
FROM 222.71.45.*
是的
最后换了用PKG_CONFIG_LIBDIR的办法,这个变量可以指定pkg-config不搜索/usr目录下的软件dev包,而是搜索自己指定的目录下的dev包
【 在 eematlab 的大作中提到: 】
: 如果你在makefile里用define, 那么需要4个$来转义
--
FROM 114.241.225.*
转意嵌套是比较麻烦的,但这就是meta programming的魅力
【 在 z16166 的大作中提到: 】
: 是的
: 最后换了用PKG_CONFIG_LIBDIR的办法,这个变量可以指定pkg-config不搜索/usr目录下的软件dev包,而是搜索自己指定的目录下的dev包
:
--
FROM 180.158.50.*