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 ...
随机推荐
- Swift 学习笔记(面向协议编程)
在Swift中协议不仅可以定义方法和属性,而且协议是可以扩展的,最关键的是,在协议的扩展中可以添加一些方法的默认实现,就是在协议的方法中可以实现一些逻辑,由于这个特性,Swift是可以面向协议进行编程 ...
- ddchuxing——php面试题及答案
1. echo和print的区别 echo没有返回值,print有返回值1,执行失败时返回false:echo输出的速度比print快,因为没有返回值:echo可以输出一个或多个字符串,print只 ...
- Dijkstra的堆优化
先附上一个例题:P3371 [模板]单源最短路径 一眼扫去,最短路... spfa可行,但是今天的主题是Dijkstra: #include<iostream> #include<a ...
- 关于调用notifyDataSetChanged刷新PullToRefreshListView列表无反应解决办法
文章转载自:关于调用notifyDataSetChanged刷新PullToRefreshListView列表无反应解决办法 | TeachCourse
- python网络爬虫之requests库 二
前面一篇在介绍request登录CSDN网站的时候,是采用的固定cookie的方式,也就是先通过抓包的方式得到cookie值,然后将cookie值加在发送的数据包中发送到服务器进行认证. 就好比获取如 ...
- 出版物排版软件——对XML数据进行排版、浏览、转换、打印
XML和XSL进行排版的功能强大的软件,并将排版结果进行打印或转换成各种各样的文件格式,满足各方需求. 随着出版物电子排版方式的普及,大部头出版物的排版,越来越多的应用在人们的工作中.比如,惠普公 ...
- Java8系列之重新认识HashMap(转)
转自美团电瓶技术团队:原文地址 简介 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap.Hashtable.LinkedHashM ...
- 【Leetcode-easy】Remove Duplicates from Sorted Array
题目要求:删除排好序的含有重复元素的数组.返回去除重复后的数组长度,并更新原始数组.不能使用额外空间. 思路:要不额外的使用内存空间,那么只有遍历数组,count保持下一个不重复的数字,遍历过程中如果 ...
- 织梦简洁机械设备dedecms模板
织梦简洁机械设备dedecms模板,个人网站模板,dedecms模板. 模板地址:http://www.huiyi8.com/sc/7269.html
- 网络编程学习笔记-listen函数
listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程.在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接 ...