What's the correct way to make a private procedure or variable in a portgroup 
-- something the portgroup will use internally but that portfiles using the 
portgroup should not use?

I think the answer is to use a namespace. The xcode-1.0 portgroup does:

namespace eval xcode {}
proc xcode::get_project_path {} {
    ...
}

The meson-1.0 portgroup defines its procedure directly within the namespace:

namespace eval meson {
    proc get_post_args {} {
        ...
    }
}

The cmake-1.1 portgroup defines a variable in a namespace:

namespace eval cmake {
    variable currentportgroupdir ...
}


I didn't understand namespaces and so I avoided them in my own portgroups, so 
for example my compiler_blacklist_versions-1.0 portgroup has procedures like:

proc compiler_blacklist_versions._matches_all_versions

The "_" prefix on the procedure name was meant to convey that it's for internal 
use only, but if namespaces are what we had been using for that already, I'd 
like to switch to using that. It looks like only 5 out of 60 portgroups use 
namespaces; maybe we have a lack of information about namespaces preventing the 
adoption of this feature. I don't see any discussion of Tcl namespaces in the 
MacPorts Guide.


Is there anything else I should know about using namespaces in Tcl generally or 
in MacPorts specifically?


Neither a namespace nor the "_" prefix I was using cause the procedures or 
variables to actually *be* private, as far as I can tell. Ports can still use 
them if they want to. If I understand correctly, the idea in MacPorts is just 
to convey which procedures and variables are meant to be internal and whose 
functionality or existence might change and should not be relied upon by 
outside callers.

Reply via email to