# # RTEMS Project (https://www.rtems.org/) # # Copyright (c) 2021 Vijay Kumar Banerjee . # 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 rtems_waf import rtems import json import os def removeprefix(data, prefix): if data.startswith(prefix): return data[len(prefix):] return data def build(bld): source_files = [] driver_source = [] drv_incl = [] arch_lib_path = rtems.arch_bsp_lib_path(bld.env.RTEMS_VERSION, bld.env.RTEMS_ARCH_BSP) arch = rtems.arch(bld.env.RTEMS_ARCH_BSP) bsp = rtems.bsp(bld.env.RTEMS_ARCH_BSP) # file-import.json is kept separate from the rest of the defs because it # describes which files are imported from upstream lwip with open('file-import.json', 'r') as cf: files = json.load(cf) for f in files['files-to-import']: if f[-2:] == '.c': source_files.append(os.path.join('lwip', f)) def walk_sources(path): return bld.path.ant_glob([path + '/**/*.c', path + '/**/*.S']) def import_json_definition(prefix, path): sources = [] includes = [] with open(os.path.join(prefix, path), 'r') as bspconfig: files = json.load(bspconfig) if 'includes' in files: for f in files['includes']: tmpsrc, tmpincl = import_json_definition(prefix, f+'.json') sources.extend(tmpsrc) includes.extend(tmpincl) if 'source-files-to-import' in files: sources.extend(files['source-files-to-import']) if 'header-paths-to-import' in files: includes.extend(files['header-paths-to-import']) return (sources, includes) # import additional lwip source more_lwip_sources, common_includes = import_json_definition( 'defs/common', 'lwip.json') source_files.extend(more_lwip_sources) # import bsp files driver_source, drv_incl = import_json_definition( os.path.join('defs/bsps', arch), bsp+'.json') lwip_obj_incl = [] lwip_obj_incl.extend(drv_incl) lwip_obj_incl.extend(common_includes) bld(features='c', target='lwip_obj', cflags='-g -Wall -O0', includes=' '.join(lwip_obj_incl), source=source_files, ) drv_obj_incl = [] drv_obj_incl.extend(drv_incl) drv_obj_incl.extend(common_includes) bld(features='c', target='driver_obj', cflags='-g -Wall -O0', includes=' '.join(drv_obj_incl), source=driver_source, ) bld(features='c cstlib', target='lwip', cflags='-g -Wall -O0', use=['lwip_obj', 'driver_obj']) bld.install_files("${PREFIX}/" + arch_lib_path, ["liblwip.a"]) def install_headers(root_path): for root, dirs, files in os.walk(root_path): for name in files: ext = os.path.splitext(name)[1] src_root = os.path.split(root) path = os.path.join(src_root[0], src_root[1]) if ext == '.h': subpath = removeprefix(removeprefix(path, root_path), "/") bld.install_files( "${PREFIX}/" + arch_lib_path + "/include/" + subpath, os.path.join(path, name) ) [install_headers(path) for path in common_includes] [install_headers(path) for path in drv_incl] test_app_incl = [] test_app_incl.extend(drv_incl) test_app_incl.extend(common_includes) test_app_incl.append('rtemslwip/test/') bld.program(features='c', target='networking01.exe', source='rtemslwip/test/networking01/sample_app.c', cflags='-g -Wall -O0', use='lwip', lib=['rtemscpu', 'rtemsbsp', 'rtemstest', 'lwip'], includes=' '.join(test_app_incl)) lib_path = os.path.join(bld.env.PREFIX, arch_lib_path) rtems_lib_path = os.path.join(bld.env.RTEMS_PATH, arch_lib_path) bld.read_stlib('telnetd', paths=[lib_path, rtems_lib_path]) bld.read_stlib('rtemstest', paths=[lib_path, rtems_lib_path]) bld.read_stlib('ftpd', paths=[lib_path, rtems_lib_path]) bld.program(features='c', target='telnetd01.exe', source='rtemslwip/test/telnetd01/init.c', use='telnetd lwip rtemstest ftpd', cflags='-g -Wall -O0', includes=' '.join(test_app_incl)) def add_flags(flags, new_flags): for flag in new_flags: if flag not in flags: flags.append(flag) def bsp_configure(conf, arch_bsp): conf.env.LIB += ['m'] section_flags = ["-fdata-sections", "-ffunction-sections"] add_flags(conf.env.CFLAGS, section_flags) add_flags(conf.env.CXXFLAGS, section_flags)