Can we create proc{} Portfile?

Darren Weber dweber at macports.org
Wed May 13 11:24:28 PDT 2009


On Tue, May 12, 2009 at 10:13 PM, Ryan Schmidt <ryandesign at macports.org>wrote:

>
> On May 12, 2009, at 18:39, Darren Weber wrote:
>
>  On Tue, May 12, 2009 at 3:52 PM, Darren Weber wrote:
>>
>>  Can we create a proc within a Portfile?
>>>
>>
> Yes, you can. You can see the not-quite-finished minivmac v3 portfile in my
> users directory in the repository for an example port that defines a few
> procedures of its own (e.g. to mount a disk image).
>
> http://trac.macports.org/browser/users/ryandesign/minivmac/Portfile#L255
>
>
>  I'm currently using this in several places for the vtk-devel port (to set
>>> different python version variables):
>>>
>>>    set pyver        2.6
>>>    set python       python${pyver}
>>>    set pyport       [join [lrange [split ${python} .] 0 1] ""]
>>>    set pyframe
>>>  ${prefix}/Library/Frameworks/Python.framework/Versions/${pyver}
>>>
>>>
>>> Can we create a global proc in a Portfile?  Something like this:
>>>
>>> proc setPython { major minor } {
>>>    global pyver python pyport pyframe
>>>    set pyver        ${major}.${minor}
>>>    set python       python${pyver}
>>>    set pyport       python${major}${minor}
>>>    set pyframe
>>>  ${prefix}/Library/Frameworks/Python.framework/Versions/${pyver}
>>> }
>>>
>>
>>
>> I've tried something that is not working (it doesn't crash, but it's not
>> effective), i.e.:
>>
>>
>> # Set some default python variables
>> set pyver        2.6
>> set python       python${pyver}
>> set pyport       [join [lrange [split ${python} .] 0 1] ""]
>> set pyframe      Library/Frameworks/Python.framework/Versions/${pyver}
>> global pyver python pyport pyframe
>>
>> # A function to reset the python variables
>> proc setPython { major minor } {
>>    global pyver python pyport pyframe
>>    set pyver        ${major}.${minor}
>>    set python       python${pyver}
>>    set pyport       python${major}${minor}
>>    set pyframe      Library/Frameworks/Python.framework/Versions/${pyver}
>> }
>>
>> variant py25 conflicts py26 requires shared description {python 2.5
>> wrapper} {
>>    pre-configure {
>>        setPython 2 5
>>    }
>>
>
> Here you are calling your setPython proc at pre-configure time.
>
>     #set pyver        2.5
>>    #set python       python${pyver}
>>    #set pyport       [join [lrange [split ${python} .] 0 1] ""]
>>    #set pyframe
>>  ${prefix}/Library/Frameworks/Python.framework/Versions/${pyver}
>>    depends_lib-append \
>>        port:${pyport}
>>
>
> Here you are expecting the pyport variable to have been defined way before
> pre-configure time.
>
> As long as the proc only sets variables, you can call it directly, outside
> of the pre-configure phase, and that might work. (I haven't tried, or
> completely evaluated the rest of your code.)
>
>
>     configure.args-delete \
>>        -DVTK_WRAP_PYTHON:BOOL=OFF
>>    configure.args-append \
>>        -DVTK_WRAP_PYTHON:BOOL=ON \
>>        -DVTK_NO_PYTHON_THREADS:BOOL=OFF \
>>        -DPYTHON_INCLUDE_PATH:FILEPATH=${prefix}/include/${python} \
>>        -DPYTHON_LIBRARY:FILEPATH=${prefix}/lib/lib${python}.dylib \
>>        -DPYTHON_DEBUG_LIBRARY:FILEPATH=${prefix}/lib/lib${python}.dylib \
>>        -DPYTHON_EXECUTABLE:FILEPATH=${prefix}/bin/${python} \
>>        -DVTK_PYTHON_SETUP_ARGS:STRING='--prefix=${prefix}
>> --root=${destroot}'
>>        # The VTK_PYTHON_SETUP_ARGS *MUST* be in single quotes
>>    post-destroot {
>>        # Redefine all the python variables in this clause (they are not
>> carried
>>        # through from the definitions above in the variant).
>>        #set pyver        2.5
>>        #set python       python${pyver}
>>        #set pyport       [join [lrange [split ${python} .] 0 1] ""]
>>        #set pyframe
>>  ${prefix}/Library/Frameworks/Python.framework/Versions/${pyver}
>>        # Reset the name of the vtkpython binary (create a symlink to the
>>        # version specific installation, in case other apps look for
>> vtkpython)
>>        move ${destroot}${prefix}/bin/vtkpython
>> ${destroot}${prefix}/bin/vtk-${branch}-${pyport}
>>        ln -f -s ${destroot}${prefix}/bin/vtk-${branch}-${pyport}
>> ${destroot}${prefix}/bin/vtkpython
>>        # Is it possible to change the python site-package name and have it
>> all work OK?
>>        # from:  /opt/local/lib/python2.6/site-packages/vtk
>>        # to:    /opt/local/lib/python2.6/site-packages/vtk-5.4
>>        # Reset the RPATH for all the python .so files
>>        set buildBinPath ${build.dir}/bin
>>        set vtkLibPath ${prefix}/lib/${distname}
>>        set vtkPythonPackage
>> ${destroot}${prefix}/lib/${python}/site-packages/vtk
>>        foreach f [glob ${vtkPythonPackage}/*.so] {
>>            foreach dep [exec otool -L ${f}] {
>>                if [string match "*libvtk*.dylib" ${dep}] {
>>                    set newdep [strsed ${dep}
>> #${buildBinPath}#${vtkLibPath}#]
>>                    system "install_name_tool -change ${dep} ${newdep}
>> ${f}"
>>                }
>>            }
>>        }
>>    }
>> }
>>
>>
>> What is wrong here?  Does it require global declarations in the variant?
>>
>
> I'm not sure.
>
>
>


The following is working:


# A function to set or reset python variables (defaults to version 2.6)
proc setPython { {major 2} {minor 6} } {
    global pyver python pyport pyframe
    set pyver        ${major}.${minor}
    set python       python${pyver}
    set pyport       python${major}${minor}
    set pyframe      Library/Frameworks/Python.framework/Versions/${pyver}
}
# Initialize the global variables for python26
setPython
# This proc is called from within pyXY variants like this:
#setPython X Y


variant py25 conflicts py26 requires shared description {python 2.5 wrapper}
{
    # Note that python25 is NOT installed as a framework (May 2009)
    setPython 2 5
    depends_lib-append \
        port:${pyport}
    configure.args-delete \
        -DVTK_WRAP_PYTHON:BOOL=OFF
    configure.args-append \
        -DVTK_WRAP_PYTHON:BOOL=ON \
        -DVTK_NO_PYTHON_THREADS:BOOL=OFF \
        -DPYTHON_INCLUDE_PATH:FILEPATH=${prefix}/include/${python} \
        -DPYTHON_LIBRARY:FILEPATH=${prefix}/lib/lib${python}.dylib \
        -DPYTHON_DEBUG_LIBRARY:FILEPATH=${prefix}/lib/lib${python}.dylib \
        -DPYTHON_EXECUTABLE:FILEPATH=${prefix}/bin/${python} \
        -DVTK_PYTHON_SETUP_ARGS:STRING='--prefix=${prefix}
--root=${destroot}'
        # The VTK_PYTHON_SETUP_ARGS *MUST* be in single quotes
    post-destroot {
        setPython 2 5
        # Reset the name of the vtkpython binary (create a symlink to the
        # version specific installation, in case other apps look for
vtkpython)
        move ${destroot}${prefix}/bin/vtkpython
${destroot}${prefix}/bin/vtk-${branch}-${pyport}
        ln -f -s ${destroot}${prefix}/bin/vtk-${branch}-${pyport}
${destroot}${prefix}/bin/vtkpython
        # Reset the RPATH for all the python .so files
        set buildBinPath ${build.dir}/bin
        set vtkLibPath ${prefix}/lib/${distname}
        set vtkSitePackage
${destroot}/${prefix}/lib/${python}/site-packages/vtk
        foreach f [glob ${vtkSitePackage}/*.so] {
            foreach dep [exec otool -L ${f}] {
                if [string match "*libvtk*.dylib" ${dep}] {
                    set newdep [strsed ${dep}
#${buildBinPath}#${vtkLibPath}#]
                    system "install_name_tool -change ${dep} ${newdep} ${f}"
                }
            }
        }
    }
}



Regards,
Darren
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-dev/attachments/20090513/61038e32/attachment-0001.html>


More information about the macports-dev mailing list