msitools学习

msitools使用

wixl-heat使用

概述

打包程序就是把程序依赖的所有库文件和可执行文件以及其他一些资源文件按照源目录结构进行压缩,知道自己的程序依赖哪些库是简单的,但是要知道依赖的库依赖哪些库就非常复杂了,所以我们需要使用msitools,它为我们预置了很多常用库的模板,即这些库包含哪些文件,并依赖了哪些文件,我们使用这些模板就能非常方便的找出我们程序所需要的所有文件了,预置的模板可以通过命令rpm -ql msitools | grep wxi查询

wxi文件介绍

使用spice-gtk3.wxi作为样例来简单的介绍下wxi文件基本格式,wxi类似C++中的头文件,可以使用?require来包含wxi文件

$ cat /usr/share/wixl-0.95/include/spice-gtk3.wxi
<?xml version="1.0" encoding="utf-8"?>
<?require gtk3.wxi?>
<?require spice-glib.wxi?>
<Include xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="INSTALLDIR">
<Directory Id="dirF3B61B20E2250498456FBB66DD63E154" Name="bin">
<Component Win64="$(var.Win64)" Id="cmpA1DABC2491D8FFEDE1B305115701456D" Guid="*">
<File Id="filF15A4CFCF3F047C36D3A6592CDAC3D33" KeyPath="yes" Source="$(var.SourceDir)/bin/libspice-client-gtk-3.0-5.dll"/>
</Component>
</Directory>
</DirectoryRef>
</Fragment>
<Fragment>
<ComponentGroup Id="CG.spice-gtk3">
<ComponentGroupRef Id="CG.gtk3"/>
<ComponentGroupRef Id="CG.spice-glib"/>
<ComponentRef Id="cmpA1DABC2491D8FFEDE1B305115701456D"/>
</ComponentGroup>
</Fragment>
</Include>
  • xml节点 : xml的标准开头
  • require节点 : spice-gtk3所依赖的库的wxi文件
  • Include节点 : 描述spice-gtk3的库文件信息的顶层容器元素
  • Fragment节点 : 构建安装模块信息的原子单元
  • DirectoryRef节点 : 在另一个片段中创建一个目录元素的引用
  • Directory节点 : 产品的目录布局,同样还能指定源目录和目标目录之间的映射
  • Component节点 : 父目录的组件
  • File节点 : 文件列表的文件规范,必须是Component的子节点
  • ComponentGroup节点 : 组织多个在其他地方使用的组件
  • ComponentRef节点 : Component节点的引用
  • ComponentGroupRef节点 : ComponentGroup节点的引用

现在对spice-gtk3.wxi文件进行详细说明:

  • 3、4 : 引用gtk3和spice-glib库
  • 7、8 : 指明安装目录为bin
  • 9、10 : 添加spice-gtk3自身文件
  • 16、17、18、19 : 打包spice-gtk3组,可在其他地方通过require+ComponentGroupRef的方式使用

使用wixl-heat生成wxi文件

wixl-heat接收文件列表作为输入(文件列表可以通过ls、find以及rpm -ql获取),产生项目的文件列表以及依赖文件

echo /usr/i686-w64-mingw32/sys-root/mingw/bin/zlib1.dll | wixl-heat -p /usr/i686-w64-mingw32/sys-root/mingw/ --component-group CG.zlib --var var.SourceDir
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="TARGETDIR">
<Directory Id="dir9A5D56716D566997FA290054D161AF96" Name="bin">
<Component Id="cmp9FA4766702C1F85ABA6E04DE3B061A12" Guid="*">
<File Id="filE110AAB4803C5CC567BBCF8AD3BB7C08" KeyPath="yes" Source="$(var.SourceDir)/bin/zlib1.dll"/>
</Component>
</Directory>
</DirectoryRef>
</Fragment>
<Fragment>
<ComponentGroup Id="CG.zlib">
<ComponentRef Id="cmp9FA4766702C1F85ABA6E04DE3B061A12"/>
</ComponentGroup>
</Fragment>
</Wix>
<!-- generated with msitools 0.93.40-6aec -->
<!-- wixl-heat -p /usr/i686-w64-mingw32/sys-root/mingw/ -component-group CG.zlib -var var.SourceDir -->

个人对于-p参数的理解,因为要保持linux下和windows下目录结构的一致,例如linux下的"/usr/i686-w64-mingw32/sys-root/mingw/bin",在windows下就是"C:\Program Files (x86)\ProjectName\bin",其中不同的部分就是bin之前的部分,所以-p就是用变量来替换这些不同的部分

virt-viewer的msi制作研究

virt-viewer的msi制作模拟

下面的片段截取virt-viewer的data目录的Makefile.am文件

virt-viewer-$(WIXL_ARCH)-$(VERSION).msi: virt-viewer.wxs deps.txt
$(AM_V_GEN)DESTDIR=`mktemp -d` && \
make -C $(top_builddir) install DESTDIR=$$DESTDIR >/dev/null && \
find $$DESTDIR | wixl-heat -p $$DESTDIR$(prefix)/ \
--component-group CG.virt-viewer --var var.DESTDIR \
--directory-ref=INSTALLDIR > virt-viewer-files.wxs && \
MANUFACTURER="$(MANUFACTURER)" wixl -D SourceDir=$(prefix) \
-D DESTDIR=$$DESTDIR$(prefix) \
-D HaveSpiceGtk=$(HaveSpiceGtk) \
-D HaveGtkVnc=$(HaveGtkVnc) \
-D HaveLibvirt=$(HaveLibvirt) \
-D HaveOVirt=$(HaveOVirt) \
--arch $(WIXL_ARCH) \
-o $@ \
$< virt-viewer-files.wxs && \
rm -rf $$DESTDIR virt-viewer-files.wxs

我们手动创建tmp目录来模拟 mktemp -d 命令

$ pwd
/home/fedora/x86/virt-viewer/data/tmp

执行install命令,生成如下目录结构

$ make -C /home/fedora/x86/virt-viewer install DESTDIR=/home/fedora/x86/virt-viewer/data/tmp
$ ls usr/i686-w64-mingw32/sys-root/mingw/
bin/ share/

执行find命令

$ find /home/fedora/x86/virt-viewer/data/tmp/ | wixl-heat -p /home/fedora/x86/virt-viewer/data/tmp/usr/i686-w64-mingw32/sys-root/mingw/ --component-group CG.virt-viewer --var var.DESTDIR --directory-ref=INSTALLDIR > virt-viewer-files.wxs
$ ls
usr virt-viewer-files.wxs
$ cp *.wxi ./tmp/
$ cd tmp/
$ rpm -qa | grep mingw32 | sort | unix2dos > deps.txt
$ ls
adwaita-icons-needed.wxi deps.txt usr virt-viewer-files.wxs virt-viewer.wxs

执行wixl命令(因为我们没有使用makefile所以有些变量需要修改成固定值)

$ vim ./virt-viewer.wxs
//修改如下四处
:1,$ s/$(env.MANUFACTURER)/0/
:1,$ s/$(var.Version)/0/
:1,$ s/$(var.UpgradeCode)/0/
<Icon Id="virt-viewer.ico" SourceFile="../../icons/virt-viewer.ico"/> $ wixl -D SourceDir=/usr/i686-w64-mingw32/sys-root/mingw -D DESTDIR=/home/fedora/x86/virt-viewer/data/tmp/usr/i686-w64-mingw32/sys-root/mingw -D HaveSpiceGtk=True -D HaveGtkVnc=False -D HaveLibvirt=False -D HaveOVirt=False --arch x86 -o virt-viewer-x86-3.0.msi virt-viewer.wxs virt-viewer-files.wxs
$ msiextract -l virt-viewer-x86-3.0.msi

virt-viewer的msi制作解析

virt-viewer.wxs描述一些图标等资源文件以及安装信息,动态生成的virt-viewer-files.wxs就是我们make install产生的工程文件,通过这两个文件就生成了msi文件。fedora下的msitools毕竟没有windows下的wixtoolset那么强大,所以很多功能都还是不支持的

总结

开源项目有很多值得借鉴和参考的部分,我们能够读懂并能够根据实际需求进行修改是最实用的技能

Fedora下Msitools使用的更多相关文章

  1. ###Fedora下安装Retext

    使用Markdown. #@date: 2012-05-07 #@author: gr #@email: forgerui@gmail.com 因为习惯了Markdown的简单,所以需要在自己的Fed ...

  2. Linux(Fedora)下NodeJs升级最新版本(制定版本)

    Linux(Fedora)下NodeJs升级最新版本(制定版本) 首先安装n模块: npm install -g n 升级node.js到最新稳定版 n stable 升级node.js到制定版本 n ...

  3. Fedora下用Iptux,中文乱码解决

    Ubuntu/Fedora下用Iptux与Windows下大飞鸽传书,中文乱码解决 问题描述: 在Ubuntu/Fedora下安装了Iptux后,再往Windows机器上发送文件或消息时,如果有中文, ...

  4. linux(fedora) 下dvwa 建筑环境

    linux(fedora)下dvwa组态 1.下载httpd,dvwa,mysql,mysqlserver, php-mysql,php 除了dvwa 这是外界进入下一官方网站.该服务通过休息inst ...

  5. fedora下一些问题的解决方案汇总

    解决fedora下一些使用问题 一 解决fedora下无法使用Fn+功能键来调整亮度的问题 在fedora下,背光的配置参数在/sys/class/backlight文件夹下,根据不同的显卡,有不同的 ...

  6. Fedora下phpMyAdmin的安装和配置

    phpMyAdmin主要用于以web界面形式管理mysql.其在Fedora下的安装方法如下: 1. yum install phpMyAdmin 利用yum安装的phpMyAdmin,其路径如下: ...

  7. OpenCV在Linux(Fedora)下搭建开发环境简述

    盼望了好久的Fedora21终于发行了.先来晒一张图: 默认桌面还是那么简洁: 好了,废话少说.来看看在Fedora下搭建opencv开发环境,因为我已经搭建好了(过程比较艰辛) 先注明参考文章,感谢 ...

  8. fedora下编译运行java傻瓜入门级教程

    操作步骤: 编译运行环境的搭建 fedora下默认安装为GNU公司的JDK,如下所示 $java -version java version "1.7.0_25" OpenJDK ...

  9. fedora下手动编译安装vim

    据说手动编译安装可以更适合自己的电脑哦- 1.首先,我门要下载源文件,下载地址:ftp://ftp.vim.org/pub/vim/unix/ 选择一个最新版本,我这里选择的是 vim-7.4.tar ...

随机推荐

  1. Swift 学习笔记(扩展和泛型)

    在开始介绍Swift中的扩展之前,我们先来回忆一下OC中的扩展. 在OC中如果我们想对一个类进行功能的扩充,我们会怎么做呢. 对于面向对象编程的话,首先会想到继承,但是继承有两个问题. 第一个问题:继 ...

  2. LeetCode:有效的括号【20】

    LeetCode:有效的括号[20] 题目描述 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. ...

  3. Algorithm: bit manipulation

    1. 一个数的从右起第p1位和第p2位swap n位 unsigned int swapBits(unsigned int x, unsigned int p1, unsigned int p2, u ...

  4. BZOJ 3671 NOI2014 随机数生成器

    这题其实是个暴力. 首先那一堆如何构造n*m方格的东西都是在玩你. 构造出来方阵后,由于是一个排列,不存在重复,可以大力贪心. 每次将选出一个最小的元素,然后将它右上左下的元素全部打上标记(记得bre ...

  5. 《C prime plus (第五版)》 ---第11章 字符串和字符串函数

    11-1:字符串表示和字符串I/O 1.首先先通过一个整体的例子来初步了解建立,读入和输出字符串的几种方式. #include<stdio.h> #define MSG "你一定 ...

  6. Spring Boot2.0之Admin-UI分布式微服务监控中心

    前面https://www.cnblogs.com/toov5/p/9823353.html  说的很不好用哈哈 还需要json格式化 我们可以用Admin-UI 比较爽歪歪 原理: 将所有服务的监控 ...

  7. 学习c语言的第14天

    #include <stdio.h> #include <string.h> struct student { int age; char sex; char name[100 ...

  8. 使用gdb调试c/c++代码

    转自 http://blog.csdn.net/haoel/article/details/2879 GDB概述———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较 ...

  9. JS事件派发器EventEmitter

    原文地址:http://zhangyiheng.com/blog/articles/js_event_mitter.html 需求 随着Browser客户端JS越来越复杂,MVC(Client端)设计 ...

  10. capsule network——CNN仅仅考虑了“有没有”的问题,没有考虑feature map的结构关系。这个结构关系包括位置,角度等。Capsule layer的输出也跟feature map的max-pooling输出不同,capsule layer的输出是一个向量,这个向量包含了位置,大小,角度等信息,这是feature map仅能输出一个值所不具备的;训练比较慢

    capsule network--<Dynamic Routing Between Capsules> from:https://zhuanlan.zhihu.com/p/31491520 ...