File: debcrossgen

package info (click to toggle)
glib2.0 2.58.3-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 48,444 kB
  • sloc: ansic: 452,195; xml: 16,781; python: 6,149; makefile: 3,776; sh: 1,499; perl: 1,140; cpp: 9
file content (96 lines) | stat: -rwxr-xr-x 3,778 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/usr/bin/env python3

# Copyright 2017 Jussi Pakkanen

# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at

#     http://www.apache.org/licenses/LICENSE-2.0

# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# This version of debcrossgen has been modified to add the --set option:
# see https://bugs.debian.org/912559

import sys, os, subprocess

import argparse

parser = argparse.ArgumentParser(description='''Generate cross compilation definition file for the Meson build system.

If you do not specify the --arch argument, Meson assumes that running
plain 'dpkg-architecture' will return correct information for the
host system.
'''
)

parser.add_argument('--arch', default=None,
                    help='The dpkg architecture to generate.')
parser.add_argument('--gccsuffix', default="",
                    help='A particular gcc version suffix if necessary.')
parser.add_argument('-o', required=True, dest='outfile',
                    help='The output file.')
parser.add_argument('--set', action='append', default=[],
                    help='Set a cross property.')

def locate_path(program):
    if os.path.isabs(program):
        return program
    for d in os.get_exec_path():
        f = os.path.join(d, program)
        if os.access(f, os.X_OK):
            return f
    raise ValueError("%s not found on $PATH" % program)

def run(options):
    if options.arch is None:
        cmd = ['dpkg-architecture']
    else:
        cmd = ['dpkg-architecture', '-a' + options.arch]
    output = subprocess.check_output(cmd, universal_newlines=True)
    data = {}
    for line in output.split('\n'):
        line = line.strip()
        if line == '':
            continue
        k, v = line.split('=', 1)
        data[k] = v
    host_arch = data['DEB_HOST_GNU_TYPE']
    host_os = data['DEB_HOST_ARCH_OS']
    host_cpu_family = data['DEB_HOST_GNU_CPU']
    host_cpu = data['DEB_HOST_ARCH'] # Not really correct, should be arm7hlf etc but it is not exposed.
    host_endian = data['DEB_HOST_ARCH_ENDIAN']
    with open(options.outfile, "w") as ofile:
        ofile.write('[binaries]\n')
        c = "%s-gcc%s" % (host_arch, options.gccsuffix)
        ofile.write("c = '%s'\n" % locate_path(c))
        cpp = "%s-g++%s" % (host_arch, options.gccsuffix)
        ofile.write("cpp = '%s'\n" % locate_path(cpp))
        ofile.write("ar = '%s'\n" % locate_path("%s-ar" % host_arch))
        ofile.write("strip = '%s'\n" % locate_path("%s-strip" % host_arch))
        ofile.write("objcopy = '%s'\n" % locate_path("%s-objcopy" % host_arch))
        ofile.write("ld= '%s'\n" % locate_path("%s-ld" % host_arch))
        try:
            ofile.write("pkgconfig = '%s'\n" % locate_path("%s-pkg-config" % host_arch))
        except ValueError:
            pass # pkg-config is optional
        ofile.write('\n[properties]\n')
        for prop in options.set:
            assert '=' in prop
            key, value = prop.split('=', 1)
            ofile.write('%s = %s\n' % (key, value))
        ofile.write('\n[host_machine]\n')
        ofile.write("system = '%s'\n" % host_os)
        ofile.write("cpu_family = '%s'\n" % host_cpu_family)
        ofile.write("cpu = '%s'\n" % host_cpu)
        ofile.write("endian = '%s'\n" % host_endian)

if __name__ == '__main__':
    options = parser.parse_args()
    run(options)
    print('Remember to add the proper --libdir arg to Meson invocation.')