hare

[hare] The Hare programming language
git clone https://git.torresjrjr.com/hare.git
Log | Files | Refs | README | LICENSE

hare.scd (10128B)


      1 hare(1)
      2 
      3 # NAME
      4 
      5 hare - compiles, runs, and tests Hare programs
      6 
      7 # SYNOPSIS
      8 
      9 *hare* build [-cv]++
     10 	[-D _ident[:type]=value_]++
     11 	[-j _jobs_]++
     12 	[-L libdir]++
     13 	[-l _name_]++
     14 	[-o _path_]++
     15 	[-t _arch_]++
     16 	[-T _tags_] [-X _tags_]++
     17 	[_path_]
     18 
     19 *hare* deps [-Mm] [-T _tags_] [-X _tags_] _path_
     20 
     21 *hare* run [-v]++
     22 	[-D _ident[:type]=value_]++
     23 	[-l _name_]++
     24 	[-L libdir]++
     25 	[-j _jobs_]++
     26 	[-T _tags_] [-X _tags_]++
     27 	[_path_] [_args_...]
     28 
     29 *hare* test [-v]++
     30 	[-D _ident[:type]=value_]++
     31 	[-l _name_]++
     32 	[-L libdir]++
     33 	[-j _jobs_]++
     34 	[-T _tags_] [-X _tags_]++
     35 	_tests_
     36 
     37 *hare* version [-v]
     38 
     39 # DESCRIPTION
     40 
     41 ; TODO: Decide on and document driver exit statuses
     42 *hare build* compiles a Hare program into an executable. The _path_ argument is
     43 a path to a Hare source file or a directory which contains a Hare module (see
     44 *MODULES* below). If no path is given, the Hare module contained in the current
     45 working directory is built.
     46 
     47 *hare deps* queries the dependencies graph of a Hare program. The _path_ argument
     48 is equivalent in usage to *hare build*.
     49 
     50 *hare run* compiles and runs a Hare program. The _path_ argument is equivalent
     51 in usage to *hare build*. If provided, any additional _args_ are passed to the
     52 Hare program which is run. os::args[0] is set to the _path_ argument.
     53 
     54 *hare test* compiles and runs tests for Hare code. All Hare modules in the
     55 current working directory are recursively discovered, built, and their tests
     56 made eligible for the test run. If the _tests_ argument is omitted, all tests
     57 are run. Otherwise, each argument is interpreted as a *glob*(7) pattern, giving
     58 the names of the tests that should be run. *hare test* adds the +test tag to the
     59 default build tags.
     60 
     61 *hare version* prints version information for the *hare* program. If *-v* is
     62 supplied, it also prints information about the build parameters. The output
     63 format is consistent for machine reading: the first line is always "Hare version
     64 $version". Subsequent lines give configuration values in the form of a name,
     65 value, and optional context, separated by tabs.
     66 
     67 # OPTIONS
     68 
     69 ## hare build
     70 
     71 *-c*
     72 	Compile only, do not link. The output is an object file (for Hare-only
     73 	modules) or archive (for mixed source modules).
     74 
     75 *-v*
     76 	Enable verbose logging. Prints every command to stderr before executing
     77 	it.
     78 
     79 *-D* _ident[:type]=value_
     80 	Passed to *harec*(1) to define a constant in the type system. _ident_ is
     81 	parsed as a Hare identifier (e.g. "foo::bar::baz"), _type_ as a Hare
     82 	type (e.g. "str" or "struct { x: int, y: int }"), and _value_ as a Hare
     83 	expression (e.g. "42"). Take care to address any necessary escaping to
     84 	avoid conflicts between your shell syntax and Hare syntax.
     85 
     86 *-j* _jobs_
     87 	Defines the maximum number of jobs which *hare* will execute in
     88 	parallel. The default is the number of processors available on the host.
     89 
     90 *-l* _name_
     91 	Link with the named system library. The name is passed to
     92 	*pkg-config --libs* (see *pkg-config*(1)) to obtain the appropriate
     93 	linker flags.
     94 
     95 *-L libdir*
     96 	Add directory to the linker library search path.
     97 
     98 *-o* _path_
     99 	Set the output file to the given path.
    100 
    101 *-t* _arch_
    102 	Set the desired architecture for cross-compiling. See *ARCHITECTURES*
    103 	for supported architecture names.
    104 
    105 *-T* _tags_
    106 	Adds additional build tags. See *CUSTOMIZING BUILD TAGS*.
    107 
    108 *-X* _tags_
    109 	Unsets build tags. See *CUSTOMIZING BUILD TAGS*.
    110 
    111 ## hare deps
    112 
    113 *-d*
    114 	Print dependency graph as a dot file for use with *graphviz*(1).
    115 
    116 *-M*
    117 	Print rules compatible with POSIX *make*(1).
    118 
    119 *-T* _tags_
    120 	Adds additional build tags. See *CUSTOMIZING BUILD TAGS*.
    121 
    122 *-X* _tags_
    123 	Unsets build tags. See *CUSTOMIZING BUILD TAGS*.
    124 
    125 ## hare run
    126 
    127 *-v*
    128 	Enable verbose logging. Prints every command to stderr before executing
    129 	it.
    130 
    131 *-D* _ident[:type]=value_
    132 	Passed to *harec*(1) to define a constant in the type system. _ident_ is
    133 	parsed as a Hare identifier (e.g. "foo::bar::baz"), _type_ as a Hare
    134 	type (e.g. "str" or "struct { x: int, y: int }"), and _value_ as a Hare
    135 	expression (e.g. "42"). Take care to address any necessary escaping to
    136 	avoid conflicts between your shell syntax and Hare syntax.
    137 
    138 *-j* _jobs_
    139 	Defines the maximum number of jobs which *hare* will execute in
    140 	parallel. The default is the number of processors available on the host.
    141 
    142 *-l* _name_
    143 	Link with the named system library. The name is passed to
    144 	*pkg-config --libs* (see *pkg-config*(1)) to obtain the appropriate
    145 	linker flags.
    146 
    147 *-L libdir*
    148 	Add directory to the linker library search path.
    149 
    150 *-T* _tags_
    151 	Adds additional build tags. See *CUSTOMIZING BUILD TAGS*.
    152 
    153 *-X* _tags_
    154 	Unsets build tags. See *CUSTOMIZING BUILD TAGS*.
    155 
    156 ## hare test
    157 
    158 *-v*
    159 	Enable verbose logging. Prints every command to stderr before executing
    160 	it.
    161 
    162 *-D* _ident[:type]=value_
    163 	Passed to *harec*(1) to define a constant in the type system. _ident_ is
    164 	parsed as a Hare identifier (e.g. "foo::bar::baz"), _type_ as a Hare
    165 	type (e.g. "str" or "struct { x: int, y: int }"), and _value_ as a Hare
    166 	expression (e.g. "42"). Take care to address any necessary escaping to
    167 	avoid conflicts between your shell syntax and Hare syntax.
    168 
    169 *-j* _jobs_
    170 	Defines the maximum number of jobs which *hare* will execute in
    171 	parallel. The default is the number of processors available on the host.
    172 
    173 *-l* _name_
    174 	Link with the named system library. The name is passed to
    175 	*pkg-config --libs* (see *pkg-config*(1)) to obtain the appropriate
    176 	linker flags.
    177 
    178 *-L libdir*
    179 	Add directory to the linker library search path.
    180 
    181 *-T* _tags_
    182 	Adds additional build tags. See *CUSTOMIZING BUILD TAGS*.
    183 
    184 *-X* _tags_
    185 	Unsets build tags. See *CUSTOMIZING BUILD TAGS*.
    186 
    187 ## hare version
    188 
    189 *-v*
    190 	Show build parameters.
    191 
    192 # MODULES
    193 
    194 The _path_ argument to *hare build* and *hare run* are used to identify the
    195 inputs for the build. If this path is a file, it is treated as a single Hare
    196 source file. If it is a directory, the directory is treated as a module, and is
    197 placed in the global namespace for the build.
    198 
    199 All files which end in *.ha* and *.s* are treated as inputs to the module, and
    200 are respectively treated as Hare sources and assembly sources. A module with a
    201 mix of assembly and Hare sources are considered *mixed* modules, and have some
    202 special semantics.
    203 
    204 The list of files considered eligible may be filtered by build tags. The format
    205 for the filename is _name_[+_tags_]._ext_, where the _name_ is user-defined, the
    206 _ext_ is either 'ha' or 's', and a list of tags are provided after the name. A
    207 plus symbol ('+') will cause a file to be included only if that tag is present,
    208 and a minus symbol ('-') will cause a file to be excluded if that tag is
    209 present. Only one file for a given _name_ will be selected for the build, and
    210 among files with eligible tags, the one with the most tag specifiers is
    211 selected.
    212 
    213 For example, if the following files are present in a directory:
    214 
    215 - foo.ha
    216 - bar.ha
    217 - bar+linux.ha
    218 - bar+plan9.ha
    219 - baz+x86_64.s
    220 - bat-x86_64.ha
    221 
    222 If the build tags are +linux+x86_64, then the files which are included in the
    223 module are foo.ha, bar+linux.ha, and baz+x86_64.s.
    224 
    225 Additionally, subdirectories in a module will be considered part of that module
    226 if their name consists *only* of a tag set, e.g. "+linux" or "-x86_64". A
    227 directory with a name *and* tag set is never considered as part of any module,
    228 such as "example+linux". A directory with only a name (e.g. "example") is
    229 considered a sub-module of its parent directory and must be imported separately,
    230 so "foo::bar" refers to foo/bar/.
    231 
    232 # DEPENDENCY RESOLUTION
    233 
    234 The "use" statements in each source file which is used as an input to *hare
    235 build* or *hare run* are scanned and used to determine the dependencies for the
    236 program, and this process is repeated for each dependency to obtain a complete
    237 dependency graph.
    238 
    239 Dependencies are searched for by examining first the current working directory,
    240 then each component of the *HAREPATH* environment variable in order, which is a
    241 list of paths separated by colons. The default value of the *HAREPATH* may be
    242 found with the *hare version -v* command. Typically, it is set to include the
    243 path to the standard library installed on the system, as well as a
    244 system-provided storage location for third-party modules installed via the
    245 system package manager.
    246 
    247 # ARCHITECTURES
    248 
    249 The *-t* flag for *hare build* is used for cross-compilation, and selects a
    250 architecture different from the host to target. The list of supported
    251 architectures is:
    252 
    253 - aarch64
    254 - riscv64
    255 - x86_64
    256 
    257 The system usually provides reasonable defaults for the *AR*, *AS*, and *LD*
    258 tools based on the desired target. However, you may wish to set these variables
    259 yourself to control the cross toolchain in use.
    260 ; TODO: sysroots
    261 
    262 # CUSTOMIZING BUILD TAGS
    263 
    264 Build tags allow you to add constraints on what features or platforms are
    265 enabled for your build. A tag is a name, consisting of alphanumeric characters
    266 and underscores, and a + or - prefix to signal inclusivity or exclusivity. See
    267 *MODULES* for details on how build tags affect module input selection.
    268 
    269 To add new tag constraints, inclusive or exclusive, use the *-T* flag. "-T
    270 +foo-bar" will include the 'foo' tag and exclude the 'bar' tag. To remove
    271 constraints, use the *-X* in a similar fashion; "-X +foo-bar" will reverse the
    272 previous *-T* example.
    273 
    274 Some tags are enabled by default, enabling features for the host platform. You
    275 can view the default tagset by running *hare version -v*. To remove all default
    276 tags, use "-X^".
    277 
    278 # ENVIRONMENT
    279 
    280 The following environment variables affect *hare*'s execution:
    281 
    282 |[ *HARECACHE*
    283 :< The path to the object cache. Defaults to _$XDG_CACHE_HOME/hare_, or
    284    _~/.cache/hare_ if that doesn't exist.
    285 |  *HAREPATH*
    286 :  See *DEPENDENCY RESOLUTION*.
    287 |  *HAREFLAGS*
    288 :  Applies additional flags to the command line arguments.
    289 |  *HAREC*
    290 :  Name of the *harec*(1) command to use.
    291 |  *AR*
    292 :  Name of the *ar*(1) command to use.
    293 |  *ARFLAGS*
    294 :  Additional flags to pass to *ar*(1).
    295 |  *AS*
    296 :  Name of the *as*(1) command to use.
    297 |  *ASFLAGS*
    298 :  Additional flags to pass to *as*(1).
    299 |  *LD*
    300 :  Name of the *ld*(1) command to use.
    301 |  *LDLINKFLAGS*
    302 :  Additional flags to pass to *ld*(1).
    303 
    304 # SEE ALSO
    305 
    306 *harec*(1), *haredoc*(1), *as*(1), *ld*(1), *ar*(1), *make*(1)