Thank you and thank you again. This is so very helpful.
On Nov 16, 2011, at 6:55 PM, Ryan Schmidt wrote:
> On Nov 16, 2011, at 20:02, Bradley Giesbrecht wrote:
>
>> On Nov 16, 2011, at 5:49 PM, Ryan Schmidt wrote:
>>
>> So is declaring an "option" something like a shorthand so you don't have to
>> use "set" to set or change a var value?
>
> options are like global variables you don't have to use "set" to set, but
> they're more than that. For example, they get -append and -delete procs added
> to them. configure.args, depends_lib, etc. are all options. So just like you
> have configure.args-append, by declaring e.g. php5pear.channel as an option,
> you now have the procedures php5pear.channel-append and
> php5pear.channel-delete available. These procs might not make sense for every
> one of your options, but they're there nonetheless if you want them.
>
> The most important difference between variables and options though is that
> options are evaluated lazily. This means an option's default is not evaluated
> when it's declared; it's evaluated when it's first used. You're already
> familiar with this behavior from many of the options in MacPorts base.
> Consider these MacPorts options and their default values:
>
> default distname {${name}-${version}}
> default worksrcdir {$distname}
>
> This code executes the moment the parser hits the line "PortSystem 1.0" at
> the top of a portfile. name and version haven't been defined yet, but that's
> fine; MacPorts has just set up distname so that, the first time something
> tries to use its value, it'll figure out what name and version are then. Same
> with worksrcdir: it's set up so that the first time it's read, it'll take the
> current value of distname. In many ports, you'll change distname, and then
> expect worksrcdir to have changed along with it. And this works, because you
> hadn't tried to read worksrcdir until after you set distname.
>
> Example from the php5extension portgroup:
>
> options php5extension.extension_dir
> default php5extension.extension_dir {[exec ${prefix}/bin/php-config
> --extension-dir 2>/dev/null]}
>
> If that [exec] were evaluated the instant the parser reached the "PortGroup
> php5extension 1.0" line in the portfile, that would cause an error if the
> user hadn't installed the php5 port yet, which provides the php-config
> executable. Instead, that [exec] is not run until
> ${php5extension.extension_dir} is first read (which, looking further into the
> portgroup, is in a pre-configure block, which won't run until after the php5
> port is already installed).
>
> That's what the extra set of curly braces surrounding the default are, by the
> way. If those weren't there, it would be evaluated immediately.
>
>
>> Now I think I know how to accomplish this, where I want to change a var to
>> non-default if the Portfile passed in an arg:
>> option php5pear.channel
>> option php5pear.packagexml
>> proc php5pear.setup {package.name package.version {package.channel
>> "pear.php.net"} {package.packagexml "package.xml"}}
>> php5pear.channel ${package.channel}
>> php5pear.packagexml ${package.packagexml}
>
> First, remember it's "options", not "option". Then, I assume you meant those
> assignments to be inside the proc:
>
> options php5pear.channel
> options php5pear.packagexml
> proc php5pear.setup {package.name package.version {package.channel
> "pear.php.net"} {package.packagexml "package.xml"}} {
> php5pear.channel ${package.channel}
> php5pear.packagexml ${package.packagexml}
> ....
> }
>
> Yes, you could do that. The only problem is you've decided that not only does
> the namespace "php5pear" belong to your portgroup, but also "package". Yes
> they're in fact local variables in this proc.... but I don't think we've used
> variables whose names contain a dot in this manner before. They've always
> been top-level global entities, and the part before the dot is there to
> create a pseudo-namespace, to ensure there's no ambiguity. Long story short,
> I'd just use "normal" variable names for proc arguments. Using an underscore
> instead of a dot would be fine for example.
>
> proc php5pear.setup {package_name package_version {package_channel
> "pear.php.net"} {package_packagexml "package.xml"}} {
> ....
> }
>
> In the setup proc, I'd only put the most essential parameters. name, version,
> channel is probably necessary. What about package.xml? None of the 500+ pear
> ports you added so far use it, unless I did my grep wrong. If the odd port
> here or there needs to override the package.xml, I'd just let that port set
> that option directly, as in:
> PortSystem 1.0
> PortGroup php5pear 1.0
>
> php5pear.setup foo 1.2.3 channel.example.com
> php5pear.packagexml otherpackage.xml
Perfect.
> And the portgroup would define the default value, as in:
>
> options php5pear.packagexml
> default php5pear.packagexml package.xml
Thank you sir!
Regards,
Bradley Giesbrecht (pixilla)
_______________________________________________
macports-dev mailing list
[email protected]
http://lists.macosforge.org/mailman/listinfo.cgi/macports-dev