6.14 API for Cross-Platform Configuration
See the raco cross documentation for information about raco cross, a tool that is provided by the "raco-cross" package as a convenient interface to cross-compilation for Racket. The underlying API documented here supports raco cross and other tools.
(require setup/cross-system) | package: base |
A Racket installation includes a "system.rktd" file in the directory reported by (find-lib-dir). When the information in that file does not match the running Racket’s information, then the setup/cross-system module infers that Racket is being run in cross-installation mode.
For example, if an in-place Racket BC installation for a different platform resides at ‹cross-dir›, then running Racket BC as
racket -C -G ‹cross-dir›/etc -X ‹cross-dir›/collects -l- raco pkg
runs raco pkg using the current platform’s racket executable, but using the collections and other configuration information of ‹cross-dir›, as well as modifying the packages of ‹cross-dir›. That can work as long as no platform-specific libraries need to run to perform the requested raco pkg action (e.g., when installing built packages), or as long as the current platform’s installation already includes those libraries.
For Racket CS, cross compilation is more complicated, because Racket CS ".zo" files are platform-specific:
A target installation ‹cross-dir› is needed that includes cross-compilation support for the host platform as plug-in within the installation’s "‹cross-dir›/lib" directory. That installation might be created by compiling from source on the host platform. Only Racket CS can use a CS cross-compilation plug-in.
When running racket in cross mode, use the --cross-compiler flag to specify the target machine and path to the "‹cross-dir›/lib" directory.
A flag combination -MCR with argument "‹absolute-zo-dir›:" is needed to enable ".zo" file creation for both the host platform (which uses the directory before a :) and the target platform (which uses the normal compiled-file subdirectory when the path after the : is empty).
The ‹absolute-zo-dir› can be any absolute path. It generally should be populated by running raco setup in cross mode before commands like raco pkg.
For example, the raco pkg example for Racket CS is
racket --cross-compiler ‹target-machine› ‹cross-dir›/lib \ |
-MCR ‹absolute-zo-dir›: \ |
-G ‹cross-dir›/etc -X ‹cross-dir›/collects -l- raco pkg |
The ‹target-machine› provided to --cross-compiler should be the same as the target-machine entry in "‹cross-dir›/lib/systemd.rktd".
The -C flag is shorthand for --cross, -M is short for --compile-any, -R is short for --compiled, -G is short for --config, -X is short for --collects, and -MCR is short for -M -C -R.
Added in version 6.3 of package base.
procedure
(cross-system-type [mode])
→ (or/c symbol? string? bytes? exact-positive-integer? vector?)
mode :
(or/c 'os 'word 'gc 'vm 'link 'machine 'so-suffix 'so-mode 'fs-change) = 'os
See also 'cross mode for system-type.
procedure
(cross-system-library-subpath [mode]) → path-for-some-system?
mode : (or/c 'cgc '3m 'cs #f) = (system-type 'gc)
In cross-installation mode, the target platform may have a different path convention than the current platform, so the result is path-for-some-system? instead of path?.
procedure