我正在尝试编写一个 bash 脚本来自动安装带有 pagespeed 模块的 nginx。
其中一部分要求我将以下内容添加--add-module=$(MODULESDIR)/ngx_pagespeed \
到文件的一部分中/usr/src/nginx/nginx-X.X.6/debian/rules
。
每个部分类似于:
light_configure_flags := \
$(common_configure_flags) \
--with-http_gzip_static_module \
--without-http_browser_module \
--without-http_geo_module \
--without-http_limit_req_module \
--without-http_limit_conn_module \
--without-http_memcached_module \
--without-http_referer_module \
--without-http_scgi_module \
--without-http_split_clients_module \
--without-http_ssi_module \
--without-http_userid_module \
--without-http_uwsgi_module \
--add-module=$(MODULESDIR)/nginx-echo
完整文件在这里: https://jsfiddle.net/72hL5pya/1/ (抱歉,不知道还能放在哪里)
每个部分都是 *_configure_flags
nginx 的每个“版本”都有许多这样的部分需要编译(light、full、extras 等)
所以最后--add-module=
一行在每个部分都是不同的。
我怎样才能将 附加--add-module=$(MODULESDIR)/ngx_pagespeed \
到每个?
注意:看起来无论什么日期,该rules
文件的结构都已更改。
#!/usr/bin/make -f
#export DH_VERBOSE=1
CFLAGS ?= $(shell dpkg-buildflags --get CFLAGS)
LDFLAGS ?= $(shell dpkg-buildflags --get LDFLAGS)
WITH_HTTP2 := $(shell printf \
"Source: nginx\nBuild-Depends: libssl-dev (>= 1.0.1)\n" | \
dpkg-checkbuilddeps - >/dev/null 2>&1 && \
echo "--with-http_v2_module")
PKGS = nginx nginx-dbg \
nginx-module-xslt nginx-module-geoip nginx-module-image-filter \
nginx-module-perl nginx-module-njs
COMMON_CONFIGURE_ARGS := \
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-http_auth_request_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_geoip_module=dynamic \
--with-http_perl_module=dynamic \
--add-dynamic-module=debian/extra/njs-1c50334fbea6/nginx \
--with-threads \
--with-stream \
--with-stream_ssl_module \
--with-http_slice_module \
--with-mail \
--with-mail_ssl_module \
--with-file-aio \
--with-ipv6 \
$(WITH_HTTP2) \
--with-cc-opt="$(CFLAGS)" \
--with-ld-opt="$(LDFLAGS)"
%:
dh $@
override_dh_auto_configure: configure_debug
override_dh_strip:
dh_strip --dbg-package=nginx-dbg
override_dh_auto_build:
dh_auto_build
mv objs/nginx objs/nginx-debug
mv objs/ngx_http_xslt_filter_module.so objs/ngx_http_xslt_filter_module-debug.so
mv objs/ngx_http_image_filter_module.so objs/ngx_http_image_filter_module-debug.so
mv objs/ngx_http_geoip_module.so objs/ngx_http_geoip_module-debug.so
mv objs/ngx_http_perl_module.so objs/ngx_http_perl_module-debug.so
mv objs/src/http/modules/perl/blib/arch/auto/nginx/nginx.so objs/src/http/modules/perl/blib/arch/auto/nginx/nginx-debug.so
mv objs/ngx_http_js_module.so objs/ngx_http_js_module-debug.so
CFLAGS="" ./configure $(COMMON_CONFIGURE_ARGS)
dh_auto_build
configure_debug:
CFLAGS="" ./configure $(COMMON_CONFIGURE_ARGS) \
--with-debug
override_dh_auto_install:
sed -e 's/%%PROVIDES%%/nginx/g' \
-e 's/%%DEFAULTSTART%%/2 3 4 5/g' \
-e 's/%%DEFAULTSTOP%%/0 1 6/g' \
< debian/init.d.in > debian/init.d
dh_auto_install
mkdir -p debian/nginx/etc/init.d debian/nginx/etc/default \
debian/nginx/usr/lib/nginx/modules
sed -e 's/%%PROVIDES%%/nginx-debug/g' \
-e 's/%%DEFAULTSTART%%//g' \
-e 's/%%DEFAULTSTOP%%/0 1 2 3 4 5 6/g' \
< debian/init.d.in > debian/debug.init.d
/usr/bin/install -m 755 debian/debug.init.d \
debian/nginx/etc/init.d/nginx-debug
/usr/bin/install -m 644 debian/nginx-debug.default \
debian/nginx/etc/default/nginx-debug
/usr/bin/install -m 644 debian/nginx.conf debian/nginx/etc/nginx/
/usr/bin/install -m 644 conf/win-utf debian/nginx/etc/nginx/
/usr/bin/install -m 644 conf/koi-utf debian/nginx/etc/nginx/
/usr/bin/install -m 644 conf/koi-win debian/nginx/etc/nginx/
/usr/bin/install -m 644 conf/mime.types debian/nginx/etc/nginx/
/usr/bin/install -m 644 conf/scgi_params debian/nginx/etc/nginx/
/usr/bin/install -m 644 conf/fastcgi_params debian/nginx/etc/nginx/
/usr/bin/install -m 644 conf/uwsgi_params debian/nginx/etc/nginx/
/usr/bin/install -m 644 html/index.html \
debian/nginx/usr/share/nginx/html/
/usr/bin/install -m 644 html/50x.html \
debian/nginx/usr/share/nginx/html/
/usr/bin/install -m 644 debian/nginx.vh.default.conf \
debian/nginx/etc/nginx/conf.d/default.conf
/usr/bin/install -m 755 objs/nginx debian/nginx/usr/sbin/
/usr/bin/install -m 755 objs/nginx-debug debian/nginx/usr/sbin/
cd debian/nginx/etc/nginx && /bin/ln -s \
../../usr/lib/nginx/modules modules && cd -
override_dh_gencontrol:
for p in $(PKGS); do \
if [ -e debian/$$p.version ]; then \
dpkg-gencontrol -p$$p -ldebian/changelog -Tdebian/$$p.substvars -Pdebian/$$p -v`cat debian/$$p.version`~`lsb_release -cs`; \
else \
dpkg-gencontrol -p$$p -ldebian/changelog -Tdebian/$$p.substvars -Pdebian/$$p ; \
fi ; \
done
override_dh_clean:
dh_clean
rm -f debian/*init.d
答案1
如果新选项在选项列表中的位置并不重要,您可以
sed '/_configure_flags *:=/ a\
--add-module=$(MODULESDIR)/ngx_pagespeed \\
' file
light_configure_flags := \
--add-module=$(MODULESDIR)/ngx_pagespeed \
$(common_configure_flags) \
--with-http_gzip_static_module \
...
要在“common_configure_flags”行之后添加,您可以:
sed -r '
# when the line ends with a backslash
# add the new line with a backslash
/\$\(common_configure_flags\)[[:blank:]]*\\$/ a\
--add-module=$(MODULESDIR)/ngx_pagespeed \\
# when the line does not end with a backslash,
# add a backslash, then
# add the new line without a backslash
/\$\(common_configure_flags\)[[:blank:]]*$/ {
s/$/ \\/
a\
--add-module=$(MODULESDIR)/ngx_pagespeed
}
' file
答案2
我需要添加多行但无法让 sed 工作所以改用 awk:
awk '/full_configure_flags :=/{print $0 RS \
" --add-dynamic-module=/opt/ngx_http_split_clients/ngx_http_split_clients_module.c" RS \
" --with-http_addition_module" RS \
" --with-http_sub_module" RS \
" --with-http_flv_module" RS \
" --with-http_mp4_module" RS \
" --with-http_gunzip_module" RS \
" --with-http_random_index_module" RS \
" --with-http_secure_link_module" RS \
" --with-http_stub_status_module" RS \
" --with-mail" RS \
" --with-mail_ssl_module" RS \
" --with-file-aio" RS \
" --with-ipv6" RS \
" --with-http_spdy_module" RS \
" --with-cc-opt";next}1' /opt/rebuildnginx/nginx-1.10.2/debian/rules
这个帖子在弄清楚语法时很有用。
答案3
一些挖掘表明规则文件目前可用这里。
由于特定于包的配置似乎是通过语句继承的$(common_configure_flags)
,因此仅修改该块可能就足够了:
$ perl -00 -ple 's{$}{ \\\n\t\t\t--add-module=\$(MODULESDIR)/ngx_pagespeed} if m/common_configure_flags :=/' rules > nu
$ diff -u rules nu
--- rules 2015-12-17 14:49:12.000000000 -0800
+++ nu 2015-12-17 14:52:52.171942309 -0800
@@ -47,7 +47,8 @@
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_realip_module \
- --with-http_auth_request_module
+ --with-http_auth_request_module \
+ --add-module=$(MODULESDIR)/ngx_pagespeed
此解决方案按段落 ( -00 -p
) 依次处理文件内容,并在每个段落的末尾添加必要的数据(以及适当的回溯、换行符和制表符),但仅限于与该common_configure_flags :=
位匹配的段落。要针对每个部分(而不仅仅是常见的部分),需要if
适当地调整正则表达式。