source: trunk/dports/math/atlas/Portfile @ 82453

Last change on this file since 82453 was 82453, checked in by vince@…, 8 years ago

Reintroduce -force_cpusubtype_ALL flag for ppc.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 11.8 KB
Line 
1# $Id: Portfile 82453 2011-08-14 05:44:25Z vince@macports.org $
2
3PortSystem                      1.0
4PortGroup                       muniversal 1.0
5
6categories                      math
7license                         BSD
8name                            atlas
9version                         3.9.47
10
11# additional versions
12set lapackversion       3.3.1
13set lapackname          lapack
14set atlasdist           ${name}${version}.tar.bz2
15set lapackdist          ${lapackname}-${lapackversion}.tgz
16
17maintainers                     jameskyle
18platforms                       darwin
19
20description                     Portable optimal linear algebra software
21long_description        The current version provides a complete BLAS and LAPACK API.\
22                                        For many operations, ATLAS achieves performance on par with\
23                                        machine-specific tuned libraries.
24
25homepage                        http://math-atlas.sourceforge.net/
26
27master_sites            sourceforge:math-atlas:atlas \
28                                        http://www.netlib.org/lapack:lapack
29
30distfiles                       ${atlasdist}:atlas \
31                                        ${lapackdist}:lapack
32
33patchfiles                      patch-SpewMakeInc_c.diff \
34                                        patch-archinfo_freebsd_c.diff \
35                                        patch-ATL_goparallel_prank_c.diff \
36                                        patch-ATL_go_parallel_c.diff \
37                                        patch-atlas_l2g_base.diff
38
39
40checksums                       atlas${version}.tar.bz2 \
41                                        sha1    a3a4797669decea28308bd7d3e0adcac44267471 \
42                                        rmd160  036dbe08784bbda33ce1fa94b20a1999b22772cd \
43                                        lapack-${lapackversion}.tgz \
44                                        md5             d0d533ec9a5b74933c2a1e84eedc58b4 \
45                                        sha1    3ce437e05f0e9a3c8148ec41922f6efeef0ebdac \
46                                        rmd160  5e9d90122110045e07351f3ab30dc4e2b43d52db
47
48
49use_parallel_build      no
50build.target            build
51build.dir                       ${workpath}/${name}-${version}/build
52
53variant gcc46 conflicts gcc42 gcc43 gcc44 gcc45 description {build using macports-gcc-4.6} {}
54variant gcc45 conflicts gcc42 gcc43 gcc44 gcc46 description {build using macports-gcc-4.5} {}
55variant gcc44 conflicts gcc42 gcc43 gcc45 gcc46 description {build using macports-gcc-4.4} {}
56variant gcc43 conflicts gcc42 gcc44 gcc45 gcc46 conflicts universal description {build using macports-gcc-4.3} {}
57variant gcc42 conflicts gcc43 gcc44 gcc45 gcc46 conflicts universal description {build using macports-gcc-4.2} {
58        ui_warn 'Use of gcc42 is deprecated. Please upgrade if possible'}
59
60if { ${os.major} < 11 || ![variant_isset dragonegg45] } {
61        if { [variant_isset gcc42] } {
62                set gccversion  4.2
63        } elseif { [variant_isset gcc43] } {
64                set gccversion  4.3
65        } elseif { [variant_isset gcc44] } {
66                set gccversion  4.4
67        } elseif { [variant_isset gcc45 ] } {
68                set gccversion  4.5
69        } elseif { [variant_isset gcc46] } {
70                set gccversion  4.6
71        } else {
72        default_variants        +gcc44
73        set gccversion          4.4
74        }
75} else {
76        # On Lion, we can also select clang and llvm-gcc42 since these compilers
77        # give performance at least as good as gcc.
78        # Fortran compiler remains gcc (dragonegg to come?)
79        if { [variant_isset gcc42] } {
80                set gccversion  4.2
81        } elseif { [variant_isset gcc43] } {
82                set gccversion  4.3
83        } elseif { [variant_isset gcc44] } {
84                set gccversion  4.4
85        } elseif { [variant_isset gcc45 ] } {
86                set gccversion  4.5
87        } elseif { [variant_isset gcc46] } {
88                return -code error "GCC/GFortran 4.6 is not yet available"
89        } elseif { [variant_isset dragonegg45] } {
90                configure.compiler      clang
91                configure.f77           ${prefix}/bin/gfortran-mp-4.5
92        } else {
93                return -code error "GCC/GFortran 4.6 is not yet available"
94        }
95}
96
97destroot.dir                    ${build.dir}
98destroot.destdir                DESTDIR=${destroot}${prefix}
99depends_lib                             port:bzip2 \
100                                                port:gzip
101
102if { [info exists gccversion] } {
103        set gccnumber           [join [split ${gccversion} .] ""]
104        configure.compiler      macports-gcc-${gccversion}
105        depends_lib-append      port:gcc${gccnumber}
106}
107
108if {[info exists depends_skip_archcheck] && [info exists gccversion]} {
109        depends_skip_archcheck gcc${gccnumber}
110}
111
112# No cross-compilation possible
113if { ${os.arch} == "i386" } {
114        set universal_archs_supported { i386 x86_64 }
115} else {
116        set universal_archs_supported { ppc  ppc64 }
117}
118
119if {${build_arch} == "x86_64" || ${build_arch} == "ppc64" } {
120        set my_arch 64
121} else {
122        set my_arch 32
123}
124
125configure.args          -C xc ${configure.cc} \
126                                        -C gc ${configure.cc} \
127                                        -C if ${configure.f77} \
128                                        -C ic ${configure.cc} \
129                                        -C dm ${configure.cc} \
130                                        -C sm ${configure.cc} \
131                                        -C dk ${configure.cc} \
132                                        -C sk ${configure.cc} \
133                                        --cc=${configure.cc} \
134                                        --with-netlib-lapack-tarfile=${distpath}/${lapackdist} \
135                                        -O 12 \
136                                        -b ${my_arch} \
137                                        -Fa alg -fPIC
138
139# Dragonegg
140if { [variant_isset dragonegg45] } {
141        configure.args-append -Fa if -fplugin=${prefix}/lib/dragonegg45.so
142}
143
144# At this point, no threading for ppc/ppc64
145
146if {${build_arch} == "ppc" || ${build_arch} == "ppc64"} {
147        configure.args-append   -t 0
148}
149
150# MacPorts defaults to ppc on G4 and G5, so we must override 64-bit detection
151# by Atlas, even if we are on a G5
152
153if {${build_arch} == "ppc" && ! [variant_isset universal]} {
154        configure.args-delete   --cc=${configure.cc} \
155                                                        -Fa alg -fPIC
156
157        configure.args-append   --cc='${configure.cc} -m32' \
158                                                        -A 4 \
159                                                        -Fa alg '-fPIC -m32 -force_cpusubtype_ALL'
160       
161        # On Leopard, we may warn the user that ppc is not as efficient as ppc64
162        if {${os.major} == 9} {
163            pre-configure {
164            if {![catch {sysctl hw.cpu64bit_capable} result] && $result == 1} {
165                ui_msg "--- Compiling for G4 arch (ppc) on a G5 (ppc64) machine."
166                ui_msg "--- This will lead to inferior performance."
167            }
168                }
169        }
170               
171}
172
173if { (${os.major} == 11 && \
174        [exec sysctl -n hw.optional.avx1_0] == 1) || \
175        [exec sysctl -n hw.cpufamily] == 1418770316 } {
176        # Corei2 is not supported yet because gcc4.5 does not
177        # support AVX instructions and gcc4.6 does not compile yet.
178        # Set CPU to Corei1 instead
179        configure.args-append -A 18
180}
181
182if { [variant_isset universal] } {
183        configure.universal_args-delete                 --disable-dependency-tracking
184        configure.args-delete                                   --cc=${configure.cc} \
185                                                                                        -b ${my_arch} \
186                                                                                        -Fa alg -fPIC
187                                       
188        lappend merger_configure_args(ppc)              --cc='${configure.cc} -m32' \
189                                                                                        -b 32 \
190                                                                                        -A 4 \
191                                                                                        -t 0 \
192                                                                                        -s gas_ppc \
193                                                                                        -Fa alg '-fPIC -m32 \
194                                                                                        -force_cpusubtype_ALL'
195        lappend merger_configure_args(ppc64)    --cc='${configure.cc} -m64' \
196                                                                                        -b 64 \
197                                                                                        -A 5 \
198                                                                                        -t 0 \
199                                                                                        -s gas_ppc \
200                                                                                        -Fa alg '-fPIC -m64 \
201                                                                                        -force_cpusubtype_ALL'
202        lappend merger_configure_args(i386)     --cc='${configure.cc} -m32' \
203                                                                                        -b 32 \
204                                                                                        -A 15 \
205                                                                                        -s gas_x86_32 \
206                                                                                        -Fa alg '-fPIC -m32'
207        lappend merger_configure_args(x86_64)   --cc='${configure.cc} -m64' \
208                                                                                        -b 64 \
209                                                                                        -s gas_x86_64 \
210                                                                                        -Fa alg '-fPIC -m64'
211} else {
212        lappend merger_configure_args(ppc)
213        lappend merger_configure_args(ppc64)
214        lappend merger_configure_args(i386)
215        lappend merger_configure_args(x86_64)
216}
217
218build.env-append        "CC=${configure.cc} CXX=${configure.cxx}"
219
220# we are configuring from the build directory
221configure.dir                   ${workpath}/${name}-${version}/build
222configure.cmd                   ../configure
223
224
225# change the default compilers to those of gcc and make into shared library
226extract {
227        # extract atlas and move to a consistent working directory name
228        system  "cd ${workpath} && bunzip2 -dc ${distpath}/${atlasdist} | \
229                         gnutar --no-same-owner -xf -"
230        system  "mv ${workpath}/ATLAS ${workpath}/${name}-${version}"
231}
232
233post-patch {
234        reinplace       "s|__MACPORTS_GCC__|${configure.cc}|g" \
235                                 ${workpath}/${name}-${version}/CONFIG/src/SpewMakeInc.c
236       
237        # ar -r / ranlib / libtool seems to be buggy, so we have to supply a
238        # workaround to link properly.
239        reinplace       "s|XXXXX|${filespath}/ar2|" \
240                                ${workpath}/${name}-${version}/CONFIG/src/SpewMakeInc.c
241}
242
243pre-configure {
244
245        # i386 builds must be patch otherwise threading does not work.
246        if { [variant_isset universal] } {
247                foreach arch ${universal_archs_to_use} {
248                        copy ${workpath}/${name}-${version} \
249                         ${workpath}/${name}-${version}-${arch}
250                        if { ${arch} == "i386" } {
251                                ui_msg  "Patching Make.ttune for i386 universal build"
252                                system  "cd ${workpath}/${name}-${version}-i386/makes && \
253                                                 patch < ${filespath}/patch-Make_ttune-i386.diff"
254                        }
255                }
256        }
257       
258        if { ${build_arch} == "i386" && ! [variant_isset universal] } {
259                ui_msg  "Patching Make.ttune for i386 build"
260                system  "cd ${workpath}/${name}-${version}/makes && \
261                                 patch < ${filespath}/patch-Make_ttune-i386.diff"
262        }
263
264        reinplace       "s|cc=gcc|cc=${configure.cc}|g" ${worksrcpath}/configure
265        reinplace       "s|-no-cpp-precomp||g" \
266                                 ${workpath}/${name}-${version}/CONFIG/src/atlcomp.txt
267
268        # Get some system specific variables for maximum optimization
269        set                     cpufreq [expr {[exec sysctl -n hw.cpufrequency]/1000000}]
270        ui_debug        "Setting CPU Frequency for: ${cpufreq}"
271
272        if { ${os.arch} == "powerpc" } {
273                configure.args-append   -D c -DWALL
274        } else {
275                configure.args-append   -D c -DPentiumCPS=${cpufreq}
276        }
277
278        if { [variant_isset universal] } {
279                set     archs ${universal_archs_to_use}
280        } else {
281                set     archs ${build_arch}
282        }
283
284        foreach arch ${archs} {
285                if { ! [variant_isset universal] } {
286                        set     atlas_path ${workpath}/${name}-${version}
287                } else {
288                        set     atlas_path ${workpath}/${name}-${version}-${arch}
289                }
290
291                file mkdir ${atlas_path}/build
292        }
293}
294
295post-configure {
296        if { [variant_isset universal] } {
297                set     archs ${universal_archs_to_use}
298        } else {
299                set     archs ${build_arch}
300        }
301
302        foreach arch ${archs} {
303                if { ! [variant_isset universal] } {
304                        set     atlas_path ${workpath}/${name}-${version}
305                } else {
306                        set     atlas_path ${workpath}/${name}-${version}-${arch}
307                }
308
309                # recursively remove directories
310                ui_debug        "patch to recursively remove directories on clean"
311                reinplace       "s|rm -f|rm -rf|g" ${atlas_path}/build/Makefile
312
313                #Second patch for i386
314                if { ${arch} == "i386" } {
315                        system  "cd ${atlas_path}/build/src/threads && \
316                                         patch < ${filespath}/patch-threads-i386.diff"
317                        system  "cd ${atlas_path}/build/src/pthreads/misc && \
318                                         patch < ${filespath}/patch-Makefile_pthreads_misc.diff"
319                }
320        }
321}
322
323proc make_dylib { lib lib_dir arch libs } {
324        global destroot prefix gccnumber
325        system "cd ${lib_dir} && \
326                        ( test ! -e ${lib}.a || \
327                          /usr/bin/ld -arch ${arch} -dynamic -dylib -single_module -dead_strip \
328                          -x -all_load -L. -L${prefix}/lib/gcc${gccnumber}/${arch} \ -L${prefix}/lib/gcc${gccnumber} -ldylib1.o \
329                          -dylib_install_name ${prefix}/lib/${lib}.dylib \
330                          ${lib}.a -o ${lib}.dylib ${libs} )"
331}
332
333post-build {
334  # We have to manually create the dylib shared libs as the default build does not do this
335
336  set ncpu [exec sysctl -n hw.ncpu]
337
338        if { [variant_isset universal] } {
339                set     archs ${universal_archs_to_use}
340        } else {
341                set     archs ${build_arch}
342        }
343
344        foreach arch ${archs} {
345                if { ! [variant_isset universal] } {
346                        set     atlas_path  ${workpath}/${name}-${version}
347                } else {
348                        set     atlas_path ${workpath}/${name}-${version}-${arch}
349                }
350
351                set                     lib_dir ${atlas_path}/build/lib
352                make_dylib      libatlas ${lib_dir} ${arch} { -lSystem }
353
354                if { ${ncpu} == "1" } {
355        # there are no threaded libraries (libpt*) on single-core machines
356                        make_dylib      libcblas   ${lib_dir} ${arch} { -latlas -lSystem }
357                        make_dylib      libf77blas ${lib_dir} ${arch} { -lgfortran -latlas -lSystem }
358                } else {
359                        make_dylib      libptcblas   ${lib_dir} ${arch} { -latlas -lSystem }
360                        make_dylib      libptf77blas ${lib_dir} ${arch} { -lgfortran -latlas -lSystem }
361                }
362
363                make_dylib      liblapack ${lib_dir} ${arch} { -lf77blas -lcblas -latlas -lgfortran -lgcc_s.1 -lSystem }
364        }
365}
366
367pre-destroot {
368        if { [variant_isset universal] } {
369                set     archs ${universal_archs_to_use}
370        } else {
371                set     archs ${build_arch}
372        }
373
374        foreach arch ${archs} {
375                if { ! [variant_isset universal] } {
376                        set     atlas_path  ${workpath}/${name}-${version}
377                        set     dest_path   ${destroot}${prefix}/lib/
378                } else {
379                        set     atlas_path ${workpath}/${name}-${version}-${arch}
380                        set     dest_path  ${destroot}-${arch}${prefix}/lib/
381                }
382
383                set             lib_dir ${atlas_path}/build/lib
384                file    mkdir ${dest_path}
385                eval    xinstall -m 755 [glob ${lib_dir}/*.dylib] ${dest_path}
386        }
387}
388
389post-destroot {
390        if { ![file exists ${destroot}${prefix}/lib/libcblas.dylib] && [file exists ${destroot}${prefix}/lib/libptcblas.dylib]} {
391                ln -s libptcblas.dylib ${destroot}${prefix}/lib/libcblas.dylib
392        }
393        if { ![file exists ${destroot}${prefix}/lib/libf77blas.dylib] && [file exists ${destroot}${prefix}/lib/libptf77blas.dylib]} {
394                ln -s libptf77blas.dylib ${destroot}${prefix}/lib/libf77blas.dylib
395        }
396}
397
398livecheck.name          math-atlas
399livecheck.distname      Stable
Note: See TracBrowser for help on using the repository browser.