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分别编译又不互相干扰呢?

创建一个构建目录,然后在该目录下调用合适的qmake,并指向源码下的工程文件即可

qmake ../project-sources/project.pro
本人的一个例子:
假设项目存于huang/下面叫xxx
shadow目录与huang位于同一级叫huangbuild
我们想在huangbuild下建立xxx-Debug与xxx-Release用来标示是xxx的debug与release
我们需要进入huangbuild目录下,如果是debug就进debug目录下,这个时qmake ../../huang/xxx.pro
release与此类似

有用的变量

前面提到的了,qmake的shadow-build功能尚不完善

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 之 shadow build的更多相关文章

  1. 浅谈 qmake 之 shadow build(将源码路径和构建路径分开,一套源码要分别用msvc2008、msvc2008、mingw分别编译又不互相干扰)

    shadow build shadow build 是什么东西?就是将源码路径和构建路径分开(也就是生成的makefile文件和其他产物都不放到源码路径),以此来保证源码路径的清洁. 这不是qmake ...

  2. 浅谈 qmake 之 shadow build(就是将源码路径和构建路径分开)

    shadow build shadow build 是什么东西?就是将源码路径和构建路径分开(也就是生成的makefile文件和其他产物都不放到源码路径),以此来保证源码路径的清洁. 这不是qmake ...

  3. 浅谈qmake之pro、pri、prf、prl文件

    浅谈qmake之pro.pri.prf.prl文件 转载自:http://blog.csdn.net/dbzhang800/article/details/6348432 尽管每次和cmake对比起来 ...

  4. 浅谈 qmake 之 pro、pri、prf、prl文件

    尽管每次和cmake对比起来,我们总是说 qmake 简单.功能少.但是qmake仍然是一个非常复杂的东西,我想大多人应该和我一样吧: 不是太清楚CONFIG等变量到底如何起作用的 用过的qmake内 ...

  5. 浅谈angular2+ionic2

    浅谈angular2+ionic2   前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2 ...

  6. 浅谈Excel开发:十一 针对64位Excel的插件的开发和部署

    自Office 2010版本开始有了32位和64位之分,对Excel来说,32位的Excel和64位的Excel在性能上的主要区别是64位的Excel能够处理2G及2G以上的大数据集. 随着64位操作 ...

  7. 浅谈RecyclerView(完美替代ListView,GridView)

    Android RecyclerView 是Android5.0推出来的,导入support-v7包即可使用. 个人体验来说,RecyclerView绝对是一款功能强大的控件. 首先总结下Recycl ...

  8. 浅谈FloatingActionButton(悬浮按钮)

    一.介绍 这个类是继承自ImageView的,所以对于这个控件我们可以使用ImageView的所有属性 android.support.design.widget.FloatingActionButt ...

  9. 浅谈TabLayout(ViewPager+Tab联动)

    google发布了的Android Support Design库中提供了TabLayout 通过TabLayout+ViewPager实现导航栏效果,点击Tab ,ViewPager跟随变化,滑动V ...

随机推荐

  1. BOS物流管理系统-第五天

    BOS物流管理系统-第五天-定区管理-WebServcie远程调用 主要内容: 分区设置-导出(分区条件查询后的结果导出为Excel-POI生成Excel和文件下载) 定区管理---定区添加(定区关联 ...

  2. js--学习方法之2-转

    再说几点忠告 1,不要着急看一些复杂网页效果的代码,这样除了打击你自信心,什么也学不到.没达到一定的武功水平,割了小JJ也学不会葵花宝典的. 2,别急着加技术交流QQ群,加牛人QQ.如果你找张三丰交流 ...

  3. HDU 1335 Basically Speaking(进制转换)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1335 Problem Description The Really Neato Calculator ...

  4. 对于querystring取值时候发生+号变空格的问题

    今天遇到这个问题,在网上找了几个答案,解决了问题,很高兴,所以贴出来给大家分享一下: URL如下 http://127.0.0.1/test/test.aspx?sql= and id='300+' ...

  5. ios中判断当前手机的网络状态

    typedef enum {    NETWORK_TYPE_NONE= 0,    NETWORK_TYPE_2G= 1,    NETWORK_TYPE_3G= 2,    NETWORK_TYP ...

  6. 练习3:修改withdraw 方法

    练习目标-使用有返回值的方法:在本练习里,将修改withdraw方法以返回一个布尔值来指示交易是否成功. 任务 1.修改Account类 a.修改deposit 方法返回true(意味所有存款是成功的 ...

  7. php 好用的函数

    extract — 从数组中将变量导入到当前的符号表,数组的键将作为新的变量,数组的值将最为新变量的值

  8. Linux下gcc编译生成动态链接库*.so文件并调用它【转载】

    动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一 ...

  9. KVM 虚拟机基本管理及常用命令

    KVM的基本管理 1.查看KVM虚拟机配置文件 #Kvm虚拟机默认配置文件位置 [root@kvm qemu]# pwd /etc/libvirt/qemu [root@kvm qemu]# ll t ...

  10. jenkins 中集成JNI的坑

    有包名1.生成class> javac myjni\HelloJNI.java2.生成.h文件> javah -d include myini.HelloJNI3.生成.dll文件> ...