[50222] trunk/dports/graphics

Ryan Schmidt ryandesign at macports.org
Mon Apr 27 17:01:27 PDT 2009


On Apr 27, 2009, at 18:27, dweber at macports.org wrote:

> Revision: 50222
>           http://trac.macports.org/changeset/50222
> Author:   dweber at macports.org
> Date:     2009-04-27 16:27:01 -0700 (Mon, 27 Apr 2009)
> Log Message:
> -----------
> The default installation with shared libraries appears to work now;  
> still lots of work to be done on wrapping for java, python, tcl,  
> among other things.
>
> Added Paths:
> -----------
>     trunk/dports/graphics/vtk-devel/
>     trunk/dports/graphics/vtk-devel/Portfile
>
> Added: trunk/dports/graphics/vtk-devel/Portfile
> ===================================================================
> --- trunk/dports/graphics/vtk-devel/ 
> Portfile	                        (rev 0)
> +++ trunk/dports/graphics/vtk-devel/Portfile	2009-04-27 23:27:01  
> UTC (rev 50222)
> @@ -0,0 +1,437 @@
> +# -*- 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
> +# $Id$
> +
> +PortSystem 1.0
> +
> +name        vtk-devel
> +version     5.4.0
> +revision    0
> +
> +set branch	[join [lrange [split ${version} .] 0 1] .]
> +
> +categories  graphics math science devel
> +
> +maintainers dweber openmaintainer
> +
> +description 3D visualization toolkit (www.vtk.org)
> +
> +long_description \
> +An open source, freely available software system for computer  
> graphics, \
> +image processing, and visualization used by thousands of  
> researchers and \
> +developers around the world. VTK consists of a C++ class library,  
> and \
> +several interpreted interface layers including Tcl/Tk, Java, and  
> Python. \
> +default_variants: +examples +testing +tclSys
> +
> +homepage        http://www.vtk.org/
> +master_sites    http://www.vtk.org/files/release/${branch}
> +
> +distname        vtk-${branch}
> +distfiles       vtk-${version}.tar.gz \
> +                vtkdata-${version}.tar.gz
> +
> +checksums       vtk-${version}.tar.gz \
> +                    md5  3e7c6d5c37602c935674d580a8dd43c0 \
> +                    sha1 a227caf932315d944cf72008d75df90dd4c554e7 \
> +                    rmd160 e2140fc35ed974f5fde6b418089554904e197c21 \
> +                vtkdata-${version}.tar.gz \
> +                    md5  283d40f3e499b3a6102d86855d2ca20b \
> +                    sha1 a710227e7f7f25f481a36d2fa14bda49756bd39d \
> +                    ripemd160  
> 160129a0580bd7b70b40d3f7fa61bbd78b586ad8
> +
> +platforms       darwin
> +
> +#depends_build   bin:cmake:cmake
> +depends_build   port:cmake \
> +                port:gmake
> +depends_lib     port:readline

Since this port uses cmake, have you considered using the cmake  
portgroup to simplify it?


> +# Using this dummy stage to inspect macport variables (using 'port  
> -d fetch vtk-devel')
> +#fetch { system "echo ${workbuildpath} && echo ${worksrcpath} &&  
> echo ${destroot}" }
> +
> +
> +# Build in a separate directory from the source
> +set workbuildpath   ${workpath}/${distname}-build
> +post-extract {
> +    system "cd ${workpath}; mv VTK ${distname}; mv VTKData $ 
> {distname}-data;"
> +    system "mkdir ${workbuildpath}"
> +}

You shouldn't use "system" for tasks which can be performed in plain  
Tcl.

move ${workpath}/VTK ${workpath}/${distname}
move ${workpath}/VTKData ${workpath}/${distname}-data
file mkdir ${workbuildpath}


> +configure {
> +    system "cd ${workbuildpath} && ${configure.env} && cmake $ 
> {configure.args} ${worksrcpath}"
> +}

configure.env is not a command; running it by itself doesn't have any  
effect, as far as I know. If you want those environment variables to  
have effect for the cmake command, you would not separate  
configure.env from the cmake command with "&&". However, see below:

> +build {
> +    system "cd ${workbuildpath} && gmake"
> +}
> +destroot {
> +    system "cd ${workbuildpath} && gmake install DESTDIR=${destroot}"
> +}

Why override all these phases? Using the cmake portgroup will take  
care of the configure phase for you, and the build and destroot  
phases are better implemented by just setting the relevant .cmd.

build.cmd gmake
destroot.cmd gmake

Actually you can omit "destroot.cmd gmake" since the default for  
destroot.cmd is the value of build.cmd.


> +# Set the equivalent of ${configure.ldflags} ${configure.cppflags}
> +# cmake also has variables called:
> +# CMAKE_LIBRARY_PATH_FLAG => specify -L compiler options
> +# CMAKE_LINK_LIBRARY_FLAG => specify -l compiler options
> +configure.env \
> +    LDFLAGS=-L${prefix}/lib \
> +    CXXFLAGS=-I${prefix}/include

MacPorts already sets LDFLAGS, CXXFLAGS and other variables for you.

> +# To double-check all the cmake variable settings after the configure
> +#cd ${workbuildpath}
> +#sudo cmake -LAH ../vtk-${branch} > ~/cmake_vars.txt
> +# Similarly, for an interactive configuration with ccmake, try:
> +#cd ${workbuildpath}
> +#sudo ccmake ../vtk-${branch}
> +
> +configure.args \
> +    -DBUILD_DOCUMENTATION:BOOL=OFF \
> +    -DBUILD_EXAMPLES:BOOL=OFF \
> +    -DBUILD_TESTING:BOOL=OFF \
> +    -DBUILD_SHARED_LIBS:BOOL=OFF \
> +    -DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo \
> +    -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \
> +    -DCMAKE_INSTALL_PREFIX:PATH=${prefix} \
> +    -DCMAKE_INCLUDE_PATH:PATH=${prefix}/include \
> +    -DCMAKE_LIBRARY_PATH:PATH=${prefix}/lib \
> +    -DCMAKE_INSTALL_NAME_DIR:STRING=${prefix}/lib/${distname} \
> +    -DVTK_DATA_ROOT:PATH=${prefix}/share/${distname}-data \
> +    -DVTK_DEBUG_LEAKS:BOOL=ON \
> +    -DVTK_USE_HYBRID:BOOL=ON \
> +    -DVTK_USE_COCOA:BOOL=ON \
> +    -DVTK_USE_CARBON:BOOL=OFF \
> +    -DVTK_USE_X:BOOL=OFF \
> +    -DVTK_USE_GUISUPPORT:BOOL=ON \
> +    -DVTK_USE_INFOVIS:BOOL=ON \
> +    -DVTK_USE_PARALLEL:BOOL=ON \
> +    -DVTK_USE_RENDERING:BOOL=ON \
> +    -DVTK_USE_VIEWS:BOOL=ON \
> +    -DVTK_WRAP_TCL:BOOL=OFF \
> +    -DVTK_WRAP_JAVA:BOOL=OFF \
> +    -DVTK_WRAP_PYTHON:BOOL=OFF
> +
> +
> +    #-DVTK_USE_RPATH:BOOL=OFF \
> +    #-DVTK_REQUIRED_EXE_LINKER_FLAGS:STRING=-rpath ${prefix}/lib \
> +    #-DCMAKE_EXE_LINKER_FLAGS:STRING=-rpath ${prefix}/lib \
> +
> +
> +
> +# PLATFORMS: platform darwin <version>
> +# Can be used to handle different tasks depending
> +# on the version of Mac OS X.  The version can be:
> +# 6 for 10.2 Jaguar,
> +# 7 for 10.3 Panther,
> +# 8 for 10.4 Tiger, or
> +# 9 for 10.5 Leopard.
> +
> +platform darwin 8 {
> +    # I have not tested this [dweber]
> +    depends_build-append \
> +        port:gcc40
> +    configure.env-append \
> +        CC=/usr/bin/gcc-4.0 \
> +        CXX=/usr/bin/cpp-4.0 \
> +        MACOSX_DEPLOYMENT_TARGET=10.4
> +}

Why require port gcc40? Is the gcc 4.0.1 Apple provides with Xcode  
insufficient? If so, and a MacPorts gcc is truly required, you should  
use the latest stable version, which is currently gcc44.

MacPorts already sets MACOSX_DEPLOYMENT_TARGET for you.

> +#VTK_REQUIRED_OBJCXX_FLAGS "-fobjc-gc"
> +# When building VTK with Cocoa, in 10.5, Cocoa supports two memory  
> models:
> +# reference counting and garbage collection. This compiler flag  
> lets it work with both.
> +platform darwin 9 {
> +    configure.env-append \
> +        MACOSX_DEPLOYMENT_TARGET=10.5
> +    configure.args-append \
> +        VTK_REQUIRED_OBJCXX_FLAGS="-fobjc-gc"
> +}
> +
> +
> +# ------------------------------------------------------------------
> +# VARIANTS
> +#
> +# variant name [requires variant] [conflicts variant] [description  
> description]
> +
> +default_variants \
> +    +cocoa \
> +    +data \
> +    +examples \
> +    +shared
> +
> +variant data description {Install the example data [default]} {
> +}
> +
> +
> +variant doc description {Build the doxygen documentation} {
> +    depends_build-append \
> +        port:doxygen
> +    configure.args-append \
> +        -DBUILD_DOCUMENTATION:BOOL=ON
> +}
> +
> +
> +variant examples description {Build and install VTK examples  
> [default]} {
> +    configure.args-delete \
> +        -DBUILD_EXAMPLES:BOOL=OFF
> +    configure.args-append \
> +        -DBUILD_EXAMPLES:BOOL=ON
> +}

Having fewer variants is better, and since you already make +data and  
+examples default variants, why not just incorporate them into the  
port proper and remove the variants?

I would also prefer that the port have no default variants. If  
something should be in the port by default, make it so; if necessary,  
offer variants to turn the feature off again, e.g. a "no_shared" or a  
"no_data" variant. However think carefully about whether anyone  
really needs to turn that feature off. If not, don't give the option.


> +variant testing description {Build VTK tests} {
> +    configure.args-delete \
> +        -DBUILD_TESTING:BOOL=OFF
> +    configure.args-append \
> +        -DBUILD_TESTING:BOOL=ON
> +}
> +
> +
> +variant tclSys conflicts tclMacPorts description {Tcl Wrapper  
> (System Tcl/Tk)} {

Having capital letters in variant names is unusual. Other ports use  
underscore-separated lowercase words. To distinguish between a  
MacPorts library and a system library, I would prefer that the  
variant that uses the MacPorts library have no special suffix, and  
the variant that uses the system library have the _apple suffix.

variant tcl_apple conflicts tcl {...}
variant tcl conflicts tcl_apple {...}

> +    configure.args-delete \
> +        -DVTK_WRAP_TCL:BOOL=OFF
> +    configure.args-append \
> +        -DVTK_WRAP_TCL:BOOL=ON \
> +        -DTCL_TCLSH:FILEPATH=/usr/bin/tclsh \
> +        -DTCL_INCLUDE_PATH:PATH=/System/Library/Frameworks/ 
> Tcl.framework/Headers \
> +        -DTCL_LIBRARY:FILEPATH=/System/Library/Frameworks/ 
> tcl.framework \
> +        -DTK_INCLUDE_PATH:PATH=/System/Library/Frameworks/ 
> Tk.framework/Headers \
> +        -DTK_LIBRARY:FILEPATH=/System/Library/Frameworks/tk.framework
> +}
> +
> +# This provides a tcl variant that uses the macports tcl  
> installation. (It seems
> +# vtk 5.2 does not work with tcl8.5 - macports has 8.5, as of Sep  
> 2008).
> +variant tclMacPorts conflicts tclSys description {Tcl Wrapper  
> (MacPorts Tcl/Tk)} {
> +    depends_lib-append \
> +        port:tcl \
> +        port:tk
> +    configure.args-delete \
> +        -DVTK_WRAP_TCL:BOOL=OFF
> +    configure.args-append \
> +        -DVTK_WRAP_TCL:BOOL=ON \
> +        -DTCL_TCLSH:FILEPATH=${prefix}/bin/tclsh \
> +        -DTCL_INCLUDE_PATH:PATH=${prefix}/include \
> +        -DTCL_LIBRARY:FILEPATH=${prefix}/lib \
> +        -DTK_INCLUDE_PATH:PATH=${prefix}/include \
> +        -DTK_LIBRARY:FILEPATH=${prefix}/lib
> +}
> +# /opt/local/lib/tclConfig.sh
> +# /opt/local/lib/tkConfig.sh
> +
> +
> +variant java description {Java wrapping for VTK} {
> +    configure.args-append \
> +        -DVTK_WRAP_JAVA:BOOL=ON
> +}

This requires no additional dependency? If so, why not enable this  
feature always and remove the variant?


> +variant python requires shared description {Python Wrapping for  
> VTK} {
> +   depends_build-append    port:python26
> +   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/python2.6 \
> +       -DPYTHON_LIBRARY:FILEPATH=${prefix}/lib/libpython2.6.dylib \
> +       -DPYTHON_DEBUG_LIBRARY:FILEPATH=${prefix}/lib/ 
> libpython2.6.dylib \
> +       -DPYTHON_EXECUTABLE:FILEPATH=${prefix}/bin/python2.6 \
> +       -DVTK_PYTHON_SETUP_ARGS:STRING="--prefix=${prefix} --root=$ 
> {destdir}"
> +}

You may want to call the variant python26 so that you can later offer  
other variants for other versions of python.


> +
> +
> +# ---------------------------------------------------------
> +# There is a problem with RPATH config for the shared libs.
> +# Until this is fixed, it will not be a default variant.

But you have made it a default variant. See above.

> +variant shared description {Build shared libraries [default]} {
> +    configure.args-delete \
> +        -DBUILD_SHARED_LIBS:BOOL=OFF
> +    configure.args-append \
> +        -DBUILD_SHARED_LIBS:BOOL=ON \
> +        -DCMAKE_SKIP_BUILD_RPATH:BOOL=ON \
> +        -DCMAKE_BUILD_WITH_INSTALL_RPATH:BOOL=ON \
> +        -DCMAKE_INSTALL_RPATH:STRING=${prefix}/lib/${distname} \
> +        -DVTK_USE_RPATH:BOOL=ON
> +}
> +
> +# CMAKE_EXE_LINKER_FLAGS:STRING=
> +
> +#  -DVTK_INSTALL_LIB_DIR:STRING=${prefix}/lib/vtk-5.2
> +#  -DVTK_USE_RPATH=ON \
> +#  -DCMAKE_BUILD_WITH_INSTALL_RPATH:BOOL=OFF \
> +
> +# -DCMAKE_BUILD_WITH_INSTALL_RPATH:BOOL=ON \
> +# Cannot use this RPATH setting because the build tree is
> +# used to bootstrap the build process, eg:
> +#
> +#[  4%] Generating vtkGLSLShaderLibrary.h
> +#dyld: Library not loaded: "/opt/local/lib/vtk-5.2"/libvtksys. 
> 5.2.dylib
> +#  Referenced from: /opt/local/var/macports/build/ 
> _Users_dweber_ports_graphics_vtk5/work/VTK/Utilities/ 
> MaterialLibrary/../../bin/ProcessShader
> +#  Reason: image not found
> +
> +# Might need variants for carbon vs. cocoa.  When doing a shared  
> library
> +# build, must use carbon, not cocoa.
> +
> +
> +variant carbon conflicts {cocoa x11} description {Build with  
> Carbon} {

So we have the choice between carbon, cocoa, and x11, and only 1 can  
be chosen. But you have made cocoa a default variant. You should only  
make cocoa the default variant if x11 or carbon have not already been  
chosen. See any of several ports for examples of how to handle this,  
such as minivmac or pdftk.

> +    configure.args-delete   \
> +        -DVTK_USE_COCOA:BOOL=ON \
> +        -DVTK_USE_CARBON:BOOL=OFF
> +    configure.args-append   \
> +        -DVTK_USE_COCOA:BOOL=OFF \
> +        -DVTK_USE_CARBON:BOOL=ON \
> +}
> +
> +
> +variant cocoa conflicts {carbon x11} description {Build with Cocoa  
> [Default]} {
> +}
> +
> +
> +variant x11 conflicts {cocoa carbon} description {Build with X11} {
> +    #depends_build-append    \
> +        port:xorg-libs \
> +        port:xorg-proto
> +    configure.args-delete   \
> +        -DVTK_USE_COCOA:BOOL=ON \
> +        -DVTK_USE_X:BOOL=OFF
> +    configure.args-append   \
> +        -DVTK_USE_COCOA:BOOL=OFF \
> +        -DVTK_USE_X:BOOL=ON \
> +        -DOPENGL_gl_LIBRARY:FILEPATH=${x11prefix}/lib/libGL.dylib \
> +        -DOPENGL_glu_LIBRARY:FILEPATH=${x11prefix}/lib/libGLU.dylib \
> +        -DOPENGL_INCLUDE_DIR:PATH=${x11prefix}/include \
> +        -DVTK_GLEXT_FILE:FILEPATH=${x11prefix}/include/GL/glext.h \
> +        -DVTK_GLXEXT_FILE:FILEPATH=${x11prefix}/include/GL/glxext.h
> +        -DVTK_OPENGL_HAS_OSMESA:BOOL=OFF
> +}

You're using items from ${x11prefix} but we now have X11 in $ 
{prefix}. The mesa port provides libGL.dylib and so forth. As I see  
you realize below. We have had the convention of the +x11 variant  
using the MacPorts x11 and the +system_x11 variant using the Apple  
X11. Though we may remove +system_x11 soon and no longer offer the  
option.


> +# This mesaOpenGL variant may not require the x11 variant, but the
> +# assumption here is that it's more likely to work with it than  
> without it.
> +
> +variant mesaOpenGL requires {x11} description {Use mesa OpenGL} {
> +    depends_build-append \
> +        port:mesa
> +    configure.args-append \
> +        -DOPENGL_INCLUDE_DIR:PATH=${prefix}/include \
> +        -DOPENGL_gl_LIBRARY:FILEPATH=${prefix}/lib/libGL.dylib \
> +        -DOPENGL_glu_LIBRARY:FILEPATH=${prefix}/lib/libGLU.dylib \
> +        -DVTK_GLEXT_FILE:FILEPATH=${prefix}/include/GL/glext.h \
> +        -DVTK_GLXEXT_FILE:FILEPATH=${prefix}/include/GL/glxext.h \
> +        -DVTK_OPENGL_HAS_OSMESA:BOOL=ON
> +}
> +
> +
> +variant mpi description {Use message passing interface (MPI) for  
> parallel support} {
> +    depends_lib-append \
> +        port:mpich2
> +    configure.args-append \
> +        -DVTK_USE_MPI:BOOL=ON
> +}
> +
> +
> +variant mysql description {Build the MySQL driver for  
> vtkSQLDatabase} {
> +    depends_build-append \
> +        port:mysql5

Please use path:bin/mysql_config5:mysql5 for any mysql5 dependency,  
so that mysql5-devel would also be able to satisfy it.

> +    configure.args-append \
> +        -DVTK_USE_MYSQL:BOOL=ON
> +}
> +
> +
> +variant pgsql description {Build the PostgreSQL driver for  
> vtkSQLDatabase} {
> +    depends_build-append \
> +        port:libpqxx
> +    configure.args-append \
> +        -DVTK_USE_POSTGRES:BOOL=ON
> +}
> +
> +
> +variant odbc description {Build the ODBC database interface} {
> +    depends_build-append \
> +        port:unixODBC
> +    configure.args-append \
> +        -DVTK_USE_ODBC:BOOL=ON
> +}
> +
> +
> +# ------------------------------------------------------------------
> +# POST DESTROOT
> +
> +set vtkDocPath  ${destroot}${prefix}/share/doc/${distname}
> +set vtkDataPath ${destroot}${prefix}/share/${distname}-data
> +
> +# Define variables used by install_name_tool for
> +# the shared libary installation RPATH
> +set libdestStr ${destroot}${prefix}/bin/libvtk
> +set libinstStr ${prefix}/lib/${distname}/libvtk
> +
> +post-destroot {
> +
> +    # Provide data files
> +    xinstall -d -m 0755 ${vtkDataPath}
> +    system "tar -C ${vtkDataPath} -zxvf ${distpath}/vtkdata-$ 
> {version}.tar.gz"
> +    system "mv ${vtkDataPath}/VTKData/* ${vtkDataPath}/"
> +    system "rm -rf ${vtkDataPath}/VTKData"
> +
> +    # Add basic documentation
> +    xinstall -d -m 0755 ${vtkDocPath}
> +    file copy ${worksrcpath}/README.html   ${vtkDocPath}
> +    file copy ${worksrcpath}/Copyright.txt ${vtkDocPath}
> +    file copy ${worksrcpath}/Testing.txt   ${vtkDocPath}
> +
> +    # Copy examples to the documentation path
> +    if {[variant_isset examples]} {
> +        file copy ${worksrcpath}/Examples ${vtkDocPath}
> +    }
> +
> +    # Provide some tests in the documentation path
> +    if {[variant_isset testing]} {
> +        foreach x { \
> +            CommonCxxTests \
> +            FilteringCxxTests \
> +            GenericFilteringCxxTests \
> +            GraphicsCxxTests \
> +            IOCxxTests \
> +            ImagingCxxTests \
> +            RenderingCxxTests \
> +            TestCxxFeatures \
> +            TestInstantiator \
> +            VTKBenchMark \
> +            VolumeRenderingCxxTests \
> +            WidgetsCxxTests } \
> +        {
> +            file copy ${worksrcpath}/bin/$x ${vtkDocPath}/Examples
> +        }
> +    }
> +
> +    #if {[variant_isset shared]} {
> +        # Must set RPATH on all .dylib for shared variant; the  
> RPATH settings
> +        # in the build are hi-jacked by the DESTDIR set by  
> macports during
> +        # 'make install'.  Add some system code here to correct  
> the RPATH
> +        # settings for shared libs?  Perhaps add the system code  
> to the shared
> +        # variant only.
> +
> +        # Use install_name_tool to change the
> +        # RPATH settings for each .dylib file.
> +
> +        # This doesn't work!
> +        #system "cd ${destroot}${prefix}/bin; install_name_tool - 
> change $libdestStr $libinstStr $*{version}.dylib"
> +        # See
> +        # http://qin.laya.com/tech_coding_help/dylib_linking.html
> +
> +        #for f in `otool -L libvtkRendering.5.2.0.dylib`; do
> +        #    echo $f | grep $libdestStr;
> +        #done
> +
> +        # otool -L ${dylib} | grep ${libdestStr} | sed  
> s/.dylib.*/.dylib/
> +
> +        # http://guide.macports.org/chunked/reference.phases.html
> +        # During the destroot phase, macports issues:
> +        # make install DESTDIR=${destroot}
> +        # in ${worksrcpath}.
> +    #}
> +}

It would be easier to understand the port if you put the parts that  
are specific to a variant inside that variant declaration.

So, instead of what you have:


variant examples {
     ...
}
variant testing {
     ...
}
variant shared {
     ...
}
post-destroot {
     ...
     if {[variant_isset examples]} {
         ...
     }
     if {[variant_isset testing]} {
         ...
     }
     if {[variant_isset shared]} {
         ...
     }
}


Do this:


variant examples {
     ...
     post-destroot {
         ...
     }
}
variant testing {
     ...
     post-destroot {
         ...
     }
}
variant shared {
     ...
     post-destroot {
         ...
     }
}
post-destroot {
     ...
}




More information about the macports-dev mailing list