From 972788c137ce10c19d9b182043d74d7c750854a0 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 15 Oct 2019 14:07:36 -0600 Subject: [PATCH] replace "INSTALL.txt" with rendered Build Guide --- CONTRIBUTING.md => .github/CONTRIBUTING.md | 5 +- INSTALL.txt | 653 ---------------- LICENSE.txt => LICENSE | 0 LICENSE-APACHE.txt => LICENSE-APACHE | 0 LICENSE-MIT.txt => LICENSE-MIT | 0 README.md | 27 +- build-guide.md | 854 +++++++++++++++++++++ pkgs/racket-build-guide/Makefile | 3 + pkgs/racket-build-guide/build.scrbl | 12 +- pkgs/racket-build-guide/common.rkt | 15 +- pkgs/racket-build-guide/contribute.scrbl | 1 - pkgs/racket-build-guide/distribute.scrbl | 3 +- pkgs/racket-build-guide/info.rkt | 6 +- racket/src/README.txt | 2 +- 14 files changed, 905 insertions(+), 676 deletions(-) rename CONTRIBUTING.md => .github/CONTRIBUTING.md (70%) delete mode 100644 INSTALL.txt rename LICENSE.txt => LICENSE (100%) rename LICENSE-APACHE.txt => LICENSE-APACHE (100%) rename LICENSE-MIT.txt => LICENSE-MIT (100%) create mode 100644 build-guide.md create mode 100644 pkgs/racket-build-guide/Makefile diff --git a/CONTRIBUTING.md b/.github/CONTRIBUTING.md similarity index 70% rename from CONTRIBUTING.md rename to .github/CONTRIBUTING.md index 1203cfbe98..abece7cd21 100644 --- a/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -5,6 +5,7 @@ the IRC or Slack channels. By making a contribution, you are agreeing that your contribution is licensed under the LGPLv3, Apache 2.0, and MIT licenses. Those licenses are available in this repository in the files -racket/src/COPYING_LESSER.txt, LICENSE-APACHE.txt, and -LICENSE-MIT.txt. +racket/src/COPYING_LESSER.txt, LICENSE-APACHE, and LICENSE-MIT. +See the [Racket Build Guide](../build-guide.md) for more guidabce on +contributing. diff --git a/INSTALL.txt b/INSTALL.txt deleted file mode 100644 index f35ef21298..0000000000 --- a/INSTALL.txt +++ /dev/null @@ -1,653 +0,0 @@ -Build Options -============= - -Instead of using this source repository, consider getting source for -the current Racket release from - - http://download.racket-lang.org/ - -or get a source snapshot (updated daily) from - - http://pre.racket-lang.org/installers/ - -The "Source + built packages" options from those sites will build and -install especially quickly, because platform-independent bytecode and -documentation are pre-built. - -In contrast to this repository, release and snapshot source -distributions will work in the - - configure --prefix=... && make && make install - -way that you probably expect. - - -If you stick with this repository, then you have several options: - - * In-place build --- the default, creates a build in the "racket" - subdirectory and installs packages that you specify, or - "main-distribution" plus "main-distribution-test" by default. Any - package implementations that reside in the "pkgs" subdirectory are - linked in place. This is the most natural mode for developing - Racket itself or staying on the bleeding edge. See "Quick - Instructions: In-place Build" below. - - * Unix-style install --- installs to a given destination directory - (on platforms other Windows), leaving no reference to the source - directory. This is the most natural mode for installing once from - the source repository. See "Quick Instructions: Unix-style Install" - below. - - * Minimal --- as described in the "src" subdirectory of "racket" - (i.e., ignore this directory and "pkgs"). You can build a minimal - Racket using the usual `configure && make && make install` steps - (or similar for Windows), and then you can install packages from - the catalog server with `raco pkg`. - - * Installers --- create installers for a variety of platforms by - farming out work to machines that run those platforms. This is the - way that Racket snapshots and releases are created, and you can - create your own. See "Building Installers" below. - - * In-place Racket-on-Chez build --- when you use `make cs`. Unless - you use various options described in "More Instructions: Building - Racket-on-Chez" below, this process downloads Chez Scheme from - GitHub, builds a traditional `racket` with minimal packages, builds - Chez Scheme, and then builds Racket-on-Chez using Racket and Chez - Scheme. Final executables that end in "cs" or "CS" are the - Racket-on-Chez variants. - - -Quick Instructions: In-place Build -================================== - -On Unix (including Linux) and Mac OS, `make` (or `make in-place`) -creates a build in the "racket" directory. - -On Windows with Microsoft Visual Studio (any version between 2008/9.0 -and 2017/15.0), `nmake win32-in-place` creates a build in the "racket" -directory. For information on configuring your command-line -environment for Visual Studio, see "racket/src/worksp/README". - -On Windows with MinGW, `make PLAIN_RACKET=racket/racket`, since MinGW -uses Unix-style tools but generates a Windows-layout Racket build. - -In all cases, an in-place build includes (via links) a few packages -that are in the "pkgs" directory. To get new versions of those -packages, as well as the Racket core, then use `git pull`. Afterward, -or to get new versions of any other package, use `make in-place` -again, which includes a `raco pkg update` step. - -See "More Instructions: Building Racket" below for more information. - - -Quick Instructions: Unix-style Install -====================================== - -On Unix (including Linux), `make unix-style PREFIX=` builds and -installs into "" (which must be an absolute path) with binaries -in "/bin", packages in "/share/racket/pkgs", documentation -in "/share/racket/doc", etc. - -On Mac OS, `make unix-style PREFIX=` builds and installs into -"" (which must be an absolute path) with binaries in "/bin", -packages in "/share/pkgs", documentation in "/doc", etc. - -On Windows, Unix-style install is not supported. - -A Unix-style install leaves no reference to this source directory. - -To split the build and install steps of a Unix-style installation, -supply `DESTDIR=` with `make unix-style PREFIX=`, which -assembles the installation in "" (which must be an absolute -path). Then, copy the content of "" to the target root -"". - -See "More Instructions: Building Racket" below for more information. - - -More Instructions: Building Racket -================================== - -The "racket" directory contains minimal Racket, which is just enough -to run `raco pkg` to install everything else. The first step of `make -in-place` or `make unix-style` is to build minimal Racket, and you can -read "racket/src/README" for more information. - -If you would like to provide arguments to `configure` for the minimal -Racket build, then you can supply them with by adding -`CONFIGURE_ARGS_qq="..."` to `make in-place` or `make -unix-style`. (The `_qq` suffix on the variable name is a convention -that indicates that single- and double-quote marks are allowed in the -value.) - -The "pkgs" directory contains packages that are tied to the Racket -core implementation and are therefore kept in the same Git -repository. A `make in-place` links to the package in-place, while -`make unix-style` copies packages out of "pkgs" to install them. - -To install a subset of the packages in "pkgs", supply `PKGS` value to -`make`. For example, - - make PKGS="gui-lib readline-lib" - -links only the "gui-lib" and "readline-lib" packages and their -dependencies. The default value of `PKGS` is "main-distribution -main-distribution-test". If you run `make` a second time, all -previously installed packages remain installed and are updated, while -new packages are added. To uninstall previously selected package, use -`raco pkg remove`. - -To build anything other than the latest sources in the repository -(e.g., when building from the "v6.2.1" tag), you need a catalog -that's compatible with those sources. Note that a release distribution -is configured to use a catalog specific to that release, so you can -extract the catalog's URL from there. - -Using `make` (or `make in-place`) sets the installation's name to -"development", unless the installation has been previously configured -(i.e., unless the "racket/etc/config.rktd" file exists). The -installation name affects, for example, the directory where -user-specific documentation is installed. Using `make` also sets the -default package scope to `installation`, which means that -packages are installed by default into the installation's space instead -of user-specific space. The name and/or default-scope configuration -can be changed through `raco pkg config`. - -Note that `make -j ` controls parallelism for the makefile part of -a build, but not for the `raco setup` part. To control both the -makefile and the `raco setup` part, use - - make CPUS= - -which recurs with `make -j JOB_OPTIONS="-j "`. Setting `CPUS` -also works with `make unix-style`. - -Use `make as-is` (or `nmake win32-as-is`) to perform the same build -actions as `make in-place`, but without consulting any package -catalogs or package sources to install or update packages. In other -words, use `make as-is` to rebuild after local changes that could -include changes to the Racket core. (If you change only packages, then -`raco setup` should suffice.) - -If you need even more control over the build, carry on to "Even More -Instructions: Building Racket Pieces" further below. - - -More Instructions: Building Racket-on-Chez -========================================== - -The `make cs` target (or `make cs-as-is` for a rebuild, or `nmake -win32-cs` on Windows with Visual Studio) builds a variant of Racket -that runs on Chez Scheme. By default, the executables for the -Racket-on-Chez variant all have a "cs" or "CS" suffix, and they -coexist with a traditional Racket build by keeping compiled files in a -machine-specific subdirectory of the "compiled" directory. You can -remove the "cs" suffix and the subdirectory in "compiled" by providing -`RACKETCS_SUFFIX=""` to `make`. (One day, if all goes well, the -default for `RACKETCS_SUFFIX` will change from "cs" to "".) - -Building Racket-on-Chez requires an existing Racket and Chez Scheme. -If you use `make cs` with no further arguments, then the build process -will bootstrap by building a traditional variant of Racket and by -downloading and building Chez Scheme. - -If you have a sufficiently recent Racket installation already with at -least the "compiler-lib" package installed, you can supply -`RACKET=...` with `make cs` to skip that part of the bootstrap. And if -you have a Chez Scheme source directory already[*], you can supply -that with `SCHEME_SRC=...` instead of downloading a new copy. - - make cs RACKET=racket SCHEME_SRC=path/to/ChezScheme - -Use `make both` to build both traditional Racket and Racket-on-Chez, -where packages are updated documentation is built only once (using -traditional Racket). - -[*] For now, Racket-on-Chez requires the variant of Chez Scheme at - https://github.com/racket/ChezScheme - - -Even More Instructions: Building Racket Pieces -============================================== - -Instead of just using `make in-place` or `make unix-style`, you can -take more control over the build by understanding how the pieces fit -together. - -Building Minimal Racket ------------------------ - -Instead of using the top-level makefile, you can go into "racket/src" -and follow the "README.txt" there, which gives you more configuration -options. - -If you don't want any special configuration and you just want the base -build, you can use `make base` (or `nmake win32-base`) with the -top-level makefile. - -Minimal Racket does not require additional native libraries to run, -but under Windows, encoding-conversion, extflonum, and SSL -functionality is hobbled until native libraries from the -`racket-win32-i386` or `racket-win32-x86_64` package are installed. - -On all platforms, fom the top-level makefile, `JOB_OPTIONS` as a -makefile variable and `PLT_SETUP_OPTIONS` as an environment variable -are passed on to the `raco setup` that is used to build minimal-Racket -libraries. See the documentation for `raco setup` for information on -the options. - -For cross compilation, add configuration options to -`CONFIGURE_ARGS_qq="..."` as described in the "README.txt" of -"racket/src", but also add a `PLAIN_RACKET=...` argument for the -top-level makefile to specify the same executable as in an -`--enable-racket=...` for `configure`. In general, the `PLAIN_RACKET` -setting should have the form `PLAIN_RACKET="... -C"` to ensure that -cross-compilation mode is used and that any foreign libraries needed -for build time can be found, but many cross-compilation scenarios work -without `-C`. - -Specify `SETUP_MACHINE_FLAGS=...` to set Racket flags that control the -target machine of compiled bytecode for `raco setup` and `raco pkg -install`. For example `SETUP_MACHINE_FLAGS=-M` causes the generated -bytecode to be machine-independent, which is mainly useful when the -generated installation will be used as a template for other platforms -or for cross-compilation. - - -Installing Packages -------------------- - -After you've built and installed minimal Racket, you could install -packages via the package-catalog server, completely ignoring the -content of "pkgs". - -If you want to install packages manually out of the "pkgs" directory, -the `local-catalog` target creates a catalog as "racket/local/catalog" -that merges the currently configured catalog's content with pointers -to the packages in "pkgs". A Unix-style build works that way: it -builds and installs minimal Racket, and then it installs packages out -of a catalog that is created by `make local-catalog`. - -To add a package catalog that is used after the content of "pkgs" but -before the default package catalogs, specify the catalog's URL as the -`SRC_CATALOG` makefile variable: - - make .... SRC_CATALOG= - -Linking Packages for In-place Development Mode ----------------------------------------------- - -With an in-place build, you can edit packages within "pkgs" directly -or update those packages with `git pull` plus `raco setup`, since the -packages are installed with the equivalent of `raco pkg install -i ---static-link ...`. - -Instead of actually using `raco pkg install --static-link ...`, the -`pkgs-catalog` makefile target creates a catalog that points to the -packages in "pkgs", and the catalog indicates that the packages are to -be installed as links. The `pkgs-catalog` target further configures -the new catalog as the first one to check when installing -packages. The configuration adjustment is made only if no -configuration file "racket/etc/config.rktd" exists already. - -All other packages (as specified by `PKGS`) are installed via the -configured package catalog. They are installed in installation scope, but -the content of "racket/share/pkgs" is not meant to be edited. To -reinstall a package in a mode suitable for editing and manipulation -with Git tools, use - - raco pkg update --clone extra-pkgs/ - -The "extra-pkgs" directory name is a convention that is supported by a -".gitignore" entry. - - -The Whole Enchilada: Building Installers -======================================== - -To build installers that can be distributed to other users, do not use -`make in-place` or `make unix-style`, but instead start from a clean -repository. - -Use one non-Windows machine as a server, where packages will be -pre-built. Then, as described below, create platform-specific -installers on N client machines, each of which contacts the server -machine to obtain pre-built packages. The server can act as a client, -naturally, to create an installer for the server's platform. - -GNU `make` is required on the server machine, `nmake` is required on -Windows client machines, and any `make` should work on other client -machines. - -Running Build Farms -------------------- - -The `installers` target of the makefile will do everything to generate -installers: build a server on the current machine, run clients on -hosts specified via `CONFIG`, and start/stop VirtualBox virtual machines -that act as client machines. - -If the server is already built, the `installers-from-built` target -will drive the client builds without re-building the server. - -See the documentation of the "distro-build" package for a description -of the site-configuration module and requirements on client hosts. - -If "my-site-config.rkt" is a configuration module, then - - make installers CONFIG=my-site-config.rkt - -drives the build farm, and the resulting installers are in -"build/installers", with a hash table mapping descriptions to -installer filenames in "build/installer/table.rktd". A log file -for each client is written to "build/log". - -If you have the "distro-build-server" package installed in some Racket -build (not the one for building installers), you can use - - make describe-clients CONFIG=my-site-config.rkt - -to see, without building anything, the effect of the configuration and -the planned build steps. - -The default `CONFIG` path is "build/site.rkt", so you could put your -configuration file there and omit the `CONFIG` argument to `make`. A -default configuration file is created there automatically. Supply -`CONFIG_MODE=...` to pass a configuration mode on to your -site-configuration module (accessible via the `current-mode` -parameter). Supply `CLEAN_MODE=--clean` to make the default `#:clean?` -configuration for a client #t instead of #f, supply -`RELEASE_MODE=--release` to make the default `#:release?` -configuration #t, supply `SOURCE_MODE=--source` to make the default -`#:source?` configuration #t, and supply `VERSIONLESS_MODE=--version` -to make the default `#:versionless?` configuration #t. - -A configuration file can specify the packages to include, host address -of the server, distribution name, installer directory, and -documentation search URL, but defaults can be provided as `make` -arguments via `PKGS`, `SERVER` plus `SERVER_PORT` plus `SERVER_HOSTS`, -`DIST_NAME`, `DIST_BASE`, and `DIST_DIR`, `DOC_SEARCH`, -respectively. The site configuration's top-level options for packages -and documentation search URL are used to configure the set of packages -that are available to client machines to include in installers. - -For each installer written to "build/installers", the installer's name -is - - ---. - -where defaults to "racket" (but can be set via -`DIST_BASE`), is from `(system-library-subpath #f)` but -normalizing the Windows results to "i386-win32" and "x86_63-win32", -- is omitted unless a `#:dist-suffix` string is specified -for the client in the site configuration, and is -platform-specific: ".sh" for Unix (including Linux), ".dmg" or ".pkg" -for Mac OS, and ".exe" for Windows. - -The server supports both 'cs and '3m clients by creating built -packages in machine-independent form (which is then recompiled to the -client's native format, still much faster than compiling from source). -Set `SERVER_COMPILE_MACHINE=` to disable machine-independent format -for built packages. - -Generating Installer Web Sites ------------------------------- - -The `site` target of the makefile uses the `installers` target to -generate a set of installers, and then it combines the installers, -packages, a package catalog, and log files into a directory that is -suitable for access via a web server. - -Supply the same `CONFIG=...` and `CONFIG_MODE=...` arguments for -`site` as for `installers`. The configuration file should have a -`#:dist-base-url` entry for the URL where installers and packages will -be made available; the `installers` target uses `#:dist-base-url` to -embed suitable configuration into the installers. Specifically, -installers are configured to access pre-built packages and -documentation from the site indicated by `#:dist-base-url`. - -Note that `#:dist-base-url` should almost always end with "/", since -others URLs will be constructed as relative to `#:dist-base-url`. - -The site is generated as "build/site" by default. A `#:site-dest` -entry in the configuration file can select an alternate destination. - -Use the `site-from-installers` makefile target to perform the part of -`site` that happens after `installers` (i.e., to generate a `site` -from an already-generated set of installers). - -Managing Snapshot Web Sites ---------------------------- - -The `snapshot-site` makefile target uses `site` (so supply the same -`CONFIG=...` and `CONFIG_MODE=...` arguments), and then treats the -resulting site as a snapshot with additional snapshot-management -tasks. - -For snapshot management, the destination of the files generated for -`site` (as specified by `#:site-dest`) should be within a directory of -snapshots. The configuration file can use `(current-stamp)` to get a -string that represents the current build, and then use the string both -for `#:dist-base-url` and `#:site-dest`. Normally, the stamp string is -a combination of the date and Git commit hash. - -Snapshot management includes creating an "index.html" file in the -snapshots directory (essentially a copy of the snapshot's own -"index.html") and pruning snapshot subdirectories to keep the number -of snapshots at the amount specified by `#:max-snapshots` -configuration-file entry (with a default value of 5). - -Use the `snapshot-at-site` makefile target to perform the part of -`snapshot-site that happens after `site (i.e., to manage snapshots -around an already-generated site). - -Separate Server and Clients ---------------------------- - -Instead of using the `installers` makefile target and a site -configuration file, you can run server and client processes manually. - -Roughly, the steps are - - 1. On the server machine: - make server PKGS="..." - - See 1b below for more information on variables other than `PKGS` - that you can provide with `make`. - - 2. On each client machine: - make client SERVER=... PKGS="..." - or - nmake win32-client SERVER=... PKGS="..." - - See 2b below for more information on variables other than `SERVER` - and `PKGS` that you can provide with `make`. - -In more detail: - - 1a. Build "racket" on a server. - - The `base` target of the makefile will do that, if you haven't - done it already. (The server only works on non-Windows platforms, - currently.) - - 1b. On the server, build packages and start a catalog server. - - The `server-from-base` target of the makefile will do that. - - Alternatively, use the `server` target, which combines `base` and - `server-from-base` (i.e., steps 1a and 1b). - - The `SERVER_PORT` variable of the makefile choose the port on - which the server listens to clients. The default is port 9440. - - The `SERVER_HOSTS` variable of the makefile determines the - interfaces at which the server listens. The default is - "localhost" which listens only on the loopback device (for - security). Supply the empty string to listen on all - interfaces. Supply multiple addresses by separating them with a - comma. - - The `PKGS` variable of the makefile determines which packages are - built for potential inclusion in a distribution. - - The `DOC_SEARCH` variable of the makefile determine a URL that is - embedded in rendered documentation for cases where a remote - search is needed (because other documentation is not installed). - - The `SRC_CATALOG` variable determines the catalog that is used to - get package sources and native-library packages. The default is - "http://pkgs.racket-lang.org". - - The `SERVER_PKG_INSTALL_OPTIONS` variable determines extra flags - that are passed to `raco pkg install` when installing on the - server (to create package builds that are sent to clients). For - example, `SERVER_PKG_INSTALL_OPTIONS=--source` could be useful - to ensure that the server always builds from sources. - - The `PACK_BUILT_OPTIONS` variable can be set to `--mode ` - to set the package mode for built packages. The default `infer` - mode infers uses the package's `distribution-preference` - "info.rkt" field, if any, infers `binary` if the package has any - native libraries and no Racket sources, and infers `built` - otherwise. - - The server provides README files from the "build/readmes" - directory. If "README.txt" does not exist when the sever is - started, a default file is created (and clients download - "README.txt" by default). - - If you stop the server and want to restart it, use the - `built-package-server` makefile target instead of starting over - with the `server` target. - - 2a. On each client (one for each platform to bundle), build "racket". - - This is the same as step 1, but on each client. If the client and - server are the same, there's nothing more to do for step 3. - - 2b. On each client, create an installer. - - The `client` (or `win32-client`) target of the makefile will do - that. - - Provide `SERVER` as the hostname of the server machine, but a - "localhost"-based tunnel back to the server is more secure and - avoids the need to specify `SERVER_HOSTS` when starting the - server in step 1b. Also, provide `SERVER_PORT` if an alternate - port was specified in step 1b. - - Provide the same `PKGS` (or a subset) as in step 1b if you want a - different set than the ones listed in the makefile. Similarly, - `DOC_SEARCH` normally should be the same as in step 1b, but for a - client, it affects future documentation builds in the - installation. - - Alternatively, use the `client` target, which combines `base` and - `client-from-base` (i.e., steps 2a and 2b). - - On Windows, you need NSIS installed, either in the usual location - or with `makensis` in your command-line path. - - To create a release installer, provide `RELEASE_MODE` as - "--release" to `make`. A release installer has slightly different - defaults that are suitable for infrequently updated release - installations, as opposed to frequently updated snapshot - installations. - - To create a source archive, provide `SOURCE_MODE` as "--source" - to `make`. - - To create an archive that omits the version number and also omit - and version number in installer paths, provide `VERSIONLESS_MODE` as - "--versionless" to `make`. - - To change the human-readable name of the distribution as embedded - in the installer, provide `DIST_NAME` to `make`. The default - distribution name is "Racket". Whatever name you pick, the Racket - version number is automatically added for various contexts. - - To change the base name of the installer file, provide `DIST_BASE` - to `make`. The default is "racket". - - To change the directory name for installation on Unix (including - Linux), provide `DIST_DIR` to `make`. The default is "racket". - - To add an extra piece to the installer's name, such as an - identifier for a variant of Linux, provide `DIST_SUFFIX` to - `make`. The default is "", which omits the prefix and its - preceding hyphen. - - To set the description string for the installer, provide - `DIST_DESC` to `make`. The description string is recorded - alongside the installer. - - To set the initial package catalogs URLs for an installation, - provide `DIST_CATALOGS_q` to `make`. Separate multiple URLs with - a space, and use an empty string in place of a URL to indicate - that the default catalogs should be used. The "_q" in the - variable name indicates that its value can include double quotes - (but not single quotes) --- which are needed to specify an empty - string, for example. - - To select a "README" file for the client, provide `README` to - `make`. The `README` value is used as a file name to download - from the server. - - To create a ".tgz" archive instead of an installer (or any - platform), set `TGZ_MODE` to "--tgz". - - For a Mac OS installer, set `SIGN_IDENTITY` as the name to - which the signing certificate is associated. Set `MAC_PKG_MODE` - to "--mac-pkg" to create a ".pkg" installer instead of a ".dmg" - image. - - For a Windows installer, set `OSSLSIGNCODE_ARGS_BASE64` as a - Base64 encoding of an S-expression for a list of argument strings - for `osslsigncode`. The `-n`, `-t`, `-in`, and `-out` arguments - are provided to `osslsigncode` automatically, so supply the - others. - - The `SERVER_CATALOG_PATH` and `SERVER_COLLECTS_PATH` makefile - variables specify paths at `SERVER` plus `SERVER_PORT` to access - the package catalog and pre-built "collects" tree needed for a - client, but those paths should be empty for a server started with - `make server`, and they are used mainly by `make - client-from-site` (described below). - - The `UPLOAD` makefile variable specifies a URL to use as an - upload destination for the created installed, where the - installer's name is added to the end of the URL, or leave as - empty for no upload. - -On each client, step 2b produces a "bundle/installer.txt" file that -contains the path to the generated installer on one line, followed by -the description on a second line. The installer is also uploaded to -the server, which leaves the installer in a "build/installers" -directory and records a mapping from the installer's description to -its filename in "build/installers/table.rktd". - -If you provide `JOB_OPTIONS=...` for either a client or server build, -the options are used both for `raco setup` and `raco pkg -install`. Normally, `JOB_OPTIONS` is used to control parallelism. - -Creating a Client from an Installer Web Site --------------------------------------------- - -If you (or someone else) previously created an installer site with -`make site`, then `make client-from-site` in a clean repository -creates an installer for the current platform drawing packages -from the site. - -At a minimum, provide `SERVER`, `SERVER_PORT` (usually 80), and -`SITE_PATH` (if not empty, include a trailing "/") makefile variables -to access a site at - - http://$(SERVER):$(SERVER_PORT)/$(SITE_PATH) - -The `client-from-site` makefile target chains to `make client` while -passing suitable values for `DIST_CATALOGS_q`, `DOC_SEARCH`, -`SERVER_CATALOG_PATH`, and `SERVER_COLLECTS_PATH`. Supply any other -suitable variables, such as `DIST_NAME` or `RELEASE_MODE`, the same as -for `make client`. diff --git a/LICENSE.txt b/LICENSE similarity index 100% rename from LICENSE.txt rename to LICENSE diff --git a/LICENSE-APACHE.txt b/LICENSE-APACHE similarity index 100% rename from LICENSE-APACHE.txt rename to LICENSE-APACHE diff --git a/LICENSE-MIT.txt b/LICENSE-MIT similarity index 100% rename from LICENSE-MIT.txt rename to LICENSE-MIT diff --git a/README.md b/README.md index fb45f15898..3a3da27529 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,29 @@ -This is the source code for the core of Racket. See "INSTALL.txt" for -full information on building Racket. +This is the source code for the core of Racket plus some related +packages. The rest of the Racket distribution source code is in other +repositories, mostly under [the Racket GitHub +organization](https://github.com/racket). + +Building +-------- To build the full Racket distribution from this repository, run `make` in the top-level directory. To build minimal Racket, run `make base`. +For more information, see the [Build Guide](build-guide.md). -The rest of the Racket distribution source code is in other -repositories, mostly under [the Racket GitHub -organization](https://github.com/racket). +Contributing +------------ Contribute to Racket by submitting a pull request, joining the [development mailing list](https://lists.racket-lang.org), or visiting the IRC or Slack channels. -Racket is free software; see "COPYRIGHT" and "CONTRIBUTING.md" for -more details. \ No newline at end of file +By making a contribution, you are agreeing that your contribution is +licensed under the LGPLv3, Apache 2.0, and MIT licenses. Those +licenses are available in this repository in the files +[COPYING_LESSER](racket/src/COPYING_LESSER.txt), +[LICENSE-APACHE](LICENSE-APACHE), and [LICENSE-MIT](LICENSE-MIT). + +License +------- + +Racket is free software; see [LICENSE](LICENSE) for more details. diff --git a/build-guide.md b/build-guide.md new file mode 100644 index 0000000000..21ecfd45e3 --- /dev/null +++ b/build-guide.md @@ -0,0 +1,854 @@ +# Building, Distributing, and Contributing to Racket + +The main Racket source code repository is + +[https://github.com/racket/racket](https://github.com/racket/racket) + +This guide explains how to build those sources, how to create Racket +distributions like the ones at +[https://download.racket-lang.org](https://download.racket-lang.org), +and how to contribute to Racket development. + +> [1 Building Racket from Source](#1-building-racket-from-source) +>> [1.1 Git Repository versus Source Distribution](#11-git-repository-versus-source-distribution) +>> [1.2 Git Repository Build Modes](#12-git-repository-build-modes) +>> [1.3 Quick Instructions: In-Place Build](#13-quick-instructions-in-place-build) +>> [1.4 Quick Instructions: Unix-Style Install](#14-quick-instructions-unix-style-install) +>> [1.5 More Instructions: Building Racket](#15-more-instructions-building-racket) +>> [1.6 More Instructions: Building Racket on Chez Scheme](#16-more-instructions-building-racket-on-chez-scheme) +>> [1.7 Even More Instructions: Building Racket Pieces](#17-even-more-instructions-building-racket-pieces) +>>> [1.7.1 Building Minimal Racket](#171-building-minimal-racket) +>>> [1.7.2 Installing Packages](#172-installing-packages) +>>> [1.7.3 Linking Packages for In-Place Development Mode](#173-linking-packages-for-in-place-development-mode) + +> [2 Distributing Racket Variants](#2-distributing-racket-variants) +>> [2.1 Running Build Farms](#21-running-build-farms) +>> [2.2 Generating Installer Web Sites](#22-generating-installer-web-sites) +>> [2.3 Managing Snapshot Web Sites](#23-managing-snapshot-web-sites) +>> [2.4 Separate Server and Clients](#24-separate-server-and-clients) +>> [2.5 Creating a Client from an Installer Web Site](#25-creating-a-client-from-an-installer-web-site) + +> [3 Contibuting to Racket Development](#3-contibuting-to-racket-development) +>> [3.1 Main-Repository Contributions](#31-main-repository-contributions) +>> [3.2 Distribution-Package Contributions](#32-distribution-package-contributions) +>> [3.3 General Contribution Guidelines](#33-general-contribution-guidelines) +>> [3.4 More Resources](#34-more-resources) + +## 1. Building Racket from Source + +In a checkout of the Racket [Git +repository](https://github.com/racket/racket), you could try just +running + +  `make` + +but we recommend that you at least consider the information in [Git +Repository versus Source +Distribution](#11-git-repository-versus-source-distribution) and [Git +Repository Build Modes](#12-git-repository-build-modes). + +### 1.1. Git Repository versus Source Distribution + +Instead of building from the [Git +repository](https://github.com/racket/racket), consider getting source +for the current Racket release from + +[http://download.racket-lang.org/](http://download.racket-lang.org/) + +or get a source snapshot (updated daily) from + +[http://snapshot.racket-lang.org/](http://snapshot.racket-lang.org/) + +The Source + built packages options from those sites will build and +install especially quickly, because platform-independent bytecode and +documentation are pre-built. + +In contrast to the Git repository, release and snapshot source +distributions will work in the + +  `configure –prefix=... && make && make install` + +way that you probably expect. + +### 1.2. Git Repository Build Modes + +The rest of this chapter assumes that you’re sticking with the [source +repository](https://github.com/racket/racket). In that case, you still +have several options: + +* **In-place build** — This mode is the default. It creates a build in + the `"racket"` subdirectory and installs packages that you specify (or + the `"main-distribution"` plus `"main-distribution-test"` package by + default). Any package implementations that reside in the `"pkgs"` + subdirectory are linked in-place. This is the most natural mode for + developing Racket itself or staying on the bleeding edge. See [Quick + Instructions: In-Place Build](#13-quick-instructions-in-place-build) + for more instructions. + +* **Unix-style install** — This mode installs to a given destination + directory (on platforms other Windows), leaving no reference to the + source directory. This is the most natural mode for installing once + from the source repository. See [Quick Instructions: Unix-Style + Install](#14-quick-instructions-unix-style-install) for more + instructions. + +* **Minimal** — This mode is like a source distribution, and it is + described in the `"src"` subdirectory of `"racket"` (i.e., ignore the + repository’s root directory and `"pkgs"` subdirectory). Build a + minimal Racket using the usual `configure && make && make install` + steps (or similar for Windows), and then you can install packages from + the catalog server with `raco pkg`. + +* **Installers** — This mode creates Racket distribution installers for + a variety of platforms by farming out work to machines that run those + platforms. This is the way that Racket snapshots and releases are + created, and you can create your own. See [Distributing Racket + Variants](#2-distributing-racket-variants) for more instructions. + +* **In-place Racket on Chez Scheme build** — This mode builds using Chez + Scheme via `make cs`. Unless you use various options described in + [More Instructions: Building Racket on Chez + Scheme](#16-more-instructions-building-racket-on-chez-scheme), this + process downloads Chez Scheme from GitHub, builds a traditional + `racket` with minimal packages, builds Chez Scheme, and then builds + Racket on Chez Scheme using Racket and Chez Scheme. Final executables + with names that end in `cs` or `CS` are the Racket on Chez Scheme + variants. + +### 1.3. Quick Instructions: In-Place Build + +On Unix (including Linux) and Mac OS, `make` (or `make in-place`) +creates a build in the `"racket"` directory. + +On Windows with Microsoft Visual Studio (any version between 2008/9.0 +and 2019/16.0), `nmake win32-in-place` creates a build in the `"racket"` +directory. For information on configuring your command-line environment +for Visual Studio, see `"racket/src/worksp/README.txt"`. + +On Windows with MinGW, use `make PLAIN_RACKET=racket/racket`, since +MinGW uses Unix-style tools but generates a Windows-layout Racket build. + +In all cases, an in-place build includes (via links) a few packages that +are in the `"pkgs"` directory. To get new versions of those packages, as +well as the Racket core, then use `git pull`. Afterward, or to get new +versions of any other package, use `make in-place` again, which includes +a `raco pkg update` step. + +See [More Instructions: Building +Racket](#15-more-instructions-building-racket) for more information. + +### 1.4. Quick Instructions: Unix-Style Install + +On Unix (including Linux), `make unix-style PREFIX=` builds and +installs into `""` (which must be an absolute path) with binaries +in `"/bin"`, packages in `"/share/racket/pkgs"`, documentation +in `"/share/racket/doc"`, etc. + +On Mac OS, `make unix-style PREFIX=` builds and installs into +`""` (which must be an absolute path) with binaries in +`"/bin"`, packages in `"/share/pkgs"`, documentation in +`"/doc"`, etc. + +On Windows, Unix-style install is not supported. + +A Unix-style install leaves no reference to the source directory. + +To split the build and install steps of a Unix-style installation, +supply `DESTDIR=` with `make unix-style PREFIX=`, which +assembles the installation in `""` (which must be an absolute +path). Then, copy the content of `""` to the target root +`""`. + +See [More Instructions: Building +Racket](#15-more-instructions-building-racket) for more information. + +### 1.5. More Instructions: Building Racket + +The `"racket"` directory contains minimal Racket, which is just enough +to run `raco pkg` to install everything else. The first step of `make +in-place` or `make unix-style` is to build minimal Racket, and you can +read `"racket/src/README"` for more information. + +If you would like to provide arguments to `configure` for the minimal +Racket build, then you can supply them with by adding +`CONFIGURE_ARGS_qq=""` to `make in-place` or `make unix-style`. +(The `_qq` suffix on the variable name `CONFIGURE_ARGS_qq` is a +convention that indicates that single- and double-quote marks are +allowed in the value.) + +The `"pkgs"` directory contains packages that are tied to the Racket +core implementation and are therefore kept in the same Git repository. A +`make in-place` links to the package in-place, while `make unix-style` +copies packages out of `"pkgs"` to install them. + +To install a subset of the packages in `"pkgs"`, supply `PKGS` value to +`make`. For example, + +  `make PKGS="gui-lib readline-lib"` + +links only the `"gui-lib"` and `"readline-lib"` packages and their +dependencies. The default value of `PKGS` is `"main-distribution +main-distribution-test"`. If you run `make` a second time, all +previously installed packages remain installed and are updated, while +new packages are added. To uninstall previously selected package, use +`raco pkg remove`. + +To build anything other than the latest sources in the repository +\(e.g., when building from the `v6.2.1` tag), you need a catalog that’s +compatible with those sources. Note that a release distribution is +configured to use a catalog specific to that release, so you can extract +the catalog’s URL from there. + +Using `make` (or `make in-place`) sets the installation’s name to +`development`, unless the installation has been previously configured +(i.e., unless the `"racket/etc/config.rktd"` file exists). The +installation name affects, for example, the directory where +user-specific documentation is installed. Using `make` also sets the +default package scope to `installation`, which means that packages are +installed by default into the installation’s space instead of +user-specific space. The name and/or default-scope configuration can be +changed through `raco pkg config`. + +Note that `make -j ` controls parallelism for the makefile part of a +build, but not for the `raco setup` part. To control both the makefile +and the `raco setup` part, use + +  `make CPUS=` + +which recurs with `make -j JOB_OPTIONS="-j "`. Setting `CPUS` +also works with `make unix-style`. + +Use `make as-is` (or `nmake win32-as-is`) to perform the same build +actions as `make in-place`, but without consulting any package catalogs +or package sources to install or update packages. In other words, use +`make as-is` to rebuild after local changes that could include changes +to the Racket core. (If you change only packages, then `raco setup` +should suffice.) + +If you need even more control over the build, carry on to [Even More +Instructions: Building Racket +Pieces](#17-even-more-instructions-building-racket-pieces) further +below. + +### 1.6. More Instructions: Building Racket on Chez Scheme + +The `make cs` target (or `make cs-as-is` for a rebuild, or `nmake +win32-cs` on Windows with Visual Studio) builds a variant of Racket that +runs on Chez Scheme. By default, the executables for the Racket-on-Chez +variant all have a `cs` or `CS` suffix, and they coexist with a +traditional Racket build by keeping compiled files in a machine-specific +subdirectory of the `"compiled"` directory. You can remove the `cs` +suffix and the subdirectory in `"compiled"` by providing +`RACKETCS_SUFFIX=""` to `make`. (One day, if all goes well, the default +for `RACKETCS_SUFFIX` will change from `"cs"` to `""`.) + +Building Racket on Chez Scheme requires an existing Racket and Chez +Scheme. If you use `make cs` with no further arguments, then the build +process will bootstrap by building a traditional variant of Racket and +by downloading and building Chez Scheme. + +If you have a sufficiently recent Racket installation already with at +least the `"compiler-lib"` package installed, you can supply +`RACKET=...` with `make cs` to skip that part of the bootstrap. And if +you have a Chez Scheme source directory already, you can supply that +with `SCHEME_SRC=` instead of downloading a new copy: + +  `make cs RACKET=racket SCHEME_SRC=path/to/ChezScheme` + +> For now, Racket on Chez requires the variant of Chez Scheme at +> [https://github.com/racket/ChezScheme](https://github.com/racket/ChezScheme) + +Use `make both` to build both traditional Racket and Racket on Chez +Scheme, where packages are updated and documentation is built only once +(using traditional Racket). + +### 1.7. Even More Instructions: Building Racket Pieces + +Instead of just using `make in-place` or `make unix-style`, you can take +more control over the build by understanding how the pieces fit +together. + +#### 1.7.1. Building Minimal Racket + +Instead of using the top-level makefile, you can go into `"racket/src"` +and follow the `"README.txt"` there, which gives you more configuration +options. + +If you don’t want any special configuration and you just want the base +build, you can use `make base` (or `nmake win32-base`) with the +top-level makefile. + +Minimal Racket does not require additional native libraries to run, but +under Windows, encoding-conversion, extflonum, and SSL functionality is +hobbled until native libraries from the `"racket-win32-i386"` or +`"racket-win32-x86_64"` package are installed. + +On all platforms, from the top-level makefile, `JOB_OPTIONS` as a +makefile variable and `PLT_SETUP_OPTIONS` as an environment variable are +passed on to the `raco setup` that is used to build minimal-Racket +libraries. See the documentation for `raco setup` for information on the +options. + +For cross compilation, add configuration options to +`CONFIGURE_ARGS_qq=""` as described in the `"README.txt"` of +`"racket/src"`, but also add a `PLAIN_RACKET=...` argument for the +top-level makefile to specify the same executable as in an +`–enable-racket=...` for `configure`. In general, the `PLAIN_RACKET` +setting should have the form `PLAIN_RACKET=" -C"` to ensure that +cross-compilation mode is used and that any foreign libraries needed for +build time can be found, but many cross-compilation scenarios work +without `-C`. + +Specify `SETUP_MACHINE_FLAGS=` to set Racket flags that control +the target machine of compiled bytecode for `raco setup` and `raco pkg +install`. For example `SETUP_MACHINE_FLAGS=-M` causes the generated +bytecode to be machine-independent, which is mainly useful when the +generated installation will be used as a template for other platforms or +for cross-compilation. + +#### 1.7.2. Installing Packages + +After you’ve built and installed minimal Racket, you could install +packages via the package-catalog server, completely ignoring the content +of `"pkgs"`. + +If you want to install packages manually out of the `"pkgs"` directory, +the `local-catalog` target creates a catalog as `"racket/local/catalog"` +that merges the currently configured catalog’s content with pointers to +the packages in `"pkgs"`. A Unix-style build works that way: it builds +and installs minimal Racket, and then it installs packages out of a +catalog that is created by `make local-catalog`. + +To add a package catalog that is used after the content of `"pkgs"` but +before the default package catalogs, specify the catalog’s URL as the +`SRC_CATALOG` makefile variable: + +  `make .... SRC_CATALOG=` + +#### 1.7.3. Linking Packages for In-Place Development Mode + +With an in-place build, you can edit packages within `"pkgs"` directly +or update those packages with `git pull` plus `raco setup`, since the +packages are installed with the equivalent of `raco pkg install -i +–static-link `. + +Instead of actually using `raco pkg install –static-link ...`, the +`pkgs-catalog` makefile target creates a catalog that points to the +packages in `"pkgs"`, and the catalog indicates that the packages are to +be installed as links. The `pkgs-catalog` target further configures the +new catalog as the first one to check when installing packages. The +configuration adjustment is made only if no configuration file +`"racket/etc/config.rktd"` exists already. + +All other packages (as specified by `PKGS`) are installed via the +configured package catalog. They are installed in installation scope, +but the content of `"racket/share/pkgs"` is not meant to be edited. To +reinstall a package in a mode suitable for editing and manipulation with +Git tools, use + +  `raco pkg update –clone extra-pkgs/` + +The `"extra-pkgs"` directory name is a convention that is supported by a +`".gitignore"` entry in the repository root. + +## 2. Distributing Racket Variants + +This chapter is about distributing variants of Racket, as opposed to +distributing applications that are built with Racket. See `raco +distribute`: Sharing Stand-Alone Executables for information about +distributing applications. + +**Important:** To build installers that can be distributed to other +users, do not use `make in-place` or `make unix-style`, but instead +start from a clean repository. + +Use one non-Windows machine as a server, where packages will be +pre-built. Then, as described below, create platform-specific installers +on some number of client machines, each of which contacts the server +machine to obtain pre-built packages. The server can act as a client, +naturally, to create an installer for the server’s platform. + +GNU `make` is required on the server machine, `nmake` is required on +Windows client machines, and any `make` should work on other client +machines. + +The distribution-build process is a collaboration between the Racket Git +repository’s top-level makefile and the `"distro-build"` package. + +### 2.1. Running Build Farms + +The `installers` target of the makefile will do everything to generate +installers: build a server on the current machine, run clients on hosts +specified via `CONFIG`, and start/stop VirtualBox virtual machines that +act as client machines. + +If the server is already built, the `installers-from-built` target will +drive the client builds without re-building the server. + +See the documentation of the `"distro-build"` package for a description +of the site-configuration module and requirements on client hosts. + +If `"my-site-config.rkt"` is a configuration module, then + +  `make installers CONFIG=my-site-config.rkt` + +drives the build farm, and the resulting installers are in +`"build/installers"`, with a hash table mapping descriptions to +installer filenames in `"build/installer/table.rktd"`. A log file for +each client is written to `"build/log"`. + +If you have the `"distro-build-server"` package installed in some Racket +build (not the one for building installers), you can use + +  `make describe-clients CONFIG=my-site-config.rkt` + +to see, without building anything, the effect of the configuration in +`"my-site-config.rkt"` and the planned build steps. + +The default `CONFIG` path is `"build/site.rkt"`, so you could put your +configuration file there and omit the `CONFIG` argument to `make`. A +default configuration file is created there automatically. Supply +`CONFIG_MODE=...` to pass a configuration mode on to your +site-configuration module (accessible via the `current-mode` parameter). +Supply `CLEAN_MODE=–clean` to make the default `#:clean?` configuration +for a client to `#t` instead of `#f`, supply `RELEASE_MODE=–release` to +make the default `#:release?` configuration `#t`, supply +`SOURCE_MODE=–source` to make the default `#:source?` configuration +`#t`, and supply `VERSIONLESS_MODE=–version` to make the default +`#:versionless?` configuration `#t`. + +A configuration file can specify the packages to include, host address +of the server, distribution name, installer directory, and documentation +search URL, but defaults can be provided as `make` arguments via `PKGS`, +`SERVER` plus `SERVER_PORT` plus `SERVER_HOSTS`, `DIST_NAME`, +`DIST_BASE`, and `DIST_DIR`, `DOC_SEARCH`, respectively. The site +configuration’s top-level options for packages and documentation search +URL are used to configure the set of packages that are available to +client machines to include in installers. + +For each installer written to `"build/installers"`, the installer’s name +is + +`"---."` + +where <_dist-base_> defaults to `"racket"` (but can be set via +`DIST_BASE`), <_platform_> is from `(system-library-subpath #f)` but +normalizing the Windows results to `"i386-win32"` and `"x86_63-win32"`, +-<_dist-suffix_> is omitted unless a `#:dist-suffix` string is specified +for the client in the site configuration, and <_ext_> is +platform-specific: `".sh"` for Unix (including Linux), `".dmg"` or +`".pkg"` for Mac OS, and `".exe"` for Windows. + +The server supports both `'cs` and `'3m` clients by creating built +packages in machine-independent form (which is then recompiled to the +client’s native format, still much faster than compiling from source). +Set `SERVER_COMPILE_MACHINE=` to disable machine-independent format for +built packages. + +### 2.2. Generating Installer Web Sites + +The `site` target of the makefile uses the `installers` target to +generate a set of installers, and then it combines the installers, +packages, a package catalog, and log files into a directory that is +suitable for access via a web server. + +Supply the same `CONFIG=...` and `CONFIG_MODE=...` arguments for `site` +as for `installers`. The configuration file should have a +`#:dist-base-url` entry for the URL where installers and packages will +be made available; the `installers` target uses `#:dist-base-url` to +embed suitable configuration into the installers. Specifically, +installers are configured to access pre-built packages and documentation +from the site indicated by `#:dist-base-url`. + +Note that `#:dist-base-url` should almost always end with `"/"`, since +others URLs will be constructed as relative to `#:dist-base-url`. + +The site is generated as `"build/site"` by default. A `#:site-dest` +entry in the configuration file can select an alternate destination. + +Use the `site-from-installers` makefile target to perform the part of +`site` that happens after `installers` (i.e., to generate a `site` from +an already-generated set of installers). + +### 2.3. Managing Snapshot Web Sites + +The `snapshot-site` makefile target uses `site` (so supply the same +`CONFIG=...` and `CONFIG_MODE=...` arguments), and then treats the +resulting site as a snapshot with additional snapshot-management tasks. + +For snapshot management, the destination of the files generated for +`site` (as specified by `#:site-dest`) should be within a directory of +snapshots. The configuration file can use `(current-stamp)` to get a +string that represents the current build, and then use the string both +for `#:dist-base-url` and `#:site-dest`. Normally, the stamp string is a +combination of the date and Git commit hash. + +Snapshot management includes creating an `"index.html"` file in the +snapshots directory (essentially a copy of the snapshot’s own +`"index.html"`) and pruning snapshot subdirectories to keep the number +of snapshots at the amount specified by `#:max-snapshots` +configuration-file entry (with a default value of `5`). + +Use the `snapshot-at-site` makefile target to perform the part of +`snapshot-site` that happens after `site` (i.e., to manage snapshots +around an already-generated site). + +### 2.4. Separate Server and Clients + +Instead of using the `installers` makefile target and a site +configuration file, you can run server and client processes manually. + +Roughly, the steps are as follows + +* On the server machine: + +   `make server PKGS=""` + + See step 2 in the detailed steps below for more information on + variables other than `PKGS` that you can provide with `make`. + +* On each client machine: + +   `make client SERVER=
PKGS=""` + + or + +   `nmake win32-client SERVER=
PKGS=""` + + See 4 in the detailed steps below for more information on variables + other than `SERVER` and `PKGS` that you can provide with `make`. + +In more detail, the steps are as follows: + +* Build `racket` on a server. + + The `base` target of the makefile will do that, if you haven’t done it + already. (The server only works on non-Windows platforms, currently.) + +* On the server, build packages and start a catalog server. + + The `server-from-base` target of the makefile will do that. + + Alternatively, use the `server` target, which combines `base` and + `server-from-base` (i.e., steps 1 and 2). + + The `SERVER_PORT` variable of the makefile choose the port on which + the server listens to clients. The default is port `9440`. + + The `SERVER_HOSTS` variable of the makefile determines the interfaces + at which the server listens. The default is `localhost` which listens + only on the loopback device (for security). Supply the empty string to + listen on all interfaces. Supply multiple addresses by separating them + with a comma. + + The `PKGS` variable of the makefile determines which packages are + built for potential inclusion in a distribution. + + The `DOC_SEARCH` variable of the makefile determine a URL that is + embedded in rendered documentation for cases where a remote search is + needed (because other documentation is not installed). + + The `SRC_CATALOG` variable determines the catalog that is used to get + package sources and native-library packages. The default is + `http://pkgs.racket-lang.org`. + + The `SERVER_PKG_INSTALL_OPTIONS` variable determines extra flags that + are passed to `raco pkg install` when installing on the server (to + create package builds that are sent to clients). For example, + `SERVER_PKG_INSTALL_OPTIONS=–source` could be useful to ensure that + the server always builds from sources. + + The `PACK_BUILT_OPTIONS` variable can be set to `–mode ` to set + the package mode for built packages. The default `infer` mode infers + uses the package’s `distribution-preference` `"info.rkt"` field, if + any, infers `binary` if the package has any native libraries and no + Racket sources, and infers `built` otherwise. + + The server provides README files from the `"build/readmes"` directory. + If `"README.txt"` does not exist when the sever is started, a default + file is created (and clients download `"README.txt"` by default). + + If you stop the server and want to restart it, use the + `built-package-server` makefile target instead of starting over with + the `server` target. + +* On each client (one for each platform to bundle), build `racket`. + + This is the same as step 1, but on each client. If the client and + server are the same, there’s nothing more to do for step 3. + +* On each client, create an installer. + + The `client` (or `win32-client`) target of the makefile will do that. + + Provide `SERVER` as the hostname of the server machine, but a + `localhost`-based tunnel back to the server is more secure and avoids + the need to specify `SERVER_HOSTS` when starting the server in step 2. + Also, provide `SERVER_PORT` if an alternate port was specified in step + 2. + + Provide the same `PKGS` (or a subset) as in step 2 if you want a + different set than the ones listed in the makefile. Similarly, + `DOC_SEARCH` normally should be the same as in step 2, but for a + client, it affects future documentation builds in the installation. + + Alternatively, use the `client` target, which combines `base` and + `client-from-base` (i.e., steps 3 and 4). + + On Windows, you need NSIS installed, either in the usual location or + with `makensis` in your command-line path. + + To create a release installer, provide `RELEASE_MODE` as `--release` + to `make`. A release installer has slightly different defaults that + are suitable for infrequently updated release installations, as + opposed to frequently updated snapshot installations. + + To create a source archive, provide `SOURCE_MODE` as `--source` to + `make`. + + To create an archive that omits the version number and also omit and + version number in installer paths, provide `VERSIONLESS_MODE` as + `--versionless` to `make`. + + To change the human-readable name of the distribution as embedded in + the installer, provide `DIST_NAME` to `make`. The default distribution + name is `Racket`. Whatever name you pick, the Racket version number is + automatically added for various contexts. + + To change the base name of the installer file, provide `DIST_BASE` to + `make`. The default is `racket`. + + To change the directory name for installation on Unix (including + Linux), provide `DIST_DIR` to `make`. The default is `racket`. + + To add an extra piece to the installer’s name, such as an identifier + for a variant of Linux, provide `DIST_SUFFIX` to `make`. The default + is `"", which` omits the prefix and its preceding hyphen. + + To set the description string for the installer, provide `DIST_DESC` + to `make`. The description string is recorded alongside the installer. + + To set the initial package catalogs URLs for an installation, provide + `DIST_CATALOGS_q` to `make`. Separate multiple URLs with a space, and + use an empty string in place of a URL to indicate that the default + catalogs should be used. The `_q` in the variable name indicates that + its value can include double quotes (but not single quotes)—which are + needed to specify an empty string, for example. + + To select a `"README"` file for the client, provide `README` to + `make`. The `README` value is used as a file name to download from the + server. + + To create a `".tgz"` archive instead of an installer (or any + platform), set `TGZ_MODE` to `--tgz`. + + For a Mac OS installer, set `SIGN_IDENTITY` as the name to which the + signing certificate is associated. Set `MAC_PKG_MODE` to `--mac-pkg` + to create a `".pkg"` installer instead of a `".dmg"` image. + + For a Windows installer, set `OSSLSIGNCODE_ARGS_BASE64` as a Base64 + encoding of an S-expression for a list of argument strings for + `osslsigncode`. The `-n`, `-t`, `-in`, and `-out` arguments are + provided to `osslsigncode` automatically, so supply the others. + + The `SERVER_CATALOG_PATH` and `SERVER_COLLECTS_PATH` makefile + variables specify paths at `SERVER` plus `SERVER_PORT` to access the + package catalog and pre-built `"collects"` tree needed for a client, + but those paths should be empty for a server started with `make + server`, and they are used mainly by `make client-from-site` + \(described below\). + + The `UPLOAD` makefile variable specifies a URL to use as an upload + destination for the created installed, where the installer’s name is + added to the end of the URL, or leave as empty for no upload. + +On each client, step 4 produces a `"bundle/installer.txt"` file that +contains the path to the generated installer on one line, followed by +the description on a second line. The installer is also uploaded to the +server, which leaves the installer in a `"build/installers"` directory +and records a mapping from the installer’s description to its filename +in `"build/installers/table.rktd"`. + +If you provide `JOB_OPTIONS=` for either a client or server +build, the options are used both for `raco setup` and `raco pkg +install`. Normally, `JOB_OPTIONS` is used to control parallelism. + +### 2.5. Creating a Client from an Installer Web Site + +If you (or someone else) previously created an installer site with `make +site`, then `make client-from-site` in a clean repository creates an +installer for the current platform drawing packages from the site. + +At a minimum, provide `SERVER`, `SERVER_PORT` (usually 80), and +`SITE_PATH` (if not empty, include a trailing `/`) makefile variables to +access a site at + +`http://$(SERVER):$(SERVER_PORT)/$(SITE_PATH)` + +The `client-from-site` makefile target chains to `make client` while +passing suitable values for `DIST_CATALOGS_q`, `DOC_SEARCH`, +`SERVER_CATALOG_PATH`, and `SERVER_COLLECTS_PATH`. Supply any other +suitable variables, such as `DIST_NAME` or `RELEASE_MODE`, the same as +for `make client`. + +## 3. Contibuting to Racket Development + +The Racket developers are happy to receive bug reports and improvements +to the implementation and documentation through GitHub issues and pull +requests: + +* Issues (bug reports): + [https://github.com/racket/racket/issues](https://github.com/racket/racket/issues) + +* Pull requests (improvements): + [https://github.com/racket/racket/pulls](https://github.com/racket/racket/pulls) + +The Racket distribution includes scores of packages that have their own +separate repositories, which somewhat complicates the process of sending +pull requests. The mechanism is the same, but see [Distribution-Package +Contributions](#32-distribution-package-contributions) for more +guidance. + +By making a contribution, you are agreeing that your contribution is +licensed under the LGPLv3, Apache 2.0, and MIT licenses. Those licenses +are available in the [Racket Git +repository](https://github.com/racket/racket) in the files +`"LICENSE.txt"`, `"LICENSE-APACHE.txt"`, and `"LICENSE-MIT.txt"`. + +### 3.1. Main-Repository Contributions + +The [main Racket Git repository](https://github.com/racket/racket) +contains the implementation of everything that is in the Minimal Racket +distribution. That includes the runtime system, core libraries, and +`raco pkg` so that other packages can be installed. + +The main Racket repository also has the source to the Racket Reference, +Racket Guide, and other core-ish documentation, including the source to +the document that you are reading. Those document sources are in the +repository’s `"pkgs"` directory. + +Finally, the main repository includes a few other packages that are +especially tightly bound to the runtime-system implementation, such as +the `"compiler-lib"` package or the `"racket-test"` package. Those +package sources are also in the repository’s `"pkgs"` directory. + +To develop improvements to any of those parts of Racket, following the +usual GitHub-based workflow: + +* Fork the Racket repository. + +* Create an in-place build as described in [Building Racket from + Source](#1-building-racket-from-source). + +* Make your changes and rebuild with `make` or `make as-is` or `raco + setup`, where `raco setup` is the best choice when modifying Racket + libraries that are in `"collects"` or a package. + +* Commit changes to your fork and [submit a pull + request](https://help.github.com/en/articles/creating-a-pull-request). + +See the [General Contribution +Guidelines](#33-general-contribution-guidelines). + +The variant of Chez Scheme that is needed to build Racket on Chez Scheme +has its own repository (to preserve the shape of the original Chez +Scheme reporitory): +[https://github.com/racket/ChezScheme](https://github.com/racket/ChezScheme). + +### 3.2. Distribution-Package Contributions + +If you find yourself changing a file that is in a `"share/pkgs"` +subdirectory, then that file is not part of the main Racket Git +repository. It almost certainly has its own Git repository somewhere +else, possibly within +[https://github.com/racket](https://github.com/racket), but possibly in +another user’s space. The name of the directory in `"share/pkgs"` is +almost certainly the package name. + +To start working on a package <_pkg-name_>, it’s usually best to go to +the root directory of your Racket repository checkout and run + +  `raco pkg update –clone extra-pkgs/` + +That will create `"extra-pkgs/"` as a clone of the package’s +source Git repository, it will replace the current installation of the +package in your Racket build to point at that directory, and then it +will rebuild (essentially by using `raco setup`) with the new location +of the package installation. Now you can edit in +`"extra-pkgs/"`, and your changes will be live. + +Some information that might improve your experience: + +* You can add `--no-setup` to the `raco pkg update` command to skip the + `raco setup` step, which makes sense if you want to make changes and + then run `raco setup` yourself. + +* A package is sometimes a subdirectory within a Git respository, and it + would be better if the checkout in `"extra-pkgs"` matched the + respoitory name instead of the package name. If you know the + repository name, you can use + +   `raco pkg update –clone extra-pkgs/ ` + + to make the distinction. + +* This same approach will generally work if you’re starting from a + distribution installer instead of the checkout of the Raclet sources + from the main Git repository. You’ll need write permission to the + installation, though, so that `raco pkg update` can redirect the + package. Also, there’s no particular reason to use `extra-pkgs` in + that case. + +* If you’re done and want to go back to the normal installation for + <_pkg-name_>, use + +   `raco pkg update –catalog ` + +* See Developing Packages with Git for more information about how + packages are meant to work as Git repositories. + +Note that none of this is necessary if you’re modifying a package in the +main Racket repository’s `"pkgs"` directory. Those are automatically +linked in place for an in-place build of Racket. + +### 3.3. General Contribution Guidelines + +When you make a pull request, the Racket developers will help you get +the improvement in shape to merge to the Racket repository. You can make +that process faster by keeping a few guidelines in mind: + +* Try to follow the style guide. + +* When you fix a bug or create a new feature, include a test case for + it. + + Note that core Racket tests are in + `"pkgs/racket-test-core/tests/racket"`, and tests for other libraries + are also sometimes in a separate `"-test"` package. + +* Include new or updated documentation as appropriate. + + Note that the Racket reference is in + `"pkgs/racket-doc/scribblings/reference"`, and documentation for other + libraries are also sometimes in a separate `"-doc"` package. + + When adding to a library or extending an existing binding’s behavior, + be sure to include a `history` note in the documentation to record the + change. + +* Build with your changes. + + Don’t break the Racket build. That means at least checking that `raco + setup` runs and completes without errors. If you added or modified + documentation, visually inspect the newly rendered documentation to + make sure it reads as intended. + + A common mistake is to just run a modified library or its tests, but + where a change creates a new package dependency that will only be + detected by a full `raco setup`. _Really:_ run `raco setup`. + +### 3.4. More Resources + +For additional pointers on how to contribute to Racket, see + +[https://github.com/racket/racket/wiki/Ways-to-contribute-to-Racket](https://github.com/racket/racket/wiki/Ways-to-contribute-to-Racket) diff --git a/pkgs/racket-build-guide/Makefile b/pkgs/racket-build-guide/Makefile new file mode 100644 index 0000000000..9a2f5d0ae2 --- /dev/null +++ b/pkgs/racket-build-guide/Makefile @@ -0,0 +1,3 @@ + +render: + raco scribble +m --markdown --seclink --dest ../.. --dest-name build-guide racket-build-guide.scrbl diff --git a/pkgs/racket-build-guide/build.scrbl b/pkgs/racket-build-guide/build.scrbl index f3a5de0289..bb1ec02f8f 100644 --- a/pkgs/racket-build-guide/build.scrbl +++ b/pkgs/racket-build-guide/build.scrbl @@ -1,6 +1,5 @@ #lang scribble/manual -@(require "common.rkt" - scribble/bnf) +@(require "common.rkt") @title[#:tag "build"]{Building Racket from Source} @@ -193,8 +192,9 @@ control both the makefile and the @exec{raco setup} part, use @commandline{make CPUS=@nonterm{n}} -which recurs with @exec{make -j JOB_OPTIONS="-j "}. Setting -@exec{CPUS} also works with @exec{make unix-style}. +which recurs with @exec{make -j @nonterm{n} JOB_OPTIONS="-j +@nonterm{n}"}. Setting @exec{CPUS} also works with @exec{make +unix-style}. Use @exec{make as-is} (or @exec{nmake win32-as-is}) to perform the same build actions as @exec{make in-place}, but without consulting any @@ -234,11 +234,11 @@ bootstrap. And if you have a Chez Scheme source directory already, you can supply that with @exec{SCHEME_SRC=@nonterm{dir}} instead of downloading a new copy: +@commandline{make cs RACKET=racket SCHEME_SRC=path/to/ChezScheme} + @margin-note{For now, Racket on Chez requires the variant of Chez Scheme at @url{https://github.com/racket/ChezScheme}} -@commandline{make cs RACKET=racket SCHEME_SRC=path/to/ChezScheme} - Use @exec{make both} to build both traditional Racket and Racket on Chez Scheme, where packages are updated and documentation is built only once (using traditional Racket). diff --git a/pkgs/racket-build-guide/common.rkt b/pkgs/racket-build-guide/common.rkt index d54b69383c..ad8f0112f8 100644 --- a/pkgs/racket-build-guide/common.rkt +++ b/pkgs/racket-build-guide/common.rkt @@ -1,5 +1,18 @@ #lang racket/base +(require scribble/base + scribble/bnf) -(provide git-repo) +(provide (all-defined-out) + nonterm) (define git-repo "https://github.com/racket/racket") + +;; Unlike `exec` from `scribble/manual`, apply +;; 'tt to all arguments, because that looks right +;; for markdown output: +(define (exec . s) + (elem #:style 'tt s)) + +;; Ditto +(define (commandline . s) + (para (hspace 2) (elem #:style 'tt s))) diff --git a/pkgs/racket-build-guide/contribute.scrbl b/pkgs/racket-build-guide/contribute.scrbl index cd1492635a..1400b4235f 100644 --- a/pkgs/racket-build-guide/contribute.scrbl +++ b/pkgs/racket-build-guide/contribute.scrbl @@ -1,6 +1,5 @@ #lang scribble/manual @(require "common.rkt" - scribble/bnf (for-label (only-in scribble/manual history))) @title[#:tag "contribute"]{Contibuting to Racket Development} diff --git a/pkgs/racket-build-guide/distribute.scrbl b/pkgs/racket-build-guide/distribute.scrbl index 87de2e0d8e..cb62bff0b4 100644 --- a/pkgs/racket-build-guide/distribute.scrbl +++ b/pkgs/racket-build-guide/distribute.scrbl @@ -1,6 +1,5 @@ #lang scribble/manual -@(require "common.rkt" - scribble/bnf) +@(require "common.rkt") @(define distro-build-doc '(lib "distro-build/distro-build.scrbl")) diff --git a/pkgs/racket-build-guide/info.rkt b/pkgs/racket-build-guide/info.rkt index 2e7b575505..7e4b341f41 100644 --- a/pkgs/racket-build-guide/info.rkt +++ b/pkgs/racket-build-guide/info.rkt @@ -3,11 +3,11 @@ (define scribblings '(("racket-build-guide.scrbl" (multi-page) (racket-core -98)))) (define deps - '("base")) + '("base" + "scribble-lib")) (define build-deps - '("scribble-lib" - "racket-doc" + '("racket-doc" "scribble-doc" "distro-build-doc")) diff --git a/racket/src/README.txt b/racket/src/README.txt index 2126bc9e6f..f419803a90 100644 --- a/racket/src/README.txt +++ b/racket/src/README.txt @@ -2,7 +2,7 @@ This is the source code distribution for minimal Racket. If this directory is part of a clone of the Git repository for Racket, then the clone's root directory includes a makefile to both build -minimal Racket and install packages. See "INSTALL.txt" in the clone's +minimal Racket and install packages. See "build-guide.md" in the clone's root directory. ========================================================================