compiling on Solaris

David Kirkby discovered that a recent SVN version of matplotlib did not compile when he was testing a new matplotlib for inclusion in Sage. A bug was opened here:

https://sourceforge.net/tracker/?func=detail&aid=3022815&group_id=80706&atid=560720

It appears that a patch has been committed to 1.0.0 which tries to fix the issue. However, David still reports that matplotlib 1.0.0 still doesn't compile on Solaris. See:

http://trac.sagemath.org/sage_trac/ticket/9221?#comment:7

I'm not sure what the right procedure for reopening a ticket is.

Thanks,

Jason

···

--
Jason Grout

Apologies for the long message---I've really tried to be precise and complete.

David Kirkby discovered that a recent SVN version of matplotlib did not
compile when he was testing a new matplotlib for inclusion in Sage. A
bug was opened here:

https://sourceforge.net/tracker/?func=detail&aid=3022815&group_id=80706&atid=560720

It appears that a patch has been committed to 1.0.0 which tries to fix
the issue. However, David still reports that matplotlib 1.0.0 still
doesn't compile on Solaris. See:

http://trac.sagemath.org/sage_trac/ticket/9221?#comment:7

I'm not sure what the right procedure for reopening a ticket is.

I've had some time and access to a solaris box today to try to deal with this issue. I think I've solved it, based on a hint from David Kirkby.

Again, the issue is that matplotlib 1.0.0 will not compile on the solaris box t2.sagemath.org (and on another Solaris box too). David Kirkby provided the logs and specs for the systems at

http://trac.sagemath.org/sage_trac/ticket/9221#comment:7

The error is in compiling CXX:

···

On 7/7/10 10:23 AM, Jason Grout wrote:

==================================================================
gcc -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -DPY_ARRAY_UNIQUE_SYMBOL=MPL_ARRAY_API -DPYCXX_ISO_CPP_LIB=1 -I/scratch/grout/sage-4.5.3/local/lib/python2.6/site-packages/numpy/core/include -I/scratch/grout/sage-4.5.3/local/include -I. -I/scratch/grout/sage-4.5.3/local/lib/python2.6/site-packages/numpy/core/include -Isrc -Iagg24/include -I. -I/scratch/grout/sage-4.5.3/local/lib/python2.6/site-packages/numpy/core/include -I/scratch/grout/sage-4.5.3/local/include/freetype2 -I/scratch/grout/sage-4.5.3/local/include -I. -I/scratch/grout/sage-4.5.3/local/include/python2.6 -c src/backend_agg.cpp -o build/temp.solaris-2.10-sun4v-2.6/src/backend_agg.o
cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++
In file included from /scratch/grout/sage-4.5.3/local/include/python2.6/Python.h:8,
                  from ./CXX/WrapPython.h:61,
                  from ./CXX/Extensions.hxx:37,
                  from src/ft2font.h:4,
                  from src/backend_agg.cpp:10:
/scratch/grout/sage-4.5.3/local/include/python2.6/pyconfig.h:1013:1: warning: "_FILE_OFFSET_BITS" redefined
In file included from /usr/include/sys/types.h:18,
                  from /scratch/grout/sage-4.5.3/local/include/zconf.h:364,
                  from /scratch/grout/sage-4.5.3/local/include/zlib.h:34,
                  from /scratch/grout/sage-4.5.3/local/include/png.h:470,
                  from src/backend_agg.cpp:3:
/usr/local/gcc-4.4.1-sun-linker/bin/../lib/gcc/sparc-sun-solaris2.10/4.4.1/include-fixed/sys/feature_tests.h:197:1: warning: this is the location of the previous definition
In file included from /scratch/grout/sage-4.5.3/local/include/python2.6/Python.h:42,
                  from ./CXX/WrapPython.h:61,
                  from ./CXX/Extensions.hxx:37,
                  from src/ft2font.h:4,
                  from src/backend_agg.cpp:10:
/usr/include/stdlib.h:144: error: declaration of C function 'void swab(const char*, char*, ssize_t)' conflicts with
/usr/include/unistd.h:496: error: previous declaration 'void swab(const void*, void*, ssize_t)' here
error: command 'gcc' failed with exit status 1

==================================================================

This was reportedly fixed in 1.0.0, but apparently the fix does not work for this Solaris box.

Based on a hint from David Kirkby, I changed the CXX/WrapPython.h file to be:

==================================================================
#ifndef __PyCXX_wrap_python_hxx__
#define __PyCXX_wrap_python_hxx__

// On some platforms we have to include time.h to get select defined
#if !defined(__WIN32__) && !defined(WIN32) && !defined(_WIN32) && !defined(_WIN64)
#include <sys/time.h>
#endif

// pull in python definitions
#include <Python.h>

#endif

(in other words, I just deleted all the defining and undefining of variables). The resulting matplotlib compiled finally, and the result of the testing was:

==================================================================
In [1]: import matplotlib
In [2]: matplotlib.__version__
Out[2]: '1.0.0'

In [3]: matplotlib.test()
/scratch/grout/sage-4.5.3/local/lib/python2.6/site-packages/matplotlib/axes.py:2369: UserWarning: Attempting to set identical left==right results
in singular transformations; automatically expanding.
left=730139.0, right=730139.0
   + 'left=%s, right=%s') % (left, right))
----------------------------------------------------------------------
Ran 138 tests in 755.419s

OK (KNOWNFAIL=42)
Out[3]: True

so I guess that means everything works.

I also compiled it on Ubuntu 10.04 (64-bit) and OSX 10.6.4, and it seemed to compile fine on those systems, though on OSX 10.6.4, I got some warnings like:

/home/grout/sage/local/include/python2.6/pyconfig.h:1028:1: warning: "_POSIX_C_SOURCE" redefined
/home/grout/sage/local/include/python2.6/pyconfig.h:1037:1: warning: "_XOPEN_SOURCE" redefined

This brings up another issue: going against the Python API

As you probably already know, Introduction — Python 3.12.0 documentation says that:

"Since Python may define some pre-processor definitions which affect the standard headers on some systems, you must include Python.h before any standard headers are included."

I notice a lot of other #undef statements for _POSIX_C_SOURCE and _XOPEN_SOURCE in matplotlib code. To my (uneducated) eyes, that seems like a recipe for trouble, since defining it one way while including some other files, and then undefining the macros and defining them a different way may lead to problems.

For example, in _png.cpp, I see:

#include <png.h>

// To remove a gcc warning
#ifdef _POSIX_C_SOURCE
#undef _POSIX_C_SOURCE
#endif

According to the Python API, we should include python.h before including png.h.

Thanks,

Jason

As a follow-up, I've implemented the patch for CXX and also patches for the other files which do not include Python.h first here:

http://github.com/jasongrout/matplotlib/commit/a961c299f5d589dae87e06caf54975eb657ebf3b

I've also attached the patch.

This patch gets rid of the warnings about redefining things on OSX 10.6.4 (see my last message on this thread).

Thanks,

Jason

conform.patch (2.01 KB)

Jason,

I tested your patch with Ubuntu 10.10, and it failed. The problem is that something is including setjmp.h before libpng.h tries to do so via pngconf.h, resulting in an error as the compiler trips over the following:

# ifndef PNG_SKIP_SETJMP_CHECK
# ifdef __linux__
# ifdef _BSD_SOURCE
# define PNG_SAVE_BSD_SOURCE
# undef _BSD_SOURCE
# endif
# ifdef _SETJMP_H
        /* If you encounter a compiler error here, see the explanation
         * near the end of INSTALL.
         */
            __pngconf.h__ in libpng already includes setjmp.h;
            __dont__ include it again.;
# endif
# endif /* __linux__ */
# endif /* PNG_SKIP_SETJMP_CHECK */

The relevant part of INSTALL is:

If you encounter a compiler error message complaining about the
lines

       __png.h__ already includes setjmp.h;
       __dont__ include it again.;

this means you have compiled another module that includes setjmp.h,
which is hazardous because the two modules might not include exactly
the same setjmp.h. If you are sure that you know what you are doing
and that they are exactly the same, then you can comment out or
delete the two lines. Better yet, use the cexcept interface
instead, as demonstrated in contrib/visupng of the libpng distribution.

For the most part your patch looks like the right thing, but I don't know what to do about this show-stopping glitch. I looked around, but could not figure out what was including setjmp.h after your patch, but not before. Maybe Mike will see it.

Eric

···

On 09/16/2010 09:50 AM, Jason Grout wrote:

As a follow-up, I've implemented the patch for CXX and also patches for
the other files which do not include Python.h first here:

http://github.com/jasongrout/matplotlib/commit/a961c299f5d589dae87e06caf54975eb657ebf3b

I've also attached the patch.

This patch gets rid of the warnings about redefining things on OSX
10.6.4 (see my last message on this thread).

Thanks,

Jason

What file caused the error (i.e., what file was compiling?)

Thanks,

Jason

···

On 9/16/10 5:24 PM, Eric Firing wrote:

On 09/16/2010 09:50 AM, Jason Grout wrote:

As a follow-up, I've implemented the patch for CXX and also patches for
the other files which do not include Python.h first here:

http://github.com/jasongrout/matplotlib/commit/a961c299f5d589dae87e06caf54975eb657ebf3b

I've also attached the patch.

This patch gets rid of the warnings about redefining things on OSX
10.6.4 (see my last message on this thread).

Thanks,

Jason

Jason,

I tested your patch with Ubuntu 10.10, and it failed. The problem is
that something is including setjmp.h before libpng.h tries to do so via
pngconf.h, resulting in an error as the compiler trips over the following:

As a follow-up, I've implemented the patch for CXX and also patches for
the other files which do not include Python.h first here:

http://github.com/jasongrout/matplotlib/commit/a961c299f5d589dae87e06caf54975eb657ebf3b

I've also attached the patch.

This patch gets rid of the warnings about redefining things on OSX
10.6.4 (see my last message on this thread).

Thanks,

Jason

Jason,

I tested your patch with Ubuntu 10.10, and it failed. The problem is
that something is including setjmp.h before libpng.h tries to do so via
pngconf.h, resulting in an error as the compiler trips over the following:

What file caused the error (i.e., what file was compiling?)

Sorry, I wasn't thinking straight, or I would have included that. It was _backend_agg.cpp. However, if I swap the order of inclusion of png.h and Python.h in that file, then redefinition warnings are generated when it compiles,

In file included from /usr/include/python2.6/Python.h:8,
                  from src/backend_agg.cpp:6:
/usr/include/python2.6/pyconfig.h:1031: warning: "_POSIX_C_SOURCE" redefined
//usr/include/features.h:162: note: this is the location of the previous definition
/usr/include/python2.6/pyconfig.h:1040: warning: "_XOPEN_SOURCE" redefined
//usr/include/features.h:164: note: this is the location of the previous definition

...

the compilation proceeds, and then fails with _png.cpp:

In file included from /usr/include/libpng12/png.h:518,
                  from src/_png.cpp:4:
/usr/include/libpng12/pngconf.h:371: error: expected constructor, destructor, or type conversion before ‘.’ token
/usr/include/libpng12/pngconf.h:372: error: ‘__dont__’ does not name a type
error: command 'gcc' failed with exit status 1

Eric

···

On 09/16/2010 01:04 PM, Jason Grout wrote:

On 9/16/10 5:24 PM, Eric Firing wrote:

On 09/16/2010 09:50 AM, Jason Grout wrote:

Thanks,

Jason

------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances
and start using them to simplify application deployment and
accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev
_______________________________________________
Matplotlib-devel mailing list
Matplotlib-devel@lists.sourceforge.net
matplotlib-devel List Signup and Options