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

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

Avoid ATLAS to use plain 'gcc' despite configuration orders (#30750)

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