diff options
Diffstat (limited to 'distrib/crunch/crunchgen')
-rw-r--r-- | distrib/crunch/crunchgen/Makefile | 12 | ||||
-rw-r--r-- | distrib/crunch/crunchgen/crunched_main.c | 104 | ||||
-rw-r--r-- | distrib/crunch/crunchgen/crunchgen.1 | 291 | ||||
-rw-r--r-- | distrib/crunch/crunchgen/crunchgen.c | 1020 | ||||
-rw-r--r-- | distrib/crunch/crunchgen/mkskel.sh | 17 |
5 files changed, 0 insertions, 1444 deletions
diff --git a/distrib/crunch/crunchgen/Makefile b/distrib/crunch/crunchgen/Makefile deleted file mode 100644 index 23625f09b60..00000000000 --- a/distrib/crunch/crunchgen/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -# $OpenBSD: Makefile,v 1.2 1996/09/25 06:40:52 etheisen Exp $ - -PROG= crunchgen -SRCS= crunchgen.c crunched_skel.c -CFLAGS+= -g -Wall -CPPFLAGS+= -DMF_NAMES='"Makefile.bsd-wrapper","Makefile"' -CLEANFILES+= crunched_skel.c - -crunched_skel.c: crunched_main.c - sh ${.CURDIR}/mkskel.sh ${.CURDIR}/crunched_main.c > crunched_skel.c - -.include <bsd.prog.mk> diff --git a/distrib/crunch/crunchgen/crunched_main.c b/distrib/crunch/crunchgen/crunched_main.c deleted file mode 100644 index 315a44d5065..00000000000 --- a/distrib/crunch/crunchgen/crunched_main.c +++ /dev/null @@ -1,104 +0,0 @@ -/* $OpenBSD: crunched_main.c,v 1.5 2003/01/27 19:41:30 deraadt Exp $ */ - -/* - * Copyright (c) 1994 University of Maryland - * All Rights Reserved. - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of U.M. not be used in advertising or - * publicity pertaining to distribution of the software without specific, - * written prior permission. U.M. makes no representations about the - * suitability of this software for any purpose. It is provided "as is" - * without express or implied warranty. - * - * U.M. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL U.M. - * BE LIABLE FOR ANY SPECIAL, 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. - * - * Author: James da Silva, Systems Design and Analysis Group - * Computer Science Department - * University of Maryland at College Park - */ -/* - * crunched_main.c - main program for crunched binaries, it branches to a - * particular subprogram based on the value of argv[0]. Also included - * is a little program invoked when the crunched binary is called via - * its EXECNAME. This one prints out the list of compiled-in binaries, - * or calls one of them based on argv[1]. This allows the testing of - * the crunched binary without creating all the links. - */ -#include <stdio.h> -#include <string.h> - -struct stub { - char *name; - int (*f)(); -}; - -extern struct stub entry_points[]; - -int -main(int argc, char *argv[], char **envp) -{ - char *slash, *basename; - struct stub *ep; - - if (argv[0] == NULL || *argv[0] == '\0') - crunched_usage(); - - slash = strrchr(argv[0], '/'); - basename = slash ? slash + 1 : argv[0]; - - for (ep = entry_points; ep->name != NULL; ep++) - if (!strcmp(basename, ep->name)) - break; - - if (ep->name) - return ep->f(argc, argv, envp); - else { - fprintf(stderr, "%s: %s not compiled in\n", EXECNAME, basename); - crunched_usage(); - } -} - -int -crunched_main(int argc, char **argv, char **envp) -{ - struct stub *ep; - int columns, len; - - if (argc <= 1) - crunched_usage(); - - return main(--argc, ++argv, envp); -} - -int -crunched_usage() -{ - int columns, len; - struct stub *ep; - - fprintf(stderr, - "Usage: %s <prog> <args> ..., where <prog> is one of:\n", - EXECNAME); - columns = 0; - for (ep = entry_points; ep->name != NULL; ep++) { - len = strlen(ep->name) + 1; - if (columns + len < 80) - columns += len; - else { - fprintf(stderr, "\n"); - columns = len; - } - fprintf(stderr, " %s", ep->name); - } - fprintf(stderr, "\n"); - exit(1); -} diff --git a/distrib/crunch/crunchgen/crunchgen.1 b/distrib/crunch/crunchgen/crunchgen.1 deleted file mode 100644 index 8c23ee1a1fd..00000000000 --- a/distrib/crunch/crunchgen/crunchgen.1 +++ /dev/null @@ -1,291 +0,0 @@ -.\" $OpenBSD: crunchgen.1,v 1.21 2007/05/31 19:19:15 jmc Exp $ -.\" -.\" -.\" Copyright (c) 1994 University of Maryland -.\" All Rights Reserved. -.\" -.\" Permission to use, copy, modify, distribute, and sell this software and its -.\" documentation for any purpose is hereby granted without fee, provided that -.\" the above copyright notice appear in all copies and that both that -.\" copyright notice and this permission notice appear in supporting -.\" documentation, and that the name of U.M. not be used in advertising or -.\" publicity pertaining to distribution of the software without specific, -.\" written prior permission. U.M. makes no representations about the -.\" suitability of this software for any purpose. It is provided "as is" -.\" without express or implied warranty. -.\" -.\" U.M. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL U.M. -.\" BE LIABLE FOR ANY SPECIAL, 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. -.\" -.\" Author: James da Silva, Systems Design and Analysis Group -.\" Computer Science Department -.\" University of Maryland at College Park -.\" -.Dd $Mdocdate: May 31 2007 $ -.Dt CRUNCHGEN 1 -.Os -.Sh NAME -.Nm crunchgen -.Nd generates build environment for a crunched binary -.Sh SYNOPSIS -.Nm crunchgen -.Bk -words -.Op Fl Efq -.Op Fl c Ar c-file-name -.Op Fl D Ar src-root -.Op Fl e Ar exec-file-name -.Op Fl L Ar lib-dir -.Op Fl m Ar makefile-name -.Op Fl O Ar objdir-name -.Ar conf-file -.Ek -.Sh DESCRIPTION -A crunched binary is a program made up of many other programs linked -together into a single executable. -The crunched binary main() function determines which component program -to run by the contents of argv[0]. -The main reason to crunch programs together is for fitting as many programs -as possible onto an installation or system recovery floppy. -.Pp -.Nm -reads in the specifications in -.Ar conf-file -for a crunched binary, and generates a Makefile and accompanying -top-level C source file that when built create the crunched executable -file from the component programs. -For each component program, -.Nm -can optionally attempt to determine the object (.o) files that make up -the program from its source directory Makefile. -This information is cached in a file named -.Pa <conf-name>.cache -between runs. -.Nm -uses the companion program -.Xr crunchide 1 -to eliminate link-time conflicts between the component programs by -hiding all unnecessary symbols. -.Pp -After -.Nm -is run, the crunched binary can be built by running -.Dq make -f <conf-name>.mk . -The component programs' object files must already be built. -An -.Dq objs -target, included in the output makefile, -will run make in each component program's source dir to build the object -files for the user. -This is not done automatically since in release engineering circumstances -it is generally not desirable to be modifying objects in other directories. -.Pp -The options are as follows: -.Bl -tag -width indent -.It Fl c Ar c-file-name -Set output C file name to -.Ar c-file-name . -The default name is -.Dq Ao conf-name Ac Ns \&.c . -.It Fl D Ar src-root -Assume that relative source directory specifications begin with -.Ar src-root . -.It Fl E -Don't prepend stub names with an underscore. -Used for architectures that don't have underscore prepended to symbol names. -Example mips ELF. -.It Fl e Ar exec-file-name -Set crunched binary executable file name to -.Ar exec-file-name . -The default name is -.Dq Aq conf-name . -.It Fl f -Flush cache. -Forces the recalculation of cached parameters. -.It Fl L Ar lib-dir -Try to obtain libraries from -.Ar lib-dir . -.It Fl m Ar makefile-name -Set output Makefile name to -.Ar makefile-name . -The default name is -.Dq Ao conf-name Ac Ns \&.mk . -.It Fl O Ar objdir-name -Specify an object directory to use. -It defaults to -.Dq obj , -though for cross building purposes it can be used to specify -obj.${HOST}.${MACHINE}. -Normally used with the make variable ${MAKEOBJDIR}. -.It Fl q -Quiet operation. -Status messages are suppressed. -.El -.Sh CRUNCHGEN CONFIGURATION FILE COMMANDS -.Nm -reads specifications from the -.Ar conf-file -that describe the components of the crunched binary. -In its simplest use, the component program names are merely listed -along with the top-level source directories in which their sources -can be found. -.Nm -then calculates (via the source makefiles) and caches the -list of object files and their locations. -For more specialized situations, the user can specify by hand -all the parameters that -.Nm -needs. -.Pp -The -.Ar conf-file -commands are as follows: -.Bl -tag -width indent -.It srcdirs Ar dirname ... -A list of source trees in which the source directories of the -component programs can be found. -These dirs are searched using the BSD -.Dq <source-dir>/<progname>/ -convention. -Multiple srcdirs lines can be specified. -The directories are searched in the order they are given. -.It libdirs Ar dirname -A list of source trees in which the source directories for supplementary -libraries can be found. -.It progs Ar progname ... -A list of programs that make up the crunched binary. -Multiple progs lines can be specified. -.It libs Ar libspec ... -A list of library specifications to be included in the crunched binary link. -Multiple libs lines can be specified. -.It ln Ar progname linkname -Causes the crunched binary to invoke -.Ar progname -whenever -.Ar linkname -appears in argv[0]. -This allows programs that change their behavior when -run under different names to operate correctly. -.El -.Pp -To handle specialized situations, such as when the source is not -available or not built via a conventional Makefile, the following -.Ic special -commands can be used to set -.Nm -parameters for a component program. -.Bl -tag -width indent -.It special Ar progname No srcdir Ar pathname -Set the source directory for -.Ar progname . -This is normally calculated by searching the specified srcdirs -for a directory named -.Ar progname . -.It special Ar progname No objdir Ar pathname -Set the obj directory for -.Ar progname . -This is normally calculated by looking for a directory named -.Dq obj -under the -.Ar srcdir , -and if that is not found, the -.Ar srcdir -itself becomes the objdir. -.It special Ar progname No objs Ar object-file-name ... -Set the list of object files for program -.Ar progname . -This is normally calculated by constructing a temporary makefile that includes -.Dq srcdir/Makefile -and outputs the value of $(OBJS). -.It special Ar progname No objpaths Ar full-pathname-to-object-file ... -Sets the pathnames of the object files for program -.Ar progname . -This is normally calculated by prepending the objdir -pathname to each file in the objs list. -.El -.Pp -Only the objpaths parameter is actually needed by -.Nm crunchgen , -but it is calculated from objdir and objs, -which are in turn calculated from srcdir, -so it is sometimes convenient to specify the earlier parameters and let -.Nm -calculate forward from there if it can. -.Pp -The makefile produced by -.Nm -contains an optional -.Ar objs -target that will build the object files for each component program by -running make inside that program's source directory. -For this to work the srcdir and objs parameters must also be valid. -If they are not valid for a particular program, that program is skipped in the -.Ar objs -target. -.Sh EXAMPLES -Here is an example -.Nm -input conf file, named -.Pa kcopy.conf : -.Bd -literal -offset indent -srcdirs /usr/src/bin /usr/src/sbin - -progs test cp echo sh fsck halt init mount umount myinstall -ln test [ # test can be invoked via [ -ln sh -sh # init invokes the shell with "-sh" in argv[0] - -special myprog objpaths /homes/leroy/src/myinstall.o # no sources - -libs -lutil -lcrypt -.Ed -.Pp -This conf file specifies a small crunched binary consisting of some -basic system utilities plus a home-grown install program -.Dq myinstall , -for which no source directory is specified, but its object file is -specified directly with the -.Ic special -line. -.Pp -The crunched binary -.Dq kcopy -can be built as follows: -.Bd -literal -offset indent -% crunchgen -m Makefile kcopy.conf # gen Makefile and kcopy.c -% make objs # build the component programs' .o files -% make # build the crunched binary kcopy -% kcopy sh # test that this invokes a sh shell -$ # it works! -.Ed -.Pp -At this point the binary -.Dq kcopy -can be copied onto an install floppy -and hard-linked to the names of the component programs. -.Sh SEE ALSO -.Xr crunchide 1 -.Sh AUTHORS -.Nm -was written by James da Silva -.Aq jds@cs.umd.edu . -.Pp -Copyright (c) 1994 University of Maryland. All Rights Reserved. -.Sh CAVEATS -While -.Nm -takes care to eliminate link conflicts between the component programs -of a crunched binary, conflicts are still possible between the -libraries that are linked in. -Some shuffling in the order of libraries may be required, -and in some rare cases two libraries may -have an unresolvable conflict and thus cannot be crunched together. -.Pp -Some versions of the BSD build environment do not by default build the -intermediate object file for single-source file programs. -The -.Dq make objs -target must then be used to get those object files built, -or some other arrangements made. diff --git a/distrib/crunch/crunchgen/crunchgen.c b/distrib/crunch/crunchgen/crunchgen.c deleted file mode 100644 index 7829fdd0228..00000000000 --- a/distrib/crunch/crunchgen/crunchgen.c +++ /dev/null @@ -1,1020 +0,0 @@ -/* $OpenBSD: crunchgen.c,v 1.28 2006/12/26 10:20:11 deraadt Exp $ */ - -/* - * Copyright (c) 1994 University of Maryland - * All Rights Reserved. - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of U.M. not be used in advertising or - * publicity pertaining to distribution of the software without specific, - * written prior permission. U.M. makes no representations about the - * suitability of this software for any purpose. It is provided "as is" - * without express or implied warranty. - * - * U.M. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL U.M. - * BE LIABLE FOR ANY SPECIAL, 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. - * - * Author: James da Silva, Systems Design and Analysis Group - * Computer Science Department - * University of Maryland at College Park - */ -/* - * ======================================================================== - * crunchgen.c - * - * Generates a Makefile and main C file for a crunched executable, - * from specs given in a .conf file. - */ -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <ctype.h> -#include <string.h> - -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/param.h> - -#define CRUNCH_VERSION "0.3" - -#define MAXLINELEN 16384 -#define MAXFIELDS 2048 - -/* XXX - This should be runtime configurable */ -/* - * We might have more than one makefile - * name on any given platform. Make sure - * default name is last though. - */ -char *mf_name[] = { -#if defined(MF_NAMES) - MF_NAMES, -#else - "Makefile", -#endif - NULL -}; - -/* internal representation of conf file: */ - -/* simple lists of strings suffice for most parms */ - -typedef struct strlst { - struct strlst *next; - char *str; -} strlst_t; - -/* progs have structure, each field can be set with "special" or calculated */ - -typedef struct prog { - struct prog *next; - char *name, *ident, *mf_name; - char *srcdir, *objdir; - strlst_t *objs, *objpaths; - strlst_t *links; - int goterror; -} prog_t; - -strlst_t *srcdirs = NULL; -strlst_t *libs = NULL; -strlst_t *libdirs = NULL; -char objdir[MAXPATHLEN] = "obj"; -prog_t *progs = NULL; - -char line[MAXLINELEN]; - -char confname[MAXPATHLEN], infilename[MAXPATHLEN]; -char outmkname[MAXPATHLEN], outcfname[MAXPATHLEN]; -char cachename[MAXPATHLEN], curfilename[MAXPATHLEN]; -char topdir[MAXPATHLEN], execfname[MAXPATHLEN]; -int linenum = -1; -int goterror = 0; - -char *progname = "crunchgen"; - -int verbose, readcache, elf_names; /* options */ -int reading_cache; - -void status(char *str); -void out_of_memory(void); -void add_string(strlst_t ** listp, char *str); -int is_dir(char *pathname); -int is_nonempty_file(char *pathname); -void usage(void); -void parse_conf_file(void); -void gen_outputs(void); - -int -main(int argc, char *argv[]) -{ - char *p; - int optc; - extern int optind; - extern char *optarg; - - verbose = 1; - readcache = 1; - *outmkname = *outcfname = *execfname = '\0'; - - if (argc > 0) - progname = argv[0]; - - while ((optc = getopt(argc, argv, "m:c:e:fqD:EL:O:")) != -1) { - switch (optc) { - case 'f': - readcache = 0; - break; - case 'q': - verbose = 0; - break; - - case 'm': - if (strlcpy(outmkname, optarg, sizeof(outmkname)) >= - sizeof(outmkname)) - usage(); - break; - case 'c': - if (strlcpy(outcfname, optarg, sizeof(outcfname)) >= - sizeof(outcfname)) - usage(); - break; - case 'e': - if (strlcpy(execfname, optarg, sizeof(execfname)) >= - sizeof(execfname)) - usage(); - break; - - case 'D': - if (strlcpy(topdir, optarg, sizeof(topdir)) >= sizeof(topdir)) - usage(); - break; - case 'E': - elf_names = 1; - break; - case 'L': - if (strlen(optarg) >= MAXPATHLEN) - usage(); - add_string(&libdirs, optarg); - break; - case 'O': - if (strlcpy(objdir, optarg, sizeof(objdir)) >= - sizeof(objdir)) - usage(); - break; - default: - usage(); - } - } - - argc -= optind; - argv += optind; - - if (argc != 1) - usage(); - - if (libdirs == NULL) - add_string(&libdirs, "/usr/lib"); - /* - * generate filenames - */ - - if (strlcpy(infilename, argv[0], sizeof(infilename)) >= - sizeof(infilename)) - usage(); - - /* confname = `basename infilename .conf` */ - - if ((p = strrchr(infilename, '/')) != NULL) - strlcpy(confname, p + 1, sizeof confname); - else - strlcpy(confname, infilename, sizeof confname); - if ((p = strrchr(confname, '.')) != NULL && !strcmp(p, ".conf")) - *p = '\0'; - - if (!*outmkname) - snprintf(outmkname, sizeof(outmkname), "%s.mk", confname); - if (!*outcfname) - snprintf(outcfname, sizeof(outcfname), "%s.c", confname); - if (!*execfname) - snprintf(execfname, sizeof(execfname), "%s", confname); - snprintf(cachename, sizeof(cachename), "%s.cache", confname); - - parse_conf_file(); - gen_outputs(); - - exit(goterror); -} - -void -usage(void) -{ - fprintf(stderr, - "usage: %s [-Efq] [-c c-file-name] [-D src-root] [-e exec-file-name]\n" - "\t[-L lib-dir] [-m makefile-name] [-O objdir-name] conf-file\n", - progname); - exit(1); -} - -void parse_one_file(char *filename); -void parse_line(char *line, int *fc, char **fv, int nf); -void add_srcdirs(int argc, char **argv); -void add_progs(int argc, char **argv); -void add_link(int argc, char **argv); -void add_libs(int argc, char **argv); -void add_libdirs(int argc, char **argv); -void add_special(int argc, char **argv); - -prog_t *find_prog(char *str); -void add_prog(char *progname); - -void -parse_conf_file(void) -{ - if (!is_nonempty_file(infilename)) { - fprintf(stderr, "%s: fatal: input file \"%s\" not found.\n", - progname, infilename); - exit(1); - } - parse_one_file(infilename); - if (readcache && is_nonempty_file(cachename)) { - reading_cache = 1; - parse_one_file(cachename); - } -} - -void -parse_one_file(char *filename) -{ - char *fieldv[MAXFIELDS]; - int fieldc; - void (*f) (int c, char **v); - FILE *cf; - - snprintf(line, sizeof(line), "reading %s", filename); - status(line); - strlcpy(curfilename, filename, sizeof curfilename); - - if ((cf = fopen(curfilename, "r")) == NULL) { - perror(curfilename); - goterror = 1; - return; - } - linenum = 0; - while (fgets(line, MAXLINELEN, cf) != NULL) { - linenum++; - parse_line(line, &fieldc, fieldv, MAXFIELDS); - if (fieldc < 1) - continue; - if (!strcmp(fieldv[0], "srcdirs")) - f = add_srcdirs; - else if (!strcmp(fieldv[0], "progs")) - f = add_progs; - else if (!strcmp(fieldv[0], "ln")) - f = add_link; - else if (!strcmp(fieldv[0], "libs")) - f = add_libs; - else if (!strcmp(fieldv[0], "special")) - f = add_special; - else if (!strcmp(fieldv[0], "libdirs")) - f = add_libdirs; - else { - fprintf(stderr, "%s:%d: skipping unknown command `%s'.\n", - curfilename, linenum, fieldv[0]); - goterror = 1; - continue; - } - if (fieldc < 2) { - fprintf(stderr, - "%s:%d: %s command needs at least 1 " - "argument, skipping.\n", - curfilename, linenum, fieldv[0]); - goterror = 1; - continue; - } - f(fieldc, fieldv); - } - - if (ferror(cf)) { - perror(curfilename); - goterror = 1; - } - fclose(cf); -} - -void -parse_line(char *line, int *fc, char **fv, int nf) -{ - char *p; - - p = line; - *fc = 0; - while (1) { - while (isspace(*p)) - p++; - if (*p == '\0' || *p == '#') - break; - - if (*fc < nf) - fv[(*fc)++] = p; - while (*p && !isspace(*p) && *p != '#') - p++; - if (*p == '\0' || *p == '#') - break; - *p++ = '\0'; - } - if (*p) - *p = '\0'; /* needed for '#' case */ -} - -void -add_srcdirs(int argc, char **argv) -{ - int i; - char tmppath[MAXPATHLEN]; - int overflow; - - for (i = 1; i < argc; i++) { - overflow = 0; - if (argv[i][0] == '/' || topdir[0] == '\0') { - if (strlcpy(tmppath, argv[i], sizeof(tmppath)) >= - sizeof(tmppath)) - overflow = 1; - } else { - if (strlcpy(tmppath, topdir, sizeof(tmppath)) >= - sizeof(tmppath) || - strlcat(tmppath, "/", sizeof(tmppath)) >= - sizeof(tmppath) || - strlcat(tmppath, argv[i], sizeof(tmppath)) >= - sizeof(tmppath)) - overflow = 1; - } - if (overflow) { - goterror = 1; - fprintf(stderr, "%s:%d: `%.40s...' is too long, skipping it.\n", - curfilename, linenum, argv[i]); - continue; - } - if (is_dir(tmppath)) - add_string(&srcdirs, tmppath); - else { - fprintf(stderr, "%s:%d: `%s' is not a directory, skipping it.\n", - curfilename, linenum, tmppath); - goterror = 1; - } - } -} - -void -add_libdirs(int argc, char **argv) -{ - int i; - char tmppath[MAXPATHLEN]; - char tmppath2[MAXPATHLEN]; - int overflow; - - for (i = 1; i < argc; i++) { - overflow = 0; - if (argv[i][0] == '/' || topdir[0] == '\0') { - if (strlcpy(tmppath, argv[i], sizeof(tmppath)) >= - sizeof(tmppath)) - overflow = 1; - } else { - if (strlcpy(tmppath, topdir, sizeof(tmppath)) >= - sizeof(tmppath) || - strlcat(tmppath, "/", sizeof(tmppath)) >= - sizeof(tmppath) || - strlcat(tmppath, argv[i], sizeof(tmppath)) >= - sizeof(tmppath)) - overflow = 1; - } - if (overflow) { - goterror = 1; - fprintf(stderr, "%s:%d: `%.40s...' is too long, skipping it.\n", - curfilename, linenum, argv[i]); - continue; - } - if (is_dir(tmppath)) { - snprintf(tmppath2, sizeof(tmppath2), "%s/%s", tmppath, - objdir); - if (is_dir(tmppath2)) - add_string(&libdirs, tmppath2); - else { - snprintf(tmppath2, sizeof(tmppath2), - "%s/obj.%s", tmppath, MACHINE); - if (is_dir(tmppath2)) - add_string(&libdirs, tmppath2); - else - add_string(&libdirs, tmppath); - } - } - else { - fprintf(stderr, "%s:%d: `%s' is not a directory, skipping it.\n", - curfilename, linenum, tmppath); - goterror = 1; - } - } -} - - -void -add_progs(int argc, char **argv) -{ - int i; - - for (i = 1; i < argc; i++) - add_prog(argv[i]); -} - -void -add_prog(char *progname) -{ - prog_t *p1, *p2; - - /* add to end, but be smart about dups */ - - for (p1 = NULL, p2 = progs; p2 != NULL; p1 = p2, p2 = p2->next) - if (!strcmp(p2->name, progname)) - return; - - p2 = calloc(1, sizeof(prog_t)); - if (p2) - p2->name = strdup(progname); - if (!p2 || !p2->name) - out_of_memory(); - - p2->next = NULL; - if (p1 == NULL) - progs = p2; - else - p1->next = p2; - - p2->ident = p2->srcdir = p2->objdir = NULL; - p2->links = p2->objs = NULL; - p2->goterror = 0; -} - -void -add_link(int argc, char **argv) -{ - int i; - prog_t *p = find_prog(argv[1]); - - if (p == NULL) { - fprintf(stderr, - "%s:%d: no prog %s previously declared, skipping link.\n", - curfilename, linenum, argv[1]); - goterror = 1; - return; - } - for (i = 2; i < argc; i++) - add_string(&p->links, argv[i]); -} - -void -add_libs(int argc, char **argv) -{ - int i; - - for (i = 1; i < argc; i++) - add_string(&libs, argv[i]); -} - -void -add_special(int argc, char **argv) -{ - int i; - prog_t *p = find_prog(argv[1]); - - if (p == NULL) { - if (reading_cache) - return; - fprintf(stderr, - "%s:%d: no prog %s previously declared, skipping special.\n", - curfilename, linenum, argv[1]); - goterror = 1; - return; - } - if (!strcmp(argv[2], "ident")) { - if (argc != 4) - goto argcount; - if ((p->ident = strdup(argv[3])) == NULL) - out_of_memory(); - } else if (!strcmp(argv[2], "srcdir")) { - if (argc != 4) - goto argcount; - if ((p->srcdir = strdup(argv[3])) == NULL) - out_of_memory(); - } else if (!strcmp(argv[2], "mf_name")) { - if (argc != 4) - goto argcount; - if ((p->mf_name = strdup(argv[3])) == NULL) - out_of_memory(); - } else if (!strcmp(argv[2], "objdir")) { - if (argc != 4) - goto argcount; - if ((p->objdir = strdup(argv[3])) == NULL) - out_of_memory(); - } else if (!strcmp(argv[2], "objs")) { - p->objs = NULL; - for (i = 3; i < argc; i++) - add_string(&p->objs, argv[i]); - } else if (!strcmp(argv[2], "objpaths")) { - p->objpaths = NULL; - for (i = 3; i < argc; i++) - add_string(&p->objpaths, argv[i]); - } else { - fprintf(stderr, "%s:%d: bad parameter name `%s', skipping line.\n", - curfilename, linenum, argv[2]); - goterror = 1; - } - return; - -argcount: - fprintf(stderr, - "%s:%d: too %s arguments, expected \"special %s %s <string>\".\n", - curfilename, linenum, argc < 4 ? "few" : "many", argv[1], argv[2]); - goterror = 1; -} - -prog_t * -find_prog(char *str) -{ - prog_t *p; - - for (p = progs; p != NULL; p = p->next) - if (!strcmp(p->name, str)) - return p; - return NULL; -} - -void remove_error_progs(void); -void fillin_program(prog_t * p); -void gen_specials_cache(void); -void gen_output_makefile(void); -void gen_output_cfile(void); - -void fillin_program_objs(prog_t * p, char *path); -void top_makefile_rules(FILE * outmk); -void prog_makefile_rules(FILE * outmk, prog_t * p); -void output_strlst(FILE * outf, strlst_t * lst); -char *genident(char *str); -char *dir_search(char *progname); - -void -gen_outputs(void) -{ - prog_t *p; - - for (p = progs; p != NULL; p = p->next) - fillin_program(p); - - remove_error_progs(); - gen_specials_cache(); - gen_output_cfile(); - gen_output_makefile(); - status(""); - fprintf(stderr, - "Run \"make -f %s objs exe\" to build crunched binary.\n", - outmkname); -} - -void -fillin_program(prog_t * p) -{ - char path[MAXPATHLEN]; - char *srcparent; - strlst_t *s; - int i; - - snprintf(line, sizeof(line), "filling in parms for %s", p->name); - status(line); - - if (!p->ident) - p->ident = genident(p->name); - if (!p->srcdir) { - srcparent = dir_search(p->name); - if (srcparent) - snprintf(path, sizeof(path), "%s/%s", srcparent, p->name); - if (is_dir(path)) - p->srcdir = strdup(path); - } - if (!p->objdir && p->srcdir) { - snprintf(path, sizeof(path), "%s/%s", p->srcdir, objdir); - if (is_dir(path)) - p->objdir = strdup(path); - else { - snprintf(path, sizeof(path), "%s/obj.%s", p->srcdir, MACHINE); - if (is_dir(path)) - p->objdir = strdup(path); - else - p->objdir = p->srcdir; - } - } - /* We have a sourcedir and no explicit objs, try */ - /* to find makefile and get objs from it. */ - if (p->srcdir && !p->objs) { - for (i = 0; mf_name[i] != NULL; i++) { - snprintf(path, sizeof(path), "%s/%s", p->srcdir, mf_name[i]); - if (is_nonempty_file(path)) { - p->mf_name = mf_name[i]; - fillin_program_objs(p, path); - break; - } - } - } - if (!p->objpaths && p->objdir && p->objs) - for (s = p->objs; s != NULL; s = s->next) { - snprintf(line, sizeof(line), "%s/%s", p->objdir, s->str); - add_string(&p->objpaths, line); - } - - if (!p->srcdir && verbose) - fprintf(stderr, "%s: %s: warning: could not find source directory.\n", - infilename, p->name); - if (!p->objs && verbose) - fprintf(stderr, "%s: %s: warning: could not find any .o files.\n", - infilename, p->name); - - if (!p->objpaths) { - fprintf(stderr, - "%s: %s: error: no objpaths specified or calculated.\n", - infilename, p->name); - p->goterror = goterror = 1; - } -} - -void -fillin_program_objs(prog_t * p, char *path) -{ - char *cp, *obj, tempfname[MAXPATHLEN]; - int fd, rc; - FILE *f; - - /* discover the objs from the srcdir Makefile */ - - snprintf(tempfname, sizeof(tempfname), ".tmp_%sXXXXXXXXXX", confname); - if ((fd = mkstemp(tempfname)) == -1 || (f = fdopen(fd, "w")) == NULL) { - if (fd != -1) - close(fd); - perror(tempfname); - goterror = 1; - return; - } - fprintf(f, ".include \"%s\"\n", path); - fprintf(f, ".if defined(PROG) && !defined(OBJS)\n"); - fprintf(f, "OBJS=${PROG}.o\n"); - fprintf(f, ".endif\n"); - fprintf(f, "crunchgen_objs:\n\t@echo 'OBJS= '${OBJS}\n"); - fclose(f); - - snprintf(line, sizeof(line), "make -f %s crunchgen_objs 2>&1", tempfname); - if ((f = popen(line, "r")) == NULL) { - perror("submake pipe"); - goterror = 1; - return; - } - while (fgets(line, MAXLINELEN, f)) { - if (strncmp(line, "OBJS= ", 6)) { - if (strcmp(line, - "sh: warning: running as root with dot in PATH\n") == 0) - continue; - fprintf(stderr, "make error: %s", line); - goterror = 1; - continue; - } - cp = line + 6; - while (isspace(*cp)) - cp++; - while (*cp) { - obj = cp; - while (*cp && !isspace(*cp)) - cp++; - if (*cp) - *cp++ = '\0'; - add_string(&p->objs, obj); - while (isspace(*cp)) - cp++; - } - } - if ((rc = pclose(f)) != 0) { - fprintf(stderr, "make error: make returned %d\n", rc); - goterror = 1; - } - unlink(tempfname); -} - -void -remove_error_progs(void) -{ - prog_t *p1, *p2; - - p1 = NULL; - p2 = progs; - while (p2 != NULL) { - if (!p2->goterror) - p1 = p2, p2 = p2->next; - else { - /* delete it from linked list */ - fprintf(stderr, "%s: %s: ignoring program because of errors.\n", - infilename, p2->name); - if (p1) - p1->next = p2->next; - else - progs = p2->next; - p2 = p2->next; - } - } -} - -void -gen_specials_cache(void) -{ - FILE *cachef; - prog_t *p; - - snprintf(line, sizeof(line), "generating %s", cachename); - status(line); - - if ((cachef = fopen(cachename, "w")) == NULL) { - perror(cachename); - goterror = 1; - return; - } - fprintf(cachef, "# %s - parm cache generated from %s by crunchgen %s\n\n", - cachename, infilename, CRUNCH_VERSION); - - for (p = progs; p != NULL; p = p->next) { - fprintf(cachef, "\n"); - if (p->srcdir) - fprintf(cachef, "special %s srcdir %s\n", p->name, p->srcdir); - if (p->mf_name) - fprintf(cachef, "special %s mf_name %s\n", p->name, p->mf_name); - if (p->objdir) - fprintf(cachef, "special %s objdir %s\n", p->name, p->objdir); - if (p->objs) { - fprintf(cachef, "special %s objs", p->name); - output_strlst(cachef, p->objs); - } - fprintf(cachef, "special %s objpaths", p->name); - output_strlst(cachef, p->objpaths); - } - fclose(cachef); -} - -void -gen_output_makefile(void) -{ - prog_t *p; - FILE *outmk; - - snprintf(line, sizeof(line), "generating %s", outmkname); - status(line); - - if ((outmk = fopen(outmkname, "w")) == NULL) { - perror(outmkname); - goterror = 1; - return; - } - fprintf(outmk, "# %s - generated from %s by crunchgen %s\n\n", - outmkname, infilename, CRUNCH_VERSION); - - top_makefile_rules(outmk); - - for (p = progs; p != NULL; p = p->next) - prog_makefile_rules(outmk, p); - - fprintf(outmk, "\n# ========\n"); - fclose(outmk); -} - -void -gen_output_cfile(void) -{ - extern char *crunched_skel[]; - char **cp; - FILE *outcf; - prog_t *p; - strlst_t *s; - - snprintf(line, sizeof(line), "generating %s", outcfname); - status(line); - - if ((outcf = fopen(outcfname, "w")) == NULL) { - perror(outcfname); - goterror = 1; - return; - } - fprintf(outcf, "/* %s - generated from %s by crunchgen %s */\n", - outcfname, infilename, CRUNCH_VERSION); - - fprintf(outcf, "#define EXECNAME \"%s\"\n", execfname); - for (cp = crunched_skel; *cp != NULL; cp++) - fprintf(outcf, "%s\n", *cp); - - for (p = progs; p != NULL; p = p->next) - fprintf(outcf, "extern int _crunched_%s_stub();\n", p->ident); - - fprintf(outcf, "\nstruct stub entry_points[] = {\n"); - for (p = progs; p != NULL; p = p->next) { - fprintf(outcf, "\t{ \"%s\", _crunched_%s_stub },\n", - p->name, p->ident); - for (s = p->links; s != NULL; s = s->next) - fprintf(outcf, "\t{ \"%s\", _crunched_%s_stub },\n", - s->str, p->ident); - } - - fprintf(outcf, "\t{ EXECNAME, crunched_main },\n"); - fprintf(outcf, "\t{ NULL, NULL }\n};\n"); - fclose(outcf); -} - -char * -genident(char *str) -{ - char *n, *s, *d; - - /* - * generates a Makefile/C identifier from a program name, mapping '-' to - * '_' and ignoring all other non-identifier characters. This leads to - * programs named "foo.bar" and "foobar" to map to the same identifier. - */ - - if ((n = strdup(str)) == NULL) - return NULL; - for (d = s = n; *s != '\0'; s++) { - if (*s == '-') - *d++ = '_'; - else if (*s == '_' || isalnum(*s)) - *d++ = *s; - } - *d = '\0'; - return n; -} - -char * -dir_search(char *progname) -{ - char path[MAXPATHLEN]; - strlst_t *dir; - - for (dir = srcdirs; dir != NULL; dir = dir->next) { - snprintf(path, sizeof(path), "%s/%s", dir->str, progname); - if (is_dir(path)) - return dir->str; - } - return NULL; -} - -void -top_makefile_rules(FILE * outmk) -{ - prog_t *p; - strlst_t *l; - - - fprintf(outmk, "STRIP?=strip\n"); - fprintf(outmk, "LINK=$(LD) -dc -r\n"); - fprintf(outmk, "LIBS="); - for (l = libdirs; l != NULL; l = l->next) - fprintf(outmk, " -L%s", l->str); - output_strlst(outmk, libs); - - fprintf(outmk, "CRUNCHED_OBJS="); - for (p = progs; p != NULL; p = p->next) - fprintf(outmk, " %s.lo", p->name); - fprintf(outmk, "\n"); - - fprintf(outmk, "SUBMAKE_TARGETS="); - for (p = progs; p != NULL; p = p->next) - fprintf(outmk, " %s_make", p->ident); - fprintf(outmk, "\n\n"); - - fprintf(outmk, "%s: %s.o $(CRUNCHED_OBJS)\n", - execfname, execfname); - fprintf(outmk, "\t$(CC) -static -o $@ %s.o $(CRUNCHED_OBJS) $(LIBS)\n", - execfname); - fprintf(outmk, "\t$(STRIP) %s\n", execfname); - fprintf(outmk, "all: objs exe\nobjs: $(SUBMAKE_TARGETS)\n"); - fprintf(outmk, "exe: %s\n", execfname); - fprintf(outmk, "clean:\n\trm -f %s *.lo *.o *_stub.c\n", - execfname); - fprintf(outmk, ".PHONY: all objs exe clean $(SUBMAKE_TARGETS)\n\n"); -} - -void -prog_makefile_rules(FILE * outmk, prog_t * p) -{ - fprintf(outmk, "\n# -------- %s\n\n", p->name); - - if (p->srcdir && p->objs) { - fprintf(outmk, "%s_SRCDIR=%s\n", p->ident, p->srcdir); - fprintf(outmk, "%s_OBJS=", p->ident); - output_strlst(outmk, p->objs); - fprintf(outmk, "%s_make:\n", p->ident); - fprintf(outmk, "\tcd $(%s_SRCDIR) && exec $(MAKE) -f %s $(%s_OBJS)\n\n", - p->ident, p->mf_name, p->ident); - } else - fprintf(outmk, "%s_make:\n\t@echo \"** cannot make objs for %s\"\n\n", - p->ident, p->name); - - fprintf(outmk, "%s_OBJPATHS=", p->ident); - output_strlst(outmk, p->objpaths); - - fprintf(outmk, "%s_stub.c:\n", p->name); - fprintf(outmk, "\techo \"" - "int _crunched_%s_stub(int argc, char **argv, char **envp)" - "{return main(argc,argv,envp);}\" >$@\n", - p->ident); - fprintf(outmk, "%s.lo: %s_stub.o $(%s_OBJPATHS)\n", - p->name, p->name, p->ident); - fprintf(outmk, "\t$(LINK) -o $@ %s_stub.o $(%s_OBJPATHS)\n", - p->name, p->ident); - fprintf(outmk, "\tcrunchide -k %s_crunched_%s_stub $@\n", - elf_names ? "" : "_", p->ident); -} - -void -output_strlst(FILE * outf, strlst_t * lst) -{ - for (; lst != NULL; lst = lst->next) - fprintf(outf, " %s", lst->str); - fprintf(outf, "\n"); -} - -void -status(char *str) -{ - static int lastlen = 0; - int len, spaces; - - if (!verbose) - return; - - len = strlen(str); - spaces = lastlen - len; - if (spaces < 1) - spaces = 1; - - fprintf(stderr, " [%s]%*.*s\r", str, spaces, spaces, " "); - fflush(stderr); - lastlen = len; -} - -void -out_of_memory(void) -{ - fprintf(stderr, "%s: %d: out of memory, stopping.\n", infilename, linenum); - exit(1); -} - -void -add_string(strlst_t ** listp, char *str) -{ - strlst_t *p1, *p2; - - /* add to end, but be smart about dups */ - - for (p1 = NULL, p2 = *listp; p2 != NULL; p1 = p2, p2 = p2->next) - if (!strcmp(p2->str, str)) - return; - - p2 = calloc(1, sizeof(strlst_t)); - if (p2) - p2->str = strdup(str); - if (!p2 || !p2->str) - out_of_memory(); - - p2->next = NULL; - if (p1 == NULL) - *listp = p2; - else - p1->next = p2; -} - -int -is_dir(char *pathname) -{ - struct stat buf; - - if (stat(pathname, &buf) == -1) - return 0; - return S_ISDIR(buf.st_mode); -} - -int -is_nonempty_file(char *pathname) -{ - struct stat buf; - - if (stat(pathname, &buf) == -1) - return 0; - - return S_ISREG(buf.st_mode) && buf.st_size > 0; -} diff --git a/distrib/crunch/crunchgen/mkskel.sh b/distrib/crunch/crunchgen/mkskel.sh deleted file mode 100644 index 676705bbb79..00000000000 --- a/distrib/crunch/crunchgen/mkskel.sh +++ /dev/null @@ -1,17 +0,0 @@ -#! /bin/sh -# $OpenBSD: mkskel.sh,v 1.2 2000/03/01 22:10:03 todd Exp $ - -# idea and sed lines taken straight from flex - -cat <<!EOF -/* File created via mkskel.sh */ - -char *crunched_skel[] = { -!EOF - -sed 's/\\/&&/g' $* | sed 's/"/\\"/g' | sed 's/.*/ "&",/' - -cat <<!EOF - 0 -}; -!EOF |