summaryrefslogblamecommitdiffstats
path: root/rtems_bsd.py
blob: 8faae1049754879e798ffd4bef4f79ef91b5a73e (plain) (tree)



























                                                                          

              






                                       
 


              
 
                 
                                  


                                                      
                                    



                                                                            
 

                                                  






                                                               
                                                                            
 
                                                       





                                                                          
                                                     
                                     

                                                           



                                                   
                                                                               
 







                                                                 

                                                  


                                                             







                                                   
 









                                                                               

                                                                   
 



                                                                    
























                                                                          
 

                                           
 
 
                          

                                                       
 
                                   



                                               
#
# RTEMS Project (https://www.rtems.org/)
#
# Copyright (c) 2016 Chris Johns <chrisj@rtems.org>. All rights reserved.
#
#  Redistribution and use in source and binary forms, with or without
#  modification, are permitted provided that the following conditions
#  are met:
#  1. Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
#  2. Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#
#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
#  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
#  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
#  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
#  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
#  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
#  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
#  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
#  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
#  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

from __future__ import print_function

import os.path

try:
    import rtems_waf.rtems as rtems
except:
    print("error: no rtems_waf module")
    import sys
    sys.exit(1)


def init(ctx):
    pass


def options(opt):
    opt.add_option('--net-config',
                   default='config.inc',
                   dest='net_config',
                   help='Network test configuration.')
    opt.add_option('--rtems-libbsd',
                   action='store',
                   default=None,
                   dest='rtems_libbsd',
                   help='Path to install RTEMS LibBSD (defauls to prefix).')


def bsp_configure(conf, arch_bsp, mandatory=True):
    configure = mandatory

    if not mandatory and conf.options.rtems_libbsd is not None:
        configure = True

    if configure:
        conf.msg('RTEMS LibBSD',
                 rtems.arch(arch_bsp) + '/' + rtems.bsp(arch_bsp), 'YELLOW')

        conf.check(header_name='dlfcn.h', features='c')
        if not rtems.check_posix(conf):
            conf.fatal('RTEMS kernel POSIX support is disabled; ' +
                       'configure RTEMS with --enable-posix')
        if rtems.check_networking(conf):
            conf.fatal('RTEMS kernel contains the old network support; ' +
                       'configure RTEMS with --disable-networking')
        rtems_libbsd_path = conf.options.rtems_libbsd
        if rtems_libbsd_path is None:
            if conf.options.rtems_path is not None:
                rtems_libbsd_path = conf.options.rtems_path
            else:
                rtems_libbsd_path = conf.env.PREFIX

        if not os.path.exists(rtems_libbsd_path):
            conf.fatal('RTEMS LibBSD path not found: %s' % (rtems_libbsd_path))

        rtems_libbsd_inc_path = os.path.join(
            rtems_libbsd_path,
            rtems.arch_bsp_include_path(conf.env.RTEMS_VERSION,
                                        conf.env.RTEMS_ARCH_BSP))
        rtems_libbsd_lib_path = os.path.join(
            rtems_libbsd_path,
            rtems.arch_bsp_lib_path(conf.env.RTEMS_VERSION,
                                    conf.env.RTEMS_ARCH_BSP))

        conf.env.IFLAGS += [rtems_libbsd_inc_path]
        conf.check(header_name='machine/rtems-bsd-sysinit.h',
                   features='c',
                   includes=conf.env.IFLAGS)

        conf.env.RTEMS_LIBBSD = 'Yes'
        conf.env.INCLUDES = conf.env.IFLAGS
        conf.env.LIBPATH += [rtems_libbsd_lib_path]
        conf.env.LIB += ['bsd', 'z', 'm']

        configure_net_config(conf, arch_bsp)


def configure_net_config(conf, arch_bsp):
    if check_libbsd(conf) and conf.options.net_config is not None:
        net_config = conf.options.net_config

        if not os.path.exists(net_config):
            conf.fatal('network configuraiton \'%s\' not found' % (net_config))

        try:
            net_cfg_lines = open(net_config).readlines()
        except:
            conf.fatal('network configuraiton \'%s\' read failed' %
                       (net_config))

        tags = [
            'NET_CFG_SELF_IP', 'NET_CFG_NETMASK', 'NET_CFG_PEER_IP',
            'NET_CFG_GATEWAY_IP'
        ]

        lc = 0
        sed = 'sed '
        defines = []
        for l in net_cfg_lines:
            lc += 1
            if l.strip().startswith('NET_CFG_'):
                ls = l.split('=')
                if len(ls) != 2:
                    conf.fatal('network configuraiton \'%s\' ' + \
                              'parse error: %d: %s' % (net_config, lc, l))
                lhs = ls[0].strip()
                rhs = ls[1].strip()
                for t in tags:
                    if lhs.startswith(t):
                        conf.env[lhs] = rhs
                        sed += "-e 's/@%s@/%s/'" % (lhs, rhs)
                        defines += ['%s="%s"' % (lhs, rhs)]

        conf.env.NET_CONFIG = net_config
        conf.env.NET_CONFIG_SED = sed
        conf.env.NET_CONFIG_DEFINES = ','.join(defines)

        conf.msg('Net Config', 'found', 'YELLOW')


def check_libbsd(ctx):
    return rtems.check(ctx, 'RTEMS_LIBBSD')


def check_net_config(ctx):
    return rtems.check(ctx, 'NET_CONFIG', setting=True)


def net_config_header(ctx, target):
    ctx(target=target,
        source="rtems_waf/network-config.h.in",
        rule=sed + " < ${SRC} > ${TGT}",
        update_outputs=True)