diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2015-09-05 15:17:02 +0300 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2015-09-05 15:17:02 +0300 |
commit | 2e3bd006d319aca659cfbd8a31894e641a7a79e6 (patch) | |
tree | a8b37e0f8e3236c4d10e481bc18b16ead56555b5 /compilers.py | |
parent | ad5795ed2e2afcd32d89fae68a8682fb647dd194 (diff) | |
download | meson-2e3bd006d319aca659cfbd8a31894e641a7a79e6.zip meson-2e3bd006d319aca659cfbd8a31894e641a7a79e6.tar.gz meson-2e3bd006d319aca659cfbd8a31894e641a7a79e6.tar.bz2 |
Converted alignment check to work also when cross compiling.
Diffstat (limited to 'compilers.py')
-rw-r--r-- | compilers.py | 39 |
1 files changed, 22 insertions, 17 deletions
diff --git a/compilers.py b/compilers.py index 56b2c8a..f457cf3 100644 --- a/compilers.py +++ b/compilers.py @@ -361,7 +361,28 @@ int main(int argc, char **argv) { raise EnvironmentException('Could not run sizeof test binary.') return int(res.stdout) + def cross_alignment(self, typename, env): + templ = '''#include<stddef.h> +struct tmp { + char c; + %s target; +}; + +int testarray[%d-offsetof(struct tmp, target)]; +''' + try: + extra_args = env.cross_info.config['properties'][self.language + '_args'] + except KeyError: + pass + for i in range(1, 1024): + code = templ % (typename, i) + if self.compiles(code, extra_args): + return i + raise EnvironmentException('Cross checking offsetof overflowed.') + def alignment(self, typename, env): + if self.is_cross: + return self.cross_alignment(typename, env) templ = '''#include<stdio.h> #include<stddef.h> @@ -375,23 +396,7 @@ int main(int argc, char **argv) { return 0; } ''' - varname = 'alignment ' + typename - varname = varname.replace(' ', '_') - if self.is_cross: - val = env.cross_info.config['properties'][varname] - if val is not None: - if isinstance(val, int): - return val - raise EnvironmentException('Cross variable {0} is not an integer.'.format(varname)) - cross_failed = False - try: - res = self.run(templ % typename) - except CrossNoRunException: - cross_failed = True - if cross_failed: - message = '''Can not determine alignment of {0} because cross compiled binaries are not runnable. -Please define the corresponding variable {1} in your cross compilation definition file.'''.format(typename, varname) - raise EnvironmentException(message) + res = self.run(templ % typename) if not res.compiled: raise EnvironmentException('Could not compile alignment test.') if res.returncode != 0: |