Wow, cool! What exciting times we live in! :)<div><br></div><div>Robby<span></span><br><br>On Tuesday, June 4, 2013, Matthew Flatt  wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
 &lt;a class=&quot;LargeFriendlyLetters&quot; href=&quot;#end&quot;&gt;<br>
  DON&#39;T PANIC<br>
 &lt;/a&gt;<br>
<br>
I&#39;ve pushed a new version of the package experiment:<br>
<br>
 <a href="https://github.com/mflatt/racket/tree/pkg" target="_blank">https://github.com/mflatt/racket/tree/pkg</a><br>
<br>
You won&#39;t see much difference in terms of package splitting. I haven&#39;t<br>
even renamed &quot;-docs&quot; packages to &quot;-doc&quot; packages, yet.<br>
<br>
This new version is about creating installers. Normally, the creation<br>
of installers is not of much interest to this list, but one of the<br>
ideas behind the package system is that it should be easy to build a<br>
Racket distribution by combining the core with a selected set of<br>
packages. I think the details of that process both inform and<br>
illustrate details about the package system.<br>
<br>
<br>
Here are some installers that I built based on the &quot;drracket&quot; package<br>
(includes DrRacket, doesn&#39;t include teaching languages, etc.):<br>
<br>
 <a href="http://www.cs.utah.edu/~mflatt/tmp/installers/" target="_blank">http://www.cs.utah.edu/~mflatt/tmp/installers/</a><br>
<br>
There are still some issues to sort out --- including a missing<br>
&quot;README.txt&quot; and a missing rule to auto-launch &quot;DrRacket.exe&quot; from the<br>
Windows installer --- but I think the installers are close to right.<br>
<br>
<br>
You can build installers yourself, as long as you have a machine for<br>
each platform where you want an installer. One machine builds the<br>
packages from source (much like the current build process) and then<br>
acts as a server. All machines act as clients to build<br>
platform-specific installers. Each client build is relatively fast<br>
(about 5 minutes): build the core, then download and install pre-built<br>
packages.<br>
<br>
See &quot;INSTALL.txt&quot; and &quot;Makefile&quot; for more information, but the process<br>
boils down to this:<br>
<br>
 1. On the server machine:<br>
      make server PKGS=&quot;...&quot;<br>
<br>
 2. On each client machine:<br>
      make client SERVER=... PKGS=&quot;...&quot;<br>
    or (on Windows)<br>
      nmake win32-client SERVER=... PKGS=&quot;...&quot;<br>
<br>
<br>
One thing the Makefile illustrates is how to get going from scratch at<br>
the level of Racket sources. Native libraries, such as Cairo, have to<br>
be built and available already, but the process to turn those into<br>
packages is part of the Makefile. The process of consing up a package<br>
catalog from local package directories is also part of the Makefile.<br>
<br>
More precisely, all of that happens with the default &quot;local&quot; mode of<br>
the Makefile. You can set `SRC_CATALOG&#39; to a URL for a catalog server,<br>
and then packages are drawn from that catalog instead of local sources.<br>
A non-&quot;local&quot; `SRC_CATALOG&#39; will be a better default after we set up a<br>
catalog server for all of the base packages, where each entry in the<br>
catalog will point to a GitHub repository.<br>
<br>
Either way, after a catalog of source packages is available, then the<br>
package system is used to create &quot;built&quot; packages (source plus bytecode<br>
and docs). Finally, a new catalog is created for the built packages so<br>
that they can be served to installer builds.<br>
<br>
<br>
The Makefile includes `binary-catalog&#39; and `binary-catalog-server&#39;<br>
targets that create and serve a catalog of binary packages. It doesn&#39;t<br>
yet work to create installers from binary packages; the first issue is<br>
that `raco setup&#39; wants &quot;installer.rkt&quot; files to exist in source form,<br>
and there are likely a dozen other little problems. I&#39;ve left<br>
`binary-catalog-server&#39; in place, though, to illustrate how things are<br>
supposed to work for binary packages: binary packages are extracted<br>
automatically from built packages, and creating a binary build is just<br>
a matter of using binary packages.<br>
<br>
<br>
If you&#39;re inclined to look closely at the generated installers or at<br>
the &quot;pkg&quot; branch, you&#39;ll see that I made some directory-structure<br>
changes inside the &quot;racket&quot;. Most notably, &quot;collects&quot; moved inside<br>
&quot;lib&quot;, while configuration items moved from &quot;collects&quot; and &quot;lib&quot; into<br>
&quot;etc&quot;. The idea behind moving &quot;collects&quot; to &quot;lib&quot; is to put it next to<br>
&quot;pkgs&quot; and in a more consistent place with respect to Unix conventions.<br>
The move of configuration information to &quot;etc&quot; is also to be more<br>
consistent with Unix conventions, but also to get platform- or<br>
installation-specific information out of &quot;collects&quot;, which simplifies<br>
installer creation. All of that is up for discussion, of course.<br>
<br>
 &lt;a name=&quot;end&quot;/&gt;<br>
<br>
I know this all looks complex, the tools are still rough, and we still<br>
have many things about the package system to explain and discuss. I<br>
think we&#39;re on the path to a place that will work well, though.<br>
<br>
I also think the way to get there is to iterate on the whole path ---<br>
from the simplest `raco pkg&#39; command to the full snapshot and release<br>
process. So, if some earlier step seems terribly wrong to you, rest<br>
assured that an experiment in installer builds doesn&#39;t mean that we&#39;ve<br>
committed to all previous steps and there&#39;s no going back. It only<br>
means that we&#39;re taking a bunch of steps ahead to make sure that we<br>
know where we&#39;re going.<br>
<br>
_________________________<br>
  Racket Developers list:<br>
  <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a><br>
</blockquote></div>