Jan Schiefer wrote:

I should know better, but I am nonetheless trying to build gnuradio on
Windows XP/cygwin.  I did follow the instructions on the wiki (including
picking the exact versions), but I am getting stuck on building wxPython.
. . .
While I try to keep GNU Radio running under Cygwin, every update to a Cygwin package or third-party library (such as wxPython) carries a significant risk of breakage. For "production" use of GNU Radio on Windows, I prefer to use MinGW and MSYS. The initial setup takes a little longer, but once you have a working system there is seldom a need to update anything but GNU Radio.
. . .
Thanks Don, this is good advice, I have been hit by cygwin update-related breakages for other applications as well. I will try the MinGW/MSYS route instead and report back.

I have attached a python script I used to install GNU Radio on MinGW/MSYS. It has only basic error checking and no documentation, but you may find it helpful. If nothing else, it lists the version numbers and file locations of all the pieces. To use it, read the start of the script and edit the install options and location as needed. Let me know if you find it useful.

-- Don W.
# Install MinGw, MSYS, GNU Radio, and all it prerequisites (except python)
# on a Windows system.
#
# Python must be installed first in order to run this script. This version
# is based on the Python 2.6.5 Windows installer at
# http://www.python.org/download/
#

import os
import sys
import shutil
import urllib
import subprocess

#
# Install options
#

install_python_packages  = True  # wants admin privileges, but can do without
install_git              = False  # requires administrator privileges
install_mingw_and_msys   = True
install_gr_prerequisites = True
install_gnuradio_tarball = True
install_gnuradio_git     = False

option_usrp      = True
option_portaudio = True
option_sdl_video = False  # doesn't build
#
# Important locations
#

# Default is to install on drive containing Python executable
# If you override the default, you will need to check the install paths
#  used by automated installers
install_drive = os.path.splitdrive(sys.executable)[0]
# install_drive = "D:"  # override default here

# MinGW and MSYS locations
mingw_dir = install_drive+"/MinGW"
msys_dir = install_drive+"/msys/1.0"

# GNU Radio install directory
gr_inst_dir = msys_dir+"/home/"+os.environ['USERNAME']

local_src = msys_dir+"/src"
local_bin = msys_dir+"/local/bin"
local_dir = os.path.dirname( local_bin )

sh_env = os.environ
sh_env['PATH'] = 
local_bin+";"+mingw_dir+"/bin;"+msys_dir+"/bin;"+os.environ['PATH']
sh_env['MSYSTEM'] = "MINGW32"
sh_env['PKG_CONFIG_PATH'] = local_dir+"/lib/pkgconfig"

pyv = sys.version_info

py_vers = "python%d.%d"%pyv[0:2]
numpy_vers = "1.4.1"
numpy_URL = 
"http://downloads.sourceforge.net/numpy/numpy-"+numpy_vers+"-win32-superpack-"+py_vers+".exe";

# Python version
py_vers = "py%d%d"%pyv[0:2]
wxpython_vers = "2.8-win32-ansi-2.8.10.1"
wxpython_URL = 
"http://downloads.sourceforge.net/wxpython/wxPython"+wxpython_vers+"-"+py_vers+".exe";
wxpython_file = sys.exec_prefix+"/Lib/site-packages/wxversion.py"

sdcc_vers = "2.9.0"
sdcc_file = install_drive+"/Program Files/SDCC"
sdcc_URL = "http://downloads.sourceforge.net/sdcc/sdcc-"+sdcc_vers+"-setup.exe";

mingw_dl = "http://downloads.sourceforge.net/mingw/";
mingw_URL = mingw_dl+"MinGW-5.1.6.exe"
msys_URL = mingw_dl+"MSYS-1.0.11.exe"
msys_vers = 'msys-1.0.11'

mingw_install_bin = (
   'autoconf2.5-2.64-1',
   'autoconf-7-1',
   'automake1.11-1.11-1',
   'automake-4-1',
   'libtool-2.2.7a-1',
   )
mingw_install_dll = (
   )

msys_install_bin = (
   'perl-5.6.1_2-1',
   'm4-1.4.13-1',
   'guile-1.8.7-1',
   'patch-2.5.9-1',
   )
msys_install_dll = (
   ('libcrypt-1.1_1-2',0),
   ('libguile-1.8.7-1',17),
   ('libgmp-4.3.1-1',3),
   ('libltdl-2.2.7a-1',7),
   ('libregex-1.20090805-1',1),
   )
msys_install_rtm = (
   'libguile-1.8.7-1',
   )

xemacs_exe = install_drive+"/Program 
Files/XEmacs/XEmacs-21.4.22/i586-pc-win32/xemacs.exe"

unzip_prog = "unz600xn"
unzip_file = unzip_prog+".exe"
unzip_URL = "ftp://ftp.info-zip.org/pub/infozip/win32/"+unzip_file
unzip_exe = "unzip.exe"

glib_file = "glib_2.24.0-2_win32.zip"
glib_URL = "http://ftp.gnome.org/pub/gnome/binaries/win32/glib/2.24/"+glib_file
gnome_URL_deps = "http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/";
pkgconfig_file = "pkg-config_0.23-3_win32.zip"
pkgconfig_URL = gnome_URL_deps+pkgconfig_file

swig_version = "swigwin-1.3.40"
swig_file = swig_version+".zip"
swig_URL = "http://prdownloads.sourceforge.net/swig/"+swig_file

fftw_version = "fftw-3.2.2"
fftw_dir = local_src+"/"+fftw_version
fftw_file = fftw_version+".tar.gz"
fftw_URL = "http://www.fftw.org/"+fftw_file

cppunit_version = "cppunit-1.12.0"    # 1.12.1 fails make check (05/02/08)
cppunit_dir = local_src+"/"+cppunit_version
cppunit_file = cppunit_version+".tar.gz"
cppunit_URL="http://downloads.sourceforge.net/cppunit/"+cppunit_file

boost_numbers = (1,43,0)
boost_version = "boost_%d_%d_%d"%boost_numbers
boost_dir = local_src+"/"+boost_version
boost_file = boost_version + ".tar.bz2"
boost_URL = 
"http://downloads.sourceforge.net/project/boost/boost/%d.%d.%d/"%boost_numbers 
+ boost_file

gsl_version = "gsl-1.14"
gsl_dir = local_src+"/"+gsl_version
gsl_file = gsl_version + ".tar.gz"
gsl_URL = "ftp://ftp.gnu.org/gnu/gsl/"; + gsl_file

portaudio_version = "pa_snapshot"   # v19_20071207 doesn't install
portaudio_ext = ".tar.gz"
portaudio_dir = "portaudio"
portaudio_dl = "http://www.portaudio.com/archives/";

sdl_version = "SDL-1.2.14"
sdl_file = "SDL-devel-1.2.14-mingw32.tar.gz"
sdl_dl = "http://www.libsdl.org/release/";

libusb_numbers = "0.1.12.2"
libusb_version = "libusb-win32-device-bin-"+libusb_numbers
libusb_ext = ".tar.gz"
libusb_dl = 
"http://downloads.sourceforge.net/project/libusb-win32/libusb-win32-releases/"+libusb_numbers+"/";

gr_tarball_version = "gnuradio-3.2.2"
gr_tarball_ext = ".tar.gz"
gr_tarball_dl = "ftp://ftp.gnu.org/gnu/gnuradio/";

git_dir = install_drive+'/Program Files/Git'
git_file = 'Git-1.7.0.2-preview20100309.exe'
git_URL = 'http://msysgit.googlecode.com/files/'+git_file

# Location of git executable
git_exe = git_dir+'/bin/git.exe'

gr_git_dl = 'git://gnuradio.org/gnuradio'
gr_git_version = 'gnuradio-git'

#
# Code starts here
#

def my_excepthook( *args ):
   sys.__excepthook__( *args )
   raw_input( "Press any key to continue..." )

sys.excepthook = my_excepthook

def my_exit( status ):
   # Allow user to view shell output before exiting
   raw_input( "Press any key to exit..." )
   sys.exit(status)

def w_to_m( path ):
   # Convert Windows path to MSYS path
   p = path
   i = p.find(':')
   while i >= 0:
       p = p[0:i-1]+'/'+p[i-1].lower()+p[i+1:]
       i = p.find(':')
   p = p.replace( ';', ':' ).replace( '\\', '/' )
   return p

def makedirs( dir ):
   # Make directory (including parents)
   if not os.access( dir, os.F_OK ):
       os.makedirs( dir )
       print "created directory",dir

def remove_file( f ):
   # Remove file, even if it isn't there
   if os.access( f, os.F_OK ):
       os.remove( f )

def rmdir( d ):
   # Remove directory tree, even if it isn't there
   if os.access( d, os.F_OK):
       shutil.rmtree( d )
def query_file( file ):
   print
   if os.access( file, os.F_OK ):
       ans = raw_input( file+" already exists: [s]kip, [r]einstall, or [q]uit? 
" )
       c = ans[0].lower()
       if c == 'q':
           my_exit(0)
       return c
   return None

def check_file( file ):
   print
   if( os.stat(file).st_size == 0 ):
       ans = raw_input( file+' is empty: [c]ontinue or [q]uit?' )
       c = ans[0].lower()
       if c == 'q':
           my_exit(0)
       return c
   return None

def sh_cmd( cmd, env=sh_env ):
   # run cmd with "sh -c"; cmd should not contain "'"
   s = subprocess.call( msys_dir+"/bin/sh -c '"+cmd+"'", env=env )
   return s

def sh_script( file, env=sh_env ):
   # execute sh script
   s = subprocess.call( msys_dir+"/bin/sh "+file, env=env )
   return s

def msys_cmd( cmd, env=sh_env ):
   # run an MSYS executable
   s = subprocess.call( msys_dir+"/bin/"+cmd, env=env )
   return s

def local_cmd( cmd, env=sh_env ):
   # run a locally-installed executable (i.e., from /local/bin)
   s = subprocess.call( local_bin+"/"+cmd, env=env )
   return s

def exe_install( url, test=None, reinstall=None, instructions=None,
                file=None ):
   # Download to temporary location and execute
   if test:
       c = query_file( test )
       if c == 's':
           return
       elif c and reinstall:
           print "To reinstall",reinstall,"you must remove or rename",test
           my_exit(1)
   print "downloading",url,"..."
   if file:
       d = os.path.dirname( file )
       makedirs( d )
       os.chdir( d )
       print "chdir to", d
       print "retrieving to", file
       t = urllib.urlretrieve( url, file )
   else:
       t = urllib.urlretrieve( url )
   if instructions:
       print instructions
   subprocess.call( t[0] )
   urllib.urlcleanup()

def tar_install( url, test=None, dir=local_src, options="-xf", install=True ):
   # Download to temporary location and execute
   if test:
       c = query_file( test )
       if c == 's':
           return 0
       if os.path.isdir( test ):
           rmdir( test )
       else:
           remove_file( test )
   makedirs( dir )
   os.chdir( dir )
   f = dir+"/"+os.path.basename(url)
   remove_file( f )
   print "downloading",url,"..."
   t = urllib.urlretrieve( url, f )
   if check_file(t[0]):
       return 0
   f = w_to_m( f )
   if install:
       print "upacking",f,"..."
       sh_cmd( "tar "+options+" "+f, env=sh_env )
   urllib.urlcleanup()
   return 1   # install done

def zip_install( url, test=None, dir=local_dir, inst_dir=None ):
   makedirs( dir )
   os.chdir( dir )
   if test:
       c = query_file( test )
       if c == 's':
           return 0
   f = os.path.basename(url)
   remove_file( f )
   print "downloading",url,"..."
   t = urllib.urlretrieve( url, f )
   print "unpacking",f,"..."
   if inst_dir:
       local_cmd( "unzip "+f+" -d "+inst_dir )
   else:
       local_cmd( "unzip "+f )
   urllib.urlcleanup()
   return 1

def git_install( url, repo, reinstall=None ):
   dir = os.path.dirname(repo)
   makedirs( dir )
   os.chdir( dir )
   if repo:
       c = query_file(repo)
       if c == 's':
           return 0
       elif c and reinstall:
           print "To reinstall",reinstall,"you must remove or rename",repo
           my_exit(1)
   print "retrieving",url,"to",repo,"..."
   subprocess.call( git_exe + ' clone ' + url + ' ' + repo )
   return 1

def link_install( p_w, name_m, dir=local_bin, default_arg=None ):
   # Add "link" to Windows program in MSYS search path
   if not os.access( p_w, os.F_OK ):
       print p_w+" not found; link not installed."
       return
   p_m = local_bin+"/"+name_m
   c = query_file( p_m )
   if c == 's':
       return
   makedirs( local_bin )
   f = open( p_m, "w+" )
   f.writelines( [ "#! /bin/sh\n" ] )
   if( default_arg ):
       f.writelines( [ "if test $# -ne 0; then\n",
                       "  exec '"+p_w+"' "+'"$@"\n',
                       "else\n",
                       "  exec '"+p_w+"' "+default_arg+"\n" ] )
       f.writelines( [ "fi\n" ] )
   else:
       f.writelines( [ "exec '"+p_w+"' "+'"$@"\n' ] )
   f.close()
   print p_m,"linked to",p_w

def make_install( dir, cfg_opt="", env=sh_env, check=True ):
   os.chdir( dir )
   s = sh_script( "configure "+cfg_opt, env=env )
   if s:
       return s
   s = msys_cmd( "make", env=env )
   if s:
       return s
   if check:
       s = msys_cmd( "make check", env=env )
       if s:
           return s
   s = msys_cmd( "make install", env=env )
   return s

def gr_make_install():
   if False:  # example of handling a patch; not needed at present
       c = query_file( "makefiles-3.1.2.patch" )
       if c != 's':
           print "downloading makefiles-3.1.2.patch ..."
           urllib.urlretrieve( 
"http://www.gnuradio.org/trac/attachment/wiki/MingwInstallMain/makefiles-3.1.2.patch?format=raw";,
 "makefiles-3.1.2.patch" )
           urllib.urlcleanup()
           msys_cmd( "patch -p0 -i makefiles-3.1.2.patch" )
           print "running ./bootstrap ..."
           sh_script( "bootstrap" )
           remove_file( "config.status" )
   sh_env[ "CXX" ] = "g++ -mthreads"
   sh_env[ "CPPFLAGS" ] = "-DWINVER=0x0501 -I/usr/local/include"
   sh_env[ "LDFLAGS" ] = "-L/usr/local/lib -lws2_32"
   make_install( ".", cfg_opt="--prefix="+local_dir )

def mingw_install( name, type="bin" ):
   full_name = name + '-mingw32-' + type + '.tar.lzma'
   u = mingw_dl + full_name
   f = mingw_dir + '/' + full_name
   tar_install( u, test=f, dir=mingw_dir, options="--lzma -xvf" )
   return

def msys_install( name, type="bin" ):
   full_name = name + '-' + msys_vers + '-' + type + '.tar.lzma'
   u = mingw_dl + full_name
   f = msys_dir + '/' + full_name
   tar_install( u, test=f, dir=msys_dir, options="--lzma -xvf" )
   return


#=======================#
# Execution begins here #
#=======================#

if install_python_packages:

   # Install NumPy
   inst = "Use wizard to install NumPy."
   t = sys.exec_prefix+"/Removenumpy.exe"
   exe_install( numpy_URL, test=t, instructions=inst )
# Install wxPython (requires Admin privs?)
   inst = "Use wizard to install wxPython."
   exe_install( wxpython_URL, test=wxpython_file, instructions=inst )

   if option_usrp:
       # Install SDCC (requires Admin privs for default install)
       inst = "Use wizard to install SDCC; the only option you need is the include 
files."
       exe_install( sdcc_URL, test=sdcc_file, instructions=inst )

if install_mingw_and_msys:

   # Install MinGW
   inst = "Use wizard to install MinGW. Select Candidate and g++ compiler."
   exe_install( mingw_URL, test=mingw_dir, reinstall="MinGW", instructions=inst 
)
# Install MSYS
   inst = "Use wizard to install MSYS using default settings;"
   inst = inst+"\n  do post-installation."
   exe_install( msys_URL, test=msys_dir, reinstall="MSYS", instructions=inst )
   makedirs( local_bin )

   # MinGW modules with common naming convention and install procedure
   for n in mingw_install_bin:
       mingw_install(n)
   for n in mingw_install_dll:
       mingw_install( n[0], type='dll-%d'%n[1] )

   # MSYS modules with common naming convention and install procedure
   for n in msys_install_bin:
       msys_install(n)
   for n in msys_install_dll:
       msys_install( n[0], type='dll-%d'%n[1] )
   for n in msys_install_rtm:
       msys_install( n, type='rtm' )

   # Create link for xemacs
   link_install( xemacs_exe, "xemacs" )

   # Create link for python
   python_exe = sys.executable.replace('pythonw.exe','python.exe')
   link_install( python_exe, "python", default_arg="-i" )

if install_gr_prerequisites:
# Install unzip
   d = local_src+"/"+unzip_prog+"/"
   f = d+unzip_file
   exe_install( unzip_URL, test=f, file=f )
   shutil.copy( d+unzip_exe, local_bin )

   # Install pkg-config and dependencies
   zip_install( pkgconfig_URL, test=pkgconfig_file )
   zip_install( glib_URL, test=glib_file )

   # Install SWIG
   zip_install( swig_URL, test=swig_file )
   link_install( local_dir+"/"+swig_version+"/swig.exe", "swig" )

   # Install FFTW
   if tar_install( fftw_URL, test=fftw_dir, dir=local_src, options="-zxf" ):
       s = make_install( fftw_dir, cfg_opt="--with-our-malloc16 --enable-shared 
--disable-static --enable-threads --with-combined-threads --enable-float 
--enable-sse" )

   # Install CppUnit
   if tar_install( cppunit_URL, test=cppunit_dir, dir=local_src,
                   options="-zxf" ):
       s = make_install( cppunit_dir, cfg_opt="--disable-static" )

   # Install boost libraries
   if tar_install( boost_URL, test=boost_dir, dir=local_src, options="-jxf" ):
       os.chdir(boost_dir)
       sh_script( "bootstrap.sh --with-toolset=mingw" )
       sh_script( "bootstrap.sh --with-libraries=thread,date_time,program_options 
--with-bjam=tools/jam/src/bin.ntx86/bjam" )
       subprocess.call( "bjam --prefix="+local_dir+" link=shared install", 
env=sh_env )
       msys_cmd( "mv "+local_dir+"/lib/*.dll "+local_bin )

   # Install GSL
   if tar_install( gsl_URL, test=gsl_dir, dir=local_src, options="-zxf" ):
       s = make_install( gsl_dir, cfg_opt="--disable-static" )

   if option_portaudio:
       # Install PortAudio
       u = portaudio_dl + portaudio_version + portaudio_ext
       d = local_src+'/'+portaudio_dir
       if tar_install( u, test=d, dir=local_src, options="-zxf" ):

           # patch portaudio-2.0.pc.in to avoid unnecessary linking of -luuid
           os.chdir(d)
           fn = 'portaudio-2.0.pc.in'
           f = open( fn, 'rb' )
           t = f.read()
           f.close()
           t = t.replace('@LIBS','@DLL_LIBS')
           f = open( fn, 'wb' )
           f.write(t)
           f.close()
s = make_install( d, cfg_opt="--disable-static", check=False )

   if option_sdl_video:
       # Install SDL
       u = sdl_dl + sdl_file
       d = local_src+'/'+sdl_version
       if tar_install( u, test=d, options="-zxf" ):
           os.chdir( d )
           #subprocess.call( msys_dir+"/bin/make cross CROSS_PATH="+local_dir, 
env=sh_env )
           msys_cmd( "make cross CROSS_PATH="+local_dir, env=sh_env )

   if option_usrp:
       # Install libusb-win32
       u = libusb_dl + libusb_version + libusb_ext
       d = local_src+'/'+libusb_version
       if tar_install( u, test=d, options="-zxf" ):
           os.chdir( d )
           sh_cmd( "cp include/* "+local_dir+"/include" )
           sh_cmd( "cp lib/gcc/* "+local_dir+"/lib" )
           sh_cmd( "cp bin/* "+local_dir+"/bin" )

if install_gnuradio_tarball:
   u = gr_tarball_dl + gr_tarball_version + gr_tarball_ext
   d = gr_inst_dir+'/'+gr_tarball_version
   tar_install( u, test=d, dir=gr_inst_dir, options="-zxf" )
   if os.access( d, os.F_OK):
       os.chdir( d )
       gr_make_install()

if install_git:
   inst = "Use wizard to install git to "+git_dir
   exe_install( git_URL, test=git_dir, reinstall="Git" )

if install_gnuradio_git:
   u = gr_git_dl
   d = gr_inst_dir+'/'+gr_git_version
   git_install( u, d, reinstall='GNU Radio' )
   if os.access( d, os.F_OK):
       os.chdir( d )
       c = query_file( "configure" )
       if c != 's':
           print "running ./bootstrap ..."
           sh_script( "bootstrap" )
       gr_make_install()

# Allow user to view shell before it goes away
raw_input( "Press any key to continue..." )
_______________________________________________
Discuss-gnuradio mailing list
Discuss-gnuradio@gnu.org
http://lists.gnu.org/mailman/listinfo/discuss-gnuradio

Reply via email to