注:论坛上格式不好控制,(blog原文链接如下:http://blog.csdn.net/dbzhang800/archive/2011/04/23/6343838.aspx)
shadow buildshadow build 是什么东西?就是将源码路径和构建路径分开(也就是生成的makefile文件和
其他产物都不放到源码路径),以此来保证源码路径的清洁。
这不是qmake独创的东西,cmake中早就使用这个东西了
- 注意:
- qmake 的shadow build还是很不完善,与cmake尚不可同日而语
- qmake 的shadow build目录不可以是源码目录的子目录
之前在shadow-build之前,为了将生成物和源码尽可能的分开,我们一般都会设置很多qmake的变量,比如:
这样一来,我们将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)
当不使用shadow build构建时,OUT_PWD 和 _PRO_FILE_PWD_ 是相同的,据此,我们可以判断采用了何种构建方式,进而采用不同的动作:
!contains(_PRO_FILE_PWD_, $${OUT_PWD}) {
#do something when using shadow build
}
比如说,采用out-of-source构建时,我们可能需要将一些文件从源码目录拷贝到构建目录下,用cmake时,这个很容易做到,但在qmake下,似乎缺少通用的方式,一个简单的demo如下:
FILES_COPY_SRC = $$SOURCES\
readme.txt
unix:COPY = cp
win32:COPY = copy /y
!contains(_PRO_FILE_PWD_, $${OUT_PWD}) {
for(f, FILES_COPY_SRC){
dist = $$OUT_PWD/$$f
win32:dist=$$replace(dist, /, \\)
system($$COPY $$f $$dist)
}
}参考