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

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

Correct a bug on Tiger (hw.cpufamily is not available)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 11.9 KB
Line 
1# $Id: Portfile 82585 2011-08-16 08:04:22Z 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 && [exec sysctl -n hw.optional.avx1_0] == 1) || \
174         (${os.major} > 8 && [exec sysctl -n hw.cpufamily] == 1418770316) } {
175        # Corei2 is not supported yet because gcc4.5 does not
176        # support AVX instructions and gcc4.6 does not compile yet.
177        # Set CPU to Corei1 instead
178        configure.args-append -A 18
179}
180
181if { [variant_isset universal] } {
182        configure.universal_args-delete                 --disable-dependency-tracking
183        configure.args-delete                                   --cc=${configure.cc} \
184                                                                                        -b ${my_arch} \
185                                                                                        -Fa alg -fPIC
186                                       
187        lappend merger_configure_args(ppc)              --cc='${configure.cc} -m32' \
188                                                                                        -b 32 \
189                                                                                        -A 4 \
190                                                                                        -t 0 \
191                                                                                        -s gas_ppc \
192                                                                                        -Fa alg '-fPIC -m32 \
193                                                                                        -force_cpusubtype_ALL'
194        lappend merger_configure_args(ppc64)    --cc='${configure.cc} -m64' \
195                                                                                        -b 64 \
196                                                                                        -A 5 \
197                                                                                        -t 0 \
198                                                                                        -s gas_ppc \
199                                                                                        -Fa alg '-fPIC -m64 \
200                                                                                        -force_cpusubtype_ALL'
201        lappend merger_configure_args(i386)     --cc='${configure.cc} -m32' \
202                                                                                        -b 32 \
203                                                                                        -A 15 \
204                                                                                        -s gas_x86_32 \
205                                                                                        -Fa alg '-fPIC -m32'
206        lappend merger_configure_args(x86_64)   --cc='${configure.cc} -m64' \
207                                                                                        -b 64 \
208                                                                                        -s gas_x86_64 \
209                                                                                        -Fa alg '-fPIC -m64'
210} else {
211        lappend merger_configure_args(ppc)
212        lappend merger_configure_args(ppc64)
213        lappend merger_configure_args(i386)
214        lappend merger_configure_args(x86_64)
215}
216
217build.env-append        "CC=${configure.cc} CXX=${configure.cxx}"
218
219# we are configuring from the build directory
220configure.dir                   ${workpath}/${name}-${version}/build
221configure.cmd                   ../configure
222
223
224# change the default compilers to those of gcc and make into shared library
225extract {
226        # extract atlas and move to a consistent working directory name
227        system  "cd ${workpath} && bunzip2 -dc ${distpath}/${atlasdist} | \
228                         gnutar --no-same-owner -xf -"
229        system  "mv ${workpath}/ATLAS ${workpath}/${name}-${version}"
230}
231
232post-patch {
233        reinplace       "s|__MACPORTS_GCC__|${configure.cc}|g" \
234                                 ${workpath}/${name}-${version}/CONFIG/src/SpewMakeInc.c
235       
236        # ar -r / ranlib / libtool seems to be buggy, so we have to supply a
237        # workaround to link properly.
238        reinplace       "s|XXXXX|${filespath}/ar2|" \
239                                ${workpath}/${name}-${version}/CONFIG/src/SpewMakeInc.c
240}
241
242pre-configure {
243
244        # i386 builds must be patch otherwise threading does not work.
245        if { [variant_isset universal] } {
246                foreach arch ${universal_archs_to_use} {
247                        copy ${workpath}/${name}-${version} \
248                         ${workpath}/${name}-${version}-${arch}
249                        if { ${arch} == "i386" } {
250                                ui_msg  "Patching Make.ttune for i386 universal build"
251                                system  "cd ${workpath}/${name}-${version}-i386/makes && \
252                                                 patch < ${filespath}/patch-Make_ttune-i386.diff"
253                        }
254                }
255        }
256       
257        if { ${build_arch} == "i386" && ! [variant_isset universal] } {
258                ui_msg  "Patching Make.ttune for i386 build"
259                system  "cd ${workpath}/${name}-${version}/makes && \
260                                 patch < ${filespath}/patch-Make_ttune-i386.diff"
261        }
262
263        reinplace       "s|cc=gcc|cc=${configure.cc}|g" ${worksrcpath}/configure
264        reinplace       "s|-no-cpp-precomp||g" \
265                                 ${workpath}/${name}-${version}/CONFIG/src/atlcomp.txt
266
267        # Get some system specific variables for maximum optimization
268        set                     cpufreq [expr {[exec sysctl -n hw.cpufrequency]/1000000}]
269        ui_debug        "Setting CPU Frequency for: ${cpufreq}"
270
271        if { ${os.arch} == "powerpc" } {
272                configure.args-append   -D c -DWALL
273        } else {
274                configure.args-append   -D c -DPentiumCPS=${cpufreq}
275        }
276
277        if { [variant_isset universal] } {
278                set     archs ${universal_archs_to_use}
279        } else {
280                set     archs ${build_arch}
281        }
282
283        foreach arch ${archs} {
284                if { ! [variant_isset universal] } {
285                        set     atlas_path ${workpath}/${name}-${version}
286                } else {
287                        set     atlas_path ${workpath}/${name}-${version}-${arch}
288                }
289
290                file mkdir ${atlas_path}/build
291        }
292}
293
294post-configure {
295        if { [variant_isset universal] } {
296                set     archs ${universal_archs_to_use}
297        } else {
298                set     archs ${build_arch}
299        }
300
301        foreach arch ${archs} {
302                if { ! [variant_isset universal] } {
303                        set     atlas_path ${workpath}/${name}-${version}
304                } else {
305                        set     atlas_path ${workpath}/${name}-${version}-${arch}
306                }
307
308                # recursively remove directories
309                ui_debug        "patch to recursively remove directories on clean"
310                reinplace       "s|rm -f|rm -rf|g" ${atlas_path}/build/Makefile
311
312                #Second patch for i386
313                if { ${arch} == "i386" } {
314                        system  "cd ${atlas_path}/build/src/threads && \
315                                         patch < ${filespath}/patch-threads-i386.diff"
316                        system  "cd ${atlas_path}/build/src/pthreads/misc && \
317                                         patch < ${filespath}/patch-Makefile_pthreads_misc.diff"
318                }
319        }
320}
321
322proc make_dylib { lib lib_dir arch libs } {
323        global destroot prefix gccnumber
324        system "cd ${lib_dir} && \
325                        ( test ! -e ${lib}.a || \
326                          /usr/bin/ld -arch ${arch} -dynamic -dylib -single_module -dead_strip \
327                          -x -all_load -L. -L${prefix}/lib/gcc${gccnumber}/${arch} \ -L${prefix}/lib/gcc${gccnumber} -ldylib1.o \
328                          -dylib_install_name ${prefix}/lib/${lib}.dylib \
329                          ${lib}.a -o ${lib}.dylib ${libs} )"
330}
331
332post-build {
333  # We have to manually create the dylib shared libs as the default build does not do this
334
335  set ncpu [exec sysctl -n hw.ncpu]
336
337        if { [variant_isset universal] } {
338                set     archs ${universal_archs_to_use}
339        } else {
340                set     archs ${build_arch}
341        }
342
343        foreach arch ${archs} {
344                if { ! [variant_isset universal] } {
345                        set     atlas_path  ${workpath}/${name}-${version}
346                } else {
347                        set     atlas_path ${workpath}/${name}-${version}-${arch}
348                }
349
350                set                     lib_dir ${atlas_path}/build/lib
351                make_dylib      libatlas ${lib_dir} ${arch} { -lSystem }
352
353                if { ${ncpu} == "1" } {
354        # there are no threaded libraries (libpt*) on single-core machines
355                        make_dylib      libcblas   ${lib_dir} ${arch} { -latlas -lSystem }
356                        make_dylib      libf77blas ${lib_dir} ${arch} { -lgfortran -latlas -lSystem }
357                } else {
358                        make_dylib      libptcblas   ${lib_dir} ${arch} { -latlas -lSystem }
359                        make_dylib      libptf77blas ${lib_dir} ${arch} { -lgfortran -latlas -lSystem }
360                }
361
362                make_dylib      liblapack ${lib_dir} ${arch} { -lf77blas -lcblas -latlas -lgfortran -lgcc_s.1 -lSystem }
363        }
364}
365
366pre-destroot {
367        if { [variant_isset universal] } {
368                set     archs ${universal_archs_to_use}
369        } else {
370                set     archs ${build_arch}
371        }
372
373        foreach arch ${archs} {
374                if { ! [variant_isset universal] } {
375                        set     atlas_path  ${workpath}/${name}-${version}
376                        set     dest_path   ${destroot}${prefix}/lib/
377                } else {
378                        set     atlas_path ${workpath}/${name}-${version}-${arch}
379                        set     dest_path  ${destroot}-${arch}${prefix}/lib/
380                }
381
382                set             lib_dir ${atlas_path}/build/lib
383                file    mkdir ${dest_path}
384                eval    xinstall -m 755 [glob ${lib_dir}/*.dylib] ${dest_path}
385        }
386}
387
388post-destroot {
389        if { ![file exists ${destroot}${prefix}/lib/libcblas.dylib] && [file exists ${destroot}${prefix}/lib/libptcblas.dylib]} {
390                ln -s libptcblas.dylib ${destroot}${prefix}/lib/libcblas.dylib
391        }
392        if { ![file exists ${destroot}${prefix}/lib/libf77blas.dylib] && [file exists ${destroot}${prefix}/lib/libptf77blas.dylib]} {
393                ln -s libptf77blas.dylib ${destroot}${prefix}/lib/libf77blas.dylib
394        }
395}
396
397livecheck.name          math-atlas
398livecheck.distname      Stable
Note: See TracBrowser for help on using the repository browser.