浅谈 qmake 之 shadow build(将源码路径和构建路径分开,一套源码要分别用msvc2008、msvc2008、mingw分别编译又不互相干扰)
shadow build
shadow build 是什么东西?就是将源码路径和构建路径分开(也就是生成的makefile文件和其他产物都不放到源码路径),以此来保证源码路径的清洁。
这不是qmake独创的东西,cmake中早就使用这个东西了
| cmake | qmake | 备注 | |
| in-source | cmake . | qmake project.pro | 在源码路径下执行 | 
| out-of-source | mkdir build cd build | mkdir build cd build  | 创建目录,在其他路径下执行(参数指向源码路径) | 
- 注意:
- qmake 的shadow build还是很不完善,与cmake尚不可同日而语
- qmake 的shadow build目录不可以是源码目录的子目录
之前
在shadow-build之前,为了将生成物和源码尽可能的分开,我们一般都会设置很多qmake的变量,比如:
| DESTDIR = $$PWD/bin | 目标文件放置位置 | 
| DLLDESTDIR = $$[QT_INSTALL_BINS] | win下拷贝动态库到qt安装路径 | 
| MOC_DIR = $$PWD/temp | moc的产物放置何处 | 
| RCC_DIR = $$PWD/temp | rcc的产物放置何处 | 
| UI_DIR = $$PWD/temp | uic的产物放置何处 | 
| OBJECTS_DIR = PWD/temp/ TARGET | 编译器生成的.o(.obj)等文件放置 | 
这样一来,我们将Qt的扩展部分(moc/rcc/uic)以及编译器的中间产物都放置到了一个 temp 子目录中。源码还算比较清洁,可是和out-of-source比较的话,还是不太爽:
- 生成的 makefile 依然在源码路径下
- 如果一套源码要分别用msvc2008、msvc2008、mingw分别编译又不互相干扰呢?
之后
有了 out-of-source 就方便多了:
|-- project-sources/
|-- build-vs2008/
|-- build-vs2005/
|-- build-mingw/
|-- build-symbian/
|-- build-dbzhang800/
|-- ...
创建一个构建目录,然后在该目录下调用合适的qmake,并指向源码下的工程文件即可
qmake ../project-sources/project.pro
有用的变量
前面提到的了,qmake的shadow-build功能尚不完善,一个表现就是提供的可用变量太少了,呵呵(个人观点,有点找拍哈,可能大家都喜欢简单 dbzhang800 20110423)
| PWD | 使用该变量的文件(.pro 或 .pri)所在目录,注意对比下一个 | 
| _PRO_FILE_PWD_ | pro文件所在目录(注意:即使它用在pri文件内,也是指代的包含它的pro文件所在的目录) | 
| _PRO_FILE_ | pro文件的全路径 | 
| OUT_PWD | 生成的makefile文件所在路径,和_PRO_FILE_PWD_对应 | 
当不使用shadow build构建时,OUT_PWD 和 _PRO_FILE_PWD_ 是相同的,据此,我们可以判断采用了何种构建方式,进而采用不同的动作:
!contains(_PRO_FILE_PWD_, $${OUT_PWD}) {
#do something when using shadow build
}
#直接使用equals更好一些,但是manual对此没有任何说明(所以我不清楚你的qmake对此是否支持,至少Qt4.5以后都是支持的)
!equals(_PRO_FILE_PWD_, OUT_PWD) {
#do something when using shadow build
}
比如说,采用out-of-source构建时,我们可能需要将一些文件从源码目录拷贝到构建目录下,用cmake时,这个很容易做到,但在qmake下,似乎缺少通用的方式,一个简单的demo如下:
- 注意:所有要拷贝的文件只能用相对路径指定(你可以帮着改进一下,我没找到合适的函数)
- 这段代码需要放到pro文件内,或者同目录的pri文件内 
FILES_COPY_SRC = $$SOURCES /
dbzhang800.txt /
images/abc.png /
i18n/abcd.qm win32{
COPY = copy /y
MKDIR = mkdir
}else{
COPY = cp
MKDIR = mkdir -p
}
!equals(_PRO_FILE_PWD_, OUT_PWD) {
for(f, FILES_COPY_SRC){
dist_file = $$OUT_PWD/$$f
dist = $$dirname(dist_file)
win32:dist = $$replace(dist, /, //)
!exists($$dist):system($$MKDIR $$dist)
!exists($$dist_file):system($$COPY $$f $$dist)
}
}
还是写一点解释吧,可能对大家有帮助,也防止自己时间长了会忘记。
- windows下,必须先将路径分割符由“/”替换成 “/”
- 目标目录不存在,创建目录。
- 目标文件不存在,拷贝文件。
参考
- qmake manual
http://blog.csdn.net/dbzhang800/article/details/6343838
浅谈 qmake 之 shadow build(将源码路径和构建路径分开,一套源码要分别用msvc2008、msvc2008、mingw分别编译又不互相干扰)的更多相关文章
- 浅谈 qmake 之 shadow build
		shadow build shadow build 是什么东西?就是将源码路径和构建路径分开(也就是生成的makefile文件和其他产物都不放到源码路径),以此来保证源码路径的清洁. 这不是qmake ... 
- 浅谈 qmake 之 shadow build(就是将源码路径和构建路径分开)
		shadow build shadow build 是什么东西?就是将源码路径和构建路径分开(也就是生成的makefile文件和其他产物都不放到源码路径),以此来保证源码路径的清洁. 这不是qmake ... 
- 浅谈qmake之pro、pri、prf、prl文件
		浅谈qmake之pro.pri.prf.prl文件 转载自:http://blog.csdn.net/dbzhang800/article/details/6348432 尽管每次和cmake对比起来 ... 
- 浅谈 qmake 之 pro、pri、prf、prl文件
		尽管每次和cmake对比起来,我们总是说 qmake 简单.功能少.但是qmake仍然是一个非常复杂的东西,我想大多人应该和我一样吧: 不是太清楚CONFIG等变量到底如何起作用的 用过的qmake内 ... 
- 浅谈 Fragment 生命周期
		版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ... 
- 浅谈Vue中计算属性(computed)和方法(methods)的差别
		浅谈Vue中计算属性(computed)和方法(methods)的差别 源码地址 methods方法和computed计算属性,两种方式的最终结果确实是完全相同 计算属性是基于它们的响应式依赖进行缓存 ... 
- 通用后台管理系统源码,响应式布局,Java管理系统源码,零门槛安装部署
		本项目是一个通用响应式管理后台,导入开发环境安装就能直接运行,界面也非诚漂亮,在PC端和移动端也是自适应的.非常适合企业或者个人搭建各种商城后台,博客后台,网站管理后台等. 源码启动后的截图 需要这套 ... 
- 【转】.NET(C#):浅谈程序集清单资源和RESX资源  关于单元测试的思考--Asp.Net Core单元测试最佳实践  封装自己的dapper lambda扩展-设计篇  编写自己的dapper lambda扩展-使用篇  正确理解CAP定理  Quartz.NET的使用(附源码)  整理自己的.net工具库  GC的前世与今生  Visual Studio Package 插件开发之自动生
		[转].NET(C#):浅谈程序集清单资源和RESX资源 目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ... 
- 车大棒浅谈jQuery源码(二)
		前言 本来只是一个自己学习jQuery笔记的简单分享,没想到获得这么多人赏识.我自己也是傻呵呵的一脸迷茫,感觉到受宠若惊. 不过还是有人向批判我的文章说,这是基本知识点,完全跟jQuery源码沾不上边 ... 
随机推荐
- 使用Keil软件编写汇编源程序应注意事项
			1)一定要使用微软的txt文本编辑器,否则键入逗号时编译通不过.应该是这个样('),不该是这个样(,). 2) 用数字做标号时,前面一定要加一个英文字母,否则编译通不过. 3) 有时编译通过的.asm ... 
- linux下的shell和脚本
			1.各种Unix shell linux下的shell基本是从unix环境中的shell发展而来,贴一下wiki:其中我们常用的,可归类为Bourne Shell(/usr/bin/sh或/bin/s ... 
- testng xml 示例
			TestNG的DTD检查文件:http://testng.org/testng-1.0.dtd.php 更多testng配置及说明,请移步http://testdoc.org/docmaster?pi ... 
- IIS 问题解决
			一.网站发布后 报500错误 解决办法:重新向iis注册framwork: 二.试图加载格式不正确的程序.(Exception from HRESULT: 0x8007000B) 解决办法:对应应用程 ... 
- 3DShader之移位贴图(Displacement Mapping)
			我们知道法线贴图是只是改了物体的法线属性,用来计算光照,但是并没有改变物体本身的网格.但是移位贴图就不一样了,它会移动物体的顶点.我用移位贴图做了个海洋,好了,上了图再讲: 注意看海的边缘的顶点,已经 ... 
- [Redux] Extracting Container Components -- Complete
			Clean TodoApp Component, it doesn't need to receive any props from the top level component: const To ... 
- linux上网络配置不生效的怪异现象处理
			1.在Linux上.在ifcfg-eth0上设置IP地址等信息 具体配置信息例如以下已 [root@rac01 Desktop]#more/etc/sysconfig/network-scripts/ ... 
- rsync+sersync实现数据文件实时同步
			一.简介 sersync是基于Inotify开发的,类似于Inotify-tools的工具: sersync可以记录下被监听目录中发生变化的(包括增加.删除.修改)具体某一个文件或某一个目录的名字: ... 
- oendir(),readdir(),closedir() 打开/读取/关闭目录
			目录操作 当目标是目录而不是文件的时候,ls -l的结果会显示目录下所有子条目的信息,怎么去遍历整个目录呢?答案马上揭晓! 1. 打开目录 功能:opendir()用来打开参数name指定的目录,并返 ... 
- python网络编程之socket
			*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ... 
