On Sep 14, 2010, at 2:41 PM, Jeff Singleton wrote:
> How could "I" be compiling for one arch and then linking another ... I'm 
> using MacPorts.  I would assume that if a Port has support for universal, 
> then MP would adhere to this and build universal.

As pointed out by Ryan, many MP developers / maintainers do not test for 
+universal (or, for that matter, other variants).  I'm certainly guilty of not 
doing it in the past, but I'm testing for it now & will continue to do so in 
the future as I add / fix ports.  All of that said, MacPorts is not infallible 
as an install system -- we as developers / maintainers do the best we can, I 
think, but there's always room for doing it better somewhere.  I would guess 
that none of us work exclusively on MP, instead giving it time & attention as 
our work load allows -- so, don't expect miracles.  MP works well overall, and 
we continue to work to improve both port as well as the portfiles.

> If the compiling from .c to .o is done as 32-bit, but trying to link 64-bit, 
> then I would say that the maintainer of said port needs to look at this and 
> fix it.

Many of these types of issues should really be fixed upstream (at the developer 
of the project), not by us maintainers of the ports.  Let me elaborate via my 
current issue:

In this case, the issue is in how numpy's setup.py does its internal 
"configure" checking -- verifying that the compiler works & finding headers and 
such --, not directly in how MacPorts is interfacing with it.  From what I can 
tell -- and, I really haven't figured out where in the setup.py scripts all 
these testing takes place -- numpy does the following test (among others; this 
is the first one that involves linking AFAICT):

1) create conftest.c
2) ${CC} -c ${CFLAGS} -o conftest.o conftest.c
3) Change CFLAGS -> CFLAGS2: if the compiler is Apple's GCC, then it copies any 
-arch flag, but if it's not Apple's GCC then it clears out the CFLAGS2.
4) ${CC} ${CFLAGS2} -o conftest conftest.o

So, when port tries to build numpy as 32-bit by setting "CFLAGS=-m32" (because 
port is not using Apple's GCC for this purpose, and thus this flag is the only 
way to compile as 32-bit), step (2) creates a 32-bit .o file but step (3) 
clears out CFLAGS2 & thus step (4) fails because the default link arch is 
x86_64 & none of the provided .o files are of that architecture.  This is not 
the port maintainer's fault; it's the upstreams'.

So, there are 2 issues here:

A) GCC (Apple's of not) should be "smart enough" to check through all of the 
provided .o files and libraries to auto-determine the arch setting if just one 
is possible; and, erroring out if not.  Doing so is -way- beyond the 
expectation of your typical port maintainer.

B) Numpy's setup.py scripts should check for arch flags in C*FLAGS and carry 
them over for this and other linking tests.  Again, doing so is also -way- 
beyond the expectation of your typical port maintainer.

Arch flags vary greatly between OS/Compiler types.  setup.py handles -a lot- of 
different types, much as GNU's autotools, QMake, and CMake do; there is no 
perfect, generic way to do this "configure" oriented testing. - MLD
_______________________________________________
macports-users mailing list
[email protected]
http://lists.macosforge.org/mailman/listinfo.cgi/macports-users

Reply via email to