From fcc7d7047805520c987fbb4f503538eccd659f34 Mon Sep 17 00:00:00 2001 From: jcorgan Date: Thu, 16 Apr 2009 07:25:15 +0000 Subject: [PATCH] Merged changeset r10817:10858 from jcorgan/cpphier into trunk. Adds standard place for C++ hierarchical blocks for gnuradio-core, and new gr.channel_model block from Tom Rondeau. git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@10859 221aa14e-8319-0410-a670-987f0aec2ac5 --- config/grc_gnuradio_core.m4 | 2 + gnuradio-core/src/lib/Makefile.am | 3 +- gnuradio-core/src/lib/hier/Makefile.am | 37 +++ .../src/lib/hier/gr_channel_model.cc | 101 +++++++ gnuradio-core/src/lib/hier/gr_channel_model.h | 69 +++++ gnuradio-core/src/lib/hier/gr_channel_model.i | 45 +++ gnuradio-core/src/lib/hier/hier.i | 31 +++ gnuradio-core/src/lib/swig/Makefile.am | 8 +- gnuradio-core/src/lib/swig/Makefile.swig.gen | 259 ++++++++++++++++++ .../src/lib/swig/gnuradio_swig_py_hier.i | 30 ++ .../src/lib/swig/gnuradio_swig_python.py | 3 +- .../src/lib/swig/gr_swig_block_magic.i | 6 - 12 files changed, 584 insertions(+), 10 deletions(-) create mode 100644 gnuradio-core/src/lib/hier/Makefile.am create mode 100644 gnuradio-core/src/lib/hier/gr_channel_model.cc create mode 100644 gnuradio-core/src/lib/hier/gr_channel_model.h create mode 100644 gnuradio-core/src/lib/hier/gr_channel_model.i create mode 100644 gnuradio-core/src/lib/hier/hier.i create mode 100644 gnuradio-core/src/lib/swig/gnuradio_swig_py_hier.i diff --git a/config/grc_gnuradio_core.m4 b/config/grc_gnuradio_core.m4 index 29e20c28..ff05d46c 100644 --- a/config/grc_gnuradio_core.m4 +++ b/config/grc_gnuradio_core.m4 @@ -61,6 +61,7 @@ AC_DEFUN([GRC_GNURADIO_CORE],[ -I\${abs_top_srcdir}/gnuradio-core/src/lib/io \ -I\${abs_top_srcdir}/gnuradio-core/src/lib/g72x \ -I\${abs_top_srcdir}/gnuradio-core/src/lib/swig \ +-I\${abs_top_srcdir}/gnuradio-core/src/lib/hier \ -I\${abs_top_builddir}/gnuradio-core/src/lib/swig \ \$(FFTW3F_CFLAGS) \ \$(GSL_CFLAGS)" @@ -96,6 +97,7 @@ AC_DEFUN([GRC_GNURADIO_CORE],[ gnuradio-core/src/lib/reed-solomon/Makefile \ gnuradio-core/src/lib/viterbi/Makefile \ gnuradio-core/src/lib/runtime/Makefile \ + gnuradio-core/src/lib/hier/Makefile \ gnuradio-core/src/lib/swig/Makefile \ gnuradio-core/src/python/Makefile \ gnuradio-core/src/python/bin/Makefile \ diff --git a/gnuradio-core/src/lib/Makefile.am b/gnuradio-core/src/lib/Makefile.am index dea28406..d43e463c 100644 --- a/gnuradio-core/src/lib/Makefile.am +++ b/gnuradio-core/src/lib/Makefile.am @@ -24,7 +24,7 @@ include $(top_srcdir)/Makefile.common ## Process this file with automake to produce Makefile.in # We've got to build . before swig -SUBDIRS = missing runtime filter viterbi general gengen g72x reed-solomon io . swig +SUBDIRS = missing runtime filter viterbi general gengen g72x reed-solomon io hier . swig # generate libgnuradio-core.la from the convenience libraries in subdirs @@ -48,6 +48,7 @@ libgnuradio_core_la_LIBADD = \ missing/libmissing.la \ reed-solomon/librs.la \ runtime/libruntime.la \ + hier/libhier.la \ $(OMNITHREAD_LA) \ $(GRUEL_LA) \ $(FFTW3F_LIBS) \ diff --git a/gnuradio-core/src/lib/hier/Makefile.am b/gnuradio-core/src/lib/hier/Makefile.am new file mode 100644 index 00000000..b525d19b --- /dev/null +++ b/gnuradio-core/src/lib/hier/Makefile.am @@ -0,0 +1,37 @@ +# +# Copyright 2009 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. +# + +include $(top_srcdir)/Makefile.common + + +AM_CPPFLAGS = $(STD_DEFINES_AND_INCLUDES) $(WITH_INCLUDES) + +noinst_LTLIBRARIES = libhier.la + +libhier_la_SOURCES = \ + gr_channel_model.cc + +grinclude_HEADERS = \ + gr_channel_model.h + +swiginclude_HEADERS = \ + hier.i \ + gr_channel_model.i diff --git a/gnuradio-core/src/lib/hier/gr_channel_model.cc b/gnuradio-core/src/lib/hier/gr_channel_model.cc new file mode 100644 index 00000000..7bc47d5a --- /dev/null +++ b/gnuradio-core/src/lib/hier/gr_channel_model.cc @@ -0,0 +1,101 @@ +/* + * Copyright 2009 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. + */ + +#include +#include +#include +#include + +// Shared pointer constructor +gr_channel_model_sptr +gr_make_channel_model(double noise_voltage, + double frequency_offset, + double epsilon, + const std::vector &taps, + double noise_seed) +{ + return gnuradio::get_initial_sptr(new gr_channel_model(noise_voltage, + frequency_offset, + epsilon, + taps, + noise_seed)); +} + +// Hierarchical block constructor, with no inputs or outputs +gr_channel_model::gr_channel_model(double noise_voltage, + double frequency_offset, + double epsilon, + const std::vector &taps, + double noise_seed) + : gr_hier_block2("gr_channel_model", + gr_make_io_signature(1, 1, sizeof(gr_complex)), + gr_make_io_signature(1, 1, sizeof(gr_complex))) +{ + d_taps = taps; + while(d_taps.size() < 2) { + d_taps.push_back(0); + } + + d_timing_offset = gr_make_fractional_interpolator_cc(0, epsilon); + + d_multipath = gr_make_fir_filter_ccc(1, d_taps); + + d_noise_adder = gr_make_add_cc(); + d_noise = gr_make_noise_source_c(GR_GAUSSIAN, noise_voltage, noise_seed); + d_freq_offset = gr_make_sig_source_c(1, GR_SIN_WAVE, frequency_offset, 1.0, 0.0); + d_mixer_offset = gr_make_multiply_cc(); + + connect(self(), 0, d_timing_offset, 0); + connect(d_timing_offset, 0, d_multipath, 0); + connect(d_multipath, 0, d_mixer_offset, 0); + connect(d_freq_offset, 0, d_mixer_offset, 1); + connect(d_mixer_offset, 0, d_noise_adder, 1); + connect(d_noise, 0, d_noise_adder, 0); + connect(d_noise_adder, 0, self(), 0); +} + +void +gr_channel_model::set_noise_voltage(double noise_voltage) +{ + d_noise->set_amplitude(noise_voltage); +} + +void +gr_channel_model::set_frequency_offset(double frequency_offset) +{ + d_freq_offset->set_frequency(frequency_offset); +} + +void +gr_channel_model::set_taps(const std::vector &taps) +{ + d_taps = taps; + while(d_taps.size() < 2) { + d_taps.push_back(0); + } + d_multipath->set_taps(d_taps); +} + +void +gr_channel_model::set_timing_offset(double epsilon) +{ + d_timing_offset->set_interp_ratio(epsilon); +} diff --git a/gnuradio-core/src/lib/hier/gr_channel_model.h b/gnuradio-core/src/lib/hier/gr_channel_model.h new file mode 100644 index 00000000..42f0ecc6 --- /dev/null +++ b/gnuradio-core/src/lib/hier/gr_channel_model.h @@ -0,0 +1,69 @@ +/* + * Copyright 2009 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. + */ + +#include +#include +#include +#include +#include +#include +#include + +class gr_channel_model; +typedef boost::shared_ptr gr_channel_model_sptr; + + +gr_channel_model_sptr gr_make_channel_model(double noise_voltage=0.0, + double frequency_offset=0.0, + double epsilon=1.0, + const std::vector &taps=std::vector(1, 1), + double noise_seed=3021); + +class gr_channel_model : public gr_hier_block2 +{ + private: + gr_channel_model(double noise_voltage, + double frequency_offset, + double epsilon, + const std::vector &taps, + double noise_seed); + + friend gr_channel_model_sptr gr_make_channel_model(double noise_voltage, + double frequency_offset, + double epsilon, + const std::vector &taps, + double noise_seed); + + gr_fractional_interpolator_cc_sptr d_timing_offset; + gr_sig_source_c_sptr d_freq_offset; + gr_fir_filter_ccc_sptr d_multipath; + gr_add_cc_sptr d_noise_adder; + gr_noise_source_c_sptr d_noise; + gr_multiply_cc_sptr d_mixer_offset; + + std::vector d_taps; + + public: + void set_noise_voltage(double noise_voltage); + void set_frequency_offset(double frequency_offset); + void set_taps(const std::vector &taps); + void set_timing_offset(double epsilon); +}; diff --git a/gnuradio-core/src/lib/hier/gr_channel_model.i b/gnuradio-core/src/lib/hier/gr_channel_model.i new file mode 100644 index 00000000..ff9ab466 --- /dev/null +++ b/gnuradio-core/src/lib/hier/gr_channel_model.i @@ -0,0 +1,45 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 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. + */ + +GR_SWIG_BLOCK_MAGIC(gr,channel_model) + +gr_channel_model_sptr gr_make_channel_model(double noise_voltage=0.0, + double frequency_offset=0.0, + double epsilon=1.0, + const std::vector &taps=std::vector(1, 1), + double noise_seed=3021); + +class gr_channel_model : public gr_hier_block2 +{ + private: + gr_channel_model(double noise_voltage, + double frequency_offset, + double epsilon, + const std::vector &taps, + double noise_seed); + + public: + void set_noise_voltage(double noise_voltage); + void set_frequency_offset(double frequency_offset); + void set_taps(const std::vector &taps); + void set_timing_offset(double epsilon); +}; diff --git a/gnuradio-core/src/lib/hier/hier.i b/gnuradio-core/src/lib/hier/hier.i new file mode 100644 index 00000000..dbcc8e91 --- /dev/null +++ b/gnuradio-core/src/lib/hier/hier.i @@ -0,0 +1,31 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 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. + */ + +%{ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +%} + +%include "gr_channel_model.i" diff --git a/gnuradio-core/src/lib/swig/Makefile.am b/gnuradio-core/src/lib/swig/Makefile.am index 734388d4..75b152dc 100644 --- a/gnuradio-core/src/lib/swig/Makefile.am +++ b/gnuradio-core/src/lib/swig/Makefile.am @@ -48,7 +48,7 @@ grinclude_HEADERS = \ gnuradio_swig_bug_workaround.h # ---------------------------------------------------------------- -# We've split the previously monstrous gnuradio_swig_python into 5 +# We've split the previously monstrous gnuradio_swig_python into 6 # smaller pieces. This reduces compile time coupling and creates # smaller pieces for the compiler to digest. prior to this change, on # X86_64, g++'s resident set size was 650MB! @@ -59,7 +59,8 @@ TOP_SWIG_IFILES = \ gnuradio_swig_py_general.i \ gnuradio_swig_py_gengen.i \ gnuradio_swig_py_filter.i \ - gnuradio_swig_py_io.i + gnuradio_swig_py_io.i \ + gnuradio_swig_py_hier.i # Install so that they end up available as: # import gnuradio.gr @@ -70,6 +71,7 @@ gnuradio_swig_py_general_pythondir_category = gnuradio/gr gnuradio_swig_py_gengen_pythondir_category = gnuradio/gr gnuradio_swig_py_filter_pythondir_category = gnuradio/gr gnuradio_swig_py_io_pythondir_category = gnuradio/gr +gnuradio_swig_py_hier_pythondir_category = gnuradio/gr # additional libraries for linking with each SWIG-generated library gnuradio_swig_py_runtime_la_swig_libadd = $(GNURADIO_CORE_LA) @@ -77,6 +79,7 @@ gnuradio_swig_py_general_la_swig_libadd = $(GNURADIO_CORE_LA) gnuradio_swig_py_gengen_la_swig_libadd = $(GNURADIO_CORE_LA) gnuradio_swig_py_filter_la_swig_libadd = $(GNURADIO_CORE_LA) gnuradio_swig_py_io_la_swig_libadd = $(GNURADIO_CORE_LA) +gnuradio_swig_py_hier_la_swig_libadd = $(GNURADIO_CORE_LA) include $(top_srcdir)/Makefile.swig @@ -90,6 +93,7 @@ BUILT_SOURCES = \ gnuradio_swig_py_gengen.h \ gnuradio_swig_py_filter.h \ gnuradio_swig_py_io.h \ + gnuradio_swig_py_hier.h \ $(grinclude_HEADERS) \ $(swig_built_sources) diff --git a/gnuradio-core/src/lib/swig/Makefile.swig.gen b/gnuradio-core/src/lib/swig/Makefile.swig.gen index ebb98a05..e24ba5a9 100644 --- a/gnuradio-core/src/lib/swig/Makefile.swig.gen +++ b/gnuradio-core/src/lib/swig/Makefile.swig.gen @@ -1293,3 +1293,262 @@ $(DEPDIR)/gnuradio_swig_py_io-generate-stamp: @am__include@ @am__quote@./$(DEPDIR)/gnuradio_swig_py_io.d@am__quote@ +# -*- Makefile -*- +# +# Copyright 2009 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. +# + +# Makefile.swig.gen for gnuradio_swig_py_hier.i + +## Default install locations for these files: +## +## Default location for the Python directory is: +## ${prefix}/lib/python${python_version}/site-packages/[category]/gnuradio_swig_py_hier +## Default location for the Python exec directory is: +## ${exec_prefix}/lib/python${python_version}/site-packages/[category]/gnuradio_swig_py_hier +## +## The following can be overloaded to change the install location, but +## this has to be done in the including Makefile.am -before- +## Makefile.swig is included. + +gnuradio_swig_py_hier_pythondir_category ?= gnuradio/gnuradio_swig_py_hier +gnuradio_swig_py_hier_pylibdir_category ?= $(gnuradio_swig_py_hier_pythondir_category) +gnuradio_swig_py_hier_pythondir = $(pythondir)/$(gnuradio_swig_py_hier_pythondir_category) +gnuradio_swig_py_hier_pylibdir = $(pyexecdir)/$(gnuradio_swig_py_hier_pylibdir_category) + +## SWIG headers are always installed into the same directory. + +gnuradio_swig_py_hier_swigincludedir = $(swigincludedir) + +## This is a template file for a "generated" Makefile addition (in +## this case, "Makefile.swig.gen"). By including the top-level +## Makefile.swig, this file will be used to generate the SWIG +## dependencies. Assign the variable TOP_SWIG_FILES to be the list of +## SWIG .i files to generated wrappings for; there can be more than 1 +## so long as the names are unique (no sorting is done on the +## TOP_SWIG_FILES list). This file explicitly assumes that a SWIG .i +## file will generate .cc, .py, and possibly .h files -- meaning that +## all of these files will have the same base name (that provided for +## the SWIG .i file). +## +## This code is setup to ensure parallel MAKE ("-j" or "-jN") does the +## right thing. For more info, see < +## http://sources.redhat.com/automake/automake.html#Multiple-Outputs > + +## Stamps used to ensure parallel make does the right thing. These +## are removed by "make clean", but otherwise unused except during the +## parallel built. These will not be included in a tarball, because +## the SWIG-generated files will be removed from the distribution. + +STAMPS += $(DEPDIR)/gnuradio_swig_py_hier-generate-* + +## Other cleaned files: dependency files generated by SWIG or this Makefile + +MOSTLYCLEANFILES += $(DEPDIR)/*.S* + +## Add the .py and .cc files to the list of SWIG built sources. The +## .h file is sometimes built, but not always ... so that one has to +## be added manually by the including Makefile.am . + +swig_built_sources += gnuradio_swig_py_hier.py gnuradio_swig_py_hier.cc + +## Various SWIG variables. These can be overloaded in the including +## Makefile.am by setting the variable value there, then including +## Makefile.swig . + +gnuradio_swig_py_hier_swiginclude_HEADERS = \ + gnuradio_swig_py_hier.i \ + $(gnuradio_swig_py_hier_swiginclude_headers) + +gnuradio_swig_py_hier_pylib_LTLIBRARIES = \ + _gnuradio_swig_py_hier.la + +_gnuradio_swig_py_hier_la_SOURCES = \ + gnuradio_swig_py_hier.cc \ + $(gnuradio_swig_py_hier_la_swig_sources) + +_gnuradio_swig_py_hier_la_LIBADD = \ + $(STD_SWIG_LA_LIB_ADD) \ + $(gnuradio_swig_py_hier_la_swig_libadd) + +_gnuradio_swig_py_hier_la_LDFLAGS = \ + $(STD_SWIG_LA_LD_FLAGS) \ + $(gnuradio_swig_py_hier_la_swig_ldflags) + +_gnuradio_swig_py_hier_la_CXXFLAGS = \ + $(STD_SWIG_CXX_FLAGS) \ + $(gnuradio_swig_py_hier_la_swig_cxxflags) + +gnuradio_swig_py_hier_python_PYTHON = \ + gnuradio_swig_py_hier.py \ + $(gnuradio_swig_py_hier_python) + +## Entry rule for running SWIG + +gnuradio_swig_py_hier.h gnuradio_swig_py_hier.py gnuradio_swig_py_hier.cc: gnuradio_swig_py_hier.i +## This rule will get called only when MAKE decides that one of the +## targets needs to be created or re-created, because: +## +## * The .i file is newer than any or all of the generated files; +## +## * Any or all of the .cc, .h, or .py files does not exist and is +## needed (in the case this file is not needed, the rule for it is +## ignored); or +## +## * Some SWIG-based dependecy of the .cc file isn't met and hence the +## .cc file needs be be regenerated. Explanation: Because MAKE +## knows how to handle dependencies for .cc files (regardless of +## their name or extension), then the .cc file is used as a target +## instead of the .i file -- but with the dependencies of the .i +## file. It is this last reason why the line: +## +## if test -f $@; then :; else +## +## cannot be used in this case: If a .i file dependecy is not met, +## then the .cc file needs to be rebuilt. But if the stamp is newer +## than the .cc file, and the .cc file exists, then in the original +## version (with the 'test' above) the internal MAKE call will not +## be issued and hence the .cc file will not be rebuilt. +## +## Once execution gets to here, it should always proceed no matter the +## state of a stamp (as discussed in link above). The +## $(DEPDIR)/gnuradio_swig_py_hier-generate stuff is used to allow for parallel +## builds to "do the right thing". The stamp has no relationship with +## either the target files or dependency file; it is used solely for +## the protection of multiple builds during a given call to MAKE. +## +## Catch signals SIGHUP (1), SIGINT (2), SIGPIPE (13), and SIGTERM +## (15). At a caught signal, the quoted command will be issued before +## exiting. In this case, remove any stamp, whether temporary of not. +## The trap is valid until the process exits; the process includes all +## commands appended via "\"s. +## + trap 'rm -rf $(DEPDIR)/gnuradio_swig_py_hier-generate-*' 1 2 13 15; \ +## +## Create a temporary directory, which acts as a lock. The first +## process to create the directory will succeed and issue the MAKE +## command to do the actual work, while all subsequent processes will +## fail -- leading them to wait for the first process to finish. +## + if mkdir $(DEPDIR)/gnuradio_swig_py_hier-generate-lock 2>/dev/null; then \ +## +## This code is being executed by the first process to succeed in +## creating the directory lock. +## +## Remove the stamp associated with this filename. +## + rm -f $(DEPDIR)/gnuradio_swig_py_hier-generate-stamp; \ +## +## Tell MAKE to run the rule for creating this stamp. +## + $(MAKE) $(AM_MAKEFLAGS) $(DEPDIR)/gnuradio_swig_py_hier-generate-stamp WHAT=$<; \ +## +## Now that the .cc, .h, and .py files have been (re)created from the +## .i file, future checking of this rule during the same MAKE +## execution will come back that the rule doesn't need to be executed +## because none of the conditions mentioned at the start of this rule +## will be positive. Remove the the directory lock, which frees up +## any waiting process(es) to continue. +## + rmdir $(DEPDIR)/gnuradio_swig_py_hier-generate-lock; \ + else \ +## +## This code is being executed by any follower processes while the +## directory lock is in place. +## +## Wait until the first process is done, testing once per second. +## + while test -d $(DEPDIR)/gnuradio_swig_py_hier-generate-lock; do \ + sleep 1; \ + done; \ +## +## Succeed if and only if the first process succeeded; exit this +## process returning the status of the generated stamp. +## + test -f $(DEPDIR)/gnuradio_swig_py_hier-generate-stamp; \ + exit $$?; \ + fi; + +$(DEPDIR)/gnuradio_swig_py_hier-generate-stamp: +## This rule will be called only by the first process issuing the +## above rule to succeed in creating the lock directory, after +## removing the actual stamp file in order to guarantee that MAKE will +## execute this rule. +## +## Call SWIG to generate the various output files; special +## post-processing on 'mingw32' host OS for the dependency file. +## + if $(SWIG) $(STD_SWIG_PYTHON_ARGS) $(gnuradio_swig_py_hier_swig_args) \ + -MD -MF $(DEPDIR)/gnuradio_swig_py_hier.Std \ + -module gnuradio_swig_py_hier -o gnuradio_swig_py_hier.cc $(WHAT); then \ + if test $(host_os) = mingw32; then \ + $(RM) $(DEPDIR)/gnuradio_swig_py_hier.Sd; \ + $(SED) 's,\\\\,/,g' < $(DEPDIR)/gnuradio_swig_py_hier.Std \ + > $(DEPDIR)/gnuradio_swig_py_hier.Sd; \ + $(RM) $(DEPDIR)/gnuradio_swig_py_hier.Std; \ + $(MV) $(DEPDIR)/gnuradio_swig_py_hier.Sd $(DEPDIR)/gnuradio_swig_py_hier.Std; \ + fi; \ + else \ + $(RM) $(DEPDIR)/gnuradio_swig_py_hier.S*; exit 1; \ + fi; +## +## Mess with the SWIG output .Std dependency file, to create a +## dependecy file valid for the input .i file: Basically, simulate the +## dependency file created for libraries by GNU's libtool for C++, +## where all of the dependencies for the target are first listed, then +## each individual dependency is listed as a target with no further +## dependencies. +## +## (1) remove the current dependency file +## + $(RM) $(DEPDIR)/gnuradio_swig_py_hier.d +## +## (2) Copy the whole SWIG file: +## + cp $(DEPDIR)/gnuradio_swig_py_hier.Std $(DEPDIR)/gnuradio_swig_py_hier.d +## +## (3) all a carriage return to the end of the dependency file. +## + echo "" >> $(DEPDIR)/gnuradio_swig_py_hier.d +## +## (4) from the SWIG file, remove the first line (the target); remove +## trailing " \" and " " from each line. Append ":" to each line, +## followed by 2 carriage returns, then append this to the end of +## the dependency file. +## + $(SED) -e '1d;s, \\,,g;s, ,,g' < $(DEPDIR)/gnuradio_swig_py_hier.Std | \ + awk '{ printf "%s:\n\n", $$0 }' >> $(DEPDIR)/gnuradio_swig_py_hier.d +## +## (5) remove the SWIG-generated file +## + $(RM) $(DEPDIR)/gnuradio_swig_py_hier.Std +## +## Create the stamp for this filename generation, to signal success in +## executing this rule; allows other threads waiting on this process +## to continue. +## + touch $(DEPDIR)/gnuradio_swig_py_hier-generate-stamp + +# KLUDGE: Force runtime include of a SWIG dependency file. This is +# not guaranteed to be portable, but will probably work. If it works, +# we have accurate dependencies for our swig stuff, which is good. + +@am__include@ @am__quote@./$(DEPDIR)/gnuradio_swig_py_hier.d@am__quote@ + diff --git a/gnuradio-core/src/lib/swig/gnuradio_swig_py_hier.i b/gnuradio-core/src/lib/swig/gnuradio_swig_py_hier.i new file mode 100644 index 00000000..a82b5ae4 --- /dev/null +++ b/gnuradio-core/src/lib/swig/gnuradio_swig_py_hier.i @@ -0,0 +1,30 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 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 this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef SWIGIMPORTED +%module(directors="1") gnuradio_swig_py_hier +#endif + + //%feature("autodoc", "1"); // generate python docstrings + +%include "gnuradio.i" // the common stuff + +%include "hier.i" diff --git a/gnuradio-core/src/lib/swig/gnuradio_swig_python.py b/gnuradio-core/src/lib/swig/gnuradio_swig_python.py index edf9f379..5324b230 100644 --- a/gnuradio-core/src/lib/swig/gnuradio_swig_python.py +++ b/gnuradio-core/src/lib/swig/gnuradio_swig_python.py @@ -1,5 +1,5 @@ # -# Copyright 2006 Free Software Foundation, Inc. +# Copyright 2006,2009 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -25,3 +25,4 @@ from gnuradio_swig_py_general import * from gnuradio_swig_py_gengen import * from gnuradio_swig_py_filter import * from gnuradio_swig_py_io import * +from gnuradio_swig_py_hier import * diff --git a/gnuradio-core/src/lib/swig/gr_swig_block_magic.i b/gnuradio-core/src/lib/swig/gr_swig_block_magic.i index 083d6068..78e83801 100644 --- a/gnuradio-core/src/lib/swig/gr_swig_block_magic.i +++ b/gnuradio-core/src/lib/swig/gr_swig_block_magic.i @@ -29,12 +29,6 @@ class NAME; typedef boost::shared_ptr NAME ## _sptr; %template(NAME ## _sptr) boost::shared_ptr; %rename(BASE_NAME) PKG ## _make_ ## BASE_NAME; -%inline { - gr_block_sptr NAME ## _block (NAME ## _sptr r) - { - return gr_block_sptr (r); - } -} %pythoncode %{ NAME ## _sptr.block = lambda self: NAME ## _block (self) -- 2.30.2