From 9e3ec3a16d8c14b06ac5e46b71b52cf2a09398b9 Mon Sep 17 00:00:00 2001 From: Lucas De Marchi Date: Thu, 5 May 2016 19:16:23 -0300 Subject: [PATCH] waf: define git versions in a generated ap_version.h header --- Tools/ardupilotwaf/ardupilotwaf.py | 16 +++++++++++++++- Tools/ardupilotwaf/boards.py | 4 +++- Tools/ardupilotwaf/git_submodule.py | 19 +++++++++++++++---- Tools/ardupilotwaf/px4.py | 6 ------ wscript | 22 +++++++++++++++++++--- 5 files changed, 52 insertions(+), 15 deletions(-) diff --git a/Tools/ardupilotwaf/ardupilotwaf.py b/Tools/ardupilotwaf/ardupilotwaf.py index c55273b35b..71967a9580 100644 --- a/Tools/ardupilotwaf/ardupilotwaf.py +++ b/Tools/ardupilotwaf/ardupilotwaf.py @@ -5,7 +5,7 @@ from __future__ import print_function from waflib import Logs, Options, Utils from waflib.Build import BuildContext from waflib.Configure import conf -import os.path +import os.path, os SOURCE_EXTS = [ '*.S', @@ -204,6 +204,20 @@ def ap_find_tests(bld, use=[]): cxxflags=['-Wno-undef'], ) +_versions = [] + +@conf +def ap_version_append_str(ctx, k, v): + ctx.env['AP_VERSION_ITEMS'] += [(k, '"{}"'.format(os.environ.get(k, v)))] + +@conf +def write_version_header(ctx, tgt): + with open(tgt, 'w') as f: + print('#pragma once\n', file=f) + + for k, v in ctx.env['AP_VERSION_ITEMS']: + print('#define {} {}'.format(k, v), file=f) + @conf def ap_find_benchmarks(bld, use=[]): if not bld.env.HAS_GBENCHMARK: diff --git a/Tools/ardupilotwaf/boards.py b/Tools/ardupilotwaf/boards.py index fe6c9da787..31123d2fe2 100644 --- a/Tools/ardupilotwaf/boards.py +++ b/Tools/ardupilotwaf/boards.py @@ -139,7 +139,7 @@ class Board: ] def build(self, bld): - pass + bld.ap_version_append_str('GIT_VERSION', bld.git_head_hash(short=True)) Board = BoardMeta('Board', Board.__bases__, dict(Board.__dict__)) @@ -375,6 +375,8 @@ class px4(Board): def build(self, bld): super(px4, self).build(bld) + bld.ap_version_append_str('NUTTX_GIT_VERSION', bld.git_submodule_head_hash('PX4NuttX', short=True)) + bld.ap_version_append_str('PX4_GIT_VERSION', bld.git_submodule_head_hash('PX4Firmware', short=True)) bld.load('px4') class px4_v1(px4): diff --git a/Tools/ardupilotwaf/git_submodule.py b/Tools/ardupilotwaf/git_submodule.py index e4fb7f8284..af452326f8 100644 --- a/Tools/ardupilotwaf/git_submodule.py +++ b/Tools/ardupilotwaf/git_submodule.py @@ -104,9 +104,20 @@ def git_submodule(bld, git_submodule, **kw): return bld(**kw) + +def _git_head_hash(ctx, path, short=False): + cmd = [ctx.env.get_flat('GIT'), 'rev-parse'] + if short: + cmd.append('--short=8') + cmd.append('HEAD') + out = ctx.cmd_and_log(cmd, quiet=Context.BOTH, cwd=path) + return out.strip() + @conf -def git_submodule_head_hash(self, name): +def git_submodule_head_hash(self, name, short=False): module_node = self.srcnode.make_node(os.path.join('modules', name)) - cmd = self.env.get_flat('GIT'), 'rev-parse', 'HEAD' - out = self.cmd_and_log(cmd, quiet=Context.BOTH, cwd=module_node.abspath()) - return out.strip() + return _git_head_hash(self, module_node.abspath(), short=short) + +@conf +def git_head_hash(self, short=False): + return _git_head_hash(self, self.srcnode.abspath(), short=short) diff --git a/Tools/ardupilotwaf/px4.py b/Tools/ardupilotwaf/px4.py index 75b97e3a62..282b428f20 100644 --- a/Tools/ardupilotwaf/px4.py +++ b/Tools/ardupilotwaf/px4.py @@ -17,11 +17,6 @@ def _load_dynamic_env_data(bld): for name in ('cxx_flags', 'include_dirs', 'definitions'): _dynamic_env_data[name] = bldnode.find_node(name).read().split(';') - _dynamic_env_data['DEFINES'] = [ - 'NUTTX_GIT_VERSION="%s"' % os.environ.get('NUTTX_GIT_VERSION', bld.git_submodule_head_hash('PX4NuttX')[:8]), - 'PX4_GIT_VERSION="%s"' % os.environ.get('PX4_GIT_VERSION', bld.git_submodule_head_hash('PX4Firmware')[:8]), - ] - @feature('px4_ap_stlib', 'px4_ap_program') @before_method('process_source') def px4_dynamic_env(self): @@ -36,7 +31,6 @@ def px4_dynamic_env(self): self.env.append_value('INCLUDES', _dynamic_env_data['include_dirs']) self.env.prepend_value('CXXFLAGS', _dynamic_env_data['cxx_flags']) self.env.prepend_value('CXXFLAGS', _dynamic_env_data['definitions']) - self.env.append_value('DEFINES', _dynamic_env_data['DEFINES']) # Single static library # NOTE: This only works only for local static libraries dependencies - fake diff --git a/wscript b/wscript index 080cf6e94f..870d18ee39 100644 --- a/wscript +++ b/wscript @@ -19,12 +19,10 @@ from waflib import Build, ConfigSet, Context, Utils # pastable. Add the 'export waf="$PWD/waf"' trick to be copy-pastable # as well. -# TODO: replace defines with the use of a generated config.h file +# TODO: replace defines with the use of the generated ap_config.h file # this makes recompilation at least when defines change. which might # be sufficient. -# TODO: set git version as part of build preparation. - def init(ctx): env = ConfigSet.ConfigSet() try: @@ -160,6 +158,10 @@ def _build_dynamic_sources(bld): ], ) + bld.env.prepend_value('INCLUDES', [ + bld.bldnode.abspath(), + ]) + def _build_common_taskgens(bld): # NOTE: Static library with vehicle set to UNKNOWN, shared by all # the tools and examples. This is the first step until the @@ -221,6 +223,11 @@ def _build_recursion(bld): for d in dirs_to_recurse: bld.recurse(d) +def _write_version_header(tsk): + bld = tsk.generator.bld + return bld.write_version_header(tsk.outputs[0].abspath()) + + def build(bld): config_header = Utils.h_file(bld.bldnode.make_node('ap_config.h').abspath()) @@ -247,6 +254,15 @@ def build(bld): _build_recursion(bld) + bld( + name='ap_version', + target='ap_version.h', + vars=['AP_VERSION_ITEMS'], + rule=_write_version_header, + group='dynamic_sources', + ) + + ardupilotwaf.build_command('check', program_group_list='all', doc='builds all programs and run tests',