On Apr 11, 2019, at 20:25, Michael Newman wrote:

> I suppose the root of my problem is that while I have a basic understanding 
> of how to use MacPorts, I have very little knowledge about how it actually 
> works. 

We explain some of this in our Guide, but I'll try to give an overview.

https://guide.macports.org

Of course you know MacPorts installs other software, which we call "ports".  If 
a usable binary is available from our build server, it downloads and installs 
that, otherwise it downloads the source and builds it. Both sources and 
binaries are mirrored on a global network of servers, so downloads should be 
fast wherever you are. Before installing a port, MacPorts installs any 
dependencies.

Each port is described in a text file called Portfile, which is written in the 
Tcl language but with many additional MacPorts-specific variables and 
procedures. The Portfile is a recipe that MacPorts follows to install that 
software. "port file XYZ" will show you the location on your disk of the 
Portfile for port XYZ. You can browse the entire collection of Portfiles on 
your disk, or online here:

https://github.com/macports/macports-ports

Any reference for the Tcl language, such as the Tcl/Tk web site, can teach you 
the basics of the language. MacPorts currently use Tcl 8.5.

https://www.tcl.tk/man/tcl8.5/

MacPorts performs port installations in "phases". If a build from source is 
needed, the phases are fetch, checksum, extract, patch, configure, build, 
destroot, install, activate. You've seen these terms scroll by on the console 
when you install a port. Not all phases are used by each port. Each phase has 
certain default behavior. Individual phases can be modified by each port. For 
example the default behavior of the configure, build, destroot phases are 
designed for autotools-based software; a port for software that doesn't use 
autotools might need to change those defaults. For any phase, additional Tcl 
code can be run before or after the phase, or a phase can be overridden 
entirely. Most phases also offer variables that change their behavior. For 
example, the patch phase uses a variable "patchfiles" which the Portfile author 
can set to a list of patch files that should be applied to the source code 
after extracting it but before configuring it, and the fetch phase uses a 
variable called "distfiles" to know what file(s) to download and a variable 
called "master_sites" to know what server(s) to download from.

Many ports need the same changes to the defaults. For example, hundreds of 
ports for software that uses the cmake configuration system need a common set 
of modifications while ports that build using xcodebuild need a different set 
of common changes. MacPorts accommodates this need with a feature called 
PortGroups, which are like include files in other languages. A port can include 
as many PortGroups as needed, and a PortGroup can include other PortGroups. For 
example, a port using the cmake build system and requiring a compiler 
supporting the C++ 11 standard would include both the cmake and cxx11 
PortGroups. PortGroups are Tcl files just like Portfiles, and they might define 
additional variables or procedures of their own which ports which include that 
PortGroup can use. PortGroups should be described in the Guide, but for those 
several that aren't, you'll have to read their code if you want to see what 
they do. Their code is here:

https://github.com/macports/macports-ports/tree/master/_resources/port1.0/group


> For example, I’ve been confused as to why some ports generate a config log 
> and some don’t. You explained that. 

Yes, some configuration systems like autotools and cmake automatically generate 
logs, some others don't. And some ports don't have a configuration step at all.


> I suppose the takeaway from your post is that I should take more time to 
> study other threads and learn from them. My failure is to only read this list 
> when I have a problem of my own to solve. That’s a poor strategy for 
> learning. 

I recommend that, and it's why I like that we use mailing lists for our 
discussions. Sometimes people ask why we don't use a web forum, but those seem 
to lend themselves to people only receiving notifications for the specific 
topics they've started or participated in. If you subscribe to a mailing list, 
you get all the topics. You don't have to read all of them, but maybe you'll 
see a topic that interests you and you'll read it and learn something, or 
you'll see a topic with a question you know the answer to and then you can 
participate, and in this way we build the community and the knowledge base.

If you want to know more about how MacPorts works or how Portfiles are written, 
you might want to join the macports-dev mailing list, since that kind of thing 
is usually discussed there. The macports-users list is mostly just for how to 
use MacPorts, without a great deal of talk about how it all works under the 
hood.



Reply via email to