defineReplace очень полезная оказывается штуковина господа! Это по сути функция вызываемая в pro файле. Причем ее можно определить в отдельном глобальном pri файле и подключать ко всм своим проектам.
Что делает конструкция ниже, точнее что сделает:
INCLUDEPATH += $$includePath($$PWD/../blablabla)
(это в pro файле):
defineReplace(cleanPath) {
win32:1 ~= s|\\\\|/|g
#message(cleanPath 1: $$1)
contains(1, ^/.*):pfx = /
else:pfx =
segs = $$split(1, /)
out =
for(seg, segs) {
equals(seg, ..):out = $$member(out, 0, -2)
else:!equals(seg, .):out += $$seg
}
#message(out : $$out)
#message(pfx : $$pfx)
win32:return($$join(out, /, $$pfx))
return($$join(out, /, $ $pfx))
}
defineReplace(includePath) {
#message(1: $$1)
!exists($$1){ #проверяет существует ли переданный путь в файловой системе (он в $$1)
error(unavailable path : $$1 )
}
path_for_INCLUDE = $$cleanPath($$1) #избавляемся от относительных переходов типа /../
contains( INCLUDEPATH, $$path_for_INCLUDE ) {
message(already included : $$path_for_INCLUDE)
return ("")
}
#message(now included : $$path_for_INCLUDE)
return($$path_for_INCLUDE)
}
defineReplace(cleanPath) убирает переходы в пути типа /../, точнее их преобразует к правильному абсолютному пути в файловой системе.
INCLUDEPATH += $$includePath($$PWD/../blablabla) сначала проверяет существует ли путь $$PWD/../blablabla в файловой системе.
Потом избавляемся от относительных переходов типа /../.
Потом проверяем - не существует ли уже в INCLUDEPATH добавляемый путь и если существует не добавляем (зачем нам дубли).
В итоге
Теперь у нас никогда не будет путей дублеров в INCLUDEPATH. Это очень нам поможет при разделении больших проектов на подпроекты и т.д.