Chinaunix首页 | 论坛 | 博客
  • 博客访问: 50317
  • 博文数量: 20
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 45
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-30 09:49
文章分类

全部博文(20)

文章存档

2015年(3)

2014年(1)

2013年(14)

2012年(2)

我的朋友

分类:

2013-07-07 15:58:52

原文地址:Solaris上编译gnu sed 作者:winter.zhang

近来需要在solaris上工作一段时间, 所以需要使用solaris上的工具. 习惯了在Linux下的工具后, 突然发现许多solaris上的工具和linux差别甚大. 自带的sed和awk即是如此,以前在linux下用的sed/awk都出错, 由于我不想再熟悉一套新的sed/awk语法,故而,我就需要在solaris上安装gnu sed.

当运行完configure后,系统给出如下提示:

checking for GNU gettext in libc... no
checking for GNU gettext in libintl... no
configure: creating ./config.status
config.status: creating lib/stdbool.h
config.status: creating bootstrap.sh
config.status: creating Makefile
config.status: creating doc/Makefile
config.status: creating lib/Makefile
config.status: creating sed/Makefile
config.status: creating testsuite/Makefile
config.status: creating po/Makefile.in
config.status: creating intl/Makefile
config.status: creating config.h
config.status: config.h is unchanged
config.status: linking ./lib/regex_.h to lib/regex.h
config.status: executing depfiles commands
config.status: executing default-1 commands
config.status: creating po/POTFILES
config.status: creating po/Makefile
config.status: executing gettext-fix commands
sed: command garbled: install_sh=/home/jd/tools/sed-4.1.5/config/install-sh
sed: command garbled: install_sh=/home/jd/tools/sed-4.1.5/config/install-sh

估计着,是出什么问题了. 一Make,果然如此:
bash-2.05$ make
make  all-recursive
make[1]: Entering directory `/scratch/jd/tools/sed-4.1.5'
Making all in intl
make[2]: Entering directory `/scratch/jd/tools/sed-4.1.5/intl'
make[2]: *** No rule to make target `all'.  Stop.
make[2]: Leaving directory `/scratch/jd/tools/sed-4.1.5/intl'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/scratch/jd/tools/sed-4.1.5'
make: *** [all] Error 2

查看了一下intl下的Makefile,居然是空的!,说明脚本没有正确的根据Makefile.in生成Makefile. 原因在于config.status中使用了一些solaris sed中不支持的指令来产生Makefile,导致Makefile为空.

不过, config.status是已经搜集完后系统配置产生的,故而,在linux平台上运行,给出的结果也是一样的.
所以,可以在linux上放一份sed的源代码,而后copy solaris上产生的config.status到linux上,在linux上运行config.status,记录下已经改变过的文件, 将改动的文件考回来就行了,抑或打个diff,这边运用.

还有一种更复杂点和更不保险的方法,就是使用系统的intl库, 这样知需要在Makefile中,查找所有对libintl.so的引用,而后修改成对系统libintl.so的引用即可,同时,去掉make中的产生libintl的target.


而后执行make,居然又出新的错误:
gcc -DHAVE_CONFIG_H -I. -I. -I..  -I../lib -I../intl -I..  -I../lib -I../intl    -g -O2 -c regex.c
In file included from regex.c:61:
regex_internal.h:395: warning: `pure' attribute directive ignored
In file included from regex.c:61:
regex_internal.h:712: warning: `pure' attribute directive ignored
regex_internal.h:725: warning: `pure' attribute directive ignored
regex_internal.h:734: warning: `pure' attribute directive ignored
In file included from regex.c:63:
regex_internal.c:750: warning: `pure' attribute directive ignored
regex_internal.c:786: warning: `pure' attribute directive ignored
regex_internal.c:1272: warning: `pure' attribute directive ignored
regex_internal.c:1287: warning: `pure' attribute directive ignored
In file included from regex.c:64:
regcomp.c:292: warning: `always_inline' attribute directive ignored
In file included from regex.c:65:
regexec.c:1028: warning: `always_inline' attribute directive ignored
regexec.c: In function `build_trtable':
regexec.c:3299: `bool' undeclared (first use in this function)
regexec.c:3299: (Each undeclared identifier is reported only once
regexec.c:3299: for each function it appears in.)
regexec.c:3299: parse error before `dests_node_malloced'
regexec.c:3325: `dests_node_malloced' undeclared (first use in this function)
regexec.c:3325: `true' undeclared (first use in this function)
regexec.c:3365: `dest_states_malloced' undeclared (first use in this function)
regexec.c: In function `group_nodes_into_DFAstates':
regexec.c:3579: `bool' undeclared (first use in this function)
regexec.c:3579: parse error before `accepts_newline'
regexec.c:3581: `accepts_newline' undeclared (first use in this function)
*** Error code 1
make: Fatal error: Command failed for target `regex.o'
Current working directory /scratch/jd/tools/sed-4.1.5/lib
*** Error code 1
The following command caused the error:
failcom='exit 1'; \
for f in x $MAKEFLAGS; do \
  case $f in \
    *=* | --[!k]*);; \
    *k*) failcom='fail=yes';; \
  esac; \
done; \
dot_seen=no; \
target=`echo all-recursive | sed s/-recursive//`; \
list='intl lib po sed doc testsuite'; for subdir in $list; do \
  echo "Making $target in $subdir"; \
  if test "$subdir" = "."; then \
    dot_seen=yes; \
    local_target="$target-am"; \
  else \
    local_target="$target"; \
  fi; \
  (cd $subdir && make  $local_target) \
  || eval $failcom; \
done; \
if test "$dot_seen" = "no"; then \
  make  "$target-am" || exit 1; \
fi; test -z "$fail"
make: Fatal error: Command failed for target `all-recursive'
Current working directory /scratch/jd/tools/sed-4.1.5
*** Error code 1
make: Fatal error: Command failed for target `all'

原来是缺了bool的定义等等, bool在solaris中由/usr/include/stdbool.h定义, 而在linux中不存在.
故而,只需要让regexec.c把/usr/include/stdbool.h包含进来就可以了, 这之后继续make就没问题,而后install一下,再运行:

bash-2.05$ sed --version
GNU sed version 4.1.5
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.

5 邮件中的句点行
我没有去了解过邮件正文的要求, 经常作的是把输出放到一个文本邮件中, 再把文本文件作为邮件正文. 但是最近收到的某些邮件总是乖乖的, 明明文件内容是完整的,  邮件内容却从某处开始缺失. 而且绝大多数都是从单独的句点行开始缺失, 我就怀疑是否邮件系统默认将单独句点行作为正文结束标识.

后来查找了一下, 果然如此, 在而后发送文件内容是,我总是把空白句点行替代掉, 这样才能收到完整的邮件.

参考:



阅读(855) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~