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. cloudeye的实现

    难点在于DNS server的搭建,然而非常简单,安装dnslib就有DNS server:zoneresolver.py,稍作修改即可使用   # -*- coding: utf-8 -*- fro ...

  2. Stack Overflow for web end

    Jquery UI tooltip on disabled button In general, disabled elements do not trigger any DOM events. Th ...

  3. Maxmum subsequence sum problem

    We have a lot of ways to solve the maximum subsequence sum problem, but different ways take differen ...

  4. Python之线程&进程

    线程: 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. thr ...

  5. Qt4.8.x Linux WebKit依赖库安装

    yum install "pkgconfig(gstreamer-app-0.10)"

  6. 在Javascript中什么是伪数组?如何将伪数组转化为标准数组?

    答案: 伪数组(类数组):无法直接调用数组方法或期望length属性有什么特殊的行为,但仍可以对真正数组遍历方法来遍历它们.典型的是函数的argument参数,还有像调用getElementsByTa ...

  7. Openjudge-计算概论(A)-求满足条件的3位数

    描述: 编写程序,按从小到大的顺序寻找同时符合条件1和2的所有3位数,条件为: 1.该数为完全平方数 2.该数至少有2位数字相同 例如,100同时满足上面两个条件. 输入输入一个数n,n的大小不超过实 ...

  8. wpf 异步加载 只需6段代码

    private BackgroundWorker worker = null; ProgressBar probar = new ProgressBar(); private int percentV ...

  9. 修改textField的placeholder的字体和颜色

    textField.placeholder = @"username is in here!"; [textField setValue:[UIColor redColor] fo ...

  10. BatteryWarning 电池预警

    MTK BatteryWarning 在mediatek/external/batterywarning下,会编译生成一个可执行文件:batterywraning main()函数中,会间断读取 /s ...