From: Jo-Philipp Wich Date: Sun, 8 Jan 2017 18:43:11 +0000 (+0100) Subject: phase1: support to request specific CC / CXX versions X-Git-Tag: v1~198 X-Git-Url: http://git.openwrt.org/?p=buildbot.git;a=commitdiff_plain;h=7e4463d19ce9a964ee9fd1ee95ecd3668feb5975 phase1: support to request specific CC / CXX versions In order to ensure the portability of the resulting SDK to a broad range of systems, add support to request specific host compiler versions by overriding the CC and CXX environment variables. Also ship a script which aids in locating proper executables. Signed-off-by: Jo-Philipp Wich --- diff --git a/phase1/config.ini.example b/phase1/config.ini.example index dcacc5f..bfbe837 100644 --- a/phase1/config.ini.example +++ b/phase1/config.ini.example @@ -5,6 +5,7 @@ buildbot_url = http://phase1.builds.lede-project.org/ homedir = . expire = 1209600 port = 9989 +cc_version = le 4.9 [status] bind = tcp:8010:interface=127.0.0.1 diff --git a/phase1/findbin.pl b/phase1/findbin.pl new file mode 100755 index 0000000..5c9716a --- /dev/null +++ b/phase1/findbin.pl @@ -0,0 +1,69 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +sub vernum($) { + if ($_[0] =~ m!^((?:\d+\.)+\d+)$!) { + my ($maj, $min) = split /\./, $1; + return int($maj) * 256 + int($min); + } + + return 0; +} + +sub vercmp($$$) { + my ($op, $v1, $v2) = @_; + + if ($op eq 'lt') { return $v1 < $v2 } + elsif ($op eq 'le') { return $v1 <= $v2 } + elsif ($op eq 'gt') { return $v1 > $v2 } + elsif ($op eq 'ge') { return $v1 >= $v2 } + elsif ($op eq 'eq') { return $v1 == $v2 } + + return 0; +} + +sub findbin($$$) { + my ($basename, $compare, $maxvstr) = @_; + + my $lastversion = 0; + my $cmpversion = vernum($maxvstr); + my $prog = undef; + + foreach my $dir (split /:/, $ENV{'PATH'}) { + foreach my $bin (glob("$dir/$basename?*"), "$dir/$basename") { + if (-x $bin && open BIN, '-|', $bin, '--version') { + my $vers = 0; + my $line = readline(BIN) || ''; + + foreach my $token (split /\s+/, $line) { + $vers = vernum($token); + last if $vers > 0; + } + + if ($vers > 0 && (!$cmpversion || vercmp($compare, $vers, $cmpversion))) { + if ($vers > $lastversion) { + $lastversion = $vers; + $prog = $bin; + } + } + + close BIN; + } + } + } + + return $prog; +} + +my $bin = findbin($ARGV[0], $ARGV[1], $ARGV[2]); + +if (defined $bin) { + printf "%s\n", $bin; + exit 0; +} +else { + warn "Cannot find a $ARGV[0] command with version $ARGV[1] $ARGV[2]\n"; + exit 1; +} diff --git a/phase1/master.cfg b/phase1/master.cfg index e1a74c4..a87b45e 100644 --- a/phase1/master.cfg +++ b/phase1/master.cfg @@ -56,6 +56,10 @@ c['mergeRequests'] = True home_dir = os.path.abspath(ini.get("general", "homedir")) tree_expire = 0 other_builds = 0 +cc_version = None + +cc_command = "gcc" +cxx_command = "g++" if ini.has_option("general", "expire"): tree_expire = ini.getint("general", "expire") @@ -63,6 +67,11 @@ if ini.has_option("general", "expire"): if ini.has_option("general", "other_builds"): other_builds = ini.getint("general", "other_builds") +if ini.has_option("general", "cc_version"): + cc_version = ini.get("general", "cc_version").split() + if len(cc_version) == 1: + cc_version = ["eq", cc_version[0]] + repo_url = ini.get("repo", "url") repo_branch = "master" @@ -213,6 +222,27 @@ def GetNumJobs(props): else: return 1 +def GetCC(props): + if props.hasProperty("cc_command"): + return props["cc_command"] + else: + return "gcc" + +def GetCXX(props): + if props.hasProperty("cxx_command"): + return props["cxx_command"] + else: + return "g++" + +def MakeEnv(overrides=None): + env = { + 'CC': WithProperties("%(cc)s", cc=GetCC), + 'CXX': WithProperties("%(cxx)s", cxx=GetCXX) + } + if overrides is not None: + env.update(overrides) + return env + c['builders'] = [] @@ -289,6 +319,27 @@ for target in targets: description = "Finding number of CPUs", command = ["nproc"])) + # find gcc and g++ compilers + if cc_version is not None: + factory.addStep(FileDownload( + mastersrc = "findbin.pl", + slavedest = "../findbin.pl", + mode = 0755)) + + factory.addStep(SetProperty( + name = "gcc", + property = "cc_command", + description = "Finding gcc command", + command = ["../findbin.pl", "gcc", cc_version[0], cc_version[1]], + haltOnFailure = True)) + + factory.addStep(SetProperty( + name = "g++", + property = "cxx_command", + description = "Finding g++ command", + command = ["../findbin.pl", "g++", cc_version[0], cc_version[1]], + haltOnFailure = True)) + # expire tree if needed if tree_expire > 0: factory.addStep(FileDownload( @@ -310,6 +361,7 @@ for target in targets: name = tuple[1], description = 'User-requested "make %s"' % tuple[1], command = ["make", tuple[1], "V=s"], + env = MakeEnv(), doStepIf = IsCleanRequested(tuple[0]) )) @@ -388,13 +440,15 @@ for target in targets: factory.addStep(ShellCommand( name = "updatefeeds", description = "Updating feeds", - command=["./scripts/feeds", "update"])) + command=["./scripts/feeds", "update"], + env = MakeEnv())) # feed factory.addStep(ShellCommand( name = "installfeeds", description = "Installing feeds", - command=["./scripts/feeds", "install", "-a"])) + command=["./scripts/feeds", "install", "-a"], + env = MakeEnv())) # seed config factory.addStep(FileDownload( @@ -419,7 +473,8 @@ for target in targets: factory.addStep(ShellCommand( name = "defconfig", description = "Populating .config", - command = ["make", "defconfig"] + command = ["make", "defconfig"], + env = MakeEnv() )) # check arch @@ -458,6 +513,7 @@ for target in targets: name = "dltar", description = "Building GNU tar", command = ["make", WithProperties("-j%(jobs)d", jobs=GetNumJobs), "tools/tar/install", "V=s"], + env = MakeEnv(), haltOnFailure = True )) @@ -466,6 +522,7 @@ for target in targets: name = "dlrun", description = "Populating dl/", command = ["make", WithProperties("-j%(jobs)d", jobs=GetNumJobs), "download", "V=s"], + env = MakeEnv(), logEnviron = False, locks = [dlLock.access('exclusive')] )) @@ -481,6 +538,7 @@ for target in targets: name = "tools", description = "Building tools", command = ["make", WithProperties("-j%(jobs)d", jobs=GetNumJobs), "tools/install", "V=s"], + env = MakeEnv(), haltOnFailure = True )) @@ -488,6 +546,7 @@ for target in targets: name = "toolchain", description = "Building toolchain", command=["make", WithProperties("-j%(jobs)d", jobs=GetNumJobs), "toolchain/install", "V=s"], + env = MakeEnv(), haltOnFailure = True )) @@ -495,6 +554,7 @@ for target in targets: name = "kmods", description = "Building kmods", command=["make", WithProperties("-j%(jobs)d", jobs=GetNumJobs), "target/compile", "V=s", "IGNORE_ERRORS=n m", "BUILD_LOG=1"], + env = MakeEnv(), #env={'BUILD_LOG_DIR': 'bin/%s' %(ts[0])}, haltOnFailure = True )) @@ -503,6 +563,7 @@ for target in targets: name = "pkgbuild", description = "Building packages", command=["make", WithProperties("-j%(jobs)d", jobs=GetNumJobs), "package/compile", "V=s", "IGNORE_ERRORS=n m", "BUILD_LOG=1"], + env = MakeEnv(), #env={'BUILD_LOG_DIR': 'bin/%s' %(ts[0])}, haltOnFailure = True )) @@ -512,6 +573,7 @@ for target in targets: name = "pkginstall", description = "Installing packages", command=["make", WithProperties("-j%(jobs)d", jobs=GetNumJobs), "package/install", "V=s"], + env = MakeEnv(), haltOnFailure = True )) @@ -519,6 +581,7 @@ for target in targets: name = "pkgindex", description = "Indexing packages", command=["make", WithProperties("-j%(jobs)d", jobs=GetNumJobs), "package/index", "V=s"], + env = MakeEnv(), haltOnFailure = True )) @@ -527,6 +590,7 @@ for target in targets: name = "images", description = "Building images", command=["make", WithProperties("-j%(jobs)d", jobs=GetNumJobs), "target/install", "V=s"], + env = MakeEnv(), haltOnFailure = True )) @@ -534,6 +598,7 @@ for target in targets: name = "diffconfig", description = "Generating config.seed", command=["make", "-j1", "diffconfig", "V=s"], + env = MakeEnv(), haltOnFailure = True )) @@ -541,6 +606,7 @@ for target in targets: name = "checksums", description = "Calculating checksums", command=["make", "-j1", "checksum", "V=s"], + env = MakeEnv(), haltOnFailure = True ))