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. js日期操作时间看板

    var nowTime = null;//获取服务器时间function GetTime() { $.ajax({ url:config._domain + "/AjaxAuctionCen ...

  2. Android View的事件分发

    如果接触android开发时间足够长的话,或多或少都会遇到各种各样事件冲突的问题,要想解决这类问题,对深入理解事件分发机制是很有必要的,接下来几天都会尽自己所能尽可能将这方面讲清楚.  View的事件 ...

  3. 第八十七节,html5+css3pc端固定布局,大纲算法,section和div,结构分析

    html5+css3pc端固定布局,大纲算法,section和div,结构分析 一.大纲算法 在HTML5中有一个很重要的概念,叫做HTML5 大纲算法(HTML5Outliner),它的用途是为用户 ...

  4. mybatis 查询语句(按条件查询)

    <select id="getAllDitch" parameterType="xxx.xx.entity.CheckDitch" resultType= ...

  5. MongoDB高级操作

    参考MongoDB菜鸟教程 一.$type操作符 MongoDB 中可以使用的类型如下表所示: 类型 数字 备注 Double 1   String 2   Object 3   Array 4   ...

  6. Cmake常用指令

    1. cmake_minimum_required(VERSION 2.8)           检查cmake的版本,至少为2.8 2. project(helloworld)           ...

  7. 用户id有则更新,无则添加 使用replace into (代替 insert into)

    app登录成功后,调用后台,更新channel_id public function set_pushchannel($device,$channelid,$iv='' ) $sql = " ...

  8. ResultSet 的Type属性 TYPE_FORWARD_ONLY, TYPE_SCROLL_I

    说明:Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY ...

  9. HDU 3835 R(N)(枚举)

    题目链接 Problem Description We know that some positive integer x can be expressed as x=A^2+B^2(A,B are ...

  10. 虚拟主机VPS区别:DigitalOcean优惠码

    虚拟主机与VPS区别在哪?这里从几个角度解释下: 虚拟化技术 把一台独立服务器用虚拟化技术“切割”开,分配不同的硬件配置,然后分配给不同的普通用户使用,就是虚拟主机的基本思路.部分奸商为了节省成本,甚 ...