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


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

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


Tags: