$(OUT)romlayout16.lds: $(OUT)ccode32flat.o $(OUT)code32seg.o $(OUT)ccode16.o $(OUT)romlayout.o src/version.c scripts/layoutrom.py scripts/buildversion.py
@echo " Building ld scripts"
- $(Q)$(PYTHON) ./scripts/buildversion.py -e "$(EXTRAVERSION)" $(OUT)autoversion.h
+ $(Q)$(PYTHON) ./scripts/buildversion.py -e "$(EXTRAVERSION)" -t "$(CC);$(AS);$(LD);$(OBJCOPY);$(OBJDUMP);$(STRIP)" $(OUT)autoversion.h
$(Q)$(CC) $(CFLAGS32FLAT) -c src/version.c -o $(OUT)version.o
$(Q)$(LD) $(LD32BIT_FLAG) -r $(OUT)ccode32flat.o $(OUT)version.o -o $(OUT)code32flat.o
$(Q)$(LD) $(LD32BIT_FLAG) -r $(OUT)ccode16.o $(OUT)romlayout.o -o $(OUT)code16.o
$(OUT)vgarom.o: $(OUT)vgaccode16.o $(OUT)vgaentry.o $(OUT)vgasrc/vgalayout.lds vgasrc/vgaversion.c scripts/buildversion.py
@echo " Linking $@"
- $(Q)$(PYTHON) ./scripts/buildversion.py -e "$(EXTRAVERSION)" $(OUT)autovgaversion.h
+ $(Q)$(PYTHON) ./scripts/buildversion.py -e "$(EXTRAVERSION)" -t "$(CC);$(AS);$(LD);$(OBJCOPY);$(OBJDUMP);$(STRIP)" $(OUT)autovgaversion.h
$(Q)$(CC) $(CFLAGS16) -c vgasrc/vgaversion.c -o $(OUT)vgaversion.o
$(Q)$(LD) --gc-sections -T $(OUT)vgasrc/vgalayout.lds $(OUT)vgaccode16.o $(OUT)vgaentry.o $(OUT)vgaversion.o -o $@
# Copyright (C) 2015 Kevin O'Connor <kevin@koconnor.net>
#
# This file may be distributed under the terms of the GNU GPLv3 license.
-import sys, os, subprocess, time, socket, optparse
+import sys, os, subprocess, time, socket, optparse, re
VERSION_FORMAT = """
/* DO NOT EDIT! This is an autogenerated file. See scripts/buildversion.py. */
#define BUILD_VERSION "%s"
+#define BUILD_TOOLS "%s"
"""
# Obtain version info from "git" program
return ver
# Generate an output file with the version information
-def write_version(outfile, version):
+def write_version(outfile, version, toolstr):
sys.stdout.write("Version: %s\n" % (version,))
f = open(outfile, 'w')
- f.write(VERSION_FORMAT % (version,))
+ f.write(VERSION_FORMAT % (version, toolstr))
f.close()
+re_gcc = re.compile(r'^(?P<prog>.*) \(GCC\) (?P<version>.*)$')
+re_binutils = re.compile(r'^GNU (?P<prog>.*) version (?P<version>.*)$')
+
+# Run "tool --version" for each specified tool and extract versions
+def tool_versions(tools):
+ tools = [t.strip() for t in tools.split(';')]
+ gcc = binutils = ""
+ success = 0
+ for tool in tools:
+ try:
+ ver = subprocess.check_output([tool, '--version']).decode()
+ except:
+ continue
+ ver = ver.split('\n')[0]
+ m = re_gcc.match(ver)
+ if m:
+ ver = m.group('version')
+ if gcc and gcc != ver:
+ gcc = "mixed"
+ continue
+ gcc = ver
+ success += 1
+ continue
+ m = re_binutils.match(ver)
+ if m:
+ ver = m.group('version')
+ if binutils and binutils != ver:
+ binutils = "mixed"
+ continue
+ binutils = ver
+ success += 1
+ cleanbuild = binutils and gcc and success == len(tools)
+ return cleanbuild, "gcc: %s binutils: %s" % (gcc, binutils)
+
def main():
usage = "%prog [options] <outputheader.h>"
opts = optparse.OptionParser(usage)
opts.add_option("-e", "--extra", dest="extra", default="",
help="extra version string to append to version")
+ opts.add_option("-t", "--tools", dest="tools", default="",
+ help="list of build programs to extra version from")
options, args = opts.parse_args()
if len(args) != 1:
opts.error("Incorrect arguments")
outfile = args[0]
+ cleanbuild, toolstr = tool_versions(options.tools)
+
ver = git_version()
if not ver:
ver = file_version()
btime = time.strftime("%Y%m%d_%H%M%S")
hostname = socket.gethostname()
ver = "%s-%s-%s%s" % (ver, btime, hostname, options.extra)
- write_version(outfile, ver)
+ write_version(outfile, ver, toolstr)
if __name__ == '__main__':
main()