获取QT项目源码和编译目录

从QT Greator源码中找到下面的函数可以获取源码根目录和编译输出的根目录。

[code]
isEqual(QT_MAJOR_VERSION, 5) {
defineReplace(cleanPath) {
return($$clean_path($$1))
}
defineReplace(targetPath) {
return($$shell_path($$1))
}
} else { # qt5
defineReplace(cleanPath) {
win32:1 ~= s|\\|/|g
contains(1, ^/.):pfx = /
else:pfx =
segs = $$split(1, /)
out =
for(seg, segs) {
equals(seg, ..):out = $$member(out, 0, -2)
else:!equals(seg, .):out += $$seg
}
return($$join(out, /, $$pfx))
}
defineReplace(targetPath) {
return($$replace(1, /, $$QMAKE_DIR_SEP))
}
} # qt5
isEqual(QT_MAJOR_VERSION, 5) {
# For use in custom compilers which just copy files
defineReplace(stripSrcDir) {
return($$relative_path($$absolute_path($$1, $$OUT_PWD), $$_PRO_FILE_PWD_))
}
} else { # qt5
# For use in custom compilers which just copy files
win32:i_flag = i
defineReplace(stripSrcDir) {
win32 {
!contains(1, ^.:.
):1 = $$OUT_PWD/$$1
} else {
!contains(1, ^/.*):1 = $$OUT_PWD/$$1
}
out = $$cleanPath($$1)
out ~= s|^$$re_escape($$_PRO_FILE_PWD_/)||$$i_flag
return($$out)
}
} # qt5
[/code]
利用上面的函数,可以获取编译输出的根目录(build_base_dir)。该段代码要放在源码根目录的pro或pri文件中,最好放在根目录下的pri文件中,每个子项目pro文件中都包含这个pri文件,这样pro文件中可以使用source_base_dir和build_base_dir这两个目录。
[code]
source_base_dir = $$PWD
isEmpty(build_base_dir) {
sub_dir = $$_PRO_FILE_PWD_
sub_dir ~= s,^$$re_escape($$PWD),,
build_base_dir = $$cleanPath($$OUT_PWD)
build_base_dir ~= s,$$re_escape($$sub_dir)$,,
}
[/code]