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

首先我們來看一個示例,源目錄\src\share\qtcreator\data.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

我們再來看一個示例,源目錄\src\share\3rdparty\data.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

原創造福大家,共享改變世界

獻出一片愛心,溫暖作者心靈



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM