跳转到内容

TWW HPMS 移植到其他操作系统

来自 Wikibooks,开放世界开放书籍

将 TWW HPMS 移植到其他操作系统

[编辑 | 编辑源代码]

将 TWW HPMS 工具移植到其他操作系统时需要完成两项任务。

  • 移植 TWW HPMS 工具本身
  • 移植包源。
  • 用于自动执行 TWW 工具移植的 Makefile。

Linksys NSLU2

[编辑 | 编辑源代码]
  • 一个用于为 nslu2 构建 TWW 工具的 Makefile。
  • 编译 sbtuils 工具以生成 sb
  • 使用 sb 编译和构建 pb 和 pkgutils
  • 移植 sbtools

{}

  • 移植 pbtools
  • 移植 pkgutils

做完功课后,以下是一些关于 Mac OS X 上软件打包的优秀文档。

包管理系统正在变得更好,但仍然缺乏 PMS 应该具有的基本功能。例如,您无法使用命令行工具列出当前安装的包。您无法使用命令删除包或自动处理包依赖关系。

/Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker 在 10.3.8 中得到了改进。我们现在可以使用命令行创建 .pkg。请注意,在 -p 或 -f 选项之后提供绝对路径。

以下是一个用于在 Mac OSX 的本地 PMS 格式中创建 TWW CPAM 工具的部分 Makefile。

<snip>
# A simple layout for .pkg format
#Test.pkg
#    Contents
#        Archive.bom
#        Archive.pax.gz
#        Info.plist
#        PkgInfo
#        Resources
#            Description.plist
#            postflight      -1-
#            postinstall     -2-
#            postupgrade     -3-
#            preflight       -4-
#            preinstall      -5-
#            preupgrade      -6-

PKGMK=/Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker
SB_PKG_DIR=/opt/TWWfsw/sbutils124
SB_PKGNAME=sbutils-1.2.4
PB_PKGNAME=pbutils-1.1.12
PKGUTILS_PKGNAME=pkgutils-1.5.19
SB_PKG_HOME=/opt/build/sbutils-1.2.4
PB_PKG_HOME=${SB_PKG_HOME}
PKGUTILS_PKG_HOME=${SB_PKG_HOME}
SB_PKG_STG=${SB_PKG_HOME}/sbutils-stage
PB_PKG_STG=${SB_PKG_HOME}/pbutils-stage
PKGUTILS_PKG_STG=${SB_PKG_HOME}/pkgutils-stage
PB_INSTALL_PREFIX=/opt/TWWfsw/pbutils11
PKGUTILS_INSTALL_PREFIX=/opt/TWWfsw/pkgutils15
sb-pkg: sb-pkg-prep sb-pkg-pkgmk
sb-pkg-clean:
        rm -rf ${SB_PKG_HOME}/${SB_PKGNAME} ${SB_PKG_STG}
sb-pkg-prep:
        rm -rf $(SB_PKG_STG)
        mkdir -p $(SB_PKG_STG)/Contents/Resources
        touch $(SB_PKG_STG)/Contents/Resources/postflight
        touch $(SB_PKG_STG)/Contents/Resources/postinstall
        touch $(SB_PKG_STG)/Contents/Resources/postupgrade
        touch $(SB_PKG_STG)/Contents/Resources/preflight
        touch $(SB_PKG_STG)/Contents/Resources/preinstall
        touch $(SB_PKG_STG)/Contents/Resources/preupgrade
sb-pkg-pkgmk:
        $(PKGMK) -build -p ${SB_PKG_HOME}/${SB_PKGNAME}.pkg -f $(SB_INSTALL_PREFIX) -i ${SB_PKG_HOME}/src/macosx/Info.p\list.sb -d ${SB_PKG_HOME}/src/macosx/Description.plist.sb

sb-pkg-pkgmk-clean:
        rm -rf ${SB_PKG_HOME}/${SB_PKGNAME}
sb-pkg-install:
        /usr/sbin/installer -pkg sbutils-1.2.4-1.pkg  -target /
<snip>
  • 移植 sbtools

sbutils-1.2.4 在 Mac OS X 10.3.8 上编译成功。我们也可以使用 packagemaker 将 sbutils-1.2.4 生成到 Mac OS X 的原生包格式。以下快速笔记需要稍后记录。

conchi:~/tww-tools/sbutils-1.2.4 tjyang$ sudo make sb-pkg
rm -rf /Users/tjyang/tww-tools/sbutils-1.2.4/sbutils-stage
mkdir -p /Users/tjyang/tww-tools/sbutils-1.2.4/sbutils-stage/Contents/Resources
touch /Users/tjyang/tww-tools/sbutils-1.2.4/sbutils-stage/Contents/Resources/postflight 
touch /Users/tjyang/tww-tools/sbutils-1.2.4/sbutils-stage/Contents/Resources/postinstall
touch /Users/tjyang/tww-tools/sbutils-1.2.4/sbutils-stage/Contents/Resources/postupgrade
touch /Users/tjyang/tww-tools/sbutils-1.2.4/sbutils-stage/Contents/Resources/preflight
touch /Users/tjyang/tww-tools/sbutils-1.2.4/sbutils-stage/Contents/Resources/preinstall
touch /Users/tjyang/tww-tools/sbutils-1.2.4/sbutils-stage/Contents/Resources/preupgrade
cp -rp /opt/TWWfsw/sbutils124/* /Users/tjyang/tww-tools/sbutils-1.2.4/sbutils-stage
^Cmake: *** [sb-pkg-prep] Interrupt

conchi:~/tww-tools/sbutils-1.2.4 tjyang$ sudo make sb-pkg
rm -rf /Users/tjyang/tww-tools/sbutils-1.2.4/sbutils-stage
mkdir -p /Users/tjyang/tww-tools/sbutils-1.2.4/sbutils-stage/Contents/Resources
touch /Users/tjyang/tww-tools/sbutils-1.2.4/sbutils-stage/Contents/Resources/postflight 
touch /Users/tjyang/tww-tools/sbutils-1.2.4/sbutils-stage/Contents/Resources/postinstall
touch /Users/tjyang/tww-tools/sbutils-1.2.4/sbutils-stage/Contents/Resources/postupgrade
touch /Users/tjyang/tww-tools/sbutils-1.2.4/sbutils-stage/Contents/Resources/preflight
touch /Users/tjyang/tww-tools/sbutils-1.2.4/sbutils-stage/Contents/Resources/preinstall
touch /Users/tjyang/tww-tools/sbutils-1.2.4/sbutils-stage/Contents/Resources/preupgrade
/usr/bin/mkbom -s  /opt/TWWfsw/sbutils124 /Users/tjyang/tww-tools/sbutils-1.2.4/sbutils-stage/Contents/Archive.bom
(pax -w -x cpio /opt/TWWfsw/sbutils124 |gzip - > /Users/tjyang/tww-tools/sbutils-1.2.4/sbutils-stage/Contents/Archive.pax.gz)
/Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker -build -p /Users/tjyang/tww-tools/sbutils-1.2.4/sbutils-1.2.4-1.pkg   -f /Users/tjyang/tww-tools/sbutils-1.2.4/sbutils-stage/Contents -i //Users/tjyang/tww-tools/sbutils-1.2.4/Info.plist -d //Users/tjyang/tww-tools/sbutils-1.2.4/Description.plist
2005-02-27 23:29:24.664 PackageMaker[19034] ** building a package at /Users/tjyang/tww-tools/sbutils-1.2.4/sbutils-1.2.4-1.pkg **
2005-02-27 23:29:32.961 PackageMaker[19034] done (0)
conchi:~/tww-tools/sbutils-1.2.4 tjyang$ ls -lrt
total 216
-rwx------   1 tjyang  tjyang  42318 23 Feb 15:04 systype
-rw-r--r--   1 tjyang  tjyang   1069 27 Feb 15:49 cipo.error.txt
drwx------  43 tjyang  tjyang   1462 27 Feb 15:59 src
-rwxr-xr-x   1 tjyang  tjyang   7796 27 Feb 22:23 genpkg.sh
-rw-r--r--   1 tjyang  tjyang    459 27 Feb 23:13 Description.plist
-rw-r--r--   1 tjyang  tjyang   1050 27 Feb 23:17 Info.plist
-rwx------   1 tjyang  tjyang  44915 27 Feb 23:28 Makefile
drwxr-xr-x   3 root    tjyang    102 27 Feb 23:28 sbutils-stage
drwxr-xr-x   3 root    tjyang    102 27 Feb 23:29 sbutils-1.2.4-1.pkg
conchi:~/tww-tools/sbutils-1.2.4 tjyang$ ls sbutils-1.2.4-1.pkg/
Contents
conchi:~/tww-tools/sbutils-1.2.4 tjyang$ ls sbutils-1.2.4-1.pkg/Contents/
Archive.bom     Archive.pax.gz  Info.plist      PkgInfo         Resources
conchi:~/tww-tools/sbutils-1.2.4 tjyang$ ls -l sbutils-1.2.4-1.pkg/Contents/
total 32312
-r--r--r--  1 root  tjyang     35525 27 Feb 23:29 Archive.bom
-r--r--r--  1 root  tjyang  16496572 27 Feb 23:29 Archive.pax.gz
-r--r--r--  1 root  tjyang      1050 27 Feb 23:29 Info.plist
-r--r--r--  1 root  tjyang         8 27 Feb 23:29 PkgInfo
drwxr-xr-x  7 root  tjyang       238 27 Feb 23:29 Resources
conchi:~/tww-tools/sbutils-1.2.4 tjyang$ ls -l sbutils-1.2.4-1.pkg/Contents/Resources/
total 40
-r--r--r--  1 root  tjyang  459 27 Feb 23:29 Description.plist
lrwxr-xr-x  1 root  tjyang   14 27 Feb 23:29 sbutils-1.2.4-1.bom -> ../Archive.bom
-r--r--r--  1 root  tjyang  275 27 Feb 23:29 sbutils-1.2.4-1.info
lrwxr-xr-x  1 root  tjyang   17 27 Feb 23:29 sbutils-1.2.4-1.pax.gz -> ../Archive.pax.gz
-r--r--r--  1 root  tjyang   46 27 Feb 23:29 sbutils-1.2.4-1.sizes
conchi:~/tww-tools/sbutils-1.2.4 tjyang$ vi  sbutils-1.2.4-1.pkg/Contents/Resources/sbutils-1.2.4-1.info 
conchi:~/tww-tools/sbutils-1.2.4 tjyang$

Microsoft Windows

[编辑 | 编辑源代码]

将 TWW HPMS 工具移植到 Win32 平台的第一个问题是使用哪个包创建软件以及基于哪个 Unix 基础软件。

  • Unix 基础软件
    • cygwin 的 sbutils 包源笔记。
  "aux" need to be renamed to "auxx". 
  perl -pi -e 's!\/aux\/!/aux!' Makfile
  http://cygwin.com/setup.html is the place to understand cygwin package format.
    • mingw
    • SFU
  • 包创建工具
    • MakeMSI(参见 http://users.cyberone.com.au/dbareis/makemsi.htm)自动构建(或更新)MSI 文件(或任何其他类型的 Windows Installer 数据库)。它使用类似 XML 的脚本语言,可以通过资源管理器或命令行调用。它还构建 MSI 文档,包括文件(MD5 检查安装的文件是否与预期等)和产品验证按钮。它包含一个非常强大的预处理器。
    对话框可以创建,并且可以轻松格式化,无需使用对话框编辑器。有许多针对不同用途和用户技能的“框架”。可以集成自定义操作代码,并且具有一些 ADSI/COMPLUS/调度和其他支持。以下是一个小型示例脚本(一个文件,一个快捷方式,一个小型基于 VBScript 的自定义操作)。
;--- Load MAKEMSI (via wrapper which configures MAKEMSI to work how I like it) ---
#include "DENNIS.MMH"

;--- Create INSTALLDIR (we wish to install file(s) here) ---
<$DirectoryTree Key="INSTALLDIR" Dir="[ProgramFilesFolder]\TryMe" CHANGE="\" PrimaryFolder="Y">

;--- Add "TRY.MM" and shortcut to same component (file must be keypath) ---
<$Component "TryMe" Create="Y" Directory_="INSTALLDIR">   ;;In this case GUID autogenerated (at least 1st time)
    ;--- Add the files to the "TryMe" component -----------------------------
    <$File SOURCE="TryMeWithAdvShortCut.MM" KeyPath="Y">

    ;--- Add the shortcut (advertise the "complete" feature) ----------------
    #(
        ;--- Advertised shortcut in "Start->programs" -----------------------
        <$Shortcut
                   Dir="ProgramMenuFolder"
               Feature="\"                        ;;root feature is my "complete" one
                 Title="Open TryMeWithAdvShortCut.MM (via default association)"
           Description=^Simply opens "TryMeWithAdvShortCut.MM" in associated handler (probably notepad)!^
                  Icon="@.\TryMe.ico"
               WorkDir="INSTALLDIR"
        >
    #)
<$/Component>

;--- Display a message during a non-silent install (logs if silent) ---------
#data "PopupCaData"
   ;--- Some data we'd like to pass to the CA -------------------------------
   "InstallationDirectory" "[INSTALLDIR]"
   "SystemFolder" "[SystemFolder]"
#data
<$VbsCa Binary="Popup.vbs" DATA=^PopupCaData^>
   <$VbsCaEntry "HiThere">
       ;--- If the VBSCRIPT "MsgBox" or similar function was used this would prevent a silent install ---
       #(
            CaMsgBox "I",
                     "Hi this is a message from '<?InputFile>'! This was displayed via a VBSCRIPT MSI custom action." &
                     vbCRLF & vbCRLF &
                     "Note that I have enlarged this message box so that when an error occurs you will see the whole text! " &
                     "This and most tweeking MAKEMSI does to the user interface is optional (most performed by ""UISAMPLE.MMH"")." &
                     vbCRLF & vbCRLF &
                     "The installation directory is """ & VbsCaCadGet("InstallationDirectory") & """. " &
                     "The system directory is """       & VbsCaCadGet("SystemFolder")          & """."
       #)
   <$/VbsCaEntry>
<$/VbsCa>
<$VbsCaSetup Binary="Popup.vbs" Entry="HiThere" Seq="StartServices-" CONDITION=^<$CONDITION_INSTALL_ONLY>^ DATA=^PopupCaData^>

  1. 使用 Wix 工具集生成 Unix 包的挑战是 GUID。幸运的是,mallow.exe 来解救。它可以扫描 src 目录并为每个组件(目录或文件)生成 GUID。
  2. 我们需要弄清楚如何使 pb 生成 wxs xml 文件,并在 mallow 的帮助下与 candle 和 light 通信以生成 msi 包。
  1. 以下是一个小型批处理文件,用于说明创建 msi 包、安装和删除此包。

candle 和 light 是一对类似于 redhat 中的 rpmbuild、Max OS X 中的 packagemaker 或 solaris 中的 pkgmk 的命令行包创建工具。

F:\src\wix\tutorial\Sample1>cat batch11.bat
del Sample11.msi
candle -nologo Sample11.wxs
light -nologo Sample11.wixobj
msiexec /i Sample11.msi /l* Sample11.log
rem msiexec /x Sample11.msi /qb
F:\src\wix\tutorial\Sample1>
  1. wix 包源在以下文本中显示,以下是一些待办事项。
    1. 将 pbuitils 的 .pb xml 文件转换为 wix 的 wxs XML。
    2. 弄清楚 msiexec 如何在没有实际 .msi 包的情况下使用包 ID 删除包。
F:\src\wix\tutorial\Sample1>cat Sample11.wxs
<?xml version='1.0' encoding='windows-1252'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2003/01/wi'>
  <Product Name='Foobar 1.0' Id='DB501C18-86C7-4D14-AEC0-86416A69ABDE'
    Language='1028' Codepage='1252'
    Version='1.0.0.0' Manufacturer='Acme Ltd.'>

    <Package Id='7EF38C48-95C1-4015-A361-3806ADA74AAC' Keywords='Installer'
      Description="Acme's Foobar 1.0 Installer"
      Comments='Foobar is a registered trademark of Acme Ltd.' Manufacturer='Acm
e Ltd.'
      InstallerVersion='100' Languages='1028' Compressed='yes' SummaryCodepage='
1252' />

    <Media Id='1' Cabinet='Sample.cab' EmbedCab='yes'
      DiskPrompt="Acme's Foobar 1.0 Installation CD-ROM" />

    <Directory Id='TARGETDIR' Name='SourceDir'>
      <Directory Id='ProgramFilesFolder' Name='PFiles'>
        <Directory Id='Acme' Name='Acme'>
          <Directory Id='INSTALLDIR' Name='Foobar10' LongName='Foobar 1.0'>

            <Component Id='MainExecutable' Guid='DCEECAA4-83F1-4F22-985B-FDB3C8ABD471'>
              <File Id='FoobarEXE' Name='Foobar10.exe' LongName='FoobarAppl10.exe' DiskId='1'
                src='FoobarAppl10.exe' Vital='yes' />
              <Shortcut Id="startmenuFoobar10" Directory="ProgramMenuDir" Name="Foobar10"
                LongName="Foobar 1.0" Target="Complete" WorkingDirectory='INSTALLDIR'
                Icon="Foobar10.exe" IconIndex="0" />
              <Shortcut Id="desktopFoobar10" Directory="DesktopFolder" Name="Foobar10"
                LongName="Foobar 1.0" Target="Complete" WorkingDirectory='INSTALLDIR'
                Icon="Foobar10.exe" IconIndex="0" />
              <File Id='HelperDLL' Name='Helper.dll' DiskId='1' src='Helper.dll' Vital='yes' />
            </Component>

            <Component Id='Manual' Guid='CE36F399-574D-4A9A-A266-5B5EC2C022A4'>
              <File Id='Manual' Name='Manual.pdf' DiskId='1' src='Manual.pdf' />

              <Shortcut Id="startmenuManual" Directory="ProgramMenuDir" Name="Manual"
                LongName="Instruction Manual" Target="Documentation" />
            </Component>

          </Directory>
        </Directory>
      </Directory>

      <Directory Id="ProgramMenuFolder" Name="PMenu" LongName="Programs">
        <Directory Id="ProgramMenuDir" Name='Foobar10' LongName="Foobar 1.0" />
      </Directory>

      <Directory Id="DesktopFolder" Name="Desktop" />
    </Directory>

    <Feature Id='Complete' Level='1'>
      <ComponentRef Id='MainExecutable' />
      <ComponentRef Id='Manual' />
    </Feature>

  </Product>
</Wix>

F:\src\wix\tutorial\Sample1>
  • WiX 和 MS 安装程序的参考资料。
 http://www.tramontana.co.hu/wix/
 http://www.ryanlowe.ca/blog/archives/001167_learning_wix_part_one.php
 http://blogs.msdn.com/robmen/
  • 移植 sbtools
  • 移植 pbtools
  • 移植 pkgutils
  • 移植 sbtools
  • 移植 pbtools
  • 移植 pkgutils
  • 移植 sbtools
  • 移植 pbtools
  • 移植 pkgutils

包管理流程

[编辑 | 编辑源代码]

软件工程流程包括通过软件开发人员设计和实现软件以生成源代码。然后需要构建、打包和管理源代码。我们可以将此流程分为三个步骤。

  • 软件构建流程 (SB),SB 可以分为以下流程,这些流程在构建机器上执行
    • 源代码解包
    • 源代码修补
    • 源代码配置
    • 构建源代码以生成二进制文件和文档
    • 二进制文件测试
    • 二进制文件安装
    • 二进制文件卸载
  • 包构建 (PB) 流程非常直接
    • 准备配置脚本
    • 准备初始化脚本以启动/停止应用程序服务
    • 调用本地 PMS 将二进制文件、文档和脚本打包到本地 PMS 格式中。
  • 包管理 (PKGUTIL) 流程
    • 上传和管理包在包仓库服务器上。
    • 安装
    • 删除
    • 升级/修补
    • 包依赖关系自动安装。

TWW HPMS 简介

[编辑 | 编辑源代码]

TWW 公司有三个工具与包管理流程相匹配。

  • 软件构建
    • sbutils
[root] ls -l /opt/TWWfsw/sbutils12/bin/
total 164
-rwxr-xr-x   1 root     root       38551 Dec  1 15:17 gen-sb-db
-rwxr-xr-x   1 root     root       44418 Dec  1 15:17 sb
[root]
  • 包构建
    • pbutils
[root] ls -l /opt/TWWfsw/pbutils11/bin/
total 186
-rwxr-xr-x   1 root     root       29975 Apr 30  2004 gen-pb-db
-rwxr-xr-x   1 root     root       29169 Apr 30  2004 gen-pkg-db
-rwxr-xr-x   1 root     root       34023 Apr 30  2004 pb
[root]

  • 包管理
    • pkgutils
[root] ls -l /opt/TWWfsw/pkgutils15/bin/
total 542
-rwxr-xr-x   1 root     root       32434 Jan 25  2004 chk-pkg-updates
-rwxr-xr-x   1 root     root       18751 Jan 25  2004 pkg-config
-rwxr-xr-x   1 root     root       48281 Jan 25  2004 pkg-info
-rwxr-xr-x   1 root     root       70570 Jan 25  2004 pkg-inst
-rwxr-xr-x   1 root     other      68887 May 18  2003 pkg-inst~
-rwxr-xr-x   1 root     root       35692 Jan 25  2004 pkg-rm
[root]
  • 如何获取 TWW 工具?

TWW 公司

[编辑 | 编辑源代码]

所有 TWW 工具及其支持包的源代码均符合 GPL 协议。它们在他们的 FTP 站点 ftp://support.thewrittenword.com 上免费提供。但他们的支持劳动和二进制包并不免费。我们很高兴 TWW 公司找到了一种方法来进行开源工作,并且仍然可以从中谋生。如果您的工作场所需要此类服务,请支持 TWW 公司 ( http://shopping.netsuite.com/tww )。

华夏公益教科书