qmake文檔真的不是很全,好多變量都不知道到哪裏去找他們的用法,只能暫時copy源碼中的部分來用,以後再慢慢學習。這裏總結一下查找到資料的qmake知識。php
更多請參考:http://www.qtcentre.org/wiki/index.php?title=Undocumented_qmakelinux
defineReplace(cleanPath) { win32:1 ~= s|\\\\|/|g #用/替換掉\,正則表達式當中用四個反斜槓匹配反斜槓, 這裏是Perl的正則表達式的用法,|g表示替換所有符合的模式 contains(1, ^/.*):pfx = / #前綴是/的,在最後要加上/ else:pfx = segs = $$split(1, /)#根據/分開參數1 out = #去除segs中..和. for(seg, segs) { equals(seg, ..):out = $$member(out, 0, -2) #文檔中member函數是隻有兩個參數的,因此這個-2不清楚是作什麼的 else:!equals(seg, .):out += $$seg } return($$join(out, /, $$pfx)) ##用/將列表連接起來,並用pfx做爲結果的前綴 }
不少狀況下咱們須要根據當前build的mode來決定生成的文件名,好比,若是使用debug模式,就在生成文件後面加d。那麼當載入這些文件的時候,咱們還須要手動添加這樣的話:
debug{
MYFILE = $${NAME}_d.dll
}
release{
MYFILE = $${NAME}.dll
}
每次用到都要寫這個,那就來一個函數好了。在QtCreator中的實現是這樣的:
正則表達式
defineReplace(qtLibraryName) { unset(LIBRARY_NAME) LIBRARY_NAME = $$1 CONFIG(debug, debug|release) { !debug_and_release|build_pass { mac:RET = $$member(LIBRARY_NAME, 0)_debug else:win32:RET = $$member(LIBRARY_NAME, 0)d } } isEmpty(RET):RET = $$LIBRARY_NAME return($$RET) }
isEmpty(PRECOMPILED_HEADER):PRECOMPILED_HEADER = $$PWD/shared/***.h