forked from qt-creator/qt-creator
		
	Clang-Tidy checks and Clazy flags updated. CLANG-UPGRADE-CHECK done. Change-Id: I1ca585c5c3c77a7f183719df9c262603150914e8 Reviewed-by: Alessandro Portale <alessandro.portale@qt.io> Reviewed-by: Eike Ziller <eike.ziller@qt.io> Reviewed-by: Marco Bubke <marco.bubke@qt.io>
		
			
				
	
	
		
			207 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			207 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
var Environment = require("qbs.Environment")
 | 
						|
var File = require("qbs.File")
 | 
						|
var FileInfo = require("qbs.FileInfo")
 | 
						|
var MinimumLLVMVersion = "8.0.0" // CLANG-UPGRADE-CHECK: Adapt minimum version numbers.
 | 
						|
var Process = require("qbs.Process")
 | 
						|
 | 
						|
function readOutput(executable, args)
 | 
						|
{
 | 
						|
    var p = new Process();
 | 
						|
    var output = "";
 | 
						|
    if (p.exec(executable, args, false) !== -1)
 | 
						|
        output = p.readStdOut().trim(); // Trailing newline.
 | 
						|
    p.close();
 | 
						|
    return output;
 | 
						|
}
 | 
						|
 | 
						|
function readListOutput(executable, args)
 | 
						|
{
 | 
						|
    var list = readOutput(executable, args).split(/\s+/);
 | 
						|
    if (!list[list.length - 1])
 | 
						|
        list.pop();
 | 
						|
    return list;
 | 
						|
}
 | 
						|
 | 
						|
function isSuitableLLVMConfig(llvmConfigCandidate, qtcFunctions)
 | 
						|
{
 | 
						|
    if (File.exists(llvmConfigCandidate)) {
 | 
						|
        var candidateVersion = version(llvmConfigCandidate);
 | 
						|
        if (candidateVersion && candidateVersion.length)
 | 
						|
            return qtcFunctions.versionIsAtLeast(candidateVersion, MinimumLLVMVersion)
 | 
						|
    }
 | 
						|
    return false;
 | 
						|
}
 | 
						|
 | 
						|
function llvmConfig(hostOS, qtcFunctions)
 | 
						|
{
 | 
						|
    var llvmInstallDirFromEnv = Environment.getEnv("LLVM_INSTALL_DIR")
 | 
						|
    var llvmConfigVariants = [
 | 
						|
        "llvm-config", "llvm-config-7", "llvm-config-8", "llvm-config-9"
 | 
						|
    ];
 | 
						|
 | 
						|
    // Prefer llvm-config* from LLVM_INSTALL_DIR
 | 
						|
    var suffix = hostOS.contains("windows") ? ".exe" : "";
 | 
						|
    if (llvmInstallDirFromEnv) {
 | 
						|
        for (var i = 0; i < llvmConfigVariants.length; ++i) {
 | 
						|
            var variant = llvmInstallDirFromEnv + "/bin/" + llvmConfigVariants[i] + suffix;
 | 
						|
            if (isSuitableLLVMConfig(variant, qtcFunctions))
 | 
						|
                return variant;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    // Find llvm-config* in PATH
 | 
						|
    var pathListString = Environment.getEnv("PATH");
 | 
						|
    var separator = hostOS.contains("windows") ? ";" : ":";
 | 
						|
    var pathList = pathListString.split(separator);
 | 
						|
    for (var i = 0; i < llvmConfigVariants.length; ++i) {
 | 
						|
        for (var j = 0; j < pathList.length; ++j) {
 | 
						|
            var variant = pathList[j] + "/" + llvmConfigVariants[i] + suffix;
 | 
						|
            if (isSuitableLLVMConfig(variant, qtcFunctions))
 | 
						|
                return variant;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    return undefined;
 | 
						|
}
 | 
						|
 | 
						|
function includeDir(llvmConfig)
 | 
						|
{
 | 
						|
    return FileInfo.fromNativeSeparators(readOutput(llvmConfig, ["--includedir"]));
 | 
						|
}
 | 
						|
 | 
						|
function libDir(llvmConfig)
 | 
						|
{
 | 
						|
    return FileInfo.fromNativeSeparators(readOutput(llvmConfig, ["--libdir"]));
 | 
						|
}
 | 
						|
 | 
						|
function binDir(llvmConfig)
 | 
						|
{
 | 
						|
    return FileInfo.fromNativeSeparators(readOutput(llvmConfig, ["--bindir"]));
 | 
						|
}
 | 
						|
 | 
						|
function version(llvmConfig)
 | 
						|
{
 | 
						|
    return readOutput(llvmConfig, ["--version"]).replace(/(\d+\.\d+\.\d+).*/, "$1")
 | 
						|
}
 | 
						|
 | 
						|
function libraries(targetOS)
 | 
						|
{
 | 
						|
    return targetOS.contains("windows") ? ["libclang.lib", "advapi32.lib", "shell32.lib"] : ["clang"]
 | 
						|
}
 | 
						|
 | 
						|
function extraLibraries(llvmConfig, targetOS)
 | 
						|
{
 | 
						|
    var libs = []
 | 
						|
    if (targetOS.contains("windows"))
 | 
						|
        libs.push("version");
 | 
						|
    var dynamicList = readListOutput(llvmConfig, ["--libs"])
 | 
						|
        .concat(readListOutput(llvmConfig, ["--system-libs"]));
 | 
						|
    return libs.concat(dynamicList.map(function(s) {
 | 
						|
        return s.startsWith("-l") ? s.slice(2) : s;
 | 
						|
    }));
 | 
						|
}
 | 
						|
 | 
						|
function formattingLibs(llvmConfig, qtcFunctions, targetOS)
 | 
						|
{
 | 
						|
    var llvmIncludeDir = includeDir(llvmConfig);
 | 
						|
    if (!File.exists(llvmIncludeDir.concat("/clang/Format/Format.h")))
 | 
						|
        return [];
 | 
						|
 | 
						|
    var clangVersion = version(llvmConfig)
 | 
						|
    var libs = []
 | 
						|
    if (qtcFunctions.versionIsAtLeast(clangVersion, MinimumLLVMVersion)) {
 | 
						|
        if (qtcFunctions.versionIsAtLeast(clangVersion, "8.0.0")) {
 | 
						|
            libs.push(
 | 
						|
                "clangFormat",
 | 
						|
                "clangToolingInclusions",
 | 
						|
                "clangToolingCore",
 | 
						|
                "clangRewrite",
 | 
						|
                "clangLex",
 | 
						|
                "clangBasic"
 | 
						|
            );
 | 
						|
        } else {
 | 
						|
            libs.push(
 | 
						|
                "clangFormat",
 | 
						|
                "clangToolingCore",
 | 
						|
                "clangRewrite",
 | 
						|
                "clangLex",
 | 
						|
                "clangBasic"
 | 
						|
            );
 | 
						|
        }
 | 
						|
        libs = libs.concat(extraLibraries(llvmConfig, targetOS));
 | 
						|
    }
 | 
						|
 | 
						|
    return libs;
 | 
						|
}
 | 
						|
 | 
						|
function toolingLibs(llvmConfig, targetOS)
 | 
						|
{
 | 
						|
    var fixedList = [
 | 
						|
        "clangTooling",
 | 
						|
        "clangFrontend",
 | 
						|
        "clangIndex",
 | 
						|
        "clangParse",
 | 
						|
        "clangSerialization",
 | 
						|
        "clangSema",
 | 
						|
        "clangEdit",
 | 
						|
        "clangAnalysis",
 | 
						|
        "clangDriver",
 | 
						|
        "clangDynamicASTMatchers",
 | 
						|
        "clangASTMatchers",
 | 
						|
        "clangToolingCore",
 | 
						|
        "clangAST",
 | 
						|
        "clangLex",
 | 
						|
        "clangBasic",
 | 
						|
    ];
 | 
						|
 | 
						|
    return fixedList.concat(extraLibraries(llvmConfig, targetOS));
 | 
						|
}
 | 
						|
 | 
						|
function toolingParameters(llvmConfig)
 | 
						|
{
 | 
						|
    var params = {
 | 
						|
        defines: [],
 | 
						|
        includes: [],
 | 
						|
        cxxFlags: [],
 | 
						|
    };
 | 
						|
    var allCxxFlags = readListOutput(llvmConfig, ["--cxxflags"]);
 | 
						|
    var badFlags = [
 | 
						|
        "-fno-exceptions",
 | 
						|
        "/W4",
 | 
						|
        "-Wcovered-switch-default",
 | 
						|
        "-Wnon-virtual-dtor",
 | 
						|
        "-Woverloaded-virtual",
 | 
						|
        "-Wmissing-field-initializers",
 | 
						|
        "-Wno-unknown-warning",
 | 
						|
        "-Wno-unused-command-line-argument",
 | 
						|
        "-fPIC",
 | 
						|
        "-pedantic",
 | 
						|
        "-Wstring-conversion",
 | 
						|
        "-gsplit-dwarf"
 | 
						|
    ]
 | 
						|
    for (var i = 0; i < allCxxFlags.length; ++i) {
 | 
						|
        var flag = allCxxFlags[i];
 | 
						|
        if (flag.startsWith("-D") || flag.startsWith("/D")) {
 | 
						|
            params.defines.push(flag.slice(2));
 | 
						|
            continue;
 | 
						|
        }
 | 
						|
        if (flag.startsWith("-I") || flag.startsWith("/I")) {
 | 
						|
            params.includes.push(flag.slice(2));
 | 
						|
            continue;
 | 
						|
        }
 | 
						|
        if (!flag.startsWith("-std") && !flag.startsWith("-O") && !flag.startsWith("/O")
 | 
						|
                && !flag.startsWith("-march")
 | 
						|
                && !flag.startsWith("-Werror=")
 | 
						|
                && !flag.startsWith("/EH")
 | 
						|
                && !badFlags.contains(flag)) {
 | 
						|
            params.cxxFlags.push(flag);
 | 
						|
        }
 | 
						|
    }
 | 
						|
    return params;
 | 
						|
}
 | 
						|
 | 
						|
function buildMode(llvmConfig)
 | 
						|
{
 | 
						|
    return readOutput(llvmConfig, ["--build-mode"]);
 | 
						|
}
 |