浅谈 qmake 之 shadow build
来源:互联网 发布:南水北调失败 知乎 编辑:程序博客网 时间:2024/05/18 17:05
shadow build
shadow build 是什么东西?就是将源码路径和构建路径分开(也就是生成的makefile文件和其他产物都不放到源码路径),以此来保证源码路径的清洁。
这不是qmake独创的东西,cmake中早就使用这个东西了
cmake
qmake
备注
in-source
cmake .
qmake project.pro
在源码路径下执行
out-of-source
(shadow-build)
mkdir build
cd build
cmake ../project
mkdir build
cd build
qmake ../project/project.pro
创建目录,在其他路径下执行(参数指向源码路径)
- 注意:
- 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.qmwin32{ 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
qmake 之 CONFIG(debug, debug|release)
qmake使用练习:包含动态库的工程
分析与学习Qt Solution对qmake的使用
qmake之CONFIG与QT
- 浅谈 qmake 之 shadow build
- 浅谈 qmake 之 shadow build
- 浅谈 qmake 之 shadow build
- 浅谈 qmake 之 shadow build
- 浅谈 qmake 之 shadow build
- 浅谈 qmake 之 shadow build
- 浅谈 qmake 之 shadow build
- qt的qmake和shadow build
- Qt 界面文件不更新以及qmake和shadow build简介
- 浅谈 qmake 之 pro、pri、prf、prl文件
- 浅谈 qmake 之 pro、pri、prf、prl文件
- 浅谈 qmake 之 pro、pri、prf、prl文件
- 浅谈qmake之pro、pri、prf、prl文件
- 浅谈 qmake 之 pro、pri、prf、prl文件
- 浅谈 qmake 之 pro、pri、prf、prl文件
- 浅谈 qmake 之 pro、pri、prf、prl文件
- 浅谈 qmake 之 pro、pri、prf、prl文件
- 浅谈 qmake 之 pro、pri、prf、prl文件
- VB6中模拟按钮的实现
- SQL语句嵌套最好用quotedstr函数替换
- ibatis动态查询
- 使用swing中的JTable时常见问题
- Nagios 编译配置
- 浅谈 qmake 之 shadow build
- 危险的搜索引擎优化作弊
- TCP/IP详解读书笔记——IP协议
- CAP原理和BASE思想
- CheckboxGroup的reset()方法
- 转载:C语言指针的初始化和赋值
- ★ USB 驅動程式「libusb 函式庫」的介紹及其使用範例 ★
- Section 3.3 Home on the Range
- 随笔生活