source: rtems-libbsd/builder.py @ 721b1c1

55-freebsd-126-freebsd-12
Last change on this file since 721b1c1 was 28ee86a, checked in by Sebastian Huber <sebastian.huber@…>, on 04/27/16 at 09:58:19

Import DPAA driver snapshot

Imported from Freescale Linux repository

git://git.freescale.com/ppc/upstream/linux.git

commit 2774c204cd8bfc56a200ff4dcdfc9cdf5b6fc161.

Linux compatibility layer is partly from FreeBSD.

  • Property mode set to 100755
File size: 32.3 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/mghttpd',              'mongoose.h',        'mghttpd'),
227            ('freebsd/include',               '**/*.h',            ''),
228            ('freebsd/sys/bsm',               '**/*.h',            'bsm'),
229            ('freebsd/sys/cam',               '**/*.h',            'cam'),
230            ('freebsd/sys/net',               '**/*.h',            'net'),
231            ('freebsd/sys/net80211',          '**/*.h',            'net80211'),
232            ('freebsd/sys/netinet',           '**/*.h',            'netinet'),
233            ('freebsd/sys/netinet6',          '**/*.h',            'netinet6'),
234            ('freebsd/sys/netipsec',          '**/*.h',            'netipsec'),
235            ('freebsd/contrib/libpcap',       '*.h',               ''),
236            ('freebsd/contrib/libpcap/pcap',  '*.h',               'pcap'),
237            ('freebsd/crypto/openssl',        '*.h',               'openssl'),
238            ('freebsd/crypto/openssl/crypto', '*.h',               'openssl'),
239            ('freebsd/crypto/openssl/ssl',    '(ssl|kssl|ssl2).h', 'openssl'),
240            ('freebsd/crypto/openssl/crypto/aes', 'aes.h',         'openssl'),
241            ('freebsd/crypto/openssl/crypto/err', 'err.h',         'openssl'),
242            ('freebsd/crypto/openssl/crypto/bio', '*.h',           'openssl'),
243            ('freebsd/crypto/openssl/crypto/dsa', '*.h',           'openssl'),
244            ('freebsd/crypto/openssl/ssl',        '*.h',           'openssl'),
245            ('freebsd/crypto/openssl/crypto/bn',  'bn.h',          'openssl'),
246            ('freebsd/crypto/openssl/crypto/x509',  'x509.h',      'openssl'),
247            ('freebsd/crypto/openssl/crypto/cast',  'cast.h',      'openssl'),
248            ('freebsd/crypto/openssl/crypto/lhash', 'lhash.h',     'openssl'),
249            ('freebsd/crypto/openssl/crypto/ecdh',  'ecdh.h',      'openssl'),
250            ('freebsd/crypto/openssl/crypto/ecdsa', 'ecdsa.h',     'openssl'),
251            ('freebsd/crypto/openssl/crypto/idea',  'idea.h',      'openssl'),
252            ('freebsd/crypto/openssl/crypto/mdc2',  'mdc2.h',      'openssl'),
253            ('freebsd/crypto/openssl/crypto/md4',   'md4.h',       'openssl'),
254            ('freebsd/crypto/openssl/crypto/md5',   'md5.h',       'openssl'),
255            ('freebsd/crypto/openssl/crypto/rc2',   'rc2.h',       'openssl'),
256            ('freebsd/crypto/openssl/crypto/rc4',   'rc4.h',       'openssl'),
257            ('freebsd/crypto/openssl/crypto/ripemd','ripemd.h',    'openssl'),
258            ('freebsd/crypto/openssl/crypto/seed',  'seed.h',      'openssl'),
259            ('freebsd/crypto/openssl/crypto/sha',   'sha.h',       'openssl'),
260            ('freebsd/crypto/openssl/crypto/x509v3','x509v3.h',    'openssl'),
261            ('freebsd/crypto/openssl/crypto/x509',  'x509_vfy.h',  'openssl'),
262            ('freebsd/crypto/openssl/crypto/buffer','buffer.h',    'openssl'),
263            ('freebsd/crypto/openssl/crypto/comp',  'comp.h',      'openssl'),
264            ('freebsd/crypto/openssl/crypto/asn1',  'asn1_mac.h',  'openssl'),
265            ('freebsd/crypto/openssl/crypto/pem',  '(pem|pem2).h', 'openssl'),
266            ('freebsd/crypto/openssl/crypto/rsa',   'rsa.h',       'openssl'),
267            ('freebsd/crypto/openssl/crypto/evp',   'evp.h',       'openssl'),
268            ('freebsd/crypto/openssl/crypto/ec',    'ec.h',        'openssl'),
269            ('freebsd/crypto/openssl/crypto/engine', 'engine.h',   'openssl'),
270            ('freebsd/crypto/openssl/crypto/pkcs7', 'pkcs7.h',     'openssl'),
271            ('freebsd/crypto/openssl/crypto/hmac',  'hmac.h',      'openssl'),
272            ('freebsd/crypto/openssl/crypto/pqueue', 'pqueue.h',   'openssl'),
273            ('freebsd/crypto/openssl/crypto/ocsp',  'ocsp.h',      'openssl'),
274            ('freebsd/crypto/openssl/crypto/rand',  'rand.h',      'openssl'),
275            ('freebsd/crypto/openssl/crypto/srp',   'srp.h',       'openssl'),
276            ('freebsd/crypto/openssl/crypto/dh',    'dh.h',        'openssl'),
277            ('freebsd/crypto/openssl/crypto/dso',   'dso.h',       'openssl'),
278            ('freebsd/crypto/openssl/crypto/krb5',  'krb5_asn.h',  'openssl'),
279            ('freebsd/crypto/openssl/crypto/cms',   'cms.h',       'openssl'),
280            ('freebsd/crypto/openssl/crypto/txt_db', 'txt_db.h',   'openssl'),
281            ('freebsd/crypto/openssl/crypto/ts',    'ts.h',        'openssl'),
282            ('freebsd/crypto/openssl/crypto/modes', 'modes.h',     'openssl'),
283            ('freebsd/crypto/openssl/crypto/pkcs12', 'pkcs12.h',   'openssl'),
284            ('freebsd/crypto/openssl/crypto/bf',    'blowfish.h',  'openssl'),
285            ('freebsd/crypto/openssl/crypto/cmac',  'cmac.h',      'openssl'),
286            ('freebsd/crypto/openssl/crypto/asn1',  '(asn1|asn1t).h',            'openssl'),
287            ('freebsd/crypto/openssl/crypto/camellia', 'camellia.h',             'openssl'),
288            ('freebsd/crypto/openssl/crypto/objects',  '(objects|obj_mac).h',    'openssl'),
289            ('freebsd/crypto/openssl/crypto/conf',     '(conf|conf_api).h',      'openssl'),
290            ('freebsd/crypto/openssl/crypto/des',      '(des|des_old).h',        'openssl'),
291            ('freebsd/crypto/openssl/crypto/ui',       '(ui_compat|ui).h',       'openssl'),
292            ('freebsd/crypto/openssl/crypto/whrlpool', 'whrlpool.h',             'openssl'),
293            ('freebsd/crypto/openssl/crypto/stack',    '(stack|safestack).h',    'openssl'),
294            ('freebsd/crypto/openssl/crypto', '(opensslconf|opensslv|crypto).h', 'openssl'),
295            ('freebsd/sys/rpc',               '**/*.h',            'rpc'),
296            ('freebsd/sys/sys',               '**/*.h',            'sys'),
297            ('freebsd/sys/vm',                '**/*.h',            'vm'),
298            ('freebsd/sys/dev/mii',           '**/*.h',            'dev/mii'),
299            ('mDNSResponder/mDNSCore',        'mDNSDebug.h',       ''),
300            ('mDNSResponder/mDNSCore',        'mDNSEmbeddedAPI.h', ''),
301            ('mDNSResponder/mDNSShared',      'dns_sd.h',          ''),
302            ('mDNSResponder/mDNSPosix',       'mDNSPosix.h',       '')]
303
304# Move target dependent files under a machine directory
305def mapCPUDependentPath(path):
306  return path.replace("include/", "include/machine/")
307
308def fixIncludes(data):
309    data = re.sub('#include <sys/resource.h>', '#include <rtems/bsd/sys/resource.h>', data)
310    data = re.sub('#include <sys/unistd.h>',   '#include <rtems/bsd/sys/unistd.h>', data)
311    return data
312
313# revert fixing the include paths inside a C or .h file
314def revertFixIncludes(data):
315    data = re.sub('#include <rtems/bsd/',  '#include <', data)
316    data = re.sub('#include <util.h>',     '#include <rtems/bsd/util.h>', data)
317    data = re.sub('#include <bsd.h>',      '#include <rtems/bsd/bsd.h>', data)
318    data = re.sub('#include <zerocopy.h>', '#include <rtems/bsd/zerocopy.h>', data)
319    return data
320
321# fix include paths inside a C or .h file
322def fixLocalIncludes(data):
323    data = re.sub('#include "opt_([^"]*)"',    '#include <rtems/bsd/local/opt_\\1>', data)
324    data = re.sub('#include "([^"]*)_if.h"',   '#include <rtems/bsd/local/\\1_if.h>', data)
325    data = re.sub('#include "miidevs([^"]*)"', '#include <rtems/bsd/local/miidevs\\1>', data)
326    data = re.sub('#include "usbdevs([^"]*)"', '#include <rtems/bsd/local/usbdevs\\1>', data)
327    return data
328
329# revert fixing the include paths inside a C or .h file
330def revertFixLocalIncludes(data):
331    data = re.sub('#include <rtems/bsd/local/([^>]*)>', '#include "\\1"', data)
332    return data
333
334def assertHeaderFile(path):
335    if path[-2] != '.' or path[-1] != 'h':
336        print("*** " + path + " does not end in .h")
337        print("*** Move it to a C source file list")
338        sys.exit(2)
339
340def assertSourceFile(path):
341    if path[-2] != '.' or (path[-1] != 'c' and path[-1] != 'S'):
342        print("*** " + path + " does not end in .c")
343        print("*** Move it to a header file list")
344        sys.exit(2)
345
346def diffSource(dstLines, srcLines, src, dst):
347    global filesTotal, filesTotalLines, filesTotalInserts, filesTotalDeletes
348    #
349    # Diff, note there is no line termination on each string.  Expand the
350    # generator to list because the generator is not reusable.
351    #
352    diff = list(difflib.unified_diff(dstLines,
353                                     srcLines,
354                                     fromfile = src,
355                                     tofile = dst,
356                                     n = 5,
357                                     lineterm = ''))
358    inserts = 0
359    deletes = 0
360    if len(diff) > 0:
361        if src in diffDetails and \
362           diffDetails[src].dst != dst and diffDetails[src].diff != diff:
363            raise error('repeated diff of file different: src:%s dst:%s' % (src, dst))
364        for l in diff:
365            if l[0] == '-':
366                deletes += 1
367            elif l[0] == '+':
368                inserts += 1
369        diffDetails[src] = diffRecord(src, dst, srcLines, diff, inserts, deletes)
370
371    #
372    # Count the total files, lines and the level of changes.
373    #
374    filesTotal += 1
375    filesTotalLines += len(srcLines)
376    filesTotalInserts += inserts
377    filesTotalDeletes += deletes
378
379    return diff
380
381#
382# Converters provide a way to alter the various types of code. The conversion
383# process filters a file as it is copies from the source path to the
384# destination path. Specialised versions are provided for different types of
385# source.
386#
387class Converter(object):
388
389    def convert(self, src, dst, hasSource = True, sourceFilter = None, srcContents = None):
390
391        global filesProcessed, filesProcessedCount
392
393        if verbose(verboseDebug):
394            print("convert: filter:%s: %s -> %s" % \
395                  (['yes', 'no'][sourceFilter is None], src, dst))
396
397        #
398        # If there is no source raise an error if we expect source else print a
399        # warning and do not try and convert.
400        #
401        if srcContents is None:
402            if not os.path.exists(src):
403                if hasSource:
404                    raise error('source not found: %s' % (src))
405                else:
406                    print('warning: no source: %s' % (src))
407                    return
408
409            #
410            # Files read as a single string if not passed in.
411            #
412            srcContents = readFile(src)
413
414        if os.path.exists(dst):
415            dstContents = readFile(dst)
416        else:
417            print('warning: no destination: %s' % (dst))
418            dstContents = ''
419
420        #
421        # Filter the source.
422        #
423        if sourceFilter is not None:
424            srcContents = sourceFilter(srcContents)
425
426        #
427        # Split into a list of lines.
428        #
429        srcLines = srcContents.split(os.linesep)
430        dstLines = dstContents.split(os.linesep)
431
432        if verbose(verboseDebug):
433            print('Unified diff: %s (lines:%d)' % (src, len(srcLines)))
434
435        #
436        # Diff, note there is no line termination on each string.
437        #
438        diff = diffSource(dstLines, srcLines, src, dst)
439
440        #
441        # The diff list is empty if the files are the same.
442        #
443        if len(diff) > 0:
444
445            if verbose(verboseDebug):
446                print('Unified diff length: %d' % len(diff))
447
448            filesProcessed += [dst]
449            filesProcessedCount += 1
450            if isDiffMode == False:
451                if verbose(verboseDetail):
452                    print("UPDATE: %s -> %s" % (src, dst))
453                if isDryRun == False:
454                    writeFile(dst, srcContents)
455            else:
456                print("diff -u %s %s" % (src, dst))
457                for l in diff:
458                    print(l)
459
460class NoConverter(Converter):
461    def convert(self, src, dst, hasSource = True, sourceFilter = None):
462        return '/* EMPTY */\n'
463
464class FromFreeBSDToRTEMSHeaderConverter(Converter):
465    def sourceFilter(self, data):
466        data = fixLocalIncludes(data)
467        data = fixIncludes(data)
468        return data
469
470    def convert(self, src, dst):
471        sconverter = super(FromFreeBSDToRTEMSHeaderConverter, self)
472        sconverter.convert(src, dst, sourceFilter = self.sourceFilter)
473
474class FromFreeBSDToRTEMSUserSpaceHeaderConverter(Converter):
475    def sourceFilter(self, data):
476        data = fixIncludes(data)
477        return data
478
479    def convert(self, src, dst):
480        sconverter = super(FromFreeBSDToRTEMSUserSpaceHeaderConverter, self)
481        sconverter.convert(src, dst, sourceFilter = self.sourceFilter)
482
483class FromFreeBSDToRTEMSSourceConverter(Converter):
484    def sourceFilter(self, data):
485        data = fixLocalIncludes(data)
486        data = fixIncludes(data)
487        data = '#include <machine/rtems-bsd-kernel-space.h>\n\n' + data
488        return data
489
490    def convert(self, src, dst):
491        sconverter = super(FromFreeBSDToRTEMSSourceConverter, self)
492        sconverter.convert(src, dst, sourceFilter = self.sourceFilter)
493
494class FromFreeBSDToRTEMSUserSpaceSourceConverter(Converter):
495    def sourceFilter(self, data):
496        data = fixIncludes(data)
497        data = '#include <machine/rtems-bsd-user-space.h>\n\n' + data
498        return data
499
500    def convert(self, src, dst):
501        sconverter = super(FromFreeBSDToRTEMSUserSpaceSourceConverter, self)
502        sconverter.convert(src, dst, sourceFilter = self.sourceFilter)
503
504class FromRTEMSToFreeBSDHeaderConverter(Converter):
505    def sourceFilter(self, data):
506        data = revertFixLocalIncludes(data)
507        data = revertFixIncludes(data)
508        return data
509
510    def convert(self, src, dst):
511        sconverter = super(FromRTEMSToFreeBSDHeaderConverter, self)
512        sconverter.convert(src, dst, hasSource = False,  sourceFilter = self.sourceFilter)
513
514class FromRTEMSToFreeBSDSourceConverter(Converter):
515    def sourceFilter(self, data):
516        data = re.sub('#include <machine/rtems-bsd-kernel-space.h>\n\n', '', data)
517        data = re.sub('#include <machine/rtems-bsd-user-space.h>\n\n', '', data)
518        data = revertFixLocalIncludes(data)
519        data = revertFixIncludes(data)
520        return data
521
522    def convert(self, src, dst):
523        sconverter = super(FromRTEMSToFreeBSDSourceConverter, self)
524        sconverter.convert(src, dst, hasSource = False, sourceFilter = self.sourceFilter)
525
526#
527# Compose a path based for the various parts of the source tree.
528#
529class PathComposer(object):
530    def composeOriginPath(self, path):
531        return path
532
533    def composeLibBSDPath(self, path, prefix):
534        return os.path.join(prefix, path)
535
536class FreeBSDPathComposer(PathComposer):
537    def composeOriginPath(self, path):
538        return os.path.join(FreeBSD_DIR, path)
539
540    def composeLibBSDPath(self, path, prefix):
541        return os.path.join(prefix, 'freebsd', path)
542
543class RTEMSPathComposer(PathComposer):
544    def composeOriginPath(self, path):
545        return path
546
547    def composeLibBSDPath(self, path, prefix):
548        return os.path.join(prefix, 'rtemsbsd', path)
549
550class LinuxPathComposer(PathComposer):
551    def composeOriginPath(self, path):
552        return os.path.join(Linux_DIR, path)
553
554    def composeLibBSDPath(self, path, prefix):
555        return os.path.join(prefix, 'linux', path)
556
557class CPUDependentFreeBSDPathComposer(FreeBSDPathComposer):
558    def composeLibBSDPath(self, path, prefix):
559        path = super(CPUDependentFreeBSDPathComposer, self).composeLibBSDPath(path, prefix)
560        path = mapCPUDependentPath(path)
561        return path
562
563class CPUDependentRTEMSPathComposer(RTEMSPathComposer):
564    def composeLibBSDPath(self, path, prefix):
565        path = super(CPUDependentRTEMSPathComposer, self).composeLibBSDPath(path, prefix)
566        path = mapCPUDependentPath(path)
567        return path
568
569class CPUDependentLinuxPathComposer(LinuxPathComposer):
570    def composeLibBSDPath(self, path, prefix):
571        path = super(CPUDependentLinuxPathComposer, self).composeLibBSDPath(path, prefix)
572        path = mapCPUDependentPath(path)
573        return path
574
575class TargetSourceCPUDependentPathComposer(CPUDependentFreeBSDPathComposer):
576    def __init__(self, targetCPU, sourceCPU):
577        self.targetCPU = targetCPU
578        self.sourceCPU = sourceCPU
579
580    def composeLibBSDPath(self, path, prefix):
581        path = super(TargetSourceCPUDependentPathComposer, self).composeLibBSDPath(path, prefix)
582        path = path.replace(self.sourceCPU, self.targetCPU)
583        return path
584
585class BuildSystemFragmentComposer(object):
586    def __init__(self, includes = None):
587        if type(includes) is not list:
588            self.includes = [includes]
589        else:
590            self.includes = includes
591
592    def compose(self, path):
593        return ''
594
595#
596# File - a file in the source we move backwards and forwards.
597#
598class File(object):
599    def __init__(self, path, pathComposer,
600                 forwardConverter, reverseConverter, buildSystemComposer):
601        if verbose(verboseMoreDetail):
602            print("FILE: %-50s F:%-45s R:%-45s" % \
603                  (path,
604                   forwardConverter.__class__.__name__,
605                   reverseConverter.__class__.__name__))
606        self.path = path
607        self.pathComposer = pathComposer
608        self.originPath = self.pathComposer.composeOriginPath(self.path)
609        self.libbsdPath = self.pathComposer.composeLibBSDPath(self.path, LIBBSD_DIR)
610        self.forwardConverter = forwardConverter
611        self.reverseConverter = reverseConverter
612        self.buildSystemComposer = buildSystemComposer
613
614    def processSource(self, forward):
615        if forward:
616            if verbose(verboseDetail):
617                print("process source: %s => %s" % (self.originPath, self.libbsdPath))
618            self.forwardConverter.convert(self.originPath, self.libbsdPath)
619        else:
620            if verbose(verboseDetail):
621                print("process source: %s => %s converter:%s" % \
622                      (self.libbsdPath, self.originPath, self.reverseConverter.__class__.__name__))
623            self.reverseConverter.convert(self.libbsdPath, self.originPath)
624
625    def getFragment(self):
626        return self.buildSystemComposer.compose(self.pathComposer.composeLibBSDPath(self.path, ''))
627
628#
629# Module - logical group of related files we can perform actions on
630#
631class Module:
632    def __init__(self, name):
633        self.name = name
634        self.conditionalOn = "none"
635        self.files = []
636        self.cpuDependentSourceFiles = {}
637        self.dependencies = []
638
639    def initCPUDependencies(self, cpu):
640        if cpu not in self.cpuDependentSourceFiles:
641            self.cpuDependentSourceFiles[cpu] = []
642
643    def processSource(self, direction):
644        if verbose(verboseDetail):
645            print("process module: %s" % (self.name))
646        for f in self.files:
647            f.processSource(direction)
648        for cpu, files in self.cpuDependentSourceFiles.items():
649            for f in files:
650                f.processSource(direction)
651
652    def addFiles(self, newFiles, buildSystemComposer = BuildSystemFragmentComposer()):
653        files = []
654        for newFile in newFiles:
655            assertFile(newFile)
656            files += [File(newFile, composers, buildSystemComposer)]
657        return files
658
659    def addFile(self, f):
660        self.files += [f]
661
662    def addFiles(self, newFiles,
663                 pathComposer, forwardConverter, reverseConverter,
664                 assertFile, buildSystemComposer = BuildSystemFragmentComposer()):
665        files = []
666        for newFile in newFiles:
667            assertFile(newFile)
668            files += [File(newFile, pathComposer, forwardConverter,
669                           reverseConverter, buildSystemComposer)]
670        return files
671
672    def addKernelSpaceHeaderFiles(self, files):
673        self.files += self.addFiles(files,
674                                    FreeBSDPathComposer(), FromFreeBSDToRTEMSHeaderConverter(),
675                                    FromRTEMSToFreeBSDHeaderConverter(), assertHeaderFile)
676
677    def addUserSpaceHeaderFiles(self, files):
678        self.files += self.addFiles(files,
679                                    FreeBSDPathComposer(), FromFreeBSDToRTEMSUserSpaceHeaderConverter(),
680                                    FromRTEMSToFreeBSDHeaderConverter(), assertHeaderFile)
681
682    def addRTEMSHeaderFiles(self, files):
683        self.files += self.addFiles(files, RTEMSPathComposer(),
684                                    NoConverter(), NoConverter(), assertHeaderFile)
685
686    def addLinuxHeaderFiles(self, files):
687        self.files += self.addFiles(files,
688                                    LinuxPathComposer(), FromFreeBSDToRTEMSHeaderConverter(),
689                                    FromRTEMSToFreeBSDHeaderConverter(), assertHeaderFile)
690
691    def addCPUDependentFreeBSDHeaderFiles(self, files):
692        self.files += self.addFiles(files,
693                                    CPUDependentFreeBSDPathComposer(), FromFreeBSDToRTEMSHeaderConverter(),
694                                    FromRTEMSToFreeBSDHeaderConverter(), assertHeaderFile)
695
696    def addCPUDependentLinuxHeaderFiles(self, files):
697        self.files += self.addFiles(files,
698                                    CPUDependentLinuxPathComposer(), FromFreeBSDToRTEMSHeaderConverter(),
699                                    FromRTEMSToFreeBSDHeaderConverter(), assertHeaderFile)
700
701    def addTargetSourceCPUDependentHeaderFiles(self, targetCPUs, sourceCPU, files):
702        for cpu in targetCPUs:
703            self.files += self.addFiles(files,
704                                        TargetSourceCPUDependentPathComposer(cpu, sourceCPU),
705                                        FromFreeBSDToRTEMSHeaderConverter(),
706                                        NoConverter(), assertHeaderFile)
707
708    def addSourceFiles(self, files, sourceFileFragmentComposer):
709        self.files += self.addFiles(files,
710                                    PathComposer(), NoConverter(), NoConverter(), assertSourceFile,
711                                    sourceFileFragmentComposer)
712
713    def addKernelSpaceSourceFiles(self, files, sourceFileFragmentComposer):
714        self.files += self.addFiles(files,
715                                    FreeBSDPathComposer(), FromFreeBSDToRTEMSSourceConverter(),
716                                    FromRTEMSToFreeBSDSourceConverter(), assertSourceFile,
717                                    sourceFileFragmentComposer)
718
719    def addUserSpaceSourceFiles(self, files, sourceFileFragmentComposer):
720        self.files += self.addFiles(files,
721                                    FreeBSDPathComposer(),
722                                    FromFreeBSDToRTEMSUserSpaceSourceConverter(),
723                                    FromRTEMSToFreeBSDSourceConverter(), assertSourceFile,
724                                    sourceFileFragmentComposer)
725
726    def addRTEMSSourceFiles(self, files, sourceFileFragmentComposer):
727        self.files += self.addFiles(files,
728                                    RTEMSPathComposer(), NoConverter(), NoConverter(),
729                                    assertSourceFile, sourceFileFragmentComposer)
730
731    def addLinuxSourceFiles(self, files, sourceFileFragmentComposer):
732        self.files += self.addFiles(files,
733                                    LinuxPathComposer(), FromFreeBSDToRTEMSSourceConverter(),
734                                    FromRTEMSToFreeBSDSourceConverter(), assertSourceFile,
735                                    sourceFileFragmentComposer)
736
737    def addCPUDependentFreeBSDSourceFiles(self, cpus, files, sourceFileFragmentComposer):
738        for cpu in cpus:
739            self.initCPUDependencies(cpu)
740            self.cpuDependentSourceFiles[cpu] += \
741                self.addFiles(files,
742                              CPUDependentFreeBSDPathComposer(), FromFreeBSDToRTEMSSourceConverter(),
743                              FromRTEMSToFreeBSDSourceConverter(), assertSourceFile,
744                              sourceFileFragmentComposer)
745
746    def addCPUDependentRTEMSSourceFiles(self, cpus, files, sourceFileFragmentComposer):
747        for cpu in cpus:
748            self.initCPUDependencies(cpu)
749            self.cpuDependentSourceFiles[cpu] += \
750                self.addFiles(files,
751                              CPUDependentRTEMSPathComposer(), NoConverter(),
752                              NoConverter(), assertSourceFile,
753                              sourceFileFragmentComposer)
754
755    def addCPUDependentLinuxSourceFiles(self, cpus, files, sourceFileFragmentComposer):
756        for cpu in cpus:
757            self.initCPUDependencies(cpu)
758            self.cpuDependentSourceFiles[cpu] += \
759                self.addFiles(files,
760                              CPUDependentLinuxPathComposer(), FromFreeBSDToRTEMSSourceConverter(),
761                              FromRTEMSToFreeBSDSourceConverter(), assertSourceFile,
762                              sourceFileFragmentComposer)
763
764    def addTest(self, testFragementComposer):
765        self.files += [File(testFragementComposer.testName,
766                            PathComposer(), NoConverter(), NoConverter(),
767                            testFragementComposer)]
768
769    def addDependency(self, dep):
770        self.dependencies += [dep]
771
772#
773# Manager - a collection of modules.
774#
775class ModuleManager:
776    def __init__(self):
777        self.modules = {}
778        self.generator = {}
779        self.setGenerators()
780
781    def __getitem__(self, key):
782        if key not in self.modules:
783            raise KeyError('module %s not found' % (key))
784        return self.modules[key]
785
786    def getModules(self):
787        return sorted(self.modules.keys())
788
789    def addModule(self, module):
790        self.modules[module.name] = module
791
792    def processSource(self, direction):
793        if verbose(verboseDetail):
794            print("process modules:")
795        for m in sorted(self.modules):
796            self.modules[m].processSource(direction)
Note: See TracBrowser for help on using the repository browser.