source: rtems-libbsd/builder.py @ 24866e6

55-freebsd-126-freebsd-12
Last change on this file since 24866e6 was 9cc419f, checked in by Sebastian Huber <sebastian.huber@…>, on 06/27/17 at 06:36:05

Install Linux header files

  • Property mode set to 100755
File size: 32.4 KB
Line 
1#
2#  Copyright (c) 2015-2016 Chris Johns <chrisj@rtems.org>. All rights reserved.
3#
4#  Copyright (c) 2009, 2017 embedded brains GmbH.  All rights reserved.
5#
6#   embedded brains GmbH
7#   Dornierstr. 4
8#   82178 Puchheim
9#   Germany
10#   <info@embedded-brains.de>
11#
12#  Copyright (c) 2012 OAR Corporation. All rights reserved.
13#
14#  Redistribution and use in source and binary forms, with or without
15#  modification, are permitted provided that the following conditions
16#  are met:
17#  1. Redistributions of source code must retain the above copyright
18#     notice, this list of conditions and the following disclaimer.
19#  2. Redistributions in binary form must reproduce the above copyright
20#     notice, this list of conditions and the following disclaimer in the
21#     documentation and/or other materials provided with the distribution.
22#
23#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24#  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25#  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26#  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27#  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29#  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30#  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31#  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32#  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33#  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
35# FreeBSD: http://svn.freebsd.org/base/releng/8.2/sys (revision 222485)
36
37from __future__ import print_function
38
39import shutil
40import os
41import re
42import sys
43import getopt
44import filecmp
45import difflib
46import codecs
47
48#
49# Global controls.
50#
51LIBBSD_DIR = "."
52FreeBSD_DIR = "freebsd-org"
53Linux_DIR = "linux-org"
54verboseLevel = 0
55isDryRun = False
56isDiffMode = False
57filesProcessedCount = 0
58filesProcessed = []
59filesTotal = 0
60filesTotalLines = 0
61filesTotalInserts = 0
62filesTotalDeletes = 0
63diffDetails = { }
64
65verboseInfo = 1
66verboseDetail = 2
67verboseMoreDetail = 3
68verboseDebug = 4
69
70def verbose(level = verboseInfo):
71    return verboseLevel >= level
72
73def changedFileSummary(statsReport = False):
74
75    global filesTotal, filesTotalLines, filesTotalInserts, filesTotalDeletes
76
77    if isDiffMode == False:
78        if verbose():
79            print('%d file(s) were changed:' % (filesProcessedCount))
80            for f in sorted(filesProcessed):
81                print(' %s' % (f))
82        else:
83            print('%d file(s) were changed.' % (filesProcessedCount))
84    if statsReport:
85        print('Stats Report:')
86        transparent = filesTotal - len(diffDetails)
87        changes = filesTotalInserts + filesTotalDeletes
88        opacity = (float(changes) / (filesTotalLines + changes)) * 100.0
89        print(' Total File(s):%d  Unchanged:%d (%.1f%%)  Changed:%d' \
90              '   Opacity:%5.1f%% Lines:%d Edits:%d (+):%d (-):%d'  % \
91              (filesTotal, transparent, (float(transparent) / filesTotal) * 100.0, len(diffDetails), \
92               opacity, filesTotalLines, changes, filesTotalInserts, filesTotalDeletes))
93        #
94        # Sort by opacity.
95        #
96        ordered_diffs = sorted(diffDetails.items(), key = lambda diff: diff[1].opacity, reverse = True)
97        for f in ordered_diffs:
98            print('  %s' % (diffDetails[f[0]].status()))
99
100def readFile(name):
101    try:
102        contents = codecs.open(name, mode = 'r', encoding = 'utf-8', errors = 'ignore').read()
103    except UnicodeDecodeError as ude:
104        print('error: reading: %s: %s' % (name, ude))
105        sys.exit(1)
106    return contents
107
108def writeFile(name, contents):
109    path = os.path.dirname(name)
110    if not os.path.exists(path):
111        try:
112            os.makedirs(path)
113        except OSError as oe:
114            print('error: cannot create directory: %s: %s' % (path, oe))
115            sys.exit(1)
116    try:
117        codecs.open(name, mode = 'w',  encoding = 'utf-8', errors = 'ignore').write(contents)
118    except UnicodeDecodeError as ude:
119        print('error: write: %s: %s' % (name, ude))
120        sys.exit(1)
121
122#
123# A builder error.
124#
125class error(Exception):
126    """Base class for exceptions."""
127    def __init__(self, msg):
128        self.msg = 'error: %s' % (msg)
129    def set_output(self, msg):
130        self.msg = msg
131    def __str__(self):
132        return self.msg
133
134#
135# Diff Record
136#
137class diffRecord:
138    def __init__(self, src, dst, orig, diff, inserts, deletes):
139        self.src = src
140        self.dst = dst
141        self.orig = orig
142        self.diff = diff
143        self.lines = len(orig)
144        self.inserts = inserts
145        self.deletes = deletes
146        self.changes = inserts + deletes
147        self.opacity = (float(self.changes) / (self.lines + self.changes)) * 100.0
148
149    def __repr__(self):
150        return self.src
151
152    def status(self):
153        return 'opacity:%5.1f%% edits:%4d (+):%-4d (-):%-4d %s' % \
154            (self.opacity, self.changes, self.inserts, self.deletes, self.src)
155
156#
157# This stuff needs to move to libbsd.py.
158#
159def commonFlags():
160    return ['-g',
161            '-fno-strict-aliasing',
162            '-ffreestanding',
163            '-fno-common']
164
165def commonWarnings():
166    return ['-Wall',
167            '-Wno-format',
168            '-Wno-pointer-sign']
169
170def commonNoWarnings():
171    return ['-w']
172
173def includes():
174    return ['-Irtemsbsd/include',
175            '-Ifreebsd/sys',
176            '-Ifreebsd/sys/contrib/pf',
177            '-Ifreebsd/sys/net',
178            '-Ifreebsd/include',
179            '-Ifreebsd/lib',
180            '-Ifreebsd/lib/libbsdstat',
181            '-Ifreebsd/lib/libc/include',
182            '-Ifreebsd/lib/libc/isc/include',
183            '-Ifreebsd/lib/libc/resolv',
184            '-Ifreebsd/lib/libutil',
185            '-Ifreebsd/lib/libkvm',
186            '-Ifreebsd/lib/libmemstat',
187            '-Ifreebsd/lib/libipsec',
188            '-Ifreebsd/contrib/expat/lib',
189            '-Ifreebsd/contrib/libpcap',
190            '-Ifreebsd/contrib/libxo',
191            '-Ilinux/include',
192            '-Ilinux/drivers/net/ethernet/freescale/fman',
193            '-Irtemsbsd/sys',
194            '-ImDNSResponder/mDNSCore',
195            '-ImDNSResponder/mDNSShared',
196            '-ImDNSResponder/mDNSPosix',
197            '-Itestsuite/include']
198
199def buildInclude():
200    """ Returns the path where headers will be copied during build. """
201    return 'build-include'
202
203def cpuIncludes():
204    return ['-Irtemsbsd/@CPU@/include',
205            '-Ifreebsd/sys/@CPU@/include']
206
207def cflags():
208    return []
209
210def cxxflags():
211    return []
212
213def headerPaths():
214    """ Returns a list of information about what header files should be
215    installed.
216
217    The list is also used to find headers with a local path that doesn't match
218    it's dest path. Due to the difference in the path name such files are
219    problematic during the build if they are included using their later
220    installation path (dest path) name. Therefore they are copied into a
221    sub-directory of the build path so that they can be included with their
222    normal installation path. """
223
224    #         local path                      wildcard             dest path
225    return [('rtemsbsd/include',              '**/*.h',            ''),
226            ('rtemsbsd/\' + bld.env.RTEMS_ARCH + \'/include', '**/*.h', ''),
227            ('rtemsbsd/mghttpd',              'mongoose.h',        'mghttpd'),
228            ('freebsd/include',               '**/*.h',            ''),
229            ('freebsd/sys/bsm',               '**/*.h',            'bsm'),
230            ('freebsd/sys/cam',               '**/*.h',            'cam'),
231            ('freebsd/sys/net',               '**/*.h',            'net'),
232            ('freebsd/sys/net80211',          '**/*.h',            'net80211'),
233            ('freebsd/sys/netinet',           '**/*.h',            'netinet'),
234            ('freebsd/sys/netinet6',          '**/*.h',            'netinet6'),
235            ('freebsd/sys/netipsec',          '**/*.h',            'netipsec'),
236            ('freebsd/contrib/libpcap',       '*.h',               ''),
237            ('freebsd/contrib/libpcap/pcap',  '*.h',               'pcap'),
238            ('freebsd/crypto/openssl',        '*.h',               'openssl'),
239            ('freebsd/crypto/openssl/crypto', '*.h',               'openssl'),
240            ('freebsd/crypto/openssl/ssl',    '(ssl|kssl|ssl2).h', 'openssl'),
241            ('freebsd/crypto/openssl/crypto/aes', 'aes.h',         'openssl'),
242            ('freebsd/crypto/openssl/crypto/err', 'err.h',         'openssl'),
243            ('freebsd/crypto/openssl/crypto/bio', '*.h',           'openssl'),
244            ('freebsd/crypto/openssl/crypto/dsa', '*.h',           'openssl'),
245            ('freebsd/crypto/openssl/ssl',        '*.h',           'openssl'),
246            ('freebsd/crypto/openssl/crypto/bn',  'bn.h',          'openssl'),
247            ('freebsd/crypto/openssl/crypto/x509',  'x509.h',      'openssl'),
248            ('freebsd/crypto/openssl/crypto/cast',  'cast.h',      'openssl'),
249            ('freebsd/crypto/openssl/crypto/lhash', 'lhash.h',     'openssl'),
250            ('freebsd/crypto/openssl/crypto/ecdh',  'ecdh.h',      'openssl'),
251            ('freebsd/crypto/openssl/crypto/ecdsa', 'ecdsa.h',     'openssl'),
252            ('freebsd/crypto/openssl/crypto/idea',  'idea.h',      'openssl'),
253            ('freebsd/crypto/openssl/crypto/mdc2',  'mdc2.h',      'openssl'),
254            ('freebsd/crypto/openssl/crypto/md4',   'md4.h',       'openssl'),
255            ('freebsd/crypto/openssl/crypto/md5',   'md5.h',       'openssl'),
256            ('freebsd/crypto/openssl/crypto/rc2',   'rc2.h',       'openssl'),
257            ('freebsd/crypto/openssl/crypto/rc4',   'rc4.h',       'openssl'),
258            ('freebsd/crypto/openssl/crypto/ripemd','ripemd.h',    'openssl'),
259            ('freebsd/crypto/openssl/crypto/seed',  'seed.h',      'openssl'),
260            ('freebsd/crypto/openssl/crypto/sha',   'sha.h',       'openssl'),
261            ('freebsd/crypto/openssl/crypto/x509v3','x509v3.h',    'openssl'),
262            ('freebsd/crypto/openssl/crypto/x509',  'x509_vfy.h',  'openssl'),
263            ('freebsd/crypto/openssl/crypto/buffer','buffer.h',    'openssl'),
264            ('freebsd/crypto/openssl/crypto/comp',  'comp.h',      'openssl'),
265            ('freebsd/crypto/openssl/crypto/asn1',  'asn1_mac.h',  'openssl'),
266            ('freebsd/crypto/openssl/crypto/pem',  '(pem|pem2).h', 'openssl'),
267            ('freebsd/crypto/openssl/crypto/rsa',   'rsa.h',       'openssl'),
268            ('freebsd/crypto/openssl/crypto/evp',   'evp.h',       'openssl'),
269            ('freebsd/crypto/openssl/crypto/ec',    'ec.h',        'openssl'),
270            ('freebsd/crypto/openssl/crypto/engine', 'engine.h',   'openssl'),
271            ('freebsd/crypto/openssl/crypto/pkcs7', 'pkcs7.h',     'openssl'),
272            ('freebsd/crypto/openssl/crypto/hmac',  'hmac.h',      'openssl'),
273            ('freebsd/crypto/openssl/crypto/pqueue', 'pqueue.h',   'openssl'),
274            ('freebsd/crypto/openssl/crypto/ocsp',  'ocsp.h',      'openssl'),
275            ('freebsd/crypto/openssl/crypto/rand',  'rand.h',      'openssl'),
276            ('freebsd/crypto/openssl/crypto/srp',   'srp.h',       'openssl'),
277            ('freebsd/crypto/openssl/crypto/dh',    'dh.h',        'openssl'),
278            ('freebsd/crypto/openssl/crypto/dso',   'dso.h',       'openssl'),
279            ('freebsd/crypto/openssl/crypto/krb5',  'krb5_asn.h',  'openssl'),
280            ('freebsd/crypto/openssl/crypto/cms',   'cms.h',       'openssl'),
281            ('freebsd/crypto/openssl/crypto/txt_db', 'txt_db.h',   'openssl'),
282            ('freebsd/crypto/openssl/crypto/ts',    'ts.h',        'openssl'),
283            ('freebsd/crypto/openssl/crypto/modes', 'modes.h',     'openssl'),
284            ('freebsd/crypto/openssl/crypto/pkcs12', 'pkcs12.h',   'openssl'),
285            ('freebsd/crypto/openssl/crypto/bf',    'blowfish.h',  'openssl'),
286            ('freebsd/crypto/openssl/crypto/cmac',  'cmac.h',      'openssl'),
287            ('freebsd/crypto/openssl/crypto/asn1',  '(asn1|asn1t).h',            'openssl'),
288            ('freebsd/crypto/openssl/crypto/camellia', 'camellia.h',             'openssl'),
289            ('freebsd/crypto/openssl/crypto/objects',  '(objects|obj_mac).h',    'openssl'),
290            ('freebsd/crypto/openssl/crypto/conf',     '(conf|conf_api).h',      'openssl'),
291            ('freebsd/crypto/openssl/crypto/des',      '(des|des_old).h',        'openssl'),
292            ('freebsd/crypto/openssl/crypto/ui',       '(ui_compat|ui).h',       'openssl'),
293            ('freebsd/crypto/openssl/crypto/whrlpool', 'whrlpool.h',             'openssl'),
294            ('freebsd/crypto/openssl/crypto/stack',    '(stack|safestack).h',    'openssl'),
295            ('freebsd/crypto/openssl/crypto', '(opensslconf|opensslv|crypto).h', 'openssl'),
296            ('freebsd/sys/rpc',               '**/*.h',            'rpc'),
297            ('freebsd/sys/sys',               '**/*.h',            'sys'),
298            ('freebsd/sys/vm',                '**/*.h',            'vm'),
299            ('freebsd/sys/dev/mii',           '**/*.h',            'dev/mii'),
300            ('linux/include',                 '**/*.h',            ''),
301            ('mDNSResponder/mDNSCore',        'mDNSDebug.h',       ''),
302            ('mDNSResponder/mDNSCore',        'mDNSEmbeddedAPI.h', ''),
303            ('mDNSResponder/mDNSShared',      'dns_sd.h',          ''),
304            ('mDNSResponder/mDNSPosix',       'mDNSPosix.h',       '')]
305
306# Move target dependent files under a machine directory
307def mapCPUDependentPath(path):
308  return path.replace("include/", "include/machine/")
309
310def fixIncludes(data):
311    data = re.sub('#include <sys/resource.h>', '#include <rtems/bsd/sys/resource.h>', data)
312    data = re.sub('#include <sys/unistd.h>',   '#include <rtems/bsd/sys/unistd.h>', data)
313    return data
314
315# revert fixing the include paths inside a C or .h file
316def revertFixIncludes(data):
317    data = re.sub('#include <rtems/bsd/',  '#include <', data)
318    data = re.sub('#include <util.h>',     '#include <rtems/bsd/util.h>', data)
319    data = re.sub('#include <bsd.h>',      '#include <rtems/bsd/bsd.h>', data)
320    data = re.sub('#include <zerocopy.h>', '#include <rtems/bsd/zerocopy.h>', data)
321    return data
322
323# fix include paths inside a C or .h file
324def fixLocalIncludes(data):
325    data = re.sub('#include "opt_([^"]*)"',    '#include <rtems/bsd/local/opt_\\1>', data)
326    data = re.sub('#include "([^"]*)_if.h"',   '#include <rtems/bsd/local/\\1_if.h>', data)
327    data = re.sub('#include "miidevs([^"]*)"', '#include <rtems/bsd/local/miidevs\\1>', data)
328    data = re.sub('#include "usbdevs([^"]*)"', '#include <rtems/bsd/local/usbdevs\\1>', data)
329    return data
330
331# revert fixing the include paths inside a C or .h file
332def revertFixLocalIncludes(data):
333    data = re.sub('#include <rtems/bsd/local/([^>]*)>', '#include "\\1"', data)
334    return data
335
336def assertHeaderFile(path):
337    if path[-2] != '.' or path[-1] != 'h':
338        print("*** " + path + " does not end in .h")
339        print("*** Move it to a C source file list")
340        sys.exit(2)
341
342def assertSourceFile(path):
343    if path[-2] != '.' or (path[-1] != 'c' and path[-1] != 'S'):
344        print("*** " + path + " does not end in .c")
345        print("*** Move it to a header file list")
346        sys.exit(2)
347
348def diffSource(dstLines, srcLines, src, dst):
349    global filesTotal, filesTotalLines, filesTotalInserts, filesTotalDeletes
350    #
351    # Diff, note there is no line termination on each string.  Expand the
352    # generator to list because the generator is not reusable.
353    #
354    diff = list(difflib.unified_diff(dstLines,
355                                     srcLines,
356                                     fromfile = src,
357                                     tofile = dst,
358                                     n = 5,
359                                     lineterm = ''))
360    inserts = 0
361    deletes = 0
362    if len(diff) > 0:
363        if src in diffDetails and \
364           diffDetails[src].dst != dst and diffDetails[src].diff != diff:
365            raise error('repeated diff of file different: src:%s dst:%s' % (src, dst))
366        for l in diff:
367            if l[0] == '-':
368                deletes += 1
369            elif l[0] == '+':
370                inserts += 1
371        diffDetails[src] = diffRecord(src, dst, srcLines, diff, inserts, deletes)
372
373    #
374    # Count the total files, lines and the level of changes.
375    #
376    filesTotal += 1
377    filesTotalLines += len(srcLines)
378    filesTotalInserts += inserts
379    filesTotalDeletes += deletes
380
381    return diff
382
383#
384# Converters provide a way to alter the various types of code. The conversion
385# process filters a file as it is copies from the source path to the
386# destination path. Specialised versions are provided for different types of
387# source.
388#
389class Converter(object):
390
391    def convert(self, src, dst, hasSource = True, sourceFilter = None, srcContents = None):
392
393        global filesProcessed, filesProcessedCount
394
395        if verbose(verboseDebug):
396            print("convert: filter:%s: %s -> %s" % \
397                  (['yes', 'no'][sourceFilter is None], src, dst))
398
399        #
400        # If there is no source raise an error if we expect source else print a
401        # warning and do not try and convert.
402        #
403        if srcContents is None:
404            if not os.path.exists(src):
405                if hasSource:
406                    raise error('source not found: %s' % (src))
407                else:
408                    print('warning: no source: %s' % (src))
409                    return
410
411            #
412            # Files read as a single string if not passed in.
413            #
414            srcContents = readFile(src)
415
416        if os.path.exists(dst):
417            dstContents = readFile(dst)
418        else:
419            print('warning: no destination: %s' % (dst))
420            dstContents = ''
421
422        #
423        # Filter the source.
424        #
425        if sourceFilter is not None:
426            srcContents = sourceFilter(srcContents)
427
428        #
429        # Split into a list of lines.
430        #
431        srcLines = srcContents.split(os.linesep)
432        dstLines = dstContents.split(os.linesep)
433
434        if verbose(verboseDebug):
435            print('Unified diff: %s (lines:%d)' % (src, len(srcLines)))
436
437        #
438        # Diff, note there is no line termination on each string.
439        #
440        diff = diffSource(dstLines, srcLines, src, dst)
441
442        #
443        # The diff list is empty if the files are the same.
444        #
445        if len(diff) > 0:
446
447            if verbose(verboseDebug):
448                print('Unified diff length: %d' % len(diff))
449
450            filesProcessed += [dst]
451            filesProcessedCount += 1
452            if isDiffMode == False:
453                if verbose(verboseDetail):
454                    print("UPDATE: %s -> %s" % (src, dst))
455                if isDryRun == False:
456                    writeFile(dst, srcContents)
457            else:
458                print("diff -u %s %s" % (src, dst))
459                for l in diff:
460                    print(l)
461
462class NoConverter(Converter):
463    def convert(self, src, dst, hasSource = True, sourceFilter = None):
464        return '/* EMPTY */\n'
465
466class FromFreeBSDToRTEMSHeaderConverter(Converter):
467    def sourceFilter(self, data):
468        data = fixLocalIncludes(data)
469        data = fixIncludes(data)
470        return data
471
472    def convert(self, src, dst):
473        sconverter = super(FromFreeBSDToRTEMSHeaderConverter, self)
474        sconverter.convert(src, dst, sourceFilter = self.sourceFilter)
475
476class FromFreeBSDToRTEMSUserSpaceHeaderConverter(Converter):
477    def sourceFilter(self, data):
478        data = fixIncludes(data)
479        return data
480
481    def convert(self, src, dst):
482        sconverter = super(FromFreeBSDToRTEMSUserSpaceHeaderConverter, self)
483        sconverter.convert(src, dst, sourceFilter = self.sourceFilter)
484
485class FromFreeBSDToRTEMSSourceConverter(Converter):
486    def sourceFilter(self, data):
487        data = fixLocalIncludes(data)
488        data = fixIncludes(data)
489        data = '#include <machine/rtems-bsd-kernel-space.h>\n\n' + data
490        return data
491
492    def convert(self, src, dst):
493        sconverter = super(FromFreeBSDToRTEMSSourceConverter, self)
494        sconverter.convert(src, dst, sourceFilter = self.sourceFilter)
495
496class FromFreeBSDToRTEMSUserSpaceSourceConverter(Converter):
497    def sourceFilter(self, data):
498        data = fixIncludes(data)
499        data = '#include <machine/rtems-bsd-user-space.h>\n\n' + data
500        return data
501
502    def convert(self, src, dst):
503        sconverter = super(FromFreeBSDToRTEMSUserSpaceSourceConverter, self)
504        sconverter.convert(src, dst, sourceFilter = self.sourceFilter)
505
506class FromRTEMSToFreeBSDHeaderConverter(Converter):
507    def sourceFilter(self, data):
508        data = revertFixLocalIncludes(data)
509        data = revertFixIncludes(data)
510        return data
511
512    def convert(self, src, dst):
513        sconverter = super(FromRTEMSToFreeBSDHeaderConverter, self)
514        sconverter.convert(src, dst, hasSource = False,  sourceFilter = self.sourceFilter)
515
516class FromRTEMSToFreeBSDSourceConverter(Converter):
517    def sourceFilter(self, data):
518        data = re.sub('#include <machine/rtems-bsd-kernel-space.h>\n\n', '', data)
519        data = re.sub('#include <machine/rtems-bsd-user-space.h>\n\n', '', data)
520        data = revertFixLocalIncludes(data)
521        data = revertFixIncludes(data)
522        return data
523
524    def convert(self, src, dst):
525        sconverter = super(FromRTEMSToFreeBSDSourceConverter, self)
526        sconverter.convert(src, dst, hasSource = False, sourceFilter = self.sourceFilter)
527
528#
529# Compose a path based for the various parts of the source tree.
530#
531class PathComposer(object):
532    def composeOriginPath(self, path):
533        return path
534
535    def composeLibBSDPath(self, path, prefix):
536        return os.path.join(prefix, path)
537
538class FreeBSDPathComposer(PathComposer):
539    def composeOriginPath(self, path):
540        return os.path.join(FreeBSD_DIR, path)
541
542    def composeLibBSDPath(self, path, prefix):
543        return os.path.join(prefix, 'freebsd', path)
544
545class RTEMSPathComposer(PathComposer):
546    def composeOriginPath(self, path):
547        return path
548
549    def composeLibBSDPath(self, path, prefix):
550        return os.path.join(prefix, 'rtemsbsd', path)
551
552class LinuxPathComposer(PathComposer):
553    def composeOriginPath(self, path):
554        return os.path.join(Linux_DIR, path)
555
556    def composeLibBSDPath(self, path, prefix):
557        return os.path.join(prefix, 'linux', path)
558
559class CPUDependentFreeBSDPathComposer(FreeBSDPathComposer):
560    def composeLibBSDPath(self, path, prefix):
561        path = super(CPUDependentFreeBSDPathComposer, self).composeLibBSDPath(path, prefix)
562        path = mapCPUDependentPath(path)
563        return path
564
565class CPUDependentRTEMSPathComposer(RTEMSPathComposer):
566    def composeLibBSDPath(self, path, prefix):
567        path = super(CPUDependentRTEMSPathComposer, self).composeLibBSDPath(path, prefix)
568        path = mapCPUDependentPath(path)
569        return path
570
571class CPUDependentLinuxPathComposer(LinuxPathComposer):
572    def composeLibBSDPath(self, path, prefix):
573        path = super(CPUDependentLinuxPathComposer, self).composeLibBSDPath(path, prefix)
574        path = mapCPUDependentPath(path)
575        return path
576
577class TargetSourceCPUDependentPathComposer(CPUDependentFreeBSDPathComposer):
578    def __init__(self, targetCPU, sourceCPU):
579        self.targetCPU = targetCPU
580        self.sourceCPU = sourceCPU
581
582    def composeLibBSDPath(self, path, prefix):
583        path = super(TargetSourceCPUDependentPathComposer, self).composeLibBSDPath(path, prefix)
584        path = path.replace(self.sourceCPU, self.targetCPU)
585        return path
586
587class BuildSystemFragmentComposer(object):
588    def __init__(self, includes = None):
589        if type(includes) is not list:
590            self.includes = [includes]
591        else:
592            self.includes = includes
593
594    def compose(self, path):
595        return ''
596
597#
598# File - a file in the source we move backwards and forwards.
599#
600class File(object):
601    def __init__(self, path, pathComposer,
602                 forwardConverter, reverseConverter, buildSystemComposer):
603        if verbose(verboseMoreDetail):
604            print("FILE: %-50s F:%-45s R:%-45s" % \
605                  (path,
606                   forwardConverter.__class__.__name__,
607                   reverseConverter.__class__.__name__))
608        self.path = path
609        self.pathComposer = pathComposer
610        self.originPath = self.pathComposer.composeOriginPath(self.path)
611        self.libbsdPath = self.pathComposer.composeLibBSDPath(self.path, LIBBSD_DIR)
612        self.forwardConverter = forwardConverter
613        self.reverseConverter = reverseConverter
614        self.buildSystemComposer = buildSystemComposer
615
616    def processSource(self, forward):
617        if forward:
618            if verbose(verboseDetail):
619                print("process source: %s => %s" % (self.originPath, self.libbsdPath))
620            self.forwardConverter.convert(self.originPath, self.libbsdPath)
621        else:
622            if verbose(verboseDetail):
623                print("process source: %s => %s converter:%s" % \
624                      (self.libbsdPath, self.originPath, self.reverseConverter.__class__.__name__))
625            self.reverseConverter.convert(self.libbsdPath, self.originPath)
626
627    def getFragment(self):
628        return self.buildSystemComposer.compose(self.pathComposer.composeLibBSDPath(self.path, ''))
629
630#
631# Module - logical group of related files we can perform actions on
632#
633class Module:
634    def __init__(self, name):
635        self.name = name
636        self.conditionalOn = "none"
637        self.files = []
638        self.cpuDependentSourceFiles = {}
639        self.dependencies = []
640
641    def initCPUDependencies(self, cpu):
642        if cpu not in self.cpuDependentSourceFiles:
643            self.cpuDependentSourceFiles[cpu] = []
644
645    def processSource(self, direction):
646        if verbose(verboseDetail):
647            print("process module: %s" % (self.name))
648        for f in self.files:
649            f.processSource(direction)
650        for cpu, files in self.cpuDependentSourceFiles.items():
651            for f in files:
652                f.processSource(direction)
653
654    def addFiles(self, newFiles, buildSystemComposer = BuildSystemFragmentComposer()):
655        files = []
656        for newFile in newFiles:
657            assertFile(newFile)
658            files += [File(newFile, composers, buildSystemComposer)]
659        return files
660
661    def addFile(self, f):
662        self.files += [f]
663
664    def addFiles(self, newFiles,
665                 pathComposer, forwardConverter, reverseConverter,
666                 assertFile, buildSystemComposer = BuildSystemFragmentComposer()):
667        files = []
668        for newFile in newFiles:
669            assertFile(newFile)
670            files += [File(newFile, pathComposer, forwardConverter,
671                           reverseConverter, buildSystemComposer)]
672        return files
673
674    def addKernelSpaceHeaderFiles(self, files):
675        self.files += self.addFiles(files,
676                                    FreeBSDPathComposer(), FromFreeBSDToRTEMSHeaderConverter(),
677                                    FromRTEMSToFreeBSDHeaderConverter(), assertHeaderFile)
678
679    def addUserSpaceHeaderFiles(self, files):
680        self.files += self.addFiles(files,
681                                    FreeBSDPathComposer(), FromFreeBSDToRTEMSUserSpaceHeaderConverter(),
682                                    FromRTEMSToFreeBSDHeaderConverter(), assertHeaderFile)
683
684    def addRTEMSHeaderFiles(self, files):
685        self.files += self.addFiles(files, RTEMSPathComposer(),
686                                    NoConverter(), NoConverter(), assertHeaderFile)
687
688    def addLinuxHeaderFiles(self, files):
689        self.files += self.addFiles(files,
690                                    LinuxPathComposer(), FromFreeBSDToRTEMSHeaderConverter(),
691                                    FromRTEMSToFreeBSDHeaderConverter(), assertHeaderFile)
692
693    def addCPUDependentFreeBSDHeaderFiles(self, files):
694        self.files += self.addFiles(files,
695                                    CPUDependentFreeBSDPathComposer(), FromFreeBSDToRTEMSHeaderConverter(),
696                                    FromRTEMSToFreeBSDHeaderConverter(), assertHeaderFile)
697
698    def addCPUDependentLinuxHeaderFiles(self, files):
699        self.files += self.addFiles(files,
700                                    CPUDependentLinuxPathComposer(), FromFreeBSDToRTEMSHeaderConverter(),
701                                    FromRTEMSToFreeBSDHeaderConverter(), assertHeaderFile)
702
703    def addTargetSourceCPUDependentHeaderFiles(self, targetCPUs, sourceCPU, files):
704        for cpu in targetCPUs:
705            self.files += self.addFiles(files,
706                                        TargetSourceCPUDependentPathComposer(cpu, sourceCPU),
707                                        FromFreeBSDToRTEMSHeaderConverter(),
708                                        NoConverter(), assertHeaderFile)
709
710    def addSourceFiles(self, files, sourceFileFragmentComposer):
711        self.files += self.addFiles(files,
712                                    PathComposer(), NoConverter(), NoConverter(), assertSourceFile,
713                                    sourceFileFragmentComposer)
714
715    def addKernelSpaceSourceFiles(self, files, sourceFileFragmentComposer):
716        self.files += self.addFiles(files,
717                                    FreeBSDPathComposer(), FromFreeBSDToRTEMSSourceConverter(),
718                                    FromRTEMSToFreeBSDSourceConverter(), assertSourceFile,
719                                    sourceFileFragmentComposer)
720
721    def addUserSpaceSourceFiles(self, files, sourceFileFragmentComposer):
722        self.files += self.addFiles(files,
723                                    FreeBSDPathComposer(),
724                                    FromFreeBSDToRTEMSUserSpaceSourceConverter(),
725                                    FromRTEMSToFreeBSDSourceConverter(), assertSourceFile,
726                                    sourceFileFragmentComposer)
727
728    def addRTEMSSourceFiles(self, files, sourceFileFragmentComposer):
729        self.files += self.addFiles(files,
730                                    RTEMSPathComposer(), NoConverter(), NoConverter(),
731                                    assertSourceFile, sourceFileFragmentComposer)
732
733    def addLinuxSourceFiles(self, files, sourceFileFragmentComposer):
734        self.files += self.addFiles(files,
735                                    LinuxPathComposer(), FromFreeBSDToRTEMSSourceConverter(),
736                                    FromRTEMSToFreeBSDSourceConverter(), assertSourceFile,
737                                    sourceFileFragmentComposer)
738
739    def addCPUDependentFreeBSDSourceFiles(self, cpus, files, sourceFileFragmentComposer):
740        for cpu in cpus:
741            self.initCPUDependencies(cpu)
742            self.cpuDependentSourceFiles[cpu] += \
743                self.addFiles(files,
744                              CPUDependentFreeBSDPathComposer(), FromFreeBSDToRTEMSSourceConverter(),
745                              FromRTEMSToFreeBSDSourceConverter(), assertSourceFile,
746                              sourceFileFragmentComposer)
747
748    def addCPUDependentRTEMSSourceFiles(self, cpus, files, sourceFileFragmentComposer):
749        for cpu in cpus:
750            self.initCPUDependencies(cpu)
751            self.cpuDependentSourceFiles[cpu] += \
752                self.addFiles(files,
753                              CPUDependentRTEMSPathComposer(), NoConverter(),
754                              NoConverter(), assertSourceFile,
755                              sourceFileFragmentComposer)
756
757    def addCPUDependentLinuxSourceFiles(self, cpus, files, sourceFileFragmentComposer):
758        for cpu in cpus:
759            self.initCPUDependencies(cpu)
760            self.cpuDependentSourceFiles[cpu] += \
761                self.addFiles(files,
762                              CPUDependentLinuxPathComposer(), FromFreeBSDToRTEMSSourceConverter(),
763                              FromRTEMSToFreeBSDSourceConverter(), assertSourceFile,
764                              sourceFileFragmentComposer)
765
766    def addTest(self, testFragementComposer):
767        self.files += [File(testFragementComposer.testName,
768                            PathComposer(), NoConverter(), NoConverter(),
769                            testFragementComposer)]
770
771    def addDependency(self, dep):
772        self.dependencies += [dep]
773
774#
775# Manager - a collection of modules.
776#
777class ModuleManager:
778    def __init__(self):
779        self.modules = {}
780        self.generator = {}
781        self.setGenerators()
782
783    def __getitem__(self, key):
784        if key not in self.modules:
785            raise KeyError('module %s not found' % (key))
786        return self.modules[key]
787
788    def getModules(self):
789        return sorted(self.modules.keys())
790
791    def addModule(self, module):
792        self.modules[module.name] = module
793
794    def processSource(self, direction):
795        if verbose(verboseDetail):
796            print("process modules:")
797        for m in sorted(self.modules):
798            self.modules[m].processSource(direction)
Note: See TracBrowser for help on using the repository browser.