Fusb_darwin.cc compile fails on Mac OS X Snow Leopard with -arch x86_64

I am building from gnuradio-3.2.2.tar from Trac on an iMac9,1 with an
Intel Core 2 Duo running Mac OS X 10.6.1 (Snow Leopard), XCode version
3.2, gcc version 4.2.1.

I am following the directions at
https://radioware.nd.edu/documentation/install-guides/mac-os-x
and just got all the prerequisites from macports for this build.

I am building one component at a time. I built gnuradio-core (but
with one wrinkle - see PPS below).

The build for usrp failed, in particular the compile for
fusb_darwin.cc failed with these error messages, among others (full
compile command with output appears in PPPS below):

fusb_darwin.cc:348: error: cast from s_both<s_buffer*>* to unsigned
int loses precision
fusb_darwin.cc:391: error: cast from void* to UInt32 loses precision
… etc. …

I suspected a 32 vs. 64 bit problem so I tried typing the compile
command by hand with the -m32 option to supercede the default -arch
86x_64 option. It compiled. Looking at the output file of this
compilation, along with some others, I find:

d-128-95-165-159:legacy mrfm$ file .libs/fusb*
.libs/fusb.o: Mach-O 64-bit object x86_64
.libs/fusb_darwin.o: Mach-O object i386
.libs/fusb_sysconfig_darwin.o: Mach-O 64-bit object x86_64

So it seems fusb_darwin.cc compiles for 32 bits but not 64. This
Stackoverflow thread
discusses the general issue:

macos - Mac OSX 10.6 compiler: a puzzling experience with 32 vs 64 bit - Stack Overflow
with-32-vs-64-bit

It looks complicated. I’m not sure how best to proceed. Please advise.

Jon Jacky

PS - I also tried installing gnuradio-usrp from macports. It also
fails at compiling fusb_darwin.cc with the same messages (but
different line numbers, I suppose because it is 3.2 not 3.2.2). In
the macports compile commands, the -arch x86_64 option is explicit; it
does not appear in the compile commands from the Trac build.

PPS - I did have a problem building gnuradio-core: at first the
compile for gnuradio-core/src/lib/filter/float_dotprod_sse.S and
several other *sse.S files failed with messages like:

float_dotprod_sse.S:63:suffix or operands invalid for `push’

This post says the error message indicates 32-bit code where 64-bit is
expected:

http://www.opensubscriber.com/message/[email protected]/6122483.html

Just to get the build to complete, I made symbolic links from
float_dotprod_sse64.S to float_dotprod_sse.S (etc. for the other .S
files).

I also had this same problem with the macports build.

PPPS Here is the complete compile command for fusb_darwin.cc which
failed, and the output:

libtool: compile: g++ -DHAVE_CONFIG_H -I. -I…/…/…/…
-I/Users/mrfm/gnuradio-
3.2.2/usrp/host/lib/legacy
-I/Users/mrfm/gnuradio-3.2.2/usrp/firmware/include -
I/Users/mrfm/gnuradio-3.2.2/usrp/host/lib/legacy -I/opt/local/include
-I/Users/mrfm/gr-
3.2.2/include/gnuradio -g -O2 -Wall -Woverloaded-virtual -D_THREAD_SAFE
-MT fusb_darwin.lo -
MD -MP -MF .deps/fusb_darwin.Tpo -c fusb_darwin.cc -fno-common -DPIC -o
.libs/fusb_darwin.o
In file included from fusb_darwin.cc:35:
darwin_libusb.h: In function ‘char* darwin_error_str(int)’:
darwin_libusb.h:50: warning: deprecated conversion from string constant
to ‘char*’
darwin_libusb.h:52: warning: deprecated conversion from string constant
to ‘char*’
darwin_libusb.h:54: warning: deprecated conversion from string constant
to ‘char*’
darwin_libusb.h:56: warning: deprecated conversion from string constant
to ‘char*’
darwin_libusb.h:58: warning: deprecated conversion from string constant
to ‘char*’
darwin_libusb.h:60: warning: deprecated conversion from string constant
to ‘char*’
darwin_libusb.h:62: warning: deprecated conversion from string constant
to ‘char*’
darwin_libusb.h:64: warning: deprecated conversion from string constant
to ‘char*’
darwin_libusb.h:66: warning: deprecated conversion from string constant
to ‘char*’
fusb_darwin.cc: In member function ‘void
fusb_ephandle_darwin::read_issue(s_both<s_buffer*>)’:
fusb_darwin.cc:348: error: cast from ‘s_both<s_buffer
>’ to ‘unsigned
int’ loses precision
fusb_darwin.cc:383: error: cast from ‘s_both<s_buffer
>’ to ‘unsigned
int’ loses precision
fusb_darwin.cc:383: warning: format ‘%ld’ expects type ‘long int’, but
argument 4 has type ‘UInt32’
fusb_darwin.cc: In static member function ‘static void
fusb_ephandle_darwin::read_completed(void
,
io_return_t, void*)’:
fusb_darwin.cc:391: error: cast from ‘void*’ to ‘UInt32’ loses precision
fusb_darwin.cc:402: warning: format ‘%ld’ expects type ‘long int’, but
argument 3 has type ‘UInt32’
fusb_darwin.cc:402: warning: format ‘%ld’ expects type ‘long int’, but
argument 4 has type ‘UInt32’
fusb_darwin.cc:406: error: cast from ‘s_both<s_buffer*>’ to ‘unsigned
int’ loses precision
fusb_darwin.cc:406: warning: format ‘%ld’ expects type ‘long int’, but
argument 4 has type ‘UInt32’
fusb_darwin.cc: In member function ‘virtual int
fusb_ephandle_darwin::read(void
, int)’:
fusb_darwin.cc:428: warning: format ‘%ld’ expects type ‘long int’, but
argument 4 has type ‘UInt32’
fusb_darwin.cc: In member function ‘virtual int
fusb_ephandle_darwin::write(const void*, int)’:
fusb_darwin.cc:480: error: cast from ‘s_both<s_buffer*>’ to ‘unsigned
int’ loses precision
fusb_darwin.cc:480: warning: format ‘%ld’ expects type ‘long int’, but
argument 4 has type ‘UInt32’
fusb_darwin.cc: In static member function ‘static void
fusb_ephandle_darwin::write_completed(void
,
io_return_t, void*)’:
fusb_darwin.cc:495: error: cast from ‘void*’ to ‘UInt32’ loses precision
fusb_darwin.cc:504: warning: format ‘%ld’ expects type ‘long int’, but
argument 3 has type ‘UInt32’
fusb_darwin.cc:504: warning: format ‘%ld’ expects type ‘long int’, but
argument 4 has type ‘UInt32’
fusb_darwin.cc:507: error: cast from ‘s_both<s_buffer*>’ to ‘unsigned
int’ loses precision
fusb_darwin.cc:507: warning: format ‘%ld’ expects type ‘long int’, but
argument 4 has type ‘UInt32’
circular_buffer.h: In member function ‘int
circular_buffer::enqueue(T
, UInt32) [with T = char]’:
fusb_darwin.cc:409: instantiated from here
circular_buffer.h:157: warning: format ‘%ld’ expects type ‘long int’,
but argument 3 has type ‘UInt32’
circular_buffer.h:157: warning: format ‘%ld’ expects type ‘long int’,
but argument 4 has type ‘UInt32’
circular_buffer.h: In member function ‘int
circular_buffer::dequeue(T*, UInt32*) [with T = char]’:
fusb_darwin.cc:425: instantiated from here
circular_buffer.h:249: warning: format ‘%ld’ expects type ‘long int’,
but argument 3 has type ‘UInt32’
circular_buffer.h:249: warning: format ‘%ld’ expects type ‘long int’,
but argument 4 has type ‘UInt32’
make[6]: *** [fusb_darwin.lo] Error 1
make[5]: *** [all] Error 2
make[4]: *** [all-recursive] Error 1
make[3]: *** [all-recursive] Error 1
make[2]: *** [all-recursive] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

Here is the successful compile with the -m32 option:

d-128-95-165-159:legacy mrfm$ g++ -DHAVE_CONFIG_H -I. -I…/…/…/…
-I/Users/mrfm/gnuradio-
3.2.2/usrp/host/lib/legacy
-I/Users/mrfm/gnuradio-3.2.2/usrp/firmware/include -
I/Users/mrfm/gnuradio-3.2.2/usrp/host/lib/legacy -I/opt/local/include
-I/Users/mrfm/gr-
3.2.2/include/gnuradio -g -O2 -Wall -Woverloaded-virtual -D_THREAD_SAFE
-MT fusb_darwin.lo -
MD -MP -MF .deps/fusb_darwin.Tpo -c fusb_darwin.cc -fno-common -DPIC
-m32 -o
.libs/fusb_darwin.o
In file included from fusb_darwin.cc:35:
darwin_libusb.h: In function ‘char* darwin_error_str(int)’:
darwin_libusb.h:50: warning: deprecated conversion from string constant
to ‘char*’
darwin_libusb.h:52: warning: deprecated conversion from string constant
to ‘char*’
darwin_libusb.h:54: warning: deprecated conversion from string constant
to ‘char*’
darwin_libusb.h:56: warning: deprecated conversion from string constant
to ‘char*’
darwin_libusb.h:58: warning: deprecated conversion from string constant
to ‘char*’
darwin_libusb.h:60: warning: deprecated conversion from string constant
to ‘char*’
darwin_libusb.h:62: warning: deprecated conversion from string constant
to ‘char*’
darwin_libusb.h:64: warning: deprecated conversion from string constant
to ‘char*’
darwin_libusb.h:66: warning: deprecated conversion from string constant
to ‘char*’

This command produces

.libs/fusb_darwin.o: Mach-O object i386

On Thu, Oct 8, 2009 at 5:19 PM, Jonathan P Jacky [email protected]
wrote:

with one wrinkle - see PPS below).

The build for usrp failed, in particular the compile for
fusb_darwin.cc failed with these error messages, among others (full
compile command with output appears in PPPS below):

fusb_darwin.cc:348: error: cast from s_both<s_buffer*>* to unsigned int
loses precision
fusb_darwin.cc:391: error: cast from void* to UInt32 loses precision
… etc. …

Both errors are coming from pointer casts to int types. Pointers and
long types go to 8-bytes on 64-bit builds while int stays at 4-bytes
on most systems. Using long rather than int types should fix things
though I have no way test it out. Michael may be aware of other
issues.

Thomas