mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-06-27 14:58:30 +00:00
Make cli commands yoinkable into cosmo shell
This lets our system() and popen() commands function sort of like BusyBox and ToyBox. By default the Cosmopolitan Shell is lightweight. But if you use STATIC_YOINK then you can pull the individual commands you want into the linkage, and they'll be included in a single binary. For example the demo binary embeds `tr` and `sed` and ends up ~140kb.
This commit is contained in:
parent
5af19b7eed
commit
3d2d04b25e
32 changed files with 897 additions and 276 deletions
33
third_party/awk/awk.mk
vendored
33
third_party/awk/awk.mk
vendored
|
@ -3,20 +3,14 @@
|
|||
|
||||
PKGS += THIRD_PARTY_AWK
|
||||
|
||||
THIRD_PARTY_AWK_SRCS = $(THIRD_PARTY_AWK_A_SRCS)
|
||||
THIRD_PARTY_AWK_HDRS = $(THIRD_PARTY_AWK_A_HDRS)
|
||||
THIRD_PARTY_AWK_INCS = $(THIRD_PARTY_AWK_A_INCS)
|
||||
THIRD_PARTY_AWK_BINS = $(THIRD_PARTY_AWK_COMS) $(THIRD_PARTY_AWK_COMS:%=%.dbg)
|
||||
THIRD_PARTY_AWK_COMS = o/$(MODE)/third_party/awk/awk.com
|
||||
|
||||
THIRD_PARTY_AWK_ARTIFACTS += THIRD_PARTY_AWK_A
|
||||
THIRD_PARTY_AWK = $(THIRD_PARTY_AWK_A_DEPS) $(THIRD_PARTY_AWK_A)
|
||||
THIRD_PARTY_AWK_A = o/$(MODE)/third_party/awk/awk.a
|
||||
THIRD_PARTY_AWK_A_FILES := $(wildcard third_party/awk/*)
|
||||
THIRD_PARTY_AWK_A_HDRS = $(filter %.h,$(THIRD_PARTY_AWK_A_FILES))
|
||||
THIRD_PARTY_AWK_A_INCS = $(filter %.inc,$(THIRD_PARTY_AWK_A_FILES))
|
||||
THIRD_PARTY_AWK_A_SRCS = $(filter %.c,$(THIRD_PARTY_AWK_A_FILES))
|
||||
THIRD_PARTY_AWK_A_OBJS = $(THIRD_PARTY_AWK_A_SRCS:%.c=o/$(MODE)/%.o)
|
||||
THIRD_PARTY_AWK_FILES := $(wildcard third_party/awk/*)
|
||||
THIRD_PARTY_AWK_HDRS = $(filter %.h,$(THIRD_PARTY_AWK_FILES))
|
||||
THIRD_PARTY_AWK_INCS = $(filter %.inc,$(THIRD_PARTY_AWK_FILES))
|
||||
THIRD_PARTY_AWK_SRCS = $(filter %.c,$(THIRD_PARTY_AWK_FILES))
|
||||
THIRD_PARTY_AWK_OBJS = $(THIRD_PARTY_AWK_SRCS:%.c=o/$(MODE)/%.o)
|
||||
|
||||
THIRD_PARTY_AWK_A_DIRECTDEPS = \
|
||||
LIBC_FMT \
|
||||
|
@ -36,22 +30,22 @@ THIRD_PARTY_AWK_A_DIRECTDEPS = \
|
|||
THIRD_PARTY_AWK_A_DEPS := \
|
||||
$(call uniq,$(foreach x,$(THIRD_PARTY_AWK_A_DIRECTDEPS),$($(x))))
|
||||
|
||||
THIRD_PARTY_AWK_A_CHECKS = \
|
||||
THIRD_PARTY_AWK_CHECKS = \
|
||||
$(THIRD_PARTY_AWK_A).pkg \
|
||||
$(THIRD_PARTY_AWK_A_HDRS:%=o/$(MODE)/%.ok)
|
||||
$(THIRD_PARTY_AWK_HDRS:%=o/$(MODE)/%.ok)
|
||||
|
||||
$(THIRD_PARTY_AWK_A): \
|
||||
third_party/awk/ \
|
||||
$(THIRD_PARTY_AWK_A).pkg \
|
||||
$(THIRD_PARTY_AWK_A_OBJS)
|
||||
$(THIRD_PARTY_AWK_OBJS)
|
||||
|
||||
$(THIRD_PARTY_AWK_A).pkg: \
|
||||
$(THIRD_PARTY_AWK_A_OBJS) \
|
||||
$(THIRD_PARTY_AWK_OBJS) \
|
||||
$(foreach x,$(THIRD_PARTY_AWK_A_DIRECTDEPS),$($(x)_A).pkg)
|
||||
|
||||
o/$(MODE)/third_party/awk/awk.com.dbg: \
|
||||
$(THIRD_PARTY_AWK) \
|
||||
o/$(MODE)/third_party/awk/main.o \
|
||||
o/$(MODE)/third_party/awk/cmd.o \
|
||||
o/$(MODE)/third_party/awk/README.zip.o \
|
||||
$(CRT) \
|
||||
$(APE_NO_MODIFY_SELF)
|
||||
|
@ -61,10 +55,9 @@ o/$(MODE)/third_party/awk/README.zip.o: \
|
|||
ZIPOBJ_FLAGS = \
|
||||
-B
|
||||
|
||||
THIRD_PARTY_AWK_LIBS = $(foreach x,$(THIRD_PARTY_AWK_ARTIFACTS),$($(x)))
|
||||
THIRD_PARTY_AWK_SRCS = $(foreach x,$(THIRD_PARTY_AWK_ARTIFACTS),$($(x)_SRCS))
|
||||
THIRD_PARTY_AWK_CHECKS = $(foreach x,$(THIRD_PARTY_AWK_ARTIFACTS),$($(x)_CHECKS))
|
||||
THIRD_PARTY_AWK_OBJS = $(foreach x,$(THIRD_PARTY_AWK_ARTIFACTS),$($(x)_OBJS))
|
||||
THIRD_PARTY_AWK_BINS = $(THIRD_PARTY_AWK_COMS) $(THIRD_PARTY_AWK_COMS:%=%.dbg)
|
||||
THIRD_PARTY_AWK_COMS = o/$(MODE)/third_party/awk/awk.com
|
||||
THIRD_PARTY_AWK_LIBS = $(THIRD_PARTY_AWK_A)
|
||||
$(THIRD_PARTY_AWK_OBJS): $(BUILD_FILES) third_party/awk/awk.mk
|
||||
|
||||
.PHONY: o/$(MODE)/third_party/awk
|
||||
|
|
15
third_party/awk/awkgram.tab.c
vendored
15
third_party/awk/awkgram.tab.c
vendored
|
@ -1,13 +1,5 @@
|
|||
// clang-format off
|
||||
#include "libc/mem/alg.h"
|
||||
#include "libc/fmt/conv.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/stdio/rand.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/stdio/temp.h"
|
||||
#include "libc/sysv/consts/exit.h"
|
||||
#include "third_party/gdtoa/gdtoa.h"
|
||||
#include "libc/mem/alg.h"
|
||||
#include "libc/str/str.h"
|
||||
#define YYBYACC 1
|
||||
#define YYMAJOR 1
|
||||
|
@ -19,13 +11,6 @@
|
|||
#define YYRECOVERING() (yyerrflag!=0)
|
||||
#define YYPREFIX "yy"
|
||||
#line 26 "awkgram.y"
|
||||
#include "libc/calls/calls.h"
|
||||
#include "libc/fmt/fmt.h"
|
||||
#include "libc/stdio/lock.internal.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/stdio/temp.h"
|
||||
#include "libc/mem/alg.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "third_party/awk/awk.h"
|
||||
|
||||
void checkdup(Node *list, Cell *item);
|
||||
|
|
25
third_party/awk/cmd.c
vendored
Normal file
25
third_party/awk/cmd.c
vendored
Normal file
|
@ -0,0 +1,25 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2022 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "third_party/awk/cmd.h"
|
||||
#include "tool/args/args.h"
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
LoadZipArgs(&argc, &argv);
|
||||
return _awk(argc, argv);
|
||||
}
|
10
third_party/awk/cmd.h
vendored
Normal file
10
third_party/awk/cmd.h
vendored
Normal file
|
@ -0,0 +1,10 @@
|
|||
#ifndef COSMOPOLITAN_THIRD_PARTY_AWK_CMD_H_
|
||||
#define COSMOPOLITAN_THIRD_PARTY_AWK_CMD_H_
|
||||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||
COSMOPOLITAN_C_START_
|
||||
|
||||
int _awk(int, char *[]);
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||
#endif /* COSMOPOLITAN_THIRD_PARTY_AWK_CMD_H_ */
|
5
third_party/awk/lex.c
vendored
5
third_party/awk/lex.c
vendored
|
@ -28,15 +28,10 @@
|
|||
#include "libc/calls/calls.h"
|
||||
#include "libc/fmt/conv.h"
|
||||
#include "libc/fmt/fmt.h"
|
||||
#include "libc/mem/alg.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/stdio/lock.internal.h"
|
||||
#include "libc/stdio/rand.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/stdio/temp.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/sysv/consts/exit.h"
|
||||
#include "third_party/awk/awk.h"
|
||||
#include "third_party/awk/awkgram.tab.h"
|
||||
#include "third_party/gdtoa/gdtoa.h"
|
||||
|
|
10
third_party/awk/lib.c
vendored
10
third_party/awk/lib.c
vendored
|
@ -28,26 +28,18 @@
|
|||
#define DEBUG
|
||||
#include "libc/calls/calls.h"
|
||||
#include "libc/errno.h"
|
||||
#include "libc/fmt/conv.h"
|
||||
#include "libc/fmt/fmt.h"
|
||||
#include "libc/limits.h"
|
||||
#include "libc/math.h"
|
||||
#include "libc/mem/alg.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/nexgen32e/ffs.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/stdio/lock.internal.h"
|
||||
#include "libc/stdio/rand.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/stdio/temp.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/sysv/consts/exit.h"
|
||||
#include "third_party/awk/awk.h"
|
||||
#include "third_party/gdtoa/gdtoa.h"
|
||||
// clang-format off
|
||||
|
||||
char EMPTY[] = { '\0' };
|
||||
FILE *infile = NULL;
|
||||
static FILE *infile = NULL;
|
||||
bool innew; /* true = infile has not been read by readrec */
|
||||
char *file = EMPTY;
|
||||
char *record;
|
||||
|
|
7
third_party/awk/main.c
vendored
7
third_party/awk/main.c
vendored
|
@ -29,17 +29,14 @@
|
|||
#include "libc/calls/calls.h"
|
||||
#include "libc/calls/struct/sigaction.h"
|
||||
#include "libc/calls/struct/siginfo.h"
|
||||
#include "libc/calls/ucontext.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/sock/struct/sockaddr.internal.h"
|
||||
#include "libc/stdio/rand.h"
|
||||
#include "libc/str/locale.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/sysv/consts/sa.h"
|
||||
#include "libc/sysv/consts/sicode.h"
|
||||
#include "third_party/awk/awk.h"
|
||||
#include "tool/args/args.h"
|
||||
// clang-format off
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
|
@ -128,14 +125,12 @@ getarg(int *argc, char ***argv, const char *msg)
|
|||
}
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
int _awk(int argc, char *argv[])
|
||||
{
|
||||
const char *fs = NULL;
|
||||
struct sigaction sa;
|
||||
char *fn, *vn;
|
||||
|
||||
LoadZipArgs(&argc, &argv);
|
||||
|
||||
setlocale(LC_CTYPE, "");
|
||||
setlocale(LC_NUMERIC, "C"); /* for parsing cmdline & prog */
|
||||
cmdname = argv[0];
|
||||
|
|
2
third_party/awk/tran.c
vendored
2
third_party/awk/tran.c
vendored
|
@ -28,10 +28,10 @@
|
|||
#define DEBUG
|
||||
#include "libc/fmt/conv.h"
|
||||
#include "libc/fmt/fmt.h"
|
||||
#include "libc/math.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "third_party/awk/awk.h"
|
||||
#include "third_party/libcxx/math.h"
|
||||
// clang-format off
|
||||
|
||||
#define FULLTAB 2 /* rehash when table gets this x full */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue