本文翻譯自Qt 4.8官方文檔。node
QMake提供了一個用於管理應用程序、庫、其它組件的構建過程的面向工程系統。
QMake擴展了每一個工程文件的信息,生成一個執行編譯和連接過程的必須命令的MakeFile。linux
工程文件.pro描述了工程信息。工程文件信息會被qmake用於生成包含構建過程當中所需的全部命令的MakeFile。工程文件一般包含一系列頭文件和源文件,通用配置信息以及音樂程序指定的細節,如應用程序的連接庫、搜索路徑。
工程文件包含必定數量的不一樣元素,如註釋、變量聲明、內置函數以及簡單的控制結構。在大多數簡單的工程中,只須要聲明使用簡單配置選項構建工程的源文件和頭文件便可。ios
對於簡單的工程,只須要在工程的頂層目錄運行qmake。默認狀況下,qmake會生成一個構建工程的MakeFile,此時能夠運行平臺相關的make工具構建工程。
qmake也能用於生成工程文件。web
在大型工程中,能夠利用預編譯頭文件的優點加速構建過程。正則表達式
工程文件包含qmake構建應用、庫、插件的全部必須信息。工程使用的資源一般使用一系列聲明指定,但支持用於描述不一樣平臺和環境的不一樣構建過程的簡單編程結構。
qmake使用的工程文件格式支持簡單和相對複雜的構建系統。簡單工程文件使用直接聲明風格,定義標準變量指明工程須要的頭文件和源文件。複雜工程可能須要使用流控制結構微調構建過程。
工程文件中不一樣類型的元素以下:
A、變量
工程文件中,變量用於保存字符串列表。簡單工程中,變量會告訴qmake使用的配置選項,提供在構建過程當中使用的文件名和路徑。
qmake會在工程文件中查找某些變量,變量的內容將決定哪些內容會生成到MakeFile。例如,HEADERS和SOURCES變量的列表值會告訴qmake相關的頭文件和源文件(工程文件所在目錄)。
變量能夠用於存儲臨時的列表值,覆寫存在的列表值或是擴展新的值。下列代碼顯示瞭如何賦值列表值給變量:HEADERS = mainwindow.h paintwidget.h
注意:第一種賦值方法只包括同一行指定的值。第二種賦值方法會使用「\」字符分隔列表值的項。
變量的列表值可使用以下方式擴展:sql
SOURCES = main.cpp mainwindow.cpp \ paintwidget.cpp CONFIG += qt
CONFIG是一個qmake生成MakeFile文件時的特殊變量。
qmake會識別下列變量的值,並描述變量的內容。
CONFIG:通用工程配置選項
DESTDIR:可執行文件或庫文件的輸出目錄
FORMS:由uic處理的UI文件列表
HEADERS:構建工程使用的頭文件列表
QT:Qt相關配置選項
RESOURCES:包含到最終工程的資源文件列表
SOURCES:用於構建工程的源文件列表
TEMPLATE:構建工程的模板,決定構建過程輸出一個應用,一個庫或是一個插件
變量的內容能夠經過在變量名稱前加「$$」符號來訪問,用於將一個變量的內容賦值給另外一個變量。TEMP_SOURCES = $$SOURCES
$$操做符能夠被擴展用於操做字符串和值列表的內置函數中。
一般,變量用於包含空格分隔符的值列表,但有時須要指定包含空格的值,必須使用雙引號包含。DEST = "Program Files"
引號內的文本在值列表內做爲單個值對待。相似的方法能夠用於處理包含空格的路徑,尤爲是在Windows平臺定義INCLUDEPATH和LIBS變量。shell
win32:INCLUDEPATH += "C:/mylibs/extra headers" unix:INCLUDEPATH += "/home/user/extra headers"
B、註釋
能夠在工程文件中增長註釋。註釋須要#符號開頭,直到#所在行結束。編程
# Comments usually start at the beginning of a line, but they # can also follow other content on the same line.
爲了在變量賦值中包括#,必須使用內置變量LITERAL_HASH。
C、內置函數和控制流
qmake提供了多個內置函數用於處理變量內容。在簡單工程中,最常使用的函數是使用一個文件名做爲參數的include函數。在工程文件中,給定文件的內容會被包含在include函數調用的位置。include函數最經常使用於包含其它工程文件.pro。include(other.pro)
經過代碼塊做用域能夠實現相似編程語言中IF語句的行爲,支持條件控制結構。後端
win32 { SOURCES += paintwidget_win.cpp}
只有條件爲true時,括號內的賦值纔會有效。在這個例子中,特殊變量win32必須被設置。在 Windows平臺上,win32會自動設置。當在其它平臺上,經過運行帶-win32參數選項的qmake能夠指定win32。左括號必須與條件在同一行。
使用for函數經過遍歷列表值能夠構建一個簡單的循環。下列代碼會在目錄存在的狀況下增長目錄到SUBDIRS變量。xcode
EXTRAS = handlers tests docsfor(dir, EXTRAS) { exists($$dir) { SUBDIRS += $$dir }}
對變量進行更復雜的操做能夠經過內置函數find、unique、count。內置函數能夠提供對字符串、路徑的操做,支持用戶輸入,並調用其它外部工具。
TEMPLATE變量用於定義構建的工程的類型。若是工程文件中沒有聲明TEMPLATE變量,qmake會默認構建一個應用程序,並生成一個MakeFile文件。
下列時可用工程類型:
app:建立一個構建應用程序的MakeFile
lib:建立一個構建庫的MakeFile
subdirs:建立一個包含使用SUBDIRS變量指定子目錄的規則的MakeFile,每一個子目錄必須包含本身的工程文件。
vcapp:建立一個構建應用程序的Visual Studio平臺的工程文件
vclib:建立一個構建庫的Visual Studio平臺的工程文件
vcsubdirs:建立一個在子目錄構建工程的Visual Studio平臺的解決方案文件
當使用subdirs模板時,qmake會生成一個MakeFile檢查每一個子目錄,處理查找到的任何工程文件。而且在新生成的MakeFile上運行平臺的make工具。SUBDIRS變量用於包含要處理的子目錄列表。
CONFIG變量用於指定編譯器使用的選項和屬性以及連接庫。CONFIG變量能夠增長任何選項,可是本節所述選項會被qmake內部識別。
下列選項控制用於構建工程的編譯器選項:
release:工程使用release模式構建,若是debug也被指定會被忽略。
debug:工程使用debug模式構建
debug_and_release:工程使用debug和release兩種模式構建
debug_and_release_target:工程使用debug和release兩種模式構建,目標會被構建到debug和release兩個目錄下
build_all:若是指定debug_and_release,工程默認使用debug和release兩種模式構建
autogen_precompile_source:自動生成.cpp文件,包含在.pro文件中指定的預編譯頭文件
ordered:當使用subdirs模板時,本選項會指定按照列出的目錄給定的順序處理
warn_on:編譯器會盡量多輸出警告信息,若是指定warn_off,警告信息會被忽略
warn_off:編譯器儘量少的輸出警告信息
copy_dir_files:打開要複製目錄安裝規則,而不僅複製文件
debug_and_release選項是一個特殊選項,會開啓工程的debug和release兩種版本構建。qmake生成的MakeFile文件會包含兩種版本的構建規則,使用下列方式進行調用:make all
增長build_all選項到CONFIG變量會生成構建工程的默認規則,而且建立debug和release版本的安裝目標。
注意:CONFIG變量指定每一個選項能夠用於條件做用域。可使用CONFIG內置函數測試某個配置選項的表現。下列代碼將展現CONFIG函數做爲做用域的條件,測試opengl選項是否在用。
CONFIG(opengl) { message(Building with OpenGL support.)} else { message(OpenGL support is not available.)}
下列選項會定義構建工程的類型,注意,某些選項只有在特定平臺纔會生效。
qt:工程是一個Qt應用程序,會連接Qt庫。可使用QT變量控制應用程序須要的任何附加Qt模塊
thread:工程是一個多線程應用程序
x11:工程是一個X11應用程序或庫
當使用應用程序或庫的工程模板時,不少配置選項用於微調構建過程。例如,若是應用程序使用Qt庫,而且在debug模式構建多線程應用時,工程文件以下:CONFIG += qt thread debug
注意:必須使用「+=」而不是「=」,不然qmake不會使用Qt配置決定工程須要的設置。
若是CONFIG變量包含qt,qmake對Qt應用程序的支持會開啓,這會使微調應用程序的Qt模塊變得可能。用於聲明須要擴展模塊的QT變量能夠實現微調。例如,可使用下列代碼開啓XML和network模塊:
CONFIG += qt QT += network xml
注意QT默認包含core和gui模塊,上述代碼會增長network和xml模塊到默認值列表。下列代碼將會忽略默認模塊,這會致使應用程序源碼編譯時錯誤。QT = network xml # This will omit the core and gui modules
若是要不使用gui模塊構建工程,可使用「-=」排除gui模塊。默認狀況下,QT包含core和gui兩個模塊,因此下列代碼會構建一個最小化工程。QT -= gui # Only the core module is used.
下列選項能夠用於QT變量:
Core:QtCore模塊,默認包含
Gui:QtGui模塊,默認包含
Network:QtNetwork模塊
Opengl:QtOpenGL模塊
Sql:QtSql模塊
Svg:QtSvg模塊
Xml:QtXml模塊
Xmlpatterns:QtXmlPatterns
qt3support:Qt3Support模塊
注意,增長opengl選項到QT變量會自動促使相應選項到增長到CONFIG變量。所以,對於Qt應用程序,增長opengl選項到QT和CONFIG變量不是必須的。
qmake可使用特性文件.prf文件設置額外的配置特性。這些額外特性經常提供了對構建過程當中自定義工具的支持。爲了增長特性到構建過程,能夠增長特性名稱到CONFIG變量。
例如,qmake能夠利用pkg-config支持的外部庫對構建過程進行配置,例如D-Bus或ogg外部庫,代碼以下:
CONFIG += link_pkgconfig PKGCONFIG += ogg dbus-1
若是在工程中使用除Qt支持的庫之外的第三方庫,須要在工程文件中指定。
qmake搜索庫的路徑和要連接的特定庫要加入到LIBS變量的列表值中。給出庫自己的路徑,或是指定庫的類unix風格標記和路徑能夠優先使用。
例如,下列代碼展現如何指定庫:LIBS += -L/usr/local/lib -lmath
包含頭文件的路徑可使用INCLUDEPATH變量指定。
當qmake有多個選項在命令行運行,qmake的行爲能夠被自定義。qmake選項能夠微調構建過程,提供有用的診斷信息,並指定工程的目標平臺。
qmake的使用採用下列簡單形式:qmake [mode] [options] files
Qmake支持兩種不一樣的操做模式:默認模式下,qmake會使用工程文件的信息生成MakeFile文件,但qmake也能夠生成工程文件。若是要顯示設置模式,必須在其它全部選項前指定模式。模式有下列兩個選項值:
-makefile:qmake生成MakeFile
-project:qmake生成工程文件,生成的過程文件可能須要編輯。
爲了自定義構建過程和覆寫平臺的默認設置,qmake能夠在命令行指定一系列參數選項。下列基本選項提供有用的信息,指定qmake輸出的文件的位置,控制輸出到控制檯調試信息的水平。
-help:qmake會回顧特性,給出有用幫助信息
-o file:qmake的輸出會被重定向到file 文件。若是本選項不指定,qmake會根據運行的模式爲輸出選擇一個合適的文件名。若是指定了「-」,輸出定向到stdout。
-d:qmake會輸出調試信息
對於每一個目標平臺都須要不一樣構建的有多個子目錄的工程,qmake可使用下列選項在每一個工程文件中設置相應特定平臺的變量。
-unix:qmake運行在unix模式,會使用unix的文件和路徑命名規範,增長對unix的測試會成功,是全部的類unix平臺的默認模式。
-macx:qmake運行在Mac OS X模式,會使用unix的文件和路徑命名規範,增長對macx的測試會成功,是Mac OS X平臺的默認模式。
-win32:qmake運行在win32模式,會使用Windows的文件和路徑命名規範,增長對win32的測試會成功,是Windows平臺的默認模式。
工程使用的模板一般在工程文件中使用TEMPLATE變量設置,可使用下列選項覆寫或修改:
-t tmpl:qamke會使用tmpl設置TEMPLATE變量,但僅在.pro文件被處理後。
-t prefix:增長前綴prefix到TEMPLATE變量
調整警告信息的水平能夠幫助找到工程文件中的問題。
-Wall:qmake會報告已知的全部警告信息
-Wnone:不生成任何警告信息
-Wparser:qmake只會生成解析警告信息,解析警告信息會在解析工程文件過程當中提醒開發者常見的陷阱和潛在問題。
-Wlogic:qmake會警告工程文件中的常見陷阱和潛在問題。例如,若是一個文件是否被屢次放到文件列表中,或是若是文件沒有找到,qmake會警告。
qmake -makefile [options] files
在makefile模式,qmake會生成用於構建工程的makefile文件。此外,下列選項能夠被用於makefile模式中:
-after:qmake會在指定文件後的命令行上處理給定賦值
-nocache:qmake會忽略.qmake.cache文件
-nodepend:qmake不會生成任何依賴信息
-cache file:qmake會使用file做爲緩存文件,其它的.qmake.cache文件會被忽略。
-spec spec:qmake會使用spec做爲平臺和編譯器信息的路徑,QMAKESPEC變量的值會被忽略。
能夠在命令行上進行qmake賦值,賦值會在指定的全部文件處理。例如:qmake -makefile -unix -o Makefile "CONFIG+=test" test.pro
上述代碼會從使用unix路徑名的test.pro文件生成一個Makefile。但指定選項的不少是默認的,不是必須的。所以,在Unix平臺,上述代碼能夠簡化以下:qmake "CONFIG+=test" test.pro
若是肯定變量在指定文件後被處理,可使用-after選項。當-after選項指定,在-after後的全部命令行的賦值會被延遲到指定文件被解析後進行。
qmake -project [options] files
在project模式下,qmake會生成一個工程文件。能夠在project模式下使用下列選項:
-r:qmake會遞歸處理給定的目錄
-nopwd:qmake不會查找當前源碼的工做路徑,只使用指定文件。
在project模式下,files參數是文件或目錄列表。若是指定一個目錄,會被包含到DEPENDPATH變量,相關代碼會包含到生成的工程文件中;若是給定一個文件,會被追加到依賴於擴展的合適變量。例如,UI會被增長到FORMS變量,C++文件會被增長到SOURCES變量。
不少跨平臺工程使用qmake的基本配置和特性進行處理。在一些平臺上,利用平臺相關特性有時是有用的,甚至是必須的。qmake直到不少特性,這些特性只能經過特定變量訪問,特定變量只在獨立平臺上有效。
本平臺特有的特性包括支持建立通用二進制文件、框架和捆綁包。
A、源包和二進制包
源包中提供的qmake版本與二進制包中提供的配置略有不一樣,由於它使用了不一樣的特性規範。源包一般使用macx-g++規範,二進制包一般被配置爲使用macx-xcode代碼規範。
每一個包的用戶須要使用-spec參數選項調用qmake覆寫配置。例如,在一個工程目錄使用下列命令能夠從一個二進制包生成Makefile文件:qmake -spec macx-g++
B、框架使用
qmake會自動生成連接框架的構建規則,這些框架的標準框架路徑在Mac OS X平臺下是/Library/Frameworks/。
除了標準框架目錄以外,須要向構建系統指定目錄,經過增長連接器選項到QMAKE_LFLAGS變量能夠實現。QMAKE_LFLAGS += -F/path/to/framework/directory/
框架自己會經過附加-framework選項和框架的名稱被連接到LIBS變量。LIBS += -framework TheFramework
C、建立框架
任何給定的庫項目均可以被配置,以便生成的庫文件放置在準備部署的框架中。經過設置工程使用lib模板,並增長lib_bundle選項到CONFIG變量能夠實現。
TEMPLATE = lib CONFIG += lib_bundle
與庫關聯的數據使用QMAKE_BUNDLE_DATA變量指定。這將保存將使用庫捆綁包進行安裝的項,而且一般用於指定頭文件集合。例如:
FRAMEWORK_HEADERS.version = Versions FRAMEWORK_HEADERS.files = path/to/header_one.h path/to/header_two.h FRAMEWORK_HEADERS.path = Headers QMAKE_BUNDLE_DATA += FRAMEWORK_HEADERS
FRAMEWORK_HEADERS是用戶定義的變量,用於定義使用特殊框架所需的頭文件。追加FRAMEWORK_HEADERS到QMAKE_BUNDLE_DATA變量,確保頭文件信息被增長到所安裝的庫捆綁包的資源集合中。框架的名稱和版本由變量QMAKE_FRAMEWORK_BUNDLE_NAME和QMAKE_FRAMEWORK_VERSION指定,默認狀況下,使用TARGET和VERSION變量的值。
D、建立通用二進制包
爲了建立應用程序的通用二進制包,須要使用已經配置了-universal選項的Qt版本。
在二進制包中,支持的架構一般在CONFIG變量指定。例如,下列代碼會使qmake生成同時支持PowerPC 和X86架構的通用二進制包的構建規則。CONFIG += x86 ppc
此外,開發者使用PowerPC平臺須要設置QMAKE_MAC_SDK變量。
E、建立和移動XCode項目
MAC OS X平臺的開發者能夠利用qmake對XCode工程文件的支持,經過運行qmake從已有的qmake工程文件生成一個XCode工程。qmake -spec macx-xcode project.pro
注意:若是工程在磁盤上進行了移動,須要再次運行qmake處理工程文件生成一個XCode工程。
F、同時支持兩種構建目標
要實現同時支持兩個構建目標目前並不可行,由於在概念上,主動構建配置的XCode概念不一樣於qmake構建目標的概念。
XCode主動構建配置用於修改xcode配置、編譯器選項以及相似的構建選項。不像Visual Studio,XCode不容許基於構建配置是否選擇debug或release來選擇特定的庫文件。Qmake的debug和release設置會控制連接到執行文件的庫文件。
目前不可能在qamke生成的XCode工程文件中設置XCode設置中的文件。
此外,所選的主動構建配置存儲在.pbxuser文件中,.pbxuser文件是由XCode在第一次加載中生成的,而不是qamke建立的。
Windows平臺特有的特性包括在部署Visual Studio 2005開發的Qt應用程序時支持建立Visual Studio工程文件和處理清單文件。
A、建立Visual Studio工程文件
使用Visual Studio編寫Qt應用程序的開發人員可使用Qt商業版提供的Visual Studio集成工具,而沒必要擔憂如何管理項目依賴關係。
可是,某些開發者可能須要導入已經存在的qmake工程到Visual Studio。qmake可以利用工程文件建立一個包含開發環境所需必須信息的Visual Studio工程。經過設置qmake工程模板爲vcapp或vclib能夠實現,可使用命令行進行:qmake -tp vc
在子目錄遞歸生成.vcproj文件和在主目錄生成文件以下:qmake -tp vc -r
每次更新工程文件時,須要運行qmake生成一個更新的Visual Studio工程。
注意:若是使用Visual Studio Add-in,能夠經過Qt->Import from .pro file菜單項導入.pro文件。
B、Visual Studio 2005 Manifest文件
當部署使用Visual Studio 2005構建的Qt應用程序時,確保應用程序連接時建立的Manifest文件被正確處理是必須的。對於生成DLL的工程來講是自動處理的。
移除嵌入在應用程序可執行文件的manifest文件可使用下列賦值給CONFIG變量完成:CONFIG -= embed_manifest_exe
移除嵌入在應用程序DLL文件的manifest文件可使用下列賦值給CONFIG變量完成:CONFIG -= embed_manifest_dll
Symbian平臺特有的特性包括處理靜態數據,兼容性,棧和堆大小,編譯器特定選項,應用程序或庫的惟一標識符。
A、處理靜態數據
若是應用程序使用了任何靜態數據,構建系統須要瞭解這些靜態數據。這是由於Symbian系統會試圖在沒有使用靜態數據的狀況下節省內存。
若要指定靜態數據支持,將其添加到項目文件中:TARGET.EPOCALLOWDLLDATA = 1
默認值爲0
B、棧和堆大小
Symbian平臺使用預約義大小的堆棧和堆。若是應用程序超過任一限制,則可能崩潰或沒法完成其任務。毫無理由的崩潰經常能夠追溯到堆棧和堆大小不足。
堆棧大小具備最大值,而堆大小具備最小值和最大值,均以字節指定。若是內存不可用,則最小值阻止應用程序啓動。最小值和最大值由一個空間分隔。例如:
TARGET.EPOCHEAPSIZE = 10000 10000000 TARGET.EPOCSTACKSIZE = 0x8000
默認值取決於所使用的Symbian SDK的版本,可是,Qt工具鏈將此設置爲最大可能值,而且不該該更改此值。
C、編譯器特定選項
通用編譯器選項一般使用QMAKE_CFLAGS和QMAKE_CXXFLAGS變量進行設置。爲了設置特定的編譯器選項,可使用QMAKE_CFLAGS.<compiler>
和QMAKE_CXXFLAGS.<compiler>
。<compiler>
能夠是WINSCW架構(仿真器)的CW,或是ARMV5架構(硬件)的ARMCC,或是ARMV5架構(硬件)的GCCE。例如:
QMAKE_CXXFLAGS.CW += -O2 QMAKE_CXXFLAGS.ARMCC += -O0
D、惟一標識符
Symbian應用程序可能有附加的惟一標識符。下面是如何在工程文件中定義惟一標識符。
支持IDS的可用類型有四種:UID二、UID三、SID和VID。它們能夠以下指定的:
TARGET.UID2 = 0x00000001 TARGET.UID3 = 0x00000002 TARGET.SID = 0x00000003 TARGET.VID = 0x00000004
若是未指定SID,則默認與UID3值相同。若是未指定UID3,qmake將自動生成適合開發和調試的UID3。應該爲要釋放的應用程序手動指定UID3值。
這兒也有一個UID1,但不會被任何應用所涉及。
UID2對於不一樣類型的文件具備特定的值;例如app/exes老是0x10039 CE。工具鏈將爲最多見的文件類型(如EXE/APP和共享庫DLL)設置值。
E、Capability
Capability爲應用程序定義額外的特權,例如列出文件系統上的全部文件的能力。Capability在項目文件中定義以下:TARGET.CAPABILITY += AllFiles
能夠經過首先指定全部的能力,而後在它們前面減去沒必要要的能力來指定哪些能力不具有,例如:TARGET.CAPABILITY = ALL -TCB -DRM -AllFiles
許多qamke工程文件使用varname=values和varname+=values定義的列表來簡單描述工程使用的源文件和頭文件。qamke還提供用於處理變量聲明中提供的信息的其它運算符、函數和做用域。這些高級特性容許從單個工程文件生成多個平臺的MakeFile文件。
在許多工程文件中,賦值操做符「=」和追加操做符「+=」能夠用於包含有關工程的全部信息。典型的使用模式是將值列表賦值給變量,並根據各類測試的結果追加更多的值。因爲qmake使用默認值定義了某些變量,所以有時須要使用移除操做符「-=」過濾出不須要的值。下面的運算符能夠用來操做變量的內容。
賦值操做符「=」用於將一個值賦值給一個變量。TARGET = myapp
上述代碼會設置TARGET變量的值爲myapp,會使用myapp覆寫TARGET變量之前設置的任何值。
追加操做符「+=」用於追加一個新的值到變量的值列表中。DEFINES += QT_DLL
上述代碼會追加QT_DLL到預處理列表的定義中,以將其放入生成的Makefile文件中。
移除操做符「-=」用於從一個變量的值列表中移除一個值。DEFINES -= QT_DLL
上述代碼會將QT_DLL從預處理列表的定義中移除,以將其結果放入生成的Makefile文件中。
增長操做符「=」會增長一個值到變量的值列表中,但僅限這個值不存在的狀況。「=」操做符胡阻止一個值被屢次包含到變量中。DEFINES *= QT_DLL
上述代碼只有在預處理列表的定義不存在QT_DLL狀況下,纔會將QTDLL加入,以將其結果放入生成的Makefile文件中。
注意:unique函數也能夠確保變量中每一個值只包含一個實例。
「~=」操做符能夠代替指定的正則表達式匹配的任何值。
`DEFINES ~= s/QT[DT].+/QT`
上述代碼,值列表中的以QT_D或QT_T開頭放入任何值使用QT替換。
「$$」操做符用於提取變量的內容,用於在變量中傳遞值或是提供給函數使用。
EVERYTHING = $$SOURCES $$HEADERS message("The project contains the following files:") message($$EVERYTHING)
做用域與過程化編程語言的IF語句比較相似。若是條件爲true,做用域內的聲明會被處理。
A、語法
做用域由一個條件和同一行跟隨的一個左括號,一系列命令和定義,新一行的右括號組成。
<condition> { <command or definition> ... }
左括號必須與條件在同一行。做用域可能會被鏈接多個條件。
B、做用域和條件
條件後面的做用域是一對括號中包含的一系列聲明。例如:
win32 { SOURCES += paintwidget_win.cpp}
若是qmake運行在Windows平臺,上述代碼會增長paintwidget_win.cpp源文件到生成的Makefile的源文件列表中。若是qmake運行在其它平臺,定義會被忽略。
在給定做用域使用的條件也能夠取反,用於提供一組可替代的聲明,僅在原始條件爲false時才被處理。例如,假設想要在除了Windows平臺上的全部平臺上處理某些事務,代碼以下:
!win32 { SOURCES -= paintwidget_win.cpp}
做用域能夠將嵌套,以組合多個條件。例如,若是想要在某個平臺包含某個特定文件,僅且在調試開啓時處理。代碼以下:
macx { debug { HEADERS += debugging.h }}
爲了省去寫不少做用域,能夠經過使用「:」嵌套做用域。上述嵌套做用域能夠重寫以下:
macx:debug { HEADERS += debugging.h}
也可使用「:」操做符執行單行條件賦值。win32:DEFINES += QT_DLL
上述代碼只有在Windows平臺纔會增長QT_DLL到DEFINES變量。
一般,「:」操做符更像一個邏輯與操做符,用於鏈接多個條件,而且必須全部條件爲true。
「|」操做符的行爲像一個邏輯或操做符(OR),鏈接多個條件,只要求其中一個條件爲true。
win32|macx { HEADERS += debugging.h}
能夠經過使用else做用域來向做用域內的內容提供替代聲明。若是前一個做用域的條件爲false,對else做用域進行處理。例如:
win32:xml { message(Building for Windows) SOURCES += xmlhandler_win.cpp} else:xml { SOURCES += xmlhandler.cpp} else { message("Unknown configuration")}
C、配置和做用域
存儲在CONFIG變量的值會被qmake特殊處理。每一個可能的值均可以做爲做用域的條件。例如,CONFIG的值列表可使用opengl值擴展。CONFIG += opengl
上述代碼的結果是測試opengl的任何做用域都會被處理,能夠利用這個特性給最終的可執行文件一個合適的名稱。
opengl { TARGET = application-gl} else { TARGET = application}
這個特性使得在沒必要丟失須要特定配置的全部自定義設置的狀況下,就能夠很容易地更改工程的配置。上述代碼中,第一個做用域的聲明被處理時,最終的可執行文件是application-gl。可是,若是opengl沒有被指定,第二個做用域的聲明會被處理,最終的可執行文件是application。
因爲能夠在CONFIG上設置本身的值,這提供了一種便捷的方法去自定義工程文件並微調生成的MakeFile文件。
D、平臺的做用域值
除了在許多做用域條件中使用的win3二、macx和unix值以外,還可使用多種其它內置平臺和編譯器特定值對做用域進行測試。這些都是基於Qt的mkspecs目錄中提供的平臺規範。例如,工程文件中的下列代碼會顯示在用的當前規範和測試linux-g++規範。
message($$QMAKESPEC) linux-g++ { message(Linux)}
只要在mkspecs目錄中存在一個規範,就能夠測試任何其餘平臺編譯器組合。
在Symbian平臺上,unix做用域爲true。
在工程文件中使用的不少變量是qmake在生成MakeFile文件時使用的特殊變量,例如,DEFINES,、SOURCES和HEADERS。用戶能夠建立自定義變量,當遇到對一個名稱賦值時,qmake會使用給定的名稱建立一個新的變量。例如:MY_VARIABLE = value
對於自定義的變量,沒有任何使用限制,由於qmake將忽略它們,除非在處理做用域時須要對它們進行評估。
經過變量名使用「$$」前綴能夠將一個變量的值賦值給另外一個變量。例如:MY_DEFINES = $$DEFINES
如今MY_DEFINES變量包含工程文件中DEFINES變量在此處中的內容。等效於下列代碼:MY_DEFINES = $${DEFINES}
第二種寫法容許將變量的內容追加到另外一個值,而沒必要用空格分隔這兩個值。例如,下列代碼會確保最終的可執行文件有一個包含所使用模板的名稱。TARGET = myproject_$${TEMPLATE}
變量能夠用於存儲環境變量的內容。
爲了獲取qamke運行時的環境的值,可使用$$(...)操做符。
DESTDIR = $$(PWD) message(The project will be installed in $$DESTDIR)
在上述賦值後,當工程文件被處理時,PWD環境變量的值會被讀取。
爲了在生成Mafkefile文件時獲取環境變量值的內容,可使用$(...)操做符。
DESTDIR = $$(PWD) message(The project will be installed in $$DESTDIR) DESTDIR = $(PWD) message(The project will be installed in the value of PWD) message(when the Makefile is processed.)
在上述代碼中,當工程文件被處理時,PWD的值會被當即讀取,但$(PWD)會在生成的MakeFile文件中被賦值給DESTDIR變量。這使得構建過程更加靈活,只要在處理MakeFile文件時環境變量被正確設置。
特殊的$$[...]操做符被用於訪問Qt構建時的多個配置選項。
message(Qt version: $$[QT_VERSION]) message(Qt is installed in $$[QT_INSTALL_PREFIX]) message(Qt resources can be found in the following locations:) message(Documentation: $$[QT_INSTALL_DOCS]) message(Header files: $$[QT_INSTALL_HEADERS]) message(Libraries: $$[QT_INSTALL_LIBS]) message(Binary files (executables): $$[QT_INSTALL_BINS]) message(Plugins: $$[QT_INSTALL_PLUGINS]) message(Data files: $$[QT_INSTALL_DATA]) message(Translation files: $$[QT_INSTALL_TRANSLATIONS]) message(Settings: $$[QT_INSTALL_SETTINGS]) message(Examples: $$[QT_INSTALL_EXAMPLES]) message(Demonstrations: $$[QT_INSTALL_DEMOS])
使用這個操做符訪問的變量一般用於使第三方插件與組件集成。例如,若是工程文件中有下列聲明,Qt Designer插件能夠與Qt Designer內置插件一塊兒安裝。
target.path = $$[QT_INSTALL_PLUGINS]/designer INSTALLS += target
qmake提供了一個內置函數的選擇,以容許變量的內容被處理。內置函數處理被提供的參數,將值或值列表做爲結果返回。爲了將內置函數結果賦值給變量,必須對內置函數使用$$操做符,就像將一個變量的內置賦值給另外一個變量同樣。
HEADERS = model.h HEADERS += $$OTHER_HEADERS HEADERS = $$unique(HEADERS)
內置函數應該用於操做符的右側。
能夠自定義一個函數處理變量內容。自定義函數按以下定義:
defineReplace(functionName){ #function code}
下列函數使用一個變量做爲惟一參數,使用eval內置函數從變量中提取出了一個值列表,而且編輯了值列表。
defineReplace(headersAndSources) { variable = $$1 names = $$eval($$variable) headers = sources = for(name, names) { header = $${name}.h exists($$header) { headers += $$header } source = $${name}.cpp exists($$source) { sources += $$source } } return($$headers $$sources)}
qmake提供了用於編寫做用域時做爲條件的內置函數。這些內置函數不會返回一個值,而是指明成功或失敗。
count(options, 2) { message(Both release and debug specified.)}
這些內置函數只能用於條件表達式。
能夠自定義函數提供做用域的條件。下列代碼用於測試一個列表中的每一個文件是否存在,若是全部的文件都存在,返回true;不然返回false。
defineTest(allFiles) { files = $$ARGS for(file, files) { !exists($$file) { return(false) } } return(true)}
Qmake容許用戶建立本身的特性,增長到工程文件中,經過增長名稱到CONFIG變量的值列表中。
預編譯頭文件是一些編譯器支持的一種性能特性,用於編譯穩定的代碼體,並將代碼的編譯狀態存儲在二進制文件中。在後續編譯過程當中,編譯器將加載存儲狀態,並繼續編譯指定的文件。每一個後續編譯速度更快,由於不須要從新編譯穩定的代碼。qmake支持在某些平臺上使用預編譯頭文件(PCH)和構建環境。
Windows平臺:
nmake Dsp projects (VC 6.0) Vcproj projects (VC 7.0 & 7.1)
Mac OS X平臺:
Makefile Xcode
Unix平臺:
GCC 3.4及以上版本
A、預編譯頭文件的註釋
預編譯頭必須包含在整個工程中穩定和靜態的代碼。典型的PCH以下:
// Add C includes here #if defined __cplusplus // Add C++ includes here #include <stdlib> #include <iostream> #include <vector> #include <QApplication> // Qt includes #include <QPushButton> #include <QLabel> #include "thirdparty/include/libmain.h" #include "my_stable_class.h" ... #endif
注意:預編譯頭文件須要從C++包含中分離出C包含,由於C文件的預編譯頭文件可能不包含C++代碼。
B、工程選項
要在工程中使用預編譯頭文件,只須要在工程文件中定義PRECOMPILED_HEADER變量便可。PRECOMPILED_HEADER = stable.h
qmake會處理其他事情,確保建立和使用預編譯頭文件。開發者不須要在HEADERS中包含預編譯頭文件,由於若是配置支持PCH,qmake會這樣作。
默認狀況下,Windows(以及Windows CE)爲目標的MSVC和G++規範會經過precompile_header開啓預編譯。
使用precompile_header選項,能夠在工程文件中觸發條件代碼塊,以便在使用預編譯頭時添加設置。
precompile_header:!isEmpty(PRECOMPILED_HEADER) { DEFINES += USING_PCH}
在某些平臺上,預編譯頭文件的文件名後綴與其餘對象文件的文件名後綴相同。例如,下面的聲明可能會致使兩個不一樣的對象文件生成相同的名稱:
PRECOMPILED_HEADER = window.h SOURCES = window.cpp
爲了不像這樣的潛在衝突,確保將預編譯的頭文件賦予不一樣的名稱是一種很好的工程實踐。
下列代碼能夠在Qt發佈版的examples/qmake/precompile目錄下能夠找到。
mydialog.ui文件:
<ui version="4.0" > <author></author> <comment></comment> <exportmacro></exportmacro> <class>MyDialog</class> <widget class="QDialog" name="MyDialog" > <property name="geometry" > <rect> <x>0</x> <y>0</y> <width>401</width> <height>70</height> </rect> </property> <property name="windowTitle" > <string>Mach 2!</string> </property> <layout class="QVBoxLayout" > <property name="margin" > <number>9</number> </property> <property name="spacing" > <number>6</number> </property> <item> <widget class="QLabel" name="aLabel" > <property name="text" > <string>Join the life in the fastlane; - PCH enable your project today! -</string> </property> </widget> </item> <item> <widget class="QPushButton" name="aButton" > <property name="text" > <string>&Quit</string> </property> <property name="shortcut" > <string>Alt+Q</string> </property> </widget> </item> </layout> </widget> <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> <resources/> <connections/> </ui>
stable.h文件:
/* Add C includes here */ #if defined __cplusplus /* Add C++ includes here */ # include <iostream> # include <QApplication> # include <QPushButton> # include <QLabel> #endif
myobject.h文件:
#include <QObject> class MyObject : public QObject { public: MyObject(); ~MyObject(); };
myobject.cpp文件:
#include <iostream> #include <QDebug> #include <QObject> #include "myobject.h" MyObject::MyObject() : QObject() { std::cout << "MyObject::MyObject()\n"; }
util.cpp文件:
void util_function_does_nothing() { // Nothing here... int x = 0; ++x; }
main.cpp文件:
#include <QApplication> #include <QPushButton> #include <QLabel> #include "myobject.h" #include "mydialog.h" int main(int argc, char **argv) { QApplication app(argc, argv); MyObject obj; MyDialog dialog; dialog.connect(dialog.aButton, SIGNAL(clicked()), SLOT(close())); dialog.show(); return app.exec(); }
precompile.pro文件:
TEMPLATE = app LANGUAGE = C++ CONFIG += console precompile_header # Use Precompiled headers (PCH) PRECOMPILED_HEADER = stable.h HEADERS = stable.h \ mydialog.h \ myobject.h SOURCES = main.cpp \ mydialog.cpp \ myobject.cpp \ util.cpp FORMS = mydialog.ui
QMake的基本行爲受定義在工程構建過程當中聲明的變量的影響。某些變量用於聲明資源,如每一個平臺中通用的頭文件、源文件,其它變量用於定義指定平臺中的編譯器和連接器中的行爲。
平臺特定變量遵循變量擴展或修改的命名模式,但在其名稱中包含相關平臺的名稱。例如,QMAKE_LIBS用於指定工程須要連接的庫的列表,QMAKE_LIBS_X11用於擴展或覆寫這個列表。
CONFIG
CONFIG變量用於指定工程配置和編譯器選項。CONFIG變量的值會被qmake內部識別並有特殊的意義。
下列CONFIG值用於控制編譯選項:
release:工程會以release模式構建,若是指定了debug,會被忽略。
debug:工程會被debug模式構建
debug_and_release:工程會以debug和release兩種模式構建,會有一些意想不到的反作用。
build_all:若是指定了debug_and_release,工程默認會以debug和release兩種模式構建
ordered:當使用subdirs模板時,本選項指定列出的子目錄會以給出的順序被處理
precompile_header:在工程中支持預編譯頭文件的使用
warn_on:編譯器應該輸出儘量多的警告信息,若是指定warn_off,本選項會會忽略。
warn_off:編譯器應該輸出儘量少的警告信息
因爲 CONDIG變量中定義debug和release兩個選項時,debug選項會覆蓋release選項,若是想要使用debug和release兩種模式構建工程,使用debug_and_release選項。此時,qmake會生成包含構建兩種版本的規則的MakeFiles,使用make all能夠調用。
當連接庫時,qmake依賴於底層平臺來了解庫中連接的其它庫。可是,若是是靜態連接,除非使用下列的CONFIG選項,不然qmake不會獲得這些信息。
create_prl:本選項使qmake可以追蹤這些依賴關係。當本選項開啓,qmake會建立一個以.prl結尾的文件,用於保存有關庫的元信息。
link_prl:當本選項開啓時,qmake會處理全部連接到應用程序的庫,並找出他們的元信息。
注意:構建一個靜態庫時,須要使用create_prl;使用一個靜態庫時,須要使用link_prl。
DEFINES
qmake會將DEFINES變量的值做爲C編譯器預處理宏(-D)添加。
例如:DEFINES += USE_MY_STUFF QT_DLL
DEPENDPATH
此變量包含要查找依賴關係的全部目錄的列表,會在查找包含文件時候使用。
DESTDIR
指定輸出目標文件的目錄
DESTDIR_TARGET
本變量是由qmake內部設置的,基本是DESTDIR變量加上TARGET變量做爲結尾。本變量的值一般由qmake或qmake.conf處理,而且不多須要修改。
DLLDESTDIR
指定dll目標文件拷貝到的地方
FORMS
本變量指定在編譯前,uic要處理的UI文件。爲了構建這些UI文件自動增長到工程,須要全部的依賴、頭文件、源文件。
HEADERS
定義工程的頭文件。qmake會爲指定頭文件生成依賴信息。若是頭文件中須要moc,qmake也會自動檢測,爲了生成和連接moc文件,會增長相應的依賴和文件到工程。
HEADERS = myclass.h \ login.h \ mainwindow.h
INCLUDEPATH
本變量指定編譯時須要查找搜索的inlucde路徑。
爲了指定一個包含空格的路徑,將路徑使用引號括起來。
win32:INCLUDEPATH += "C:/mylibs/extra headers" unix:INCLUDEPATH += "/home/user/extra headers"
INSTALLS
本變量包含當make install或是相似的安裝過程被執行時,要被安裝的資源列表。INSTALLS值列表中的每一個項會一般會使用屬性定義,屬性提供安裝在哪兒的相關信息。
例如,下列代碼target.path定義描述了構建目標被安裝的路徑,增長構建目標到INSTALLS會將構建目標加入要安裝的資源列表中。
target.path += $$[QT_INSTALL_PLUGINS]/imageformats INSTALLS += target
注意:qmake會忽略可執行文件,若是須要安裝可執行文件,能夠取消文件的可執行屬性標識。
LIBS
本變量包含連接到工程的庫列表。可使用Unix平臺-l(library)和-L(library path)的標識,qmake會正確處理Windows和Symbian平臺上的這些庫。例如:
unix:LIBS += -L/usr/local/lib -lmath win32:LIBS += c:/mylibs/math.lib
注意:在Windows平臺,使用-l選項指定庫會使用最高版本的庫。例如,math2.lib可能會潛在使用,替換math.lib。爲了便面這種模糊性,推薦顯示的指定庫,經過使用包含庫文件後綴.lib的文件名。
爲了指定包含空格的路徑,將路徑使用引號括起來。
win32:LIBS += "C:/mylibs/extra libs/extra.lib" unix:LIBS += "-L/home/user/extra libs" -lextra
默認狀況下,使用庫前,存儲在LIBS變量中的庫列表會被簡化爲惟一名稱的列表。爲了改變這種行爲,可使用在CONFIG變量使用no_lflags_merge選項。
MOC_DIR
本變量指定臨時moc文件的存放路徑。例如,
unix:MOC_DIR = ../myproject/tmp win32:MOC_DIR = c:/myproject/tmp
PRECOMPILED_HEADER
爲了加快工程的編譯速度,本變量會爲建立一個預編譯頭文件指明一個頭文件。預編譯頭文件目前只支持某些平臺(Windows全部MSVC工程類型, Mac OS X - Xcode, Makefile, Unix - gcc 3.3+版本)。
PWD
本變量指定指向當前文件被解析的目錄的全路徑。爲了支持影子構建,編寫工程文件時在源碼樹引用文件時會有用。
OUT_PWD
本變量包含指向生成MakeFile文件的目錄的全路徑
QMAKE
本變量包含qmake程序本身的名字,會放在生成的MakeFile文件中。
QMAKESPEC
當生成MakeFile時,本變量包含qmake配置要使用的名稱。
使用QMAKESPEC環境變量會覆蓋qmake配置。注意,因爲qmake讀取工程文件的方式,在工程文件內設置QMAKESPEC變量會沒有效果。
QT
QT變量中存儲的值用於控制工程中使用的Qt模塊。
core:默認包含,QtCore模塊
gui:默認包含,QtGui模塊
network:QtNetwork模塊
opengl:QtOpenGl模塊
phonon:Phonon多媒體框架
sql:QtSql模塊
svg:QtSvg模塊
xml:QtXml模塊
webkit:QtWebkit模塊
默認,QT包含core和gui模塊,在沒有進一步配置的狀況下確保構建一個GUI應用程序。
若是想要構建一個沒有QtGui模塊的工程,須要使用「-=」將gui排除。如:QT -= gui # Only the core module is used
注意:增長opengl選項到QT變量會自動將相應的選項增長到CONFIG變量。所以,對於應用程序來講,沒必要增長opengl選項到QT和CONFIG兩個變量。
QTPLUGIN
本變量包含靜態插件的名字列表
QT_VERSION
本變量包含當前Qt的版本
QT_MAJOR_VERSION
本變量包含當前Qt版本的主版本號
QT_MINOR_VERSION
本變量包含當前Qt版本的次版本號
RC_FILE
本變量包含應用程序的資源文件的名稱
RESOURCES
本變量包含資源集合文件的名稱(qrc)
SOURCES
本變量包含工程中全部源文件的名稱,如:
SOURCES = myclass.cpp \ login.cpp \ mainwindow.cpp
SUBDIRS
此變量與subdirs模板一塊兒使用時,指定包含須要構建的工程部分的全部子目錄或工程文件的名稱。使用此變量指定的每一個子目錄必須包含其本身的工程文件。
建議每一個子目錄中的工程文件與子目錄自己具備相同的基名,由於這樣能夠省略文件名。例如,若是子目錄是myapp,目錄中的工程文件應用命名爲myapp.pro。
或者,能夠在任何目錄中指定.pro文件的相對路徑。強烈建議只在當前工程的父目錄或其子目錄中指定路徑。例如:
SUBDIRS = kernel \ tools \ myapp
若是須要確保子目錄按指定的順序構建,須要在CONFIG 變量增長ordered選項。CONFIG += ordered
經過修改附加的屬性SUBDIRS的默認行爲,支持的附加調節屬性以下:
.subdir:使用指定的子目錄取代SUBDIRS的值
.file:顯示指定子工程的pro文件,不能與修飾符.subdir結合使用
.condition:指定bld.inf定義,若是子工程被構建,必須爲true。
.depends:子工程依賴於指定的子工程,只對生成MakeFile的平臺可用。
.makefile:子工程的MakeFile,只對生成MakeFile的平臺可用。
.target:子工程相關的MakeFile目標的基字符串
例如,定義兩個子目錄,它們的值不一樣於SUBDIRS的值。
SUBDIRS += my_executable my_library my_executable.subdir = app my_executable.depends = my_library my_library.subdir = lib
Visual Studio不支持ordered選項。
TARGET
本變量指定目標文件名稱
TEMPLATE = app
TARGET = myapp
SOURCES = main.cpp
上述代碼會在建立一個可執行文件myapp(Unix)和myapp.exe(Windows)。
TEMPLATE
本變量指定目標文件的名稱。
app :創建一個應用程序的Makefile,是默認值。
lib:創建一個庫的Makefile。
vcapp:創建一個應用程序的Visual Studio項目文件。
vclib:創建一個庫的Visual Studio項目文件。
subdirs:特殊的模板,
TRANSLATIONS
本變量包含翻譯文件(.ts)列表,
VERSION
本變量用於包含應用程序或庫的版本號。
QMake提供內置函數用於處理變量的內容以及在配置過程當中進行測試。處理變量內容的函數一般會返回可賦值給其它變量的值,可使用$$FuncionName獲取函數的返回值;進行測試的函數一般做爲做用域的條件部分使用。
qmake提供了在配置過程當中處理變量內容的函數。這些函數稱爲替換函數。一般,替換函數返回能夠賦值給其它變量的值。能夠經過在函數名稱前使用$$操做符來獲取這些值。
basename(variablename)
返回指定文件的基本文件名
FILE = /etc/passwd FILENAME = $$basename(FILE) #passwd
dirname(file)
返回指定文件file中的目錄部分
FILE = /etc/X11R6/XF86Config DIRNAME = $$dirname(FILE) #/etc/X11R6
find(variablename, substr)
在variablename變量的全部值中查找匹配substr字符串的值,substr多是正則表達式。
join(variablename, glue, before, after)
使用glue鏈接variablename變量中的值。若是變量的值非空,在值前面加一個前綴before,在值的後面加一個後綴after。Variablename是必須參數,其它參數默認是空字符串。若是須要在glue、before、after中對空格進行編碼,必須對它們使用引號。
member(variablename, position)
返回variablename變量的值列表中position位置的值。若是在指定位置不能找到值項,返回一個空字符串。Variablename是必須參數,若是不指定position參數,position默認爲0,返回variablename變量的值列表中的第一個值。
prompt(question)
顯示指定的question,返回一個從stdin讀取的值。
quote(string)
將整個string轉換爲單個實體,返回結果。這只是一種把字符串括上雙引號的花樣方法。
replace(string, old_string, new_string)
使用new_string替換在變量string中出現的old_string。如:
MESSAGE = This is a tent. message($$replace(MESSAGE, tent, test)) sprintf(string, arguments...)
使用逗號分隔的函數參數arguments替換1%——9%,返回處理後的字符串。
unique(variablename)
返回變量中值的鏈表,若是有重複的刪除。
ARGS = 1 2 3 2 5 1 ARGS = $$unique(ARGS) #1 2 3 5
CONFIG(config)
本函數用來測試放置在CONFIG變量中的變量。這與常規舊式(tmake)做用域相同,但具備附加的優勢,能夠將第二個參數傳遞給活動配置進行測試。因爲CONFIG變量中值的順序是重要的,CONFIG的第二個參數用於指定要考慮的值的集合。例如:
CONFIG = debug CONFIG += release CONFIG(release, debug|release):message(Release build!) #will print CONFIG(debug, debug|release):message(Debug build!) #no print
因爲release做爲活躍設置, CONFIG用於生成構建文件。在通常狀況下,不須要第二個參數,但對於特定的互斥測試,這是很是寶貴的。
contains(variablename, value)
若是variablename變量包含value值,成功;不然,失敗。可使用做用域檢查此函數的返回值。
contains( drivers, network ) { # drivers contains 'network' message( "Configuring for network build..." ) HEADERS += network.h SOURCES += network.cpp}
上述代碼只有在drivers變量包含network值的條件下,做用域纔會被處理。
count(variablename, number)
若是variablename變量包含指定數量number的值列表,成功;不然,失敗。
本函數用於確保做用域內的聲明僅在變量包含正確數值的狀況下才被處理。
options = $$find(CONFIG, "debug") $$find(CONFIG, "release") count(options, 2) { message(Both release and debug specified.)}
error(string)
函數無返回值,用於顯示給定的字符串string給用戶,並退出。只用於不可恢復的錯誤。error(An error has occurred in the configuration process.)
eval(string)
評估使用qamke語法規則的string字符串的內容,返回true。在string字符串中可使用定義和賦值來修改現有變量的值或建立新的定義。
eval(TARGET = myapp) { message($$TARGET)}
注意:引號能夠用來分隔字符串,若是不須要返回值,則能夠放棄。
exists(filename)
測試給定文件名的文件是否存在。若是文件存在,函數成功;不然,失敗。若是文件名是一個正則表達式,若是有任何文件匹配成功,則函數執行成功。
exists( $(QTDIR)/lib/libqt-mt* ) { message( "Configuring for multi-threaded Qt..." ) CONFIG += thread }
for(iterate, list)
這個特殊的測試函數將開啓循環,遍歷列表中的全部值,依次對每一個值設置迭代。爲方便起見,若是列表爲1…10,則迭代將遍歷值1到10。
在for循環的條件行後使用else做用域是不容許的。
LIST = 1 2 3 for(a, LIST):exists(file.$${a}):message(I see a file.$${a}!)
message(string)
此函數簡單地將消息寫入控制檯。不像error()函數,本函數容許繼續處理。message( "This is a message" )
上述代碼會將"This is a message"消息寫入控制檯。引號的使用是可選的。
注意:默認,對於給定項目,qmake生成的每一個MakeFile文件都會寫入消息。若是要確保每一個項目只顯示一次消息,在構建期間,能夠測試build_pass變量,並在相鄰build_pass變量的做用域中過濾出消息。!build_pass:message( "This is a message" )
include(filename)
將filename指定的文件的內容包含在當前工程所在的點。若是文件已經被包含,函數成功;不然,失敗。被包含的文件要被當即處理。
經過使用此函數做爲做用域的條件,能夠檢查文件是否被包含。
include( shared.pri ) OPTIONS = standard custom!include( options.pri ) { message( "No custom build options specified" ) OPTIONS -= custom}
infile(filename, var, val)
當文件被qmake解析時,若是filename文件包含有val值的var變量,成功;不然,失敗。若是不指定第三個參數val,函數只會測試文件中是否包含var變量。isEmpty(variablename)
若是variablename變量爲空,成功;不然,失敗。等價於count(variablename, 0)。
isEmpty(CONFIG) { CONFIG += qt warn_on debug}
system(command)
在shell中執行給定的命令command,若是command返回一個0的退出狀態,成功;不然,失敗。
可使用system函數從command命令獲取stdout和stderr,賦值給變量。如:
UNAME = $$system(uname -s) contains( UNAME, [lL]inux ):message( This looks like Linux ($$UNAME) to me )
warning(string)
顯示給定的字符串string,總會成功。與message()相同。
packagesExist(packages)
使用PKGCONFIG機制決定在工程解析時是否存在給定的packages。一般用於打開、關閉特性。如:
packagesExist(sqlite3 QtNetwork QtDeclarative) { DEFINES += USE_FANCY_UI }
qmake擁有一個持久信息系統,容許在qmake中一次設置變量,之後每次調用qmake時,能夠查詢該值。
在qmake中按以下設置變量:qmake -set VARIABLE VALUE
使用適當的變量和值應該代替VARIABLE和VALUE。
爲了從qmake中取出信息,以下:
qmake -query VARIABLE qmake -query #queries all current VARIABLE/VALUE pairs..
注意:qmake -query只會列出先前使用qmake -set VARIABLE VALUE設置的變量。
屬性信息會被保存到QSetting對象中對象中(意味着它將存儲在不一樣平臺的不一樣位置)。因爲VARIABLE也能夠被版本化,能夠在較舊版本的qamke中設置一個值,而較新版本將檢索此值。可是,若是在較新版本的qmake設置VARIABLE,將不能再舊版本使用這個值。經過前綴化qmake的版本到VARIABLE,能夠查詢特定版本的變量,代碼以下:qmake -query "1.06a/VARIABLE"
qmake也有內置屬性的概念,例如可使用QT_INSTALL_PREFIX屬性查詢這個qmake版本的Qt安裝。qmake -query "QT_INSTALL_PREFIX"
因爲沒有被版本化,內置屬性不能有前綴版本,而且qmake的每一個版本都有本身的內置屬性值集合。
QT_INSTALL_PREFIX:Where the version of Qt this qmake is built for resides QT_INSTALL_DATA - Where data for this version of Qt resides
QMAKE_VERSION:當前qmake的版本
最終,這些值能夠在一個工程文件中查詢,使用以下語法:QMAKE_VERS = $$[QMAKE_VERSION]
qmake須要一個平臺和編譯器的描述文件,文件包含不少用於生成MakeFile的默認值。標準的Qt版本帶有不少這類文件,位於Qt安裝目錄的 mkspecs子目錄下。
QMAKESPEC環境變量包含下列的任何值:
指向包含qmake.conf文件的目錄的完整路徑。qmake會打開目錄中的qmake.conf文件。若是文件不存在,qmake會以錯誤退出。
平臺-編譯器組合的名稱。qmake會搜索,當Qt編譯時
QMAKESPEC路徑會自動增長到INCLUDEPATH系統變量。
在Unix上,使用構建工具安裝應用程序和庫是相同的。例如,經過調用make install。qmake有安裝集的概念,。
例如,documentation文件集合使用以下方式描述:
documentation.path = /usr/local/program/doc documentation.files = docs/*
path成員告訴qmake,文件應該安裝在/usr/local/program/doc路徑,files成員指定要拷貝到安裝目錄下的文件。本例中,docs目錄下的全部文件將被拷貝到/usr/local/program/doc目錄。
一旦安裝集已被徹底描述,能夠像以下代碼將其添加到安裝列表中:INSTALLS += documentation
qmake會確保指定的文件被拷貝到安裝目錄。若是須要對安裝過程進行更大的控制,還能夠爲對象的額外成員提供定義。例如,下列代碼告訴qmake爲安裝集執行一系列的命令:unix:documentation.extra = create_docs; mv master.doc toc.doc
unix做用域確保這些特殊的命令只會在unix平臺下執行。其它平臺適合的命令可使用其它做用域規則定義。
在執行對象的其餘成員中的指令前執行extra成員中指定的命令。
若是追加內置的安裝集到INSTALLS變量,而且不指定files和extra成員,qmake會決定拷貝哪些內容。目前,只支持內置安裝集的是target:
target.path = /usr/local/myprogram INSTALLS += target
上訴代碼中,qmake知道拷貝哪些內容,自動處理安裝過程。
緩存文件是qmake讀取的特殊文件,用於查找不在qmake.conf文件、工程文件或是命令行指定的設置。若是qmake運行時沒有指定-nocache選項,qmake會試圖在當前目錄的上層目錄下查找名稱爲.qmake.cache的文件。若是沒有找到,qmake會忽略這個處理步驟。 若是qmake找到一個.qmake.cache文件,qmake會在處理工程文件前首先處理這個文件。
常常在連接到一個庫時,qmake依賴於底層平臺來了解庫中連接的其餘庫,並讓平臺將它們拉入。然而,在不少狀況下,這是不夠的。例如,當靜態連接一個庫時,沒有連接到其餘庫,所以不會建立與這些庫的依賴關係。可是,後續連接到該庫的應用程序須要知道在哪裏能夠找到靜態庫所需的符號。爲了幫助解決這種狀況,qmake嘗試在適當的狀況下遵循庫的依賴關係,可是必須經過如下兩個步驟明確地啓用該行爲。
A、開啓庫自身的依賴追蹤。要作到這點,必須告訴qmake保存庫的有關信息。CONFIG += create_prl
這隻和lib模板有關,其它模板會被忽略。當啓用此選項時,qmake會建立一個在.prl結尾的文件,該文件將保存庫相關的一些元信息。這個元文件就像一個普通的工程文件,但只包含內部變量聲明。能夠自由查看該文件,若是刪除該文件,則qmake會知道在須要時從新建立它,即在後續讀取工程文件時,或者若是依賴庫(如下描述)已經發生變化時。在安裝此庫時,經過將其指定爲INSTALLS聲明中的目標,qmake將自動將.prl文件拷貝到安裝路徑。
B、在使用靜態庫的應用程序中讀取該元信息。CONFIG += link_prl
當該選項開啓,qmake會處理由應用程序連接的全部庫,並找到它們的元信息。qmake會使用它來肯定相關連接信息,特別是嚮應用程序工程文件的DEFINES以及LIBS添加值。一旦qmake處理了該文件,它將查看LIBS變量中新引入的庫,並找到它們的依賴.prl文件,直到全部庫都被解析。此時,MakeFile文件按常規建立,而且庫與應用程序顯式連接。
prl文件的內部結構是關閉的,所以後續能夠很容易地進行更改。prl文件並非用來被手工改變的,只能由{qmake Manual#qmake}{qmake}建立,而且不該該在操做系統之間傳輸,因爲它們可能包含依賴於平臺的信息。
在正常狀況下,qmake會嘗試爲平臺使用適當的文件擴展名。可是,有時須要重寫每一個平臺的默認選項,並顯式定義用於qmake的文件擴展名。這是經過從新定義某些內置變量來實現的;
例如,用於moc文件的擴展能夠用工程文件中的如下賦值來從新定義。QMAKE_EXT_MOC = .mymoc
下列變量可用於從新定義qmake所識別的公共文件擴展名。
QMAKE_EXT_MOC:修改包含的moc文件的擴展
QMAKE_EXT_UI:修改designer UI文件的擴展
QMAKE_EXT_PRL:修改庫依賴文件的擴展
QMAKE_EXT_LEX:修改文件後綴(LEXSOURCES)
QMAKE_EXT_YACC:修改文件後綴(YACCSOURCES)
QMAKE_EXT_OBJ:修改生成的對象文件的後綴
上述全部變量都只接受第一個值,因此必須給它分配一個值,會在整個工程文件中使用。有兩個變量能夠接受一個值列表:
QMAKE_EXT_CPP:qmake會將這些後綴的文件解釋爲C++源文件 QMAKE_EXT_H:qmake會將這些後綴的文件解釋爲C和C++頭文件
qmake試圖實現跨平臺構建工具所指望的一切。當真的須要運行特定的平臺相關命令時,經常是不太理想的。這能夠經過對不一樣qmake後端的特定指令來實現。
對MakeFile文件輸出的定製是經過對象風格的API實現的,就像在qmake中其它地方發現的那樣。對象是經過指定成員來自動定義的,例如:
mytarget.target = .buildfile mytarget.commands = touch $$mytarget.target mytarget.depends = mytarget2 mytarget2.commands = @echo Building $$mytarget.target
上述代碼定義了一個名爲mytarget的qmake目標,mytarget目標包含一個名爲.buildfile的MakeFile目標,.buildfile使用touch命令依次生成。最終,.depends成員指定mytarget目標依賴於mytarget2。mytarget2是一個僞目標,只定義了一些顯示到控制檯的文本。
最後一步是指示qmake,這個對象是要創建的目標。
QMAKE_EXTRA_TARGETS += mytarget mytarget2
這就是實際構建自定義目標所需作的一切。固然,可能但願將其中一個目標綁定到qmake構建目標。要作到這一點,只須要將MakeFile目標包含到PRE_TARGETDEPS列表中。
下表是QMAKE_EXTRA_TARGETS變量的可用選項的概述。
commands:生成自定義構建目標的命令
CONFIG:自定義構建目標的特定配置選項
depends:自定義目標鎖依賴的現有構建目標
recurse:爲了調用子目標的MakeFile文件,當建立MakeFile文件時,指定使用哪些子目標。當CONFIG變量設置了recursive才能使用。
recurse_target:經過MakeFile文件中的子目標MakeFile文件,指定要構建的目標。
target:自定義構建目標建立的文件
CONFIG變量:
recursive:指明MakeFile中要建立的規則,於是會在子目標的MakeFile文件中調用相關目標。默認會爲每一個子目標建立一個實體。
爲了方便起見,還有一種新的編譯器或預處理器的工程定製方法。
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,可使用moc隨時替換。在給定的NEW_HEADERS變量的全部參數上執行命令。結果寫到output成員指定文件。這個文件會被增長到工程中的其它源文件。此外,爲了生成依賴信息,qmake會執行depend_command命令,也將這些信息放到工程中。這些命令能夠很容易地放入緩存文件中,從而容許後續工程文件向NEW_HEADERS添加參數。下表概述了QMAKE_EXTRA_COMPILERS變量的可用選項。commands:用於從輸入產生輸出的命令。CONFIG:爲自定義編譯器指定配置選項depend_command:指定用於生成輸出依賴項列表的命令。dependency_type:指定輸出的文件類型,若是它是已知類型(TYPE_C, TYPE_UI, TYPE_QRC),則使用其中的一種類型處理它。depends:指定輸出文件的依賴input:包含使用自定義編譯器處理的文件的變量name:對自定義編譯器所作事情的描述。只用於某些後端output:自定義編譯器建立的文件名output_function:指定用於建立文件名的qmake自定義函數variable_out:應該將從輸出建立的文件添加到變量。指定到CONFIG選項的成員:commands:用於從輸入產生輸出的命令。CONFIG:爲自定義編譯器指定配置選項depend_command:指定用於生成輸出依賴項列表的命令。dependency_type:指定輸出的文件類型,若是它是已知類型(TYPE_C, TYPE_UI, TYPE_QRC),則使用其中的一種類型處理它。depends:指定輸出文件的依賴input:包含使用自定義編譯器處理的文件的變量name:對自定義編譯器所作事情的描述。只用於某些後端output:自定義編譯器建立的文件名output_function:指定用於建立文件名的qmake自定義函數variable_out:應該將從輸出建立的文件添加到變量。