LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1050|回复: 9

LFS6.2构建时环境测试的脚本

[复制链接]
发表于 2007-3-27 13:11:21 | 显示全部楼层 |阅读模式
下面是针对构建LFS6.2时主系统环境测试的脚本,欢迎各位试用并将测试结果跟贴,如果对此脚本有任何修改或意见也请跟贴或与作者联系

[PHP]#!/bin/sh
############################################################################
#                                                                          #
# This file is part of the lfs-autobuild.                                  #
# FILENAME: checkenv                                                       #
# VER: 0.1                                                                 #
# Copyright (C) 2006 Gary <whlgl@hotmail.com>.                             #
#                                                                          #
############################################################################




        check_version() {
                declare -i major minor revision
                declare -i ref_major ref_minor ref_revision
                declare -r dotSTR="..............."
                declare -r spaceSTR="         "

                ref_version=$1
                tst_version=$2
                TXT=$3

                # This saves us the save/restore hassle of the system IFS value
                local IFS

                write_error_and_die() {
                        echo -e "\n\t\t$TXT version -->${tst_version}<-- is too old.
                        This script requires ${ref_version} or greater\n"
                        exit 1
                }

                #  echo -ne "${TXT}${dotSTR{#TXT}} ${L_arrow}${BOLD}${tst_version}      ${OFF}${R_arrow}"
                echo -ne "${BRW}${TXT}${dotSTR{#TXT}} ${tst_version}${spaceSTR{#tst_version}}    ${WHITE}"

                #  echo -ne "$TXT:\t${L_arrow}${BOLD}${tst_version}${OFF}${R_arrow}"
                IFS=".-(p"   # Split up w.x.y.z as well as w.x.y-rc  (catch release candidates)
                set -- $ref_version # set postional parameters to minimum ver values
                ref_major=$1; ref_minor=$2; ref_revision=$3
                #
                set -- $tst_version # Set postional parameters to test version values
                major=$1; minor=$2; revision=$3
                #
                # Compare against minimum acceptable version..
                (( major > ref_major )) && echo "${GREEN}OK${WHITE}" && return
                (( major < ref_major )) && write_error_and_die
                # major=ref_major
                (( minor < ref_minor )) && write_error_and_die
                (( minor > ref_minor )) && echo "${GREEN}OK${WHITE}" && return
                # minor=ref_minor
                (( revision >= ref_revision )) && echo "${GREEN}OK${WHITE}" && return

                # oops.. write error msg and die
                write_error_and_die
        }


        (check_version "2.6.2" "`uname -r`" "KERNEL"
        check_version "2.0.5" "$BASH_VERSION" "BASH"
        check_version "3.0.0" "`gcc -dumpversion`" "GCC"
        libcVer="`/lib/libc.so.6 | head -n1`"
        libcVer="${libcVer##*version }"
        check_version "2.2.5" ${libcVer%%,*} "GLIBC"
        check_version "2.12" "$(ld --version  | head -n1 | cut -d" " -f4)" "BINUTILS"
        check_version "1.14" "$(tar --version | head -n1 | cut -d" " -f4)" "TAR"
        bzip2Ver="$(bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f8)"
        check_version "1.0.2" "${bzip2Ver%%,*}" "BZIP2"
        check_version "5.0" "$(chown --version | head -n1 | cut -d")" -f2)" "COREUTILS"
        check_version "2.8" "$(diff --version  | head -n1 | cut -d" " -f4)" "DIFF"
        check_version "4.1.20" "$(find --version  | head -n1 | cut -d" " -f4)" "FIND"
        check_version "3.0" "$(gawk --version  | head -n1 | cut -d" " -f3)" "GAWK"
        check_version "2.5" "$(grep --version  | head -n1 | cut -d" " -f4)" "GREP"
        check_version "1.2.4" "$(gzip --version 2>&1 | head -n1 | cut -d" " -f2)" "GZIP"
        check_version "3.79.1" "$(make --version  | head -n1 | cut -d " " -f3 | cut -c1-4)" "MAKE"
        check_version "2.5.4" "$(patch --version | head -n1 | cut -d" " -f2)" "ATCH"
        check_version "3.0.2" "$(sed --version   | head -n1 | cut -d" " -f4)" "SED")

        if [ $? -eq 0 ]; then
                echo "env OK"
        else
                exit 1
        fi

[/PHP]
发表于 2007-3-27 15:46:46 | 显示全部楼层
谢谢分享,晚上有空测试一下
回复 支持 反对

使用道具 举报

发表于 2007-3-28 06:48:02 | 显示全部楼层
Ha...Ha...Seems good! :2cool
  1. d00m3d@BlackMesa1:~$ ./checkenv.sh
  2. KERNEL......... 2.6.18.1     OK
  3. BASH........... 3.1.17(1)-release    OK
  4. GCC............ 4.1.2        OK
  5. GLIBC.......... 2.3.6        OK
  6. BINUTILS....... 2.17         OK
  7. TAR............ 1.16         OK
  8. BZIP2.......... 1.0.3        OK
  9. COREUTILS......  5.97        OK
  10. DIFF........... 2.8.1        OK
  11. FIND........... 4.2.28       OK
  12. GAWK........... 3.1.5        OK
  13. GREP........... 2.5.1        OK
  14. GZIP........... 1.3.9        OK
  15. MAKE........... 3.81         OK
  16. PATCH.......... 2.5.9        OK
  17. SED............ 4.1.5        OK
  18. env OK
  19. d00m3d@BlackMesa1:~$
复制代码

However, look at the scripts.  The version being checked is hard coded.  This may imply the script is good for checking the environment as of today but it may not suitable for future.  Any ideas for enhancement?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-28 13:42:53 | 显示全部楼层
呵呵,因为暂时只在做LFS6.2自动构建脚本,所以它目前只针对LFS6.2的构建环境进行测试,如果需要对CLFS进行测试还是需要改进的(修改应该不是很难)。
目前整套自动构建脚本还差最后部分的制作安装光盘和livecd部分,暂时没精力为它修改以适合其它版本,期待着有人能将这个脚本完善,那本人以后就可直接借用了
回复 支持 反对

使用道具 举报

发表于 2007-3-28 20:51:52 | 显示全部楼层
想了一下,还有一点不足,这不是脚本写得不够好,而是各家发行版自身的问题(我觉得是发行版的缺陷)

情况是这样的,很多发行版都会把开发用的软件斩件打包,分成 xxx-dev 或 xxx-devel 之类,最明显的就是 Debian/Fedora/Ubuntu 等,没有这些 -dev 单纯检查软件的版本是能够通过的脚本测试,但编译就一定不行了

另一方面,如果用 LFS LiveCD 来做 host,这样就根本没有必要去检查了,而用 Gentoo 及 Arch 的人又比较老练,不大可能连版本也不会检查

那岂不是没有用武之地了 :ask
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-28 21:45:29 | 显示全部楼层
Post by d00m3d

情况是这样的,很多发行版都会把开发用的软件斩件打包,分成 xxx-dev 或 xxx-devel 之类,最明显的就是 Debian/Fedora/Ubuntu 等,没有这些 -dev 单纯检查软件的版本是能够通过的脚本测试,但编译就一定不行了


这的确是个问题,但目前我无法在所有这些平台上进行测试,必竟只有一台机器,而且精力时间有限,至于每个平台的特性,我倒是希望在整套自动构建脚本完成后大家能够帮助测试,不过如果条件允许的话我想还是为这套脚本的运行构建一个单独的livecd为好:ask

今天初拟了下这套脚本的功能需求,希望大家会感兴趣:
1,测试构建环境
2,自动下载所需软件包
3,自动构建并记录每个包的构建日志
4,对最终系统记录每个软件包安装的文件及路径并制作压缩包(临时系统当然不需要了)
5,出错的软件包修正错误后脚本可以继续
6,可以构建普通LFS(依据LFS手册)和定制mini系统(根据所需程序清单自动检索依赖并从压缩包中提取所需文件)
7,脚本要能以构建的最终系统构建一个安装光盘或livecd
8,可构建支持USB启动安装或livecd系统

目前只完成前5条需求,第6条只完成普通LFS构建部分,余下的需求难度较大:mad:
回复 支持 反对

使用道具 举报

发表于 2007-3-29 07:38:42 | 显示全部楼层
很伟大啊,但这并不简单,jhalfs 就是案例,相当难实现的,非常期待中

Btw,第 2 点"自动下载所需软件包"是指让系统先行自我升级吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-29 09:51:16 | 显示全部楼层
是有点难度,目前仅实现这些功能的脚本光BZ2打包后就有200多K,相对于我最先的6.1构建脚本才80K要大多了。
自动下载软件包目前还只是下载LFS构建时需要的软件包并校验,至于主系统自我升级我想还需要在系统测试后添加相应的apt或dpkg指令,只是偶对他们都不是很熟悉,也没有实际试过DEBIAN/UBUNTU或FEDORA上构建LFS需要安装哪些包
回复 支持 反对

使用道具 举报

发表于 2007-3-29 12:08:43 | 显示全部楼层
我想不要使用apt和dpkg的好吧,直接使用wget和make指令来实现是困难,可是会比使用apt和包管理更加有移植性。
脚本写的不错哦;~)我也来玩玩,好久没有LFS了,使用archlinux还是方便惯了。
对上次LFS是在半年前了-_-不过也比6.2更加新的svn来玩,其实LFS文档就是一个很好的数据库了:-P使用XHTML构建的?没有详细看里面的东西,可以使用文档的指令加上我们要使用外部兼容指令(就是mv亚,test 一类的操作啦)
回复 支持 反对

使用道具 举报

发表于 2007-3-29 19:14:26 | 显示全部楼层
在 LFS 系统,dpkg 还可一用,俺就是用它来安装怪兽级的 OpenOffice,省却自己编译

但是 apt 却太自动了,用 apt 的後果可能是会把 你艰苦建立的 LFS 系统替换成 Debian/Ubuntu,结果还不如找过真的 Debian/Ubuntu 来装。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表