Fedora下Msitools使用
msitools学习
概述
打包程序就是把程序依赖的所有库文件和可执行文件以及其他一些资源文件按照源目录结构进行压缩,知道自己的程序依赖哪些库是简单的,但是要知道依赖的库依赖哪些库就非常复杂了,所以我们需要使用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使用的更多相关文章
- ###Fedora下安装Retext
使用Markdown. #@date: 2012-05-07 #@author: gr #@email: forgerui@gmail.com 因为习惯了Markdown的简单,所以需要在自己的Fed ...
- Linux(Fedora)下NodeJs升级最新版本(制定版本)
Linux(Fedora)下NodeJs升级最新版本(制定版本) 首先安装n模块: npm install -g n 升级node.js到最新稳定版 n stable 升级node.js到制定版本 n ...
- Fedora下用Iptux,中文乱码解决
Ubuntu/Fedora下用Iptux与Windows下大飞鸽传书,中文乱码解决 问题描述: 在Ubuntu/Fedora下安装了Iptux后,再往Windows机器上发送文件或消息时,如果有中文, ...
- linux(fedora) 下dvwa 建筑环境
linux(fedora)下dvwa组态 1.下载httpd,dvwa,mysql,mysqlserver, php-mysql,php 除了dvwa 这是外界进入下一官方网站.该服务通过休息inst ...
- fedora下一些问题的解决方案汇总
解决fedora下一些使用问题 一 解决fedora下无法使用Fn+功能键来调整亮度的问题 在fedora下,背光的配置参数在/sys/class/backlight文件夹下,根据不同的显卡,有不同的 ...
- Fedora下phpMyAdmin的安装和配置
phpMyAdmin主要用于以web界面形式管理mysql.其在Fedora下的安装方法如下: 1. yum install phpMyAdmin 利用yum安装的phpMyAdmin,其路径如下: ...
- OpenCV在Linux(Fedora)下搭建开发环境简述
盼望了好久的Fedora21终于发行了.先来晒一张图: 默认桌面还是那么简洁: 好了,废话少说.来看看在Fedora下搭建opencv开发环境,因为我已经搭建好了(过程比较艰辛) 先注明参考文章,感谢 ...
- fedora下编译运行java傻瓜入门级教程
操作步骤: 编译运行环境的搭建 fedora下默认安装为GNU公司的JDK,如下所示 $java -version java version "1.7.0_25" OpenJDK ...
- fedora下手动编译安装vim
据说手动编译安装可以更适合自己的电脑哦- 1.首先,我门要下载源文件,下载地址:ftp://ftp.vim.org/pub/vim/unix/ 选择一个最新版本,我这里选择的是 vim-7.4.tar ...
随机推荐
- POJ 2442 Sequence【堆】
题目链接:http://poj.org/problem?id=2442 题目大意:给出一个m*n的矩阵,从每一行中取出一个数相加.能得到n^m个不同的结果.要求输出当中前n项. 建立一个以n元数组为底 ...
- Error: Failed to fetch plugin E:_My_File______workMyCodemyCodecordova-workspaceplugman-testMyMath via registry. Probably this is either a connection problem, or plugin spec is incorrect.
$ cordova plugin add E:\_My_File_____\_work\MyCode\myCode\cordova-workspace\plugman-test\MyMath --sa ...
- Java基础教程:面向对象编程[2]
Java基础教程:面向对象编程[2] 内容大纲 访问修饰符 四种访问修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java 支持 4 种不同的访问权限. default ...
- HDU - 1495 非常可乐 【BFS】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1495 思路 首先 如果可乐的体积 是奇数 那么是无解的 然后 如果能够得到两杯 都是一般容量的可乐 那 ...
- 让我们再谈谈 iOS 安全
前言 安全方面的话题总是聊不完的.这不,国外一家有名的专门攻击别人的安全公司 Hacking Team 自己被 Hack 了,结果有 400 多 G 的攻击资料泄漏出来,包括一些 0-day 的漏洞. ...
- 算法(Algorithms)第4版 练习 1.3.11
主要思路: 这个和Dijkstrad的双栈算法不太一样,后缀的计算只需要一个栈即可. 用一个栈来存数字栈即可. 遇到数字,压栈. 遇到运算法,从栈中弹出相应的数字,用该运算法计算得到结果. 再次压入栈 ...
- 算法(Algorithms)第4版 练习 链表类 1.3.19~1.3.29
package com.qiusongde.linkedlist; import java.util.Iterator; import java.util.NoSuchElementException ...
- Vim设置括号自动补全和快速跳出
一.设置括号自动补全 inoremap ' ''<ESC>i inoremap " ""<ESC>i inoremap ( ()<ESC&g ...
- BZOJ 1724 [Usaco2006 Nov]Fence Repair 切割木板:贪心 优先队列【合并果子】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1724 题意: 你要将一块长木板切成n段,长度分别为a[i](长木板的长度 = ∑ a[i] ...
- static语句块的执行时间
package utfTest; public class Test01 { public static void main(String[] args) { //Person.show(); Sys ...