# coreutils (uutils) # * see the repository LICENSE, README, and CONTRIBUTING files for more information # spell-checker:ignore (libs) libselinux gethostid procfs [package] name = "coreutils" version = "0.0.17" authors = ["uutils developers"] license = "MIT" description = "coreutils ~ GNU coreutils (updated); implemented as universal (cross-platform) utils, written in Rust" default-run = "coreutils" homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils" readme = "README.md" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] rust-version = "1.60.0" edition = "2021" build = "build.rs" [features] default = [ "feat_common_core" ] ## OS feature shortcodes macos = [ "feat_os_macos" ] unix = [ "feat_os_unix" ] windows = [ "feat_os_windows" ] ## project-specific feature shortcodes nightly = [] test_unimplemented = [] # * only build `uudoc` when `--feature uudoc` is activated uudoc = ["zip"] ## features # "feat_acl" == enable support for ACLs (access control lists; by using`--features feat_acl`) # NOTE: # * On linux, the posix-acl/acl-sys crate requires `libacl` headers and shared library to be accessible in the C toolchain at compile time. # * On FreeBSD and macOS this is not required. feat_acl = ["cp/feat_acl"] # "feat_selinux" == enable support for SELinux Security Context (by using `--features feat_selinux`) # NOTE: # * The selinux(-sys) crate requires `libselinux` headers and shared library to be accessible in the C toolchain at compile time. # * Running a uutils compiled with `feat_selinux` requires an SELinux enabled Kernel at run time. feat_selinux = ["cp/selinux", "id/selinux", "ls/selinux", "selinux", "feat_require_selinux"] ## ## feature sets ## (common/core and Tier1) feature sets # "feat_common_core" == baseline core set of utilities which can be built/run on most targets feat_common_core = [ "base32", "base64", "basename", "basenc", "cat", "cksum", "comm", "cp", "csplit", "cut", "date", "df", "dir", "dircolors", "dirname", "dd", "du", "echo", "env", "expand", "expr", "factor", "false", "fmt", "fold", "hashsum", "head", "join", "link", "ln", "ls", "mkdir", "mktemp", "more", "mv", "nl", "numfmt", "od", "paste", "pr", "printenv", "printf", "ptx", "pwd", "readlink", "realpath", "relpath", "rm", "rmdir", "seq", "shred", "shuf", "sleep", "sort", "split", "sum", "tac", "tail", "tee", "test", "tr", "true", "truncate", "tsort", "touch", "unexpand", "uniq", "unlink", "vdir", "wc", "yes", ] # "feat_Tier1" == expanded set of utilities which can be built/run on the usual rust "Tier 1" target platforms (ref: ) feat_Tier1 = [ "feat_common_core", # "arch", "hostname", "nproc", "sync", "touch", "uname", "whoami", ] ## (primary platforms) feature sets # "feat_os_macos" == set of utilities which can be built/run on the MacOS platform feat_os_macos = [ "feat_os_unix", ## == a modern/usual *nix platform # "feat_require_unix_hostid", ] # "feat_os_unix" == set of utilities which can be built/run on modern/usual *nix platforms feat_os_unix = [ "feat_Tier1", # "feat_require_crate_cpp", "feat_require_unix", "feat_require_unix_utmpx", ] # "feat_os_windows" == set of utilities which can be built/run on modern/usual windows platforms feat_os_windows = [ "feat_Tier1", ## == "feat_os_windows_legacy" + "hostname" ] ## (secondary platforms) feature sets # "feat_os_unix_gnueabihf" == set of utilities which can be built/run on the "arm-unknown-linux-gnueabihf" target (ARMv6 Linux [hardfloat]) feat_os_unix_gnueabihf = [ "feat_Tier1", # "feat_require_unix", "feat_require_unix_hostid", "feat_require_unix_utmpx", ] # "feat_os_unix_musl" == set of utilities which can be built/run on targets binding to the "musl" library (ref: ) feat_os_unix_musl = [ "feat_Tier1", # "feat_require_unix", "feat_require_unix_hostid", ] feat_os_unix_android = [ "feat_Tier1", # "feat_require_unix", ] ## feature sets with requirements (restricting cross-platform availability) # # ** NOTE: these `feat_require_...` sets should be minimized as much as possible to encourage cross-platform availability of utilities # # "feat_require_crate_cpp" == set of utilities requiring the `cpp` crate (which fail to compile on several platforms; as of 2020-04-23) feat_require_crate_cpp = [ "stdbuf", ] # "feat_require_unix" == set of utilities requiring support which is only available on unix platforms (as of 2020-04-23) feat_require_unix = [ "chgrp", "chmod", "chown", "chroot", "groups", "id", "install", "kill", "logname", "mkfifo", "mknod", "nice", "nohup", "pathchk", "stat", "stty", "timeout", "tty", ] # "feat_require_unix_utmpx" == set of utilities requiring unix utmp/utmpx support # * ref: feat_require_unix_utmpx = [ "pinky", "uptime", "users", "who", ] # "feat_require_unix_hostid" == set of utilities requiring gethostid in libc (only some unixes provide) feat_require_unix_hostid = [ "hostid", ] # "feat_require_selinux" == set of utilities depending on SELinux. feat_require_selinux = [ "chcon", "runcon", ] ## (alternate/newer/smaller platforms) feature sets # "feat_os_unix_fuchsia" == set of utilities which can be built/run on the "Fuchsia" OS (refs: ; ) feat_os_unix_fuchsia = [ "feat_common_core", # "feat_require_crate_cpp", # "chgrp", "chmod", "chown", "du", "groups", "hostid", "install", "logname", "mkfifo", "mknod", "nice", "pathchk", "tty", "uname", "unlink", ] # "feat_os_unix_redox" == set of utilities which can be built/run on "Redox OS" (refs: ; ) feat_os_unix_redox = [ "feat_common_core", # "chmod", "uname", ] # "feat_os_windows_legacy" == slightly restricted set of utilities which can be built/run on early windows platforms (eg, "WinXP") feat_os_windows_legacy = [ "feat_common_core", # "arch", "nproc", "sync", "touch", "whoami", ] ## # * bypass/override ~ translate 'test' feature name to avoid dependency collision with rust core 'test' crate (o/w surfaces as compiler errors during testing) test = [ "uu_test" ] [workspace] [dependencies] clap = { version = "4.0", features = ["wrap_help", "cargo"] } clap_complete = "4.0" once_cell = "1.13.1" phf = "0.11.1" selinux = { version="0.3", optional = true } textwrap = { version="0.16.0", features=["terminal_size"] } uucore = { version=">=0.0.17", package="uucore", path="src/uucore" } zip = { version = "0.6.3", optional=true, default_features=false, features=["deflate"] } # * uutils uu_test = { optional=true, version="0.0.17", package="uu_test", path="src/uu/test" } # arch = { optional=true, version="0.0.17", package="uu_arch", path="src/uu/arch" } base32 = { optional=true, version="0.0.17", package="uu_base32", path="src/uu/base32" } base64 = { optional=true, version="0.0.17", package="uu_base64", path="src/uu/base64" } basename = { optional=true, version="0.0.17", package="uu_basename", path="src/uu/basename" } basenc = { optional=true, version="0.0.17", package="uu_basenc", path="src/uu/basenc" } cat = { optional=true, version="0.0.17", package="uu_cat", path="src/uu/cat" } chcon = { optional=true, version="0.0.17", package="uu_chcon", path="src/uu/chcon" } chgrp = { optional=true, version="0.0.17", package="uu_chgrp", path="src/uu/chgrp" } chmod = { optional=true, version="0.0.17", package="uu_chmod", path="src/uu/chmod" } chown = { optional=true, version="0.0.17", package="uu_chown", path="src/uu/chown" } chroot = { optional=true, version="0.0.17", package="uu_chroot", path="src/uu/chroot" } cksum = { optional=true, version="0.0.17", package="uu_cksum", path="src/uu/cksum" } comm = { optional=true, version="0.0.17", package="uu_comm", path="src/uu/comm" } cp = { optional=true, version="0.0.17", package="uu_cp", path="src/uu/cp" } csplit = { optional=true, version="0.0.17", package="uu_csplit", path="src/uu/csplit" } cut = { optional=true, version="0.0.17", package="uu_cut", path="src/uu/cut" } date = { optional=true, version="0.0.17", package="uu_date", path="src/uu/date" } dd = { optional=true, version="0.0.17", package="uu_dd", path="src/uu/dd" } df = { optional=true, version="0.0.17", package="uu_df", path="src/uu/df" } dir = { optional=true, version="0.0.17", package="uu_dir", path="src/uu/dir" } dircolors= { optional=true, version="0.0.17", package="uu_dircolors", path="src/uu/dircolors" } dirname = { optional=true, version="0.0.17", package="uu_dirname", path="src/uu/dirname" } du = { optional=true, version="0.0.17", package="uu_du", path="src/uu/du" } echo = { optional=true, version="0.0.17", package="uu_echo", path="src/uu/echo" } env = { optional=true, version="0.0.17", package="uu_env", path="src/uu/env" } expand = { optional=true, version="0.0.17", package="uu_expand", path="src/uu/expand" } expr = { optional=true, version="0.0.17", package="uu_expr", path="src/uu/expr" } factor = { optional=true, version="0.0.17", package="uu_factor", path="src/uu/factor" } false = { optional=true, version="0.0.17", package="uu_false", path="src/uu/false" } fmt = { optional=true, version="0.0.17", package="uu_fmt", path="src/uu/fmt" } fold = { optional=true, version="0.0.17", package="uu_fold", path="src/uu/fold" } groups = { optional=true, version="0.0.17", package="uu_groups", path="src/uu/groups" } hashsum = { optional=true, version="0.0.17", package="uu_hashsum", path="src/uu/hashsum" } head = { optional=true, version="0.0.17", package="uu_head", path="src/uu/head" } hostid = { optional=true, version="0.0.17", package="uu_hostid", path="src/uu/hostid" } hostname = { optional=true, version="0.0.17", package="uu_hostname", path="src/uu/hostname" } id = { optional=true, version="0.0.17", package="uu_id", path="src/uu/id" } install = { optional=true, version="0.0.17", package="uu_install", path="src/uu/install" } join = { optional=true, version="0.0.17", package="uu_join", path="src/uu/join" } kill = { optional=true, version="0.0.17", package="uu_kill", path="src/uu/kill" } link = { optional=true, version="0.0.17", package="uu_link", path="src/uu/link" } ln = { optional=true, version="0.0.17", package="uu_ln", path="src/uu/ln" } ls = { optional=true, version="0.0.17", package="uu_ls", path="src/uu/ls" } logname = { optional=true, version="0.0.17", package="uu_logname", path="src/uu/logname" } mkdir = { optional=true, version="0.0.17", package="uu_mkdir", path="src/uu/mkdir" } mkfifo = { optional=true, version="0.0.17", package="uu_mkfifo", path="src/uu/mkfifo" } mknod = { optional=true, version="0.0.17", package="uu_mknod", path="src/uu/mknod" } mktemp = { optional=true, version="0.0.17", package="uu_mktemp", path="src/uu/mktemp" } more = { optional=true, version="0.0.17", package="uu_more", path="src/uu/more" } mv = { optional=true, version="0.0.17", package="uu_mv", path="src/uu/mv" } nice = { optional=true, version="0.0.17", package="uu_nice", path="src/uu/nice" } nl = { optional=true, version="0.0.17", package="uu_nl", path="src/uu/nl" } nohup = { optional=true, version="0.0.17", package="uu_nohup", path="src/uu/nohup" } nproc = { optional=true, version="0.0.17", package="uu_nproc", path="src/uu/nproc" } numfmt = { optional=true, version="0.0.17", package="uu_numfmt", path="src/uu/numfmt" } od = { optional=true, version="0.0.17", package="uu_od", path="src/uu/od" } paste = { optional=true, version="0.0.17", package="uu_paste", path="src/uu/paste" } pathchk = { optional=true, version="0.0.17", package="uu_pathchk", path="src/uu/pathchk" } pinky = { optional=true, version="0.0.17", package="uu_pinky", path="src/uu/pinky" } pr = { optional=true, version="0.0.17", package="uu_pr", path="src/uu/pr" } printenv = { optional=true, version="0.0.17", package="uu_printenv", path="src/uu/printenv" } printf = { optional=true, version="0.0.17", package="uu_printf", path="src/uu/printf" } ptx = { optional=true, version="0.0.17", package="uu_ptx", path="src/uu/ptx" } pwd = { optional=true, version="0.0.17", package="uu_pwd", path="src/uu/pwd" } readlink = { optional=true, version="0.0.17", package="uu_readlink", path="src/uu/readlink" } realpath = { optional=true, version="0.0.17", package="uu_realpath", path="src/uu/realpath" } relpath = { optional=true, version="0.0.17", package="uu_relpath", path="src/uu/relpath" } rm = { optional=true, version="0.0.17", package="uu_rm", path="src/uu/rm" } rmdir = { optional=true, version="0.0.17", package="uu_rmdir", path="src/uu/rmdir" } runcon = { optional=true, version="0.0.17", package="uu_runcon", path="src/uu/runcon" } seq = { optional=true, version="0.0.17", package="uu_seq", path="src/uu/seq" } shred = { optional=true, version="0.0.17", package="uu_shred", path="src/uu/shred" } shuf = { optional=true, version="0.0.17", package="uu_shuf", path="src/uu/shuf" } sleep = { optional=true, version="0.0.17", package="uu_sleep", path="src/uu/sleep" } sort = { optional=true, version="0.0.17", package="uu_sort", path="src/uu/sort" } split = { optional=true, version="0.0.17", package="uu_split", path="src/uu/split" } stat = { optional=true, version="0.0.17", package="uu_stat", path="src/uu/stat" } stdbuf = { optional=true, version="0.0.17", package="uu_stdbuf", path="src/uu/stdbuf" } stty = { optional=true, version="0.0.17", package="uu_stty", path="src/uu/stty" } sum = { optional=true, version="0.0.17", package="uu_sum", path="src/uu/sum" } sync = { optional=true, version="0.0.17", package="uu_sync", path="src/uu/sync" } tac = { optional=true, version="0.0.17", package="uu_tac", path="src/uu/tac" } tail = { optional=true, version="0.0.17", package="uu_tail", path="src/uu/tail" } tee = { optional=true, version="0.0.17", package="uu_tee", path="src/uu/tee" } timeout = { optional=true, version="0.0.17", package="uu_timeout", path="src/uu/timeout" } touch = { optional=true, version="0.0.17", package="uu_touch", path="src/uu/touch" } tr = { optional=true, version="0.0.17", package="uu_tr", path="src/uu/tr" } true = { optional=true, version="0.0.17", package="uu_true", path="src/uu/true" } truncate = { optional=true, version="0.0.17", package="uu_truncate", path="src/uu/truncate" } tsort = { optional=true, version="0.0.17", package="uu_tsort", path="src/uu/tsort" } tty = { optional=true, version="0.0.17", package="uu_tty", path="src/uu/tty" } uname = { optional=true, version="0.0.17", package="uu_uname", path="src/uu/uname" } unexpand = { optional=true, version="0.0.17", package="uu_unexpand", path="src/uu/unexpand" } uniq = { optional=true, version="0.0.17", package="uu_uniq", path="src/uu/uniq" } unlink = { optional=true, version="0.0.17", package="uu_unlink", path="src/uu/unlink" } uptime = { optional=true, version="0.0.17", package="uu_uptime", path="src/uu/uptime" } users = { optional=true, version="0.0.17", package="uu_users", path="src/uu/users" } vdir = { optional=true, version="0.0.17", package="uu_vdir", path="src/uu/vdir" } wc = { optional=true, version="0.0.17", package="uu_wc", path="src/uu/wc" } who = { optional=true, version="0.0.17", package="uu_who", path="src/uu/who" } whoami = { optional=true, version="0.0.17", package="uu_whoami", path="src/uu/whoami" } yes = { optional=true, version="0.0.17", package="uu_yes", path="src/uu/yes" } # this breaks clippy linting with: "tests/by-util/test_factor_benches.rs: No such file or directory (os error 2)" # factor_benches = { optional = true, version = "0.0.0", package = "uu_factor_benches", path = "tests/benches/factor" } # # * pinned transitive dependencies # Not needed for now. Keep as examples: #pin_cc = { version="1.0.61, < 1.0.62", package="cc" } ## cc v1.0.62 has compiler errors for MinRustV v1.32.0, requires 1.34 (for `std::str::split_ascii_whitespace()`) [dev-dependencies] chrono = { version="^0.4.23", default-features=false, features=["std", "alloc", "clock"]} conv = "0.3" filetime = "0.2" glob = "0.3.0" libc = "0.2" pretty_assertions = "1" rand = "0.8" regex = "1.7" sha1 = { version="0.10", features=["std"] } tempfile = "3" time = {version="0.3", features=["local-offset"]} unindent = "0.1" uucore = { version=">=0.0.17", package="uucore", path="src/uucore", features=["entries", "process"] } walkdir = "2.2" atty = "0.2" hex-literal = "0.3.1" rstest = "0.16.0" [target.'cfg(any(target_os = "linux", target_os = "android"))'.dev-dependencies] procfs = { version = "0.14", default-features = false } rlimit = "0.8.3" [target.'cfg(unix)'.dev-dependencies] nix = { version = "0.25", default-features = false, features = ["process", "signal", "user"] } rust-users = { version="0.11", package="users" } rand_pcg = "0.3" [build-dependencies] phf_codegen = "0.11.1" [[bin]] name = "coreutils" path = "src/bin/coreutils.rs" [[bin]] name = "uudoc" path = "src/bin/uudoc.rs" required-features = ["uudoc"]