diff --git a/BUILD.bazel b/BUILD.bazel index 48b0998f..7216e1dd 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -90,7 +90,7 @@ BASE_UNIT_STRING = " ".join(BASE_UNITS) GIT_ID_CMD = "cat bazel-out/stable-status.txt | grep STABLE_GIT_ID | sed 's/STABLE_GIT_ID \\(.*\\)/\\1/' | tr -d '\\n'" -CMD_ROOT = "$(location tools/bin/make-single-file) {extra_opts} {units} {all_constants} --version-id $$({id_cmd}) > $(OUTS)" +CMD_ROOT = "$(location tools/bin/make-single-file) {extra_opts} {units} {all_literals} {all_constants} --version-id $$({id_cmd}) > $(OUTS)" ################################################################################ # Release single-file package `au.hh` @@ -101,6 +101,7 @@ genrule( outs = ["docs/au.hh"], cmd = CMD_ROOT.format( all_constants = "", + all_literals = "", extra_opts = "", id_cmd = GIT_ID_CMD, units = "--units " + BASE_UNIT_STRING, @@ -125,6 +126,7 @@ genrule( outs = ["docs/au_noio.hh"], cmd = CMD_ROOT.format( all_constants = "", + all_literals = "", extra_opts = "--noio", id_cmd = GIT_ID_CMD, units = "--units " + BASE_UNIT_STRING, @@ -149,6 +151,7 @@ genrule( outs = ["docs/au_all_units.hh"], cmd = CMD_ROOT.format( all_constants = "--all-constants", + all_literals = "--all-literals", extra_opts = "", id_cmd = GIT_ID_CMD, units = "--all-units", @@ -173,6 +176,7 @@ genrule( outs = ["docs/au_all_units_noio.hh"], cmd = CMD_ROOT.format( all_constants = "--all-constants", + all_literals = "--all-literals", extra_opts = "--noio", id_cmd = GIT_ID_CMD, units = "--all-units", @@ -197,6 +201,7 @@ genrule( outs = ["docs/au_stdformat.hh"], cmd = CMD_ROOT.format( all_constants = "", + all_literals = "", extra_opts = "--std-format", id_cmd = GIT_ID_CMD, units = "--units " + BASE_UNIT_STRING, @@ -217,6 +222,7 @@ genrule( outs = ["docs/au_stdformat_noio.hh"], cmd = CMD_ROOT.format( all_constants = "", + all_literals = "", extra_opts = "--std-format --noio", id_cmd = GIT_ID_CMD, units = "--units " + BASE_UNIT_STRING, @@ -237,6 +243,7 @@ genrule( outs = ["docs/au_all_units_stdformat.hh"], cmd = CMD_ROOT.format( all_constants = "--all-constants", + all_literals = "--all-literals", extra_opts = "--std-format", id_cmd = GIT_ID_CMD, units = "--all-units", @@ -257,6 +264,7 @@ genrule( outs = ["docs/au_all_units_stdformat_noio.hh"], cmd = CMD_ROOT.format( all_constants = "--all-constants", + all_literals = "--all-literals", extra_opts = "--std-format --noio", id_cmd = GIT_ID_CMD, units = "--all-units", diff --git a/docs/install.md b/docs/install.md index 2d68ba3a..d746c19e 100644 --- a/docs/install.md +++ b/docs/install.md @@ -96,7 +96,7 @@ to your `deps` attribute, and include the appropriate files. | Dependency | Headers provided | Notes | |------------|------------------|-------| -| `@au//au` | `"au/au.hh"`
`"au/fwd.hh"`
`"au/units/*.hh"`
`"au/units/*_fwd.hh"`
`"au/constants/*.hh"` | Core library functionality. See [all available units](https://github.com/aurora-opensource/au/tree/main/au/units) and [constants](./reference/constant.md#built-in) | +| `@au//au` | `"au/au.hh"`
`"au/fwd.hh"`
`"au/units/*.hh"`
`"au/units/*_fwd.hh"`
`"au/units/literals/*.hh"`
`"au/constants/*.hh"` | Core library functionality. See [all available units](https://github.com/aurora-opensource/au/tree/main/au/units), [unit literals](./reference/constant.md#unit-literals), and [constants](./reference/constant.md#built-in) | | `@au//au:io` | `"au/io.hh"` | `operator<<` support | | `@au//au:std_format` | `"au/std_format.hh"` | `std::format` support[^1] | | `@au//au:testing` | `"au/testing.hh"` | Utilities for writing googletest tests
_Note:_ `testonly = True` | @@ -176,7 +176,7 @@ In either case, here are the main targets and include files provided by the Au l | Target | Headers provided | Notes | |--------|------------------|-------| -| `Au::au` | `"au/au.hh"`
`"au/fwd.hh"`
`"au/io.hh"`
`"au/std_format.hh"`[^1]
`"au/units/*.hh"`
`"au/units/*_fwd.hh"`
`"au/constants/*.hh"` | Core library functionality. See [all available units](https://github.com/aurora-opensource/au/tree/main/au/units) | +| `Au::au` | `"au/au.hh"`
`"au/fwd.hh"`
`"au/io.hh"`
`"au/std_format.hh"`[^1]
`"au/units/*.hh"`
`"au/units/*_fwd.hh"`
`"au/units/literals/*.hh"`
`"au/constants/*.hh"` | Core library functionality. See [all available units](https://github.com/aurora-opensource/au/tree/main/au/units) and [unit literals](./reference/constant.md#unit-literals) | | `Au::testing` | `"au/testing.hh"` | Utilities for writing googletest tests | [^1]: Do not include `"au/std_format.hh"` unless you know that both your compiler and your build @@ -426,6 +426,11 @@ Here's how: - Similarly, to see the full list of available constants, search the `.hh` files in the `au/constants/` folder. For example, `speed_of_light` will include the contents of `"au/constants/speed_of_light.hh"`, which provides the constant `au::SPEED_OF_LIGHT`. + - To include [unit literals](./reference/constant.md#unit-literals), pass the `--literals` flag + with the units whose literals you want: for example,
+ `tools/bin/make-single-file --units meters seconds --literals meters`.
+ Each entry named here also pulls in the unit itself, so `--literals meters` works even if + `meters` isn't in the `--units` list. - Provide the `--noio` flag if you prefer to avoid the expense of the `` library. Now you have a file, `~/au.hh`, which you can add to your `third_party` folder. diff --git a/tools/bin/make-single-file b/tools/bin/make-single-file index f2fa32a1..2ff30856 100755 --- a/tools/bin/make-single-file +++ b/tools/bin/make-single-file @@ -51,6 +51,7 @@ def main(argv=None): filenames=filenames( main_files=args.main_files, units=args.units, + literals=args.literals, constants=args.constants, include_io=args.include_io, include_std_format=args.std_format, @@ -61,7 +62,7 @@ def main(argv=None): return 0 -def filenames(main_files, units, constants, include_io, include_std_format): +def filenames(main_files, units, literals, constants, include_io, include_std_format): """Construct the list of project filenames to include. The script will be sure to include all of these, and will also include any @@ -70,6 +71,7 @@ def filenames(main_files, units, constants, include_io, include_std_format): names = ( ["au/au.hh"] + [f"au/units/{u}.hh" for u in units] + + [f"au/units/literals/{u}.hh" for u in literals] + [f"au/constants/{c.lower()}.hh" for c in constants] + main_files ) @@ -96,6 +98,19 @@ def parse_command_line_args(argv): help="Include all units (may slow compilation!)", ) + literal_group = parser.add_mutually_exclusive_group(required=False) + literal_group.add_argument( + "--literals", + nargs="*", + default=[], + help="The units whose unit literals to include (implies the unit itself)", + ) + literal_group.add_argument( + "--all-literals", + action="store_true", + help="Include all unit literals (may slow compilation!)", + ) + constant_group = parser.add_mutually_exclusive_group(required=False) constant_group.add_argument( "--constants", nargs="*", default=[], help="The constants to include" @@ -134,7 +149,8 @@ def enumerate_units_and_constants(args): Massage args object so that it's "as if" user had specified all units/constants manually. This means that if `--all-units` is specified, we populate the `units` list with every existing - entry, and then delete `--all-units`, and similarly for `--all-constants`. + entry, and then delete `--all-units`, and similarly for `--all-literals` and + `--all-constants`. """ def looks_like_header(f): return f.endswith(".hh") and not f.endswith("_fwd.hh") @@ -145,6 +161,12 @@ def enumerate_units_and_constants(args): ] del args.all_units + if args.all_literals: + args.literals = [ + f[:-3] for f in os.listdir("au/units/literals/") if looks_like_header(f) + ] + del args.all_literals + if args.all_constants: args.constants = [ f[:-3].upper() @@ -296,6 +318,8 @@ def manifest(args): "List of included units:", ] + [f" {u}" for u in sorted(args.units)] + + ["List of included unit literals:"] + + [f" {u}" for u in sorted(args.literals)] + ["List of included constants:"] + [f" {c}" for c in sorted(args.constants)] )