#
#  W A R N I N G
#  -------------
#
# This file is not part of the Qt API.  It exists purely as an
# implementation detail.  It may change from version to version
# without notice, or even be removed.
#
# We mean it.
#

defineReplace(cmakeModuleName) {
    _module = $$1
    _name = $$eval(QT.$${_module}.name)
    cmake_module_name = $$replace(_name, ^Qt, )
    return ($$cmake_module_name)
}

defineReplace(cmakeModuleList) {
    variable = $$1
    out =
    for(v, variable) {
        out += $$cmakeModuleName($$v)
    }
    return ($$join(out, ";"))
}

defineReplace(cmakeTargetPath) {
    SYSR = $$[QT_SYSROOT]
    !isEmpty(SYSR): path = /$$relative_path($$1, $$[QT_SYSROOT])
    else: path = $$1
    return($$clean_path($$path))
}

defineReplace(cmakeTargetPaths) {
    variable = $$1
    out =
    for(v, variable) {
        out += \"$$cmakeTargetPath($$v)\"
    }
    return ($$join(out, " "))
}

defineReplace(cmakePortablePaths) {
    variable = $$1
    out =
    for(v, variable) {
        out += $$[QT_SYSROOT]$$cmakeTargetPath($$v)
    }
    return ($$join(out, ";"))
}

defineReplace(cmakeProcessLibs) {
    variable = $$1
    out =
    for(v, variable) {
        if(!equals(v, -framework):!contains(v, -L.*)) {
            v ~= s,^-l,,
            v ~= s,^-lib,,
            v ~= s,.lib$,,
            out += $$v
        }
    }
    return ($$join(out, ";"))
}

defineReplace(cmakeRelativePath) {
    path = $$relative_path($$1, $$2)
    return($$replace(path, ([^/])$, \\1/))
}
