Sage FreeBSD 7.x and 8.x build notes for Sage 4.2

Note that this is a work-in-progress and not currently complete

Contents

Overall build environment differences

Preparatory work

It's possible there are other dependencies, I haven't tried building sage in a clean (tinderbox) environment.

Building Sage

On FreeBSD 8.x

FreeBSD 7.x hasn't been tested with Sage 4.2 but is expected to work.

Current Status

Currently, the following tests fail on FreeBSD 8.0-rc1/amd64. Full logs at sage-4.2.freebsd8.0-amd64.test.log.

        sage -t  "devel/sage/doc/en/reference/coercion.rst"
        sage -t  "devel/sage/sage/crypto/boolean_function.pyx"
        sage -t  "devel/sage/sage/crypto/mq/sbox.py"
        sage -t  "devel/sage/sage/crypto/mq/mpolynomialsystem.py"
        sage -t  "devel/sage/sage/crypto/mq/sr.py"
        sage -t  "devel/sage/sage/modules/free_module_element.pyx"
        sage -t  "devel/sage/sage/quadratic_forms/binary_qf.py"
        sage -t  "devel/sage/sage/quadratic_forms/constructions.py"
        sage -t  "devel/sage/sage/schemes/plane_curves/projective_curve.py"
        sage -t  "devel/sage/sage/schemes/generic/scheme.py"
        sage -t  "devel/sage/sage/schemes/generic/projective_space.py"
        sage -t  "devel/sage/sage/schemes/generic/affine_space.py"
        sage -t  "devel/sage/sage/schemes/generic/algebraic_scheme.py"
        sage -t  "devel/sage/sage/schemes/elliptic_curves/ell_field.py"
        sage -t  "devel/sage/sage/schemes/elliptic_curves/ell_rational_field.py"
        sage -t  "devel/sage/sage/schemes/elliptic_curves/ell_generic.py"
        sage -t  "devel/sage/sage/schemes/elliptic_curves/ell_curve_isogeny.py"
        sage -t  "devel/sage/sage/schemes/hyperelliptic_curves/jacobian_generic.py"
        sage -t  "devel/sage/sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py"
        sage -t  "devel/sage/sage/schemes/hyperelliptic_curves/hyperelliptic_g2_generic.py"
        sage -t  "devel/sage/sage/schemes/hyperelliptic_curves/invariants.py"
        sage -t  "devel/sage/sage/symbolic/expression.pyx"
        sage -t  "devel/sage/sage/symbolic/relation.py"
        sage -t  "devel/sage/sage/symbolic/ring.pyx"
        sage -t  "devel/sage/sage/libs/pari/gen.pyx"
        sage -t  "devel/sage/sage/libs/symmetrica/sb.pxi"
        sage -t  "devel/sage/sage/misc/getusage.py"
        sage -t  "devel/sage/sage/modular/overconvergent/genus0.py"
        sage -t  "devel/sage/sage/coding/linear_code.py"
        sage -t  "devel/sage/sage/rings/qqbar.py"
        sage -t  "devel/sage/sage/rings/integer.pyx"
        sage -t  "devel/sage/sage/rings/tests.py"
        sage -t  "devel/sage/sage/rings/fraction_field_element.pyx"
        sage -t  "devel/sage/sage/rings/fraction_field.py"
        sage -t  "devel/sage/sage/rings/polynomial/symmetric_reduction.pyx"
        sage -t  "devel/sage/sage/rings/polynomial/multi_polynomial_ring.py"
        sage -t  "devel/sage/sage/rings/polynomial/symmetric_ideal.py"
        sage -t  "devel/sage/sage/rings/polynomial/pbori.pyx"
        sage -t  "devel/sage/sage/rings/polynomial/infinite_polynomial_ring.py"
        sage -t  "devel/sage/sage/rings/polynomial/laurent_polynomial.pyx"
        sage -t  "devel/sage/sage/rings/polynomial/multi_polynomial_ring_generic.pyx"
        sage -t  "devel/sage/sage/rings/polynomial/multi_polynomial_libsingular.pyx"
        sage -t  "devel/sage/sage/rings/polynomial/laurent_polynomial_ring.py"
        sage -t  "devel/sage/sage/rings/polynomial/infinite_polynomial_element.py"
        sage -t  "devel/sage/sage/rings/polynomial/groebner_fan.py"
        sage -t  "devel/sage/sage/rings/polynomial/multi_polynomial_ideal.py"
        sage -t  "devel/sage/sage/rings/polynomial/polynomial_singular_interface.py"
        sage -t  "devel/sage/sage/rings/polynomial/toy_d_basis.py"
        sage -t  "devel/sage/sage/rings/polynomial/multi_polynomial.pyx"
        sage -t  "devel/sage/sage/rings/polynomial/polynomial_ring_constructor.py"
        sage -t  "devel/sage/sage/ext/fast_eval.pyx"
        sage -t  "devel/sage/sage/ext/fast_callable.pyx"
        sage -t  "devel/sage/sage/categories/pushout.py"
        sage -t  "devel/sage/sage/categories/map.pyx"
        sage -t  "devel/sage/sage/matrix/matrix_space.py"
        sage -t  "devel/sage/sage/matrix/constructor.py"
        sage -t  "devel/sage/sage/matrix/matrix_sparse.pyx"
        sage -t  "devel/sage/sage/matrix/matrix2.pyx"
        sage -t  "devel/sage/sage/matrix/matrix_mpolynomial_dense.pyx"
        sage -t  "devel/sage/sage/structure/parent.pyx"
        sage -t  "devel/sage/sage/structure/coerce_actions.pyx"
        sage -t  "devel/sage/sage/structure/element.pyx"
        sage -t  "devel/sage/sage/structure/sage_object.pyx"
        sage -t  "devel/sage/sage/structure/coerce.pyx"
        sage -t  "devel/sage/sage/interfaces/sage0.py"
        sage -t  "devel/sage/sage/lfunctions/sympow.py"
        sage -t  "devel/sage/sage/combinat/sf/sfa.py"
        sage -t  "devel/sage/sage/combinat/sf/schur.py"
        sage -t  "devel/sage/sage/combinat/sf/dual.py"
        sage -t  "devel/sage/sage/combinat/sf/powersum.py"
        sage -t  "devel/sage/sage/combinat/sf/ns_macdonald.py"
        sage -t  "devel/sage/sage/combinat/sf/homogeneous.py"
        sage -t  "devel/sage/sage/combinat/sf/monomial.py"
        sage -t  "devel/sage/sage/combinat/sf/elementary.py"
        sage -t  "devel/sage/sage/combinat/sf/macdonald.py"
        sage -t  "devel/sage/sage/combinat/q_analogues.py"
        sage -t  "devel/sage/sage/combinat/combinat.py"
        sage -t  "devel/sage/sage/combinat/partition.py"
        sage -t  "devel/sage/sage/combinat/tableau.py"
        sage -t  "devel/sage/sage/combinat/schubert_polynomial.py"
        sage -t  "devel/sage/sage/plot/complex_plot.pyx"

The actual failures indicate that the port still needs significant work and include:

Notes on spkgs and attached patches

base.patch

atlas-3.8.3.p9

Various fixes to make it compile on FreeBSD

cliquer-1.2.p2

FreeBSD uses the same invocation as Linux to build shared libraries.

gap-4.4.10.p12

Patches (mostly taken from the FreeBSD port) to make gap compile on FreeBSD 8.x. These patches should be optional on FreeBSD/7.x.

libgcrypt-1.4.4.p0

Chase shared library name difference on FreeBSD. Sage local patch. Otherwise the gnutls build fails similar to:

gcc -std=gnu99 -shared  .libs/gnutls_openssl.o .libs/openssl_compat.o -Wl,--whole-archive ../lgl/.libs/liblgnu.a ../lib/minitasn1/.libs/libminitasn1.a -Wl,--no-whole-archive  -Wl,--rpath -Wl,/home/pjeremy/sage-3.4/local/lib -Wl,--rpath -Wl,/usr/local/lib -L/home/pjeremy/sage-3.4/spkg/build/gnutls-2.2.1.p1/src/lib/.libs -L/home/pjeremy/sage-3.4/local/lib -lgcrypt -L/usr/local/lib -lintl -liconv -lgpg-error -lgnutls  -Wl,-soname -Wl,libgnutls-openssl.so.27 -o .libs/libgnutls-openssl.so.27
/usr/bin/ld: /home/pjeremy/sage-3.4/local/lib/libgcrypt.a(libgcrypt_la-visibility.o): relocation R_X86_64_32 can not be used when making a shared object; recompile with -fPIC
/home/pjeremy/sage-3.4/local/lib/libgcrypt.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
libtool: install: error: relink `libgnutls-openssl.la' with the above command before installing it
make[5]: *** [install-libLTLIBRARIES] Error 1
make[5]: Leaving directory `/home/pjeremy/sage-3.4/spkg/build/gnutls-2.2.1.p1/src/libextra'

matplotlib-0.99.1.p2

Add hooks to ensure that the local Sage versions of dependencies are used by FreeBSD. Otherwise you get:

BUILDING MATPLOTLIB
            matplotlib: 0.98.6svn
                python: 2.5.2 (r252:60911, Apr  1 2009, 08:50:05)  [GCC
                        4.3.4 20090326 (prerelease)]
              platform: freebsd7

REQUIRED DEPENDENCIES
                 numpy: no
                        * You must install numpy 1.1 or later to build
                        * matplotlib.
Error building matplotlib package.

Add support for FreeBSD later than 6.x. Otherwise you get :

REQUIRED DEPENDENCIES
Traceback (most recent call last):
  File "setup.py", line 119, in <module>
    if not check_for_numpy():
  File "/home/pjeremy/sage-3.4/spkg/build/matplotlib-0.98.5.3rc0-svn6910.p3/src/setupext.py", line 499, in check_for_numpy
    add_base_flags(module)
  File "/home/pjeremy/sage-3.4/spkg/build/matplotlib-0.98.5.3rc0-svn6910.p3/src/setupext.py", line 320, in add_base_flags
    [os.path.join(p, 'include') for p in basedir[sys.platform] ])
KeyError: 'freebsd7'
Error building matplotlib package.

gcc4.3 (though not gcc4.2) appears to define putchar() in a way that breaks the putchar() definitions inside ttconv. I couldn't quickly identify what the underlying cause was so I took the easy way out and undef'd the offending putchar() macro.

Individual character bounding boxes in AFM files do not have to be integral so convert each bounding box to a list of floats, rather than a list of ints. This corrects a problem where most of the tests would fail with ValueError: invalid literal for int() with base 10: '539.621'.

All three sub-patches are in #5873

numpy-1.2.0.p0

r-2.6.1.p23

Pass CFLAGS, CPPFLAGS and LDFLAGS from the environment into the build process. This also corrects a typo in CPPFLAGS.

Note that FreeBSD needs the path to libiconv to be explicitly specified. In theory, --with-libiconv-prefix should work but configure script is broken and ignores that path when looking for libiconv. Hard-wire /usr/local/include and /usr/local/lib via xxFLAGS.

Note that the X11 detection in spkg-install will not work anywhere other than Linux. This needs future work.

These patches are all local to Sage.

sage-4.1

sage_scripts-4.1

Patch sage-spkg to apply local patches. This patch also disables deletion of the spkg/build/FOO temporary directories - which was useful during porting. This latter patch can be safely removed.