Makefile中规避错误以及$符号的转义

今天再次尝试访问stackoverflow的登录页, 惊奇的发现竟然可以访问了. 之前由于相关页面的资源使用了cloudflarecdn, 导致资源无法获取~ 现在终于又可以登录了;)

跑题了, 最近在打一个开源工具的deb包的时候, 遇到了一些小小的问题, 主要都是围绕Makefile的, 这里简单记录一下.

错误

还是照常的使用dh_make来初始化, 先使用默认的rules文件, 发现在起始的clean阶段就发生错误. 简单看了一下就是Makefile执行的时候出错了. 为了让流程继续执行, 简单的在make clean之前加-即可. 有兴趣的同学可以看下gnu的说明.

变量

顺利过了clean这关, 发现在install阶段并没有将对应的文件安装的默认的目录下面. 看了下输出, 发现是原生的Makefile没有支持DESTDIR变量. 好吧, 看来我们需要处理一下对应的Makefile: 在install阶段, 给所有对应的PREFIX变量前添加DESTDIR. 这个可以用sed或者perl来搞定.

在处理时, 需要注意下Makefile对$符号的处理. Makefile的变量大都是$(VAR)的形式, 因此在增加$(DESTDIR)就需要将$字符转义一下(引用Bash变量的时候也一样). 因此我们可以用sed来实现一下:

sed
1
sed -i -e '/^install/,/^\s*$$/{s/$$(PREFIX)/$$(DESTDIR)\/$$(PREFIX)/g}' Makefile

顺便再来个perl的:

perl
1
2
perl -i -n -e \
    'if (/^install/../^\s*$$/) { s|(\$$\(PREFIX\))|\$$\(DESTDIR\)/$$1|g; print $$_ } else { print $$_}' Makefile

修改完之后, 打包完成~

Comments