gr-digitalhf/python/build_utils.py

229 lines
7.1 KiB
Python

#
# Copyright 2004,2009,2012 Free Software Foundation, Inc.
#
# This file was generated by gr_modtool, a tool from the GNU Radio framework
# This file is a part of gr-digitalhf
#
# GNU Radio is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
#
# GNU Radio is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GNU Radio; see the file COPYING. If not, write to
# the Free Software Foundation, Inc., 51 Franklin Street,
# Boston, MA 02110-1301, USA.
#
"""Misc utilities used at build time
"""
import re
import os
import os.path
from build_utils_codes import *
# set srcdir to the directory that contains Makefile.am
try:
srcdir = os.environ['srcdir']
except KeyError, e:
srcdir = "."
srcdir = srcdir + '/'
# set do_makefile to either true or false dependeing on the environment
try:
if os.environ['do_makefile'] == '0':
do_makefile = False
else:
do_makefile = True
except KeyError, e:
do_makefile = False
# set do_sources to either true or false dependeing on the environment
try:
if os.environ['do_sources'] == '0':
do_sources = False
else:
do_sources = True
except KeyError, e:
do_sources = True
name_dict = {}
def log_output_name(name):
(base, ext) = os.path.splitext(name)
ext = ext[1:] # drop the leading '.'
entry = name_dict.setdefault(ext, [])
entry.append(name)
def open_and_log_name(name, dir):
global do_sources
if do_sources:
f = open(name, dir)
else:
f = None
log_output_name(name)
return f
def expand_template(d, template_filename, extra=""):
'''Given a dictionary D and a TEMPLATE_FILENAME, expand template into output file
'''
global do_sources
output_extension = extract_extension(template_filename)
template = open_src(template_filename, 'r')
output_name = d['NAME'] + extra + '.' + output_extension
log_output_name(output_name)
if do_sources:
output = open(output_name, 'w')
do_substitution(d, template, output)
output.close()
template.close()
def output_glue(dirname):
output_makefile_fragment()
output_ifile_include(dirname)
def output_makefile_fragment():
global do_makefile
if not do_makefile:
return
# overwrite the source, which must be writable; this should have been
# checked for beforehand in the top-level Makefile.gen.gen .
f = open(os.path.join(os.environ.get('gendir', os.environ.get('srcdir', '.')), 'Makefile.gen'), 'w')
f.write('#\n# This file is machine generated. All edits will be overwritten\n#\n')
output_subfrag(f, 'h')
output_subfrag(f, 'i')
output_subfrag(f, 'cc')
f.close()
def output_ifile_include(dirname):
global do_sources
if do_sources:
f = open('%s_generated.i' % (dirname,), 'w')
f.write('//\n// This file is machine generated. All edits will be overwritten\n//\n')
files = name_dict.setdefault('i', [])
files.sort()
f.write('%{\n')
for file in files:
f.write('#include <%s>\n' % (file[0:-1] + 'h',))
f.write('%}\n\n')
for file in files:
f.write('%%include <%s>\n' % (file,))
def output_subfrag(f, ext):
files = name_dict.setdefault(ext, [])
files.sort()
f.write("GENERATED_%s =" % (ext.upper()))
for file in files:
f.write(" \\\n\t%s" % (file,))
f.write("\n\n")
def extract_extension(template_name):
# template name is something like: GrFIRfilterXXX.h.t
# we return everything between the penultimate . and .t
mo = re.search(r'\.([a-z]+)\.t$', template_name)
if not mo:
raise ValueError, "Incorrectly formed template_name '%s'" % (template_name,)
return mo.group(1)
def open_src(name, mode):
global srcdir
return open(os.path.join(srcdir, name), mode)
def do_substitution(d, in_file, out_file):
def repl(match_obj):
key = match_obj.group(1)
# print key
return d[key]
inp = in_file.read()
out = re.sub(r"@([a-zA-Z0-9_]+)@", repl, inp)
out_file.write(out)
copyright = '''/* -*- c++ -*- */
/*
* Copyright 2003,2004 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
* GNU Radio is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* GNU Radio is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Radio; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
'''
def is_complex(code3):
if i_code(code3) == 'c' or o_code(code3) == 'c':
return '1'
return '0'
def standard_dict(name, code3, package='gr'):
d = {}
d['NAME'] = name
d['NAME_IMPL'] = name+'_impl'
d['GUARD_NAME'] = 'INCLUDED_%s_%s_H' % (package.upper(), name.upper())
d['GUARD_NAME_IMPL'] = 'INCLUDED_%s_%s_IMPL_H' % (package.upper(), name.upper())
d['BASE_NAME'] = re.sub('^' + package + '_', '', name)
d['SPTR_NAME'] = '%s_sptr' % name
d['WARNING'] = 'WARNING: this file is machine generated. Edits will be overwritten'
d['COPYRIGHT'] = copyright
d['TYPE'] = i_type(code3)
d['I_TYPE'] = i_type(code3)
d['O_TYPE'] = o_type(code3)
d['TAP_TYPE'] = tap_type(code3)
d['IS_COMPLEX'] = is_complex(code3)
return d
def standard_dict2(name, code3, package):
d = {}
d['NAME'] = name
d['BASE_NAME'] = name
d['GUARD_NAME'] = 'INCLUDED_%s_%s_H' % (package.upper(), name.upper())
d['WARNING'] = 'WARNING: this file is machine generated. Edits will be overwritten'
d['COPYRIGHT'] = copyright
d['TYPE'] = i_type(code3)
d['I_TYPE'] = i_type(code3)
d['O_TYPE'] = o_type(code3)
d['TAP_TYPE'] = tap_type(code3)
d['IS_COMPLEX'] = is_complex(code3)
return d
def standard_impl_dict2(name, code3, package):
d = {}
d['NAME'] = name
d['IMPL_NAME'] = name
d['BASE_NAME'] = name.rstrip("impl").rstrip("_")
d['GUARD_NAME'] = 'INCLUDED_%s_%s_H' % (package.upper(), name.upper())
d['WARNING'] = 'WARNING: this file is machine generated. Edits will be overwritten'
d['COPYRIGHT'] = copyright
d['FIR_TYPE'] = "fir_filter_" + code3
d['CFIR_TYPE'] = "fir_filter_" + code3[0:2] + 'c'
d['TYPE'] = i_type(code3)
d['I_TYPE'] = i_type(code3)
d['O_TYPE'] = o_type(code3)
d['TAP_TYPE'] = tap_type(code3)
d['IS_COMPLEX'] = is_complex(code3)
return d