zoukankan      html  css  js  c++  java
  • qt creator源码全方面分析(3-3)

    qtcreatordata.pri

    此pri文件用于部署在构建Qt Creator时未编译的文件。如果使用影子构建,它将文件复制到构建目录中,同时添加相应的安装目标。

    用法:首先定义变量(详细信息如下),然后包含此pri文件。

    STATIC_BASE:STATIC_FILES中列出的文件的基础目录
    STATIC_FILES:要部署的文件列表
    STATIC_OUTPUT_BASE:编译输出的基础目录
    STATIC_INSTALL_BASE:安装输出的基础目录

    定义stripStaticBase替换函数

    函数如下:

    # used in custom compilers which just copy files
    defineReplace(stripStaticBase) {
        return($$relative_path($$1, $$STATIC_BASE))
    }
    

    函数很简单,返回函数参数相对于STATIC_BASE的相对路径。注释也很明白,在仅复制文件的自定义编译器中使用。

    设置自定义编译和安装

    接下来是

    # handle conditional copying based on STATIC_BASE compared to STATIC_OUTPUT_BASE
    !isEmpty(STATIC_FILES) {
        isEmpty(STATIC_BASE): 
            error("Using STATIC_FILES without having STATIC_BASE set")
        isEmpty(STATIC_OUTPUT_BASE): 
            error("Using STATIC_FILES without having STATIC_OUTPUT_BASE set")
        !osx:isEmpty(STATIC_INSTALL_BASE): 
            error("Using STATIC_FILES without having STATIC_INSTALL_BASE set")
    
        !isEqual(STATIC_BASE, $$STATIC_OUTPUT_BASE) {
            copy2build.input += STATIC_FILES
            copy2build.output = $$STATIC_OUTPUT_BASE/${QMAKE_FUNC_FILE_IN_stripStaticBase}
            isEmpty(vcproj):copy2build.variable_out = PRE_TARGETDEPS
            win32:copy2build.commands = $$QMAKE_COPY "${QMAKE_FILE_IN}" "${QMAKE_FILE_OUT}"
            unix:copy2build.commands = $$QMAKE_COPY ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT}
            copy2build.name = COPY ${QMAKE_FILE_IN}
            copy2build.config += no_link
            QMAKE_EXTRA_COMPILERS += copy2build
        }
    
        static.files = $$STATIC_FILES
        static.base = $$STATIC_BASE
        static.path = $$STATIC_INSTALL_BASE
        INSTALLS += static
    }
    

    QMAKE_EXTRA_COMPILERS

    指定额外编译器或预处理器的列表。

    另请参阅Adding Compilers

    Adding Compilers

    可以自定义qmake以支持新的编译器和预处理器:

    new_moc.output  = moc_${QMAKE_FILE_BASE}.cpp
    new_moc.commands = moc ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT}
    new_moc.depend_command = g++ -E -M ${QMAKE_FILE_NAME} | sed "s,^.*: ,,"
    new_moc.input = NEW_HEADERS
    QMAKE_EXTRA_COMPILERS += new_moc
    

    根据上述定义,您可以使用moc的直接替代品(如果有)。 该命令执行时,附加在NEW_HEADERS变量中定义的所有参数(来自input成员),并将结果写入output成员定义的文件中。 该文件被添加到项目的其他源文件中。 另外,qmake将执行depend_command来生成依赖信息,并将该信息也放置在项目中。

    自定义编译器规范支持以下成员:

    不常用,略。

    注释说的很明确,基于STATIC_OUTPUT_BASE与STATIC_BASE的不同,处理条件拷贝。

    示例1

    首先我们来看一个示例,源目录srcshareqtcreatordata.pro

    TEMPLATE = aux
    
    include(../../../qtcreator.pri)
    
    STATIC_BASE = $$PWD
    STATIC_OUTPUT_BASE = $$IDE_DATA_PATH
    STATIC_INSTALL_BASE = $$INSTALL_DATA_PATH
    
    STATIC_FILES = 
        $$PWD/externaltools/lrelease.xml 
        $$PWD/externaltools/lupdate.xml 
        $$PWD/externaltools/qmlviewer.xml 
        $$PWD/externaltools/qmlscene.xml
    unix {
        osx:STATIC_FILES += $$PWD/externaltools/vi_mac.xml
        else:STATIC_FILES += $$PWD/externaltools/vi.xml
    } else {
        STATIC_FILES += $$PWD/externaltools/notepad_win.xml
    }
    
    include(../../../qtcreatordata.pri)
    

    data.pro首先定义了用法中描述的四个变量,然后调用qtcreatordata.pri。

    要部署的文件STATIC_FILES,源目录src/share/qtcreator/externaltools/*
    待部署文件的基础目录STATIC_BASE,源目录/src/share/qtcreator
    编译输出目录STATIC_OUTPUT_BASE,构建目录/share/qtcreator
    安装输出目录STATIC_INSTALL_BASE,安装目录/share/qtcreator

    下面分析接着分析qtcreatordata.pri。

    1. 如果四个变量有一个值为空,则退出。
    2. 如果STATIC_BASE与STATIC_OUTPUT_BASE不一样,则自定义编译对象copy2build,指定输入input,输出output,拷贝命令commands,描述name,配置config。
    3. 设置安装集static。

    示例2

    我们再来看一个示例,源目录srcshare3rdpartydata.pro

    TEMPLATE = aux
    
    include(../../../qtcreator.pri)
    
    STATIC_BASE = $$PWD
    STATIC_OUTPUT_BASE = $$IDE_DATA_PATH
    STATIC_INSTALL_BASE = $$INSTALL_DATA_PATH
    
    DATA_DIRS = 
        generic-highlighter 
        fonts
    
    for(data_dir, DATA_DIRS) {
        STATIC_FILES += $$files($$PWD/$$data_dir/*, true)
    }
    
    include(../../../qtcreatordata.pri)
    

    和上一个类似。

    这里大家注意下第一行TEMPLATE = aux,我们在qt creator源码全方面分析(3-1)介绍过,aux的含义是:

    创建一个不生成任何内容的Makefile。 如果不需要调用任何编译器来创建目标,请使用此选项;

    小节

    想必大家也明白了,这个pri的功能,其实就是开头说的,把这些数据/配置文件等复制到构建目录中。

    image-20200302211016449

    原创造福大家,共享改变世界

    献出一片爱心,温暖作者心灵


  • 相关阅读:
    算法15 《啊哈算法》第四章 盒子装扑克-DFS深度优先搜索 递归
    算法14 leetcode28 实现 strStr() kmp
    markdown一些有用笔记
    算法11 leetcode274 有效的字母异位词
    Quantity? Quality!
    算法 10 leetcode344. 反转字符串
    JavaWeb —— JDBC Driver驱动及连接问题
    Python —— 4 习题练习
    Python —— 变量的作用域
    JavaWeb —— 文件上传
  • 原文地址:https://www.cnblogs.com/codeForFamily/p/qt-creator-ide-source-learn-3-3.html
Copyright © 2011-2022 走看看