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 ...
随机推荐
- Android笔记之Retrofit与RxJava的组合
依赖 implementation 'com.squareup.retrofit2:retrofit:2.5.0' implementation 'com.squareup.retrofit2:con ...
- 一起来学linux:SAMBA服务器搭建
前面介绍的NFS服务器的用来linux和linux系统之间共享文件和目录的,那如果是linux和windows之间需要共享修改文件该如何操作呢.这据需要用到SAMBA系统.我们首先来看下SAMBA系统 ...
- spring运行步骤
Spring确实使你能通过最简单可行的解决的方法来解决你的问题. 而这是有有非常大价值的.同一时候他的源码的设计理念也受到非常多程序猿的追捧,简洁,易用.但是从哪着手研究Spring却是非常多新手头疼 ...
- LeetCode:砖墙【554】
LeetCode:砖墙[554] 题目描述 你的面前有一堵方形的.由多行砖块组成的砖墙. 这些砖块高度相同但是宽度不同.你现在要画一条自顶向下的.穿过最少砖块的垂线. 砖墙由行的列表表示. 每一行都是 ...
- LightOJ - 1038 Race to 1 Again —— 期望
题目链接:https://vjudge.net/problem/LightOJ-1038 1038 - Race to 1 Again PDF (English) Statistics Foru ...
- Zookeeper原理与Curator使用
近期打算实现一个基于Zookeeper的分布式的集群状态一致性控制, 对Zookeeper的原理不太了解, 正好学习一下, 网上找到了几篇文章, 先贴在这边, 等我熟读官方文档后, 再来补充自己的见解 ...
- leetcode 191 Number of 1 Bits(位运算)
Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also know ...
- 运算符-----------instanceof
- bzoj 2251: 外星联络 后缀Trie
题目大意 http://www.lydsy.com/JudgeOnline/problem.php?id=2251 题解 本来以为这道题应该从01序列的性质入手 结果就想歪了 等自己跳出了01序列这个 ...
- python使用uuid生成唯一id或str
介绍: UUID是128位的全局唯一标识符,通常由32字节的字符串表示. 使用: import uuid print uuid.uuid1() 14bfe806-f1c7-11e6-83b5-0680 ...