qt creator源碼全方面分析(3-3)
- 2020 年 3 月 8 日
- 筆記
目錄
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。
- 如果四個變數有一個值為空,則退出。
- 如果STATIC_BASE與STATIC_OUTPUT_BASE不一樣,則自定義編譯對象copy2build,指定輸入input,輸出output,拷貝命令commands,描述name,配置config。
- 設置安裝集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的功能,其實就是開頭說的,把這些數據/配置文件等複製到構建目錄中。

原創造福大家,共享改變世界
獻出一片愛心,溫暖作者心靈


