Installing GNU Radio with
Native Windows Tools
WARNING: This page is a work-in-progress.
Two developers, Andrew Rose and Geof Nieboer, have taken up the challenge to
get a windows native install complete. For the moment, this is note of their
independent attempts to get it going. Geof's methodology is to use Managed
C++ to add a shim to .NET managed code, and then use C# instead of Python. So
Managed C++ would replace SWIG and C# Python.
[2009-06-12] Andrew abandoned his attempt on discovering that it was
considerably easier to dual-boot Windows & Ubuntu and install GNURadio on
Ubuntu.
Rationale
- Even with the Cygwin installation
instructions, producing a working build with this method was very
painful.
- Having produced the build, the result was unusably slow.
Starting Point
- Windows XP SP2 box.
- Subversion already installed.
- MSVC6 already installed.
Latest Update06/04/08 {Geof}
- All of the core/filter classes have been wrapped using a series of template
classes. general and io are all that's left of core to wrap
06/02/08
{Geof}
- All [96!] of the core/gengen classes have been wrapped using a series of
template classes.
05/21/08 {Geof}
- Successfully created a Managed base class which allows .NET developers to
create blocks using any CLS language
- The blocks can work side by side with C++ blocks, as long as the overall
code is in .NET
- Probably not wise to use these blocks for processing because performance
would be better in native C++, but I haven't done benchmarking yet. But for
rapid proof of concept it might be satisfactory.
- Most likely use is to create sinks, which could then leverage WinForms
etc
- The current version is pretty basic, it just implements sync_block and
hasn't been fully wrung out, though the toughest work is complete. A basic
derived C# class had no impact on the USRP benchmark max throughout.
- Next step is to create more wrappers for the many many native blocks out
there.
05/06/08 {Geof}: Success!
- The gr-core, gr-usrp, and usrp have been compiled using MSVC++ 2005
- Managed C++ shims have been built for 6 classes (just ones needed for the
usrp_benchmark_usb test)
- usrp_benchmark_usb.py has been ported to C#
- The program runs successfully!
- TODO:
- port over windows audio C++ library
- Create a hybrid native/managed class to expose the data stream to C#
consumers, basically need to take the std::vector and push it to a .NET IOStream
class and set up event notifications.
- Create additional shim classes to cover all the rest of the
sources/sinks/filters. This should be straightforward now, just
timeconsuming.
Progress
|
Library |
|
Priority |
|
Status (C++) |
|
Status (C#) |
|
|
Omnithread |
|
|
|
Done-GA |
|
|
|
|
GR_Core |
|
HP |
|
In Progress |
|
|
|
|
* filter |
|
|
|
Done-G |
|
|
|
|
* g72x |
|
|
|
Done-A |
|
|
|
|
* general |
|
|
|
Done-GA |
|
|
|
|
* gengen |
|
|
|
Done*-G |
|
Wrappers done |
|
|
* io |
|
|
|
Done-GA |
|
|
|
|
* missing |
|
|
|
|
|
|
|
|
* reed-solomon |
|
|
|
|
|
|
|
|
* runtime |
|
|
|
Done-GA |
|
|
|
|
* swig |
|
|
|
NA |
|
NA |
|
|
USRP |
|
LP: I can't afford one |
|
Done-G |
|
|
|
|
GNU_Radio_USRP |
|
LP: requires URSP |
|
Done-G |
|
|
|
|
GR_Audio_Alsa |
|
LP: appears to be Linux specific |
|
|
|
|
|
|
GR_Audio_Jack |
|
LP: Ditto |
|
|
|
|
|
|
GR_Audio_OSS |
|
LP: Ditto |
|
|
|
|
|
|
GR_Audio_OSX |
|
|
|
|
|
|
|
|
GR_Audio_PortAudio |
|
HP |
|
|
|
|
|
|
GR_Audio_Windows |
|
HP |
|
|
|
|
|
|
GR_ATSC |
|
|
|
|
|
|
|
|
GR_Comedi |
|
|
|
|
|
|
|
|
GR_GSM_FR_VOCODER |
|
|
|
|
|
|
|
|
GR_Pager |
|
|
|
|
|
|
|
|
GR_Radio_Mono |
|
|
|
|
|
|
|
|
GR_Radio_Astronomy |
|
|
|
|
|
|
|
|
GR_Trellis |
|
|
|
|
|
|
|
|
GR_WXGUI |
|
|
|
|
|
|
|
|
GR_Sounder |
|
LP: requires USRP |
|
|
|
|
|
|
GR_Utils |
|
|
|
NA |
|
|
|
|
GNU_Radio_Examples |
|
HP: Get the "audio" examples working as proof-of-concept |
|
|
|
|
| LP = Low Priority HP = High Priority
- = This library appears to use Python script to machine generate code. "Done"
in this case means the existing C++ files create after running configure on CygWin have been
built, the machine generated will need to be revisited
Dependencies* Boost (http://www.boost.org/). I used
boost_1_34_1.zip. * FFTW (http://www.fftw.org/install/windows.html).
I used the pre-compiled fftw-3.1.2.zip (shared, single-precision version).
You'll need to produce your own .lib file as instructed using the following
call.
lib /machine:i386 /def:libfftw3f-3.def
* libusb-win32. Only applies if using USRP. Use version 0.1.10.1 for the
moment. The 0.1.12 versions include #windows.h which complicates build process.
Notes* Get the latest
GNU Radio codebase via subversion. * Attempt to build a random file in
gnuradio-core\src\lib\runtime\. * Discover that MSVC6 can't cope with the
following (valid) syntax. (This problem is not an issue in MSVC 2005)
for (unsigned int i=0; i<n; i++) {} for (unsigned int i=0; i<n; i++) {}
FYI: known issue. can be worked around by wrapping the first for loop with
{}:
{for (unsigned int i=0; i<n; i++) {}} for (unsigned int i=0; i<n; i++) {}
* Install Visual C++ 2008 Express Edition (http://www.microsoft.com/express/vc/),
which is free (beer). * Discover that GCC allows the following (valid C99)
syntax, but MSVC doesn't.
void funcname(int n) { int foo[n]; }
* Fix is to replace all instances with the following. If I ever get this
install working, I'll submit all such fixes for inclusion in the main
codebase.
void funcname(int n) { int *foo = (int *)malloc(n * sizeof(int)); ... free(foo); }
FYI, it's probably easier to use "alloca" if it's supported by MS. it does
stack-based dynamic allocation.
void funcname(int n) { int *foo = (int *)alloca(n * sizeof(int)); ... }
- Note to self: Must remember to check existing changes for correct use of
'free'.
- Define HAVE_CONFIG_H when building any file. Create \w32\config.h as a
repository for all the necessary settings to get this working on Windows. Again,
I'll submit this if it works.
- Floating point support seems like an issue. Investigate if there are any 3rd
party floating point libraries that I can use, rather than the default MS
stuff.
- (Geof) rint and roundf have no MSVC equivalent, so they had to be declared
in the config.h file
- (Geof) system doesn't like std::min(), but likes min()
- (Geof) had to port over the assembly code in 'filters' to Intel syntax
instead of AT&T and make it inline instead. As a side note, MSVC has SSE1/2
optimization built in, so it will be worth a try to compare MSVC's result to the
hand-coded result. Also there appears to be some powerful optimizations in SSE4
that do dot products specifically, so there's an opportunity for some more
optimization there.
- (Geof) attribute is a GCC-specific extension, so it must be
removed to work w/ MSVC 8 + C99
Dead Ends
- (Andrew) I tried to install the GnuWin32 (http://gnuwin32.sourceforge.net/)
version of the automake tools, but they don't include autom4te (which is a
dependency). I'll see if I can produce a script that can convert the Automake.am
files to .vcproj files. (Obviously, in the general case, this is impossible. But
with the limited syntax I've encountered so far, it might be possible to produce
something useful.) Geof's approach is to create a totally separate directory
with the MSVC unique code in it, with .vcproj files that point to the original
version. Obviously not cross-compatible, but probably workable.
- (Andrew) I installed VMWare to host Linux. However, sound card driver
support for VMWare was insufficient for GNURadio.
注:Installing GNU Radio with
Native Windows Tools(原文出处,翻译整理仅供参考!) |
|