zoukankan      html  css  js  c++  java
  • qmake 之 shadow build

    qmake 之 shadow build

    https://blog.csdn.net/dbzhang800/article/details/6343838

    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/
    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.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下,必须先将路径分割符由“/”替换成 “/”
    目标目录不存在,创建目录。
    目标文件不存在,拷贝文件。

    ============== End

  • 相关阅读:
    博客园电子期刊2012年6月刊发布啦
    如何在博客园发博客时插入优酷视频
    上周热点回顾(7.167.22)
    “Coding changes the world” 博客园2012主题T恤专题上线
    [转]MySql查询缓存机制
    淘宝店铺开发 ShopSDK 1.x 及 TAE_SDK 2.0
    [转]NHibernate之旅系列文章导航
    MySQL 5.1参考手册 :: 7. 优化
    [转]Nant daily build实践
    [转]淘宝sdk——入门实战之footer.php制作
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/12879557.html
Copyright © 2011-2022 走看看