source: trunk/dports/_resources/port1.0/group/python-1.0.tcl @ 143452

Last change on this file since 143452 was 143452, checked in by mcalhoun@…, 3 years ago

python-1.0.tcl: give Portfiles the option of not modifying destroot.env (see #49948,#34562)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 13.0 KB
Line 
1# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
2# $Id: python-1.0.tcl 143452 2015-12-12 18:02:13Z mcalhoun@macports.org $
3#
4# Copyright (c) 2011 The MacPorts Project
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions are
8# met:
9#
10# 1. Redistributions of source code must retain the above copyright
11#    notice, this list of conditions and the following disclaimer.
12# 2. Redistributions in binary form must reproduce the above copyright
13#    notice, this list of conditions and the following disclaimer in the
14#    documentation and/or other materials provided with the distribution.
15# 3. Neither the name of The MacPorts Project nor the names of its
16#    contributors may be used to endorse or promote products derived from
17#    this software without specific prior written permission.
18#
19# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30#
31
32# Usage:
33# name should be of the form py-foo for modules
34# subports pyXY-foo are declared for each XY in python.versions
35
36# for apps (i.e. not named py-foo), no subports will be defined
37# only the python.default_version will be used
38# you can change that in variants if you want
39
40# options:
41# python.versions: which versions this module supports, e.g. "26 27 31"
42#   always set this (even if you have your own subport blocks)
43# python.default_version: which version will be installed if the user asks
44#   for py-foo rather than pyXY-foo
45# python.consistent_destroot: set consistent environment values in build and destroot phases
46#
47# Note: setting these options requires name to be set beforehand
48
49categories      python
50
51use_configure   no
52# we want the default universal variant added despite not using configure
53universal_variant yes
54
55build.target    build
56
57pre-destroot    {
58    xinstall -d -m 755 ${destroot}${prefix}/share/doc/${subport}/examples
59}
60
61# python.rootname: The "proper" name of the software. For a module
62#   pyXY-foo, this defaults to "foo"; for an app "foobar", this defaults
63#   to "foobar".
64
65options python.rootname
66default python.rootname {[regsub ^py- [option name] ""]}
67
68options python.versions python.version python.default_version
69option_proc python.versions python_set_versions
70default python.default_version {[python_get_default_version]}
71default python.version {[python_get_version]}
72
73# see #34562
74options python.consistent_destroot
75default python.consistent_destroot yes
76
77proc python_get_version {} {
78    if {[string match py-* [option name]]} {
79        return [string range [option subport] 2 3]
80    } else {
81        return [option python.default_version]
82    }
83}
84proc python_get_default_version {} {
85    global python.versions
86    if {[info exists python.versions]} {
87        if {[lsearch -exact ${python.versions} 27] != -1} {
88            return 27
89        } else {
90            return [lindex ${python.versions} end]
91        }
92    } else {
93        return 27
94    }
95}
96
97proc python_set_versions {option action args} {
98    if {$action ne "set"} {
99        return
100    }
101    global name subport python._addedcode
102    if {[string match py-* $name]} {
103        foreach v [option $option] {
104
105            subport py${v}[string trimleft $name py] { depends_lib-append port:python${v} }
106        }
107        if {$subport eq $name || $subport eq ""} {
108            # set up py-foo as a stub port that depends on the default pyXY-foo
109            fetch {}
110            checksum {}
111            extract {}
112            supported_archs noarch
113            global python.default_version python.version
114            unset python.version
115            depends_lib port:py${python.default_version}[string trimleft $name py]
116            patch {}
117            build {}
118            destroot {
119                system "echo $name is a stub port > ${destroot}${prefix}/share/doc/${name}/README"
120            }
121        } else {
122            set addcode 1
123        }
124    } else {
125        set addcode 1
126    }
127    if {[info exists addcode] && ![info exists python._addedcode]} {
128        pre-build {
129            if {${python.add_archflags}} {
130                if {[variant_exists universal] && [variant_isset universal]} {
131                    build.env-append    CFLAGS="${configure.universal_cflags}" \
132                                        OBJCFLAGS="${configure.universal_cflags}" \
133                                        CXXFLAGS="${configure.universal_cxxflags}" \
134                                        LDFLAGS="${configure.universal_ldflags}"
135                } else {
136                    build.env-append    CFLAGS="${configure.cc_archflags}" \
137                                        OBJCFLAGS="${configure.objc_archflags}" \
138                                        CXXFLAGS="${configure.cxx_archflags}" \
139                                        FFLAGS="${configure.f77_archflags}" \
140                                        F90FLAGS="${configure.f90_archflags}" \
141                                        FCFLAGS="${configure.fc_archflags}" \
142                                        LDFLAGS="${configure.ld_archflags}"
143                }
144            }
145            if {${python.set_compiler}} {
146                foreach var {cc objc cxx fc f77 f90} {
147                    if {[set configure.${var}] ne ""} {
148                        build.env-append [string toupper $var]="[set configure.${var}]"
149                    }
150                }
151            }
152        }
153        pre-destroot {
154            if {${python.add_archflags} && ${python.consistent_destroot}} {
155                if {[variant_exists universal] && [variant_isset universal]} {
156                    destroot.env-append CFLAGS="${configure.universal_cflags}" \
157                                        OBJCFLAGS="${configure.universal_cflags}" \
158                                        CXXFLAGS="${configure.universal_cxxflags}" \
159                                        LDFLAGS="${configure.universal_ldflags}"
160                } else {
161                    destroot.env-append CFLAGS="${configure.cc_archflags}" \
162                                        OBJCFLAGS="${configure.objc_archflags}" \
163                                        CXXFLAGS="${configure.cxx_archflags}" \
164                                        FFLAGS="${configure.f77_archflags}" \
165                                        F90FLAGS="${configure.f90_archflags}" \
166                                        FCFLAGS="${configure.fc_archflags}" \
167                                        LDFLAGS="${configure.ld_archflags}"
168                }
169            }
170            if {${python.set_compiler} && ${python.consistent_destroot}} {
171                foreach var {cc objc cxx fc f77 f90} {
172                    if {[set configure.${var}] ne ""} {
173                        destroot.env-append [string toupper $var]="[set configure.${var}]"
174                    }
175                }
176            }
177        }
178        post-destroot {
179            if {${python.link_binaries}} {
180                foreach bin [glob -nocomplain -tails -directory "${destroot}${python.prefix}/bin" *] {
181                    if {[catch {file type "${destroot}${prefix}/bin/${bin}${python.link_binaries_suffix}"}]} {
182                        ln -s "${python.prefix}/bin/${bin}" "${destroot}${prefix}/bin/${bin}${python.link_binaries_suffix}"
183                    }
184                }
185            }
186            if {${python.move_binaries}} {
187                foreach bin [glob -nocomplain -tails -directory "${destroot}${prefix}/bin" *] {
188                    move ${destroot}${prefix}/bin/${bin} \
189                        ${destroot}${prefix}/bin/${bin}${python.move_binaries_suffix}
190                }
191            }
192        }
193        set python._addedcode 1
194    }
195}
196
197option_proc python.default_version python_set_default_version
198proc python_set_default_version {option action args} {
199    if {$action ne "set"} {
200        return
201    }
202    global name subport python.default_version
203    if {[string match py-* $name]} {
204        if {$subport eq $name || $subport eq ""} {
205            depends_lib port:py${python.default_version}[string trimleft $name py]
206        }
207    } else {
208        python.versions ${python.default_version}
209        depends_lib-append port:python[option python.default_version]
210    }
211}
212
213
214options python.branch python.prefix python.bin python.lib python.libdir \
215        python.include python.pkgd
216# for pythonXY, python.branch is X.Y
217default python.branch {[string range ${python.version} 0 end-1].[string index ${python.version} end]}
218default python.prefix {[python_get_defaults prefix]}
219default python.bin  {[python_get_defaults bin]}
220default python.lib  {[python_get_defaults lib]}
221default python.pkgd {[python_get_defaults pkgd]}
222default python.libdir {${python.prefix}/lib/python${python.branch}}
223default python.include  {[python_get_defaults include]}
224
225default build.cmd       {"${python.bin} setup.py [python_get_defaults setup_args]"}
226default destroot.cmd    {"${python.bin} setup.py [python_get_defaults setup_args]"}
227default destroot.destdir {"--prefix=[python_get_defaults setup_prefix] --root=${destroot}"}
228
229proc python_get_defaults {var} {
230    global python.version python.branch prefix python.prefix
231    switch -- $var {
232        prefix {
233            global build_arch frameworks_dir
234            set ret "${frameworks_dir}/Python.framework/Versions/${python.branch}"
235            if {${python.version} == 25 || (${python.version} == 24 &&
236                ![file isfile ${ret}/include/python${python.branch}/Python.h] &&
237                ([file isfile ${prefix}/include/python${python.branch}/Python.h]
238                || [string match *64* $build_arch]))} {
239                set ret $prefix
240            }
241            return $ret
242        }
243        bin {
244            if {${python.version} != 24} {
245                return "${python.prefix}/bin/python${python.branch}"
246            } else {
247                return "${prefix}/bin/python${python.branch}"
248            }
249        }
250        include {
251            set inc_dir "${python.prefix}/include/python${python.branch}"
252            if {[file exists ${inc_dir}]} {
253                return ${inc_dir}
254            } else {
255                # look for "${inc_dir}*" and pick the first one found;
256                # make assumptions if none are found
257                if {[catch {set inc_dirs [glob ${inc_dir}*]}]} {
258                    if {${python.version} < 30} {
259                        return ${inc_dir}
260                    } else {
261                        return ${inc_dir}m
262                    }
263                } else {
264                    return [lindex ${inc_dirs} 0]
265                }
266            }
267        }
268        lib {
269            if {${python.version} != 24 && ${python.version} != 25} {
270                return "${python.prefix}/Python"
271            } else {
272                return "${prefix}/lib/lib${python.branch}.dylib"
273            }
274        }
275        pkgd {
276            if {${python.version} != 24} {
277                return "${python.prefix}/lib/python${python.branch}/site-packages"
278            } else {
279                return "${prefix}/lib/python${python.branch}/site-packages"
280            }
281        }
282        setup_args {
283            if {${python.version} != 24} {
284                return "--no-user-cfg"
285            } else {
286                return ""
287            }
288        }
289        setup_prefix {
290            if {${python.version} != 24} {
291                return "${python.prefix}"
292            } else {
293                return "${prefix}"
294            }
295        }
296        link_binaries {
297            if {${python.version} != 24 && ${python.version} != 25} {
298                return yes
299            } else {
300                return no
301            }
302        }
303        move_binaries {
304            if {${python.version} == 24 || ${python.version} == 25} {
305                return yes
306            } else {
307                return no
308            }
309        }
310        binary_suffix {
311            if {[string match py-* [option name]]} {
312                return -${python.branch}
313            } else {
314                return ""
315            }
316        }
317        default {
318            error "unknown option $var"
319        }
320    }
321}
322
323options python.add_archflags
324default python.add_archflags yes
325options python.set_compiler
326default python.set_compiler yes
327
328options python.link_binaries python.link_binaries_suffix
329default python.link_binaries {[python_get_defaults link_binaries]}
330default python.link_binaries_suffix {[python_get_defaults binary_suffix]}
331
332options python.move_binaries python.move_binaries_suffix
333default python.move_binaries {[python_get_defaults move_binaries]}
334default python.move_binaries_suffix {[python_get_defaults binary_suffix]}
Note: See TracBrowser for help on using the repository browser.