/***********************************************************************
* *
* This software is part of the ast package *
* Copyright (c) 1984-2012 AT&T Intellectual Property *
* and is licensed under the *
* Eclipse Public License, Version 1.0 *
* by AT&T Intellectual Property *
* *
* A copy of the License is available at *
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
* *
* Information and Software Systems Research *
* AT&T Research *
* Florham Park NJ *
* *
* Glenn Fowler <gsf@research.att.com> *
* *
***********************************************************************/
/*
* Glenn Fowler
* AT&T Research
*
* make common definitions
*/
#else
#endif
#
define COMMENT '#' /* make comment char */#
define MARK_CONTEXT '\002' /* context mark -- not in input!*/#
define MARK_QUOTE '\003' /* quote mark -- not in input! */#
define SALT '#' /* preprocessor control char */#
define VIEWOFFSET '0' /* char offset for view==0 */
#else
#endif
#
define ATTRNAME '.' /* prefix to name an attribute */#
define ATTRSET '+' /* prefix to set an attribute */#
define ATTRCLEAR '-' /* prefix to clear an attribute */
#
define CMDTRACE (-
6)
/* coshell trace debug level */#
define EXPTRACE (-
5)
/* explanation trace debug lev */
#
define clrbit(v,b) ((v)&=~(
1L<<(b)))
#
define setbit(v,b) ((v)|=(
1L<<(b)))
#
define tstbit(v,b) ((v)&(
1L<<(b)))
#else
#endif
#
define NOTYET 0
/* don't know what to do yet */#
define UPDATE 1 /* rule in process of being updated */#
define MAKING 2 /* executing update action */#
define TOUCH 3 /* archive member to be touched */#
define EXISTS 4 /* rule already exists in desired state */#
define IGNORE 5 /* rule make failed but ignore errors */#
define FAILED 6 /* rule make failed */#
define OLDRULE 7 /* makefile compiler old rule mark */
#
define RECOMPILE 1 /* recompile make object */#
define COMPILED 2 /* make object compiled (if necessary) */#
define SAVED 3 /* make state saved */
#
define DELETE NiL /* delete path component in edit() */#
define KEEP ((
char*)
1)
/* keep path component in edit() */
/*
* VAR and RULE must not change -- the rest must be in sequence
*/
#
define VAR 0
/* state var from var in staterule() */#
define RULE 1 /* state rule in staterule() */#
define PREREQS 2 /* alternate prereqs in staterule() */
#
define MINVALUE 32 /* minimum variable value length */#
define MAXJOBS 128 /* maximum number concurrent jobs */#
define MAXNAME 1024 /* maximum file pathname length */#
define PCTGARBAGE 10 /* maximum state garbage percentage */
#endif
#
define A_clear (
1<<0)
/* assertion() .CLEAR */#
define A_copy (
1<<
1)
/* assertion() .COPY */#
define A_delete (
1<<
2)
/* assertion() .DELETE */#
define A_group (
1<<
3)
/* assertion() metarule (...) grouping */#
define A_insert (
1<<
4)
/* assertion() .INSERT */#
define A_metarule (
1<<
5)
/* assertion() pattern metarule */#
define A_negate (
1<<
6)
/* assertion() -attribute */#
define A_nooptions (
1<<
7)
/* assertion() no more option prereqs */#
define A_norhs (
1<<
8)
/* assertion() empty rhs */#
define A_null (
1<<
9)
/* assertion() .NULL */#
define A_scan (
1<<
10)
/* assertion() .SCAN */#
define A_scope (
1<<
11)
/* assertion() metarule scope prereqs */#
define A_special (
1<<
12)
/* assertion() .SPECIAL */#
define A_target (
1<<
13)
/* assertion() set P_target */
#
define C_ID1 (
1<<0)
/* istype() first identifier char */#
define C_ID2 (
1<<
1)
/* istype() remaining id chars */#
define C_MATCH (
1<<
2)
/* istype() shell pattern match chars */#
define C_OPTVAL (
1<<
3)
/* istype() option value separator */#
define C_SEP (
1<<
4)
/* istype() token separator */#
define C_TERMINAL (
1<<
5)
/* istype() terminal chars */#
define C_VARIABLE1 (
1<<
6)
/* istype() first variable name char */#
define C_VARIABLE2 (
1<<
7)
/* istype() remaining variable chars */
#
define C_VARPOS1 (
1<<
8)
/* istype() var superimposed code 1 */#
define C_VARPOS2 (
1<<
9)
/* istype() var superimposed code 2 */#
define C_VARPOS3 (
1<<
10)
/* istype() var superimposed code 3 */#
define C_VARPOS4 (
1<<
11)
/* istype() var superimposed code 4 */#
define C_VARPOS5 (
1<<
12)
/* istype() var superimposed code 5 */#
define C_VARPOS6 (
1<<
13)
/* istype() var superimposed code 6 */#
define C_VARPOS7 (
1<<
14)
/* istype() var superimposed code 7 */#
define C_VARPOS8 (
1L<<
15)
/* istype() var superimposed code 8 */
#
define NAME_glob 0x010 /* requires dynamic glob() */
#
define ARG_ASSIGN (
1<<0)
/* command line assignment arg flag */#
define ARG_SCRIPT (
1<<
1)
/* command line script arg flag */#
define ARG_TARGET (
1<<
2)
/* command line target arg flag */
#
define BIND_DOT (
1<<0)
/* bindfile in . */#
define BIND_FORCE (
1<<
1)
/* force bindfile current time */#
define BIND_RULE (
1<<
3)
/* force bindfile makerule */
#
define MERGE_ALL (
1<<0)
/* merge everything */#
define MERGE_ASSOC (
1<<
1)
/* pattern association merge */#
define MERGE_ATTR (
1<<
2)
/* merge just attributes */#
define MERGE_SCANNED (
1<<
5)
/* MERGE_ALL but no entries|scanned */
#
define COMP_BASE (
1<<0)
/* base rules prereq */#
define COMP_RULES (
1<<
6)
/* from explicit rules statement */#
define COMP_NSEC (
1<<
7)
/* next prereq nsec */
#
define SCAN_NULL 2 /* .SCAN.NULL scan index */#
define SCAN_USER 8 /* first user defined scan index */
/*
* rule.property flags
*/
#
define P_accept (
1<<0)
/* ignore state conflicts */#
define P_after (
1<<
1)
/* make after parent update */#
define P_always (
1<<
2)
/* execute even if !state.exec */#
define P_archive (
1<<
3)
/* rule bound to archive file */#
define P_before (
1<<
5)
/* make before parent update */#
define P_command (
1<<
6)
/* command target -- no pattern */#
define P_dontcare (
1<<
7)
/* don't care if rule made */#
define P_force (
1<<
8)
/* target is always out of date */#
define P_ignore (
1<<
11)
/* parent to ignore this prereq */#
define P_immediate (
1<<
12)
/* rule needs immediate action */#
define P_implicit (
1<<
13)
/* force implicit prereq checks */#
define P_internal (
1<<
14)
/* don't compile unless prereq */#
define P_joint (
1L<<
15)
/* pseudo for joint targets */#
define P_make (
1L<<
16)
/* make (not shell) action */#
define P_multiple (
1L<<
18)
/* multi prereq occurrences OK */
#
define P_local (
1L<<
19)
/* local affinity */
#
define P_operator (
1L<<
20)
/* rule is an operator */#
define P_parameter (
1L<<
21)
/* rule bound to parameter file */#
define P_readonly (
1L<<
22)
/* no user modifications */#
define P_repeat (
1L<<
23)
/* make even if already made */#
define P_state (
1L<<
24)
/* state atom */#
define P_target (
1L<<
27)
/* rule is an explicit target */#
define P_terminal (
1L<<
28)
/* terminal target or metarule */#
define P_use (
1L<<
29)
/* rule is a .USE script */#
define P_virtual (
1L<<
30)
/* target is not a file */
#
define P_read (
1L<<
31)
/* read action output */
/*
* rule.dynamic flags
*/
#
define D_alias (
1<<0)
/* more than one unbound name */#
define D_bound (
1<<
2)
/* rule has been bound */#
define D_built (
1<<
3)
/* triggered action built target*/#
define D_cached (
1<<
4)
/* post assertion info cached */#
define D_compiled (
1<<
5)
/* rule has been compiled */#
define D_dynamic (
1<<
6)
/* must do dynamic expansion */#
define D_entries (
1<<
7)
/* scanned rule has entries */#
define D_garbage (
1<<
8)
/* state file GC mark */#
define D_hasafter (
1<<
9)
/* rule has after prereqs */#
define D_hasbefore (
1<<
10)
/* rule has before prereqs */
#
define D_membertoo (
1<<
11)
/* D_member was also set */#
define D_same (
1<<
13)
/* target unchanged by action */
#
define D_lower (
1<<
14)
/* state from lower view */
#
define D_source (
1L<<
15)
/* .SOURCE directory */
#
define D_member (
1L<<
16)
/* rule bound to archive member */
#
define D_global (
1L<<
17)
/* global view if view==0 */
#
define D_regular (
1L<<
18)
/* rule bound to regular file */#
define D_scanned (
1L<<
19)
/* has been scanned */#
define D_select0 (
1L<<
20)
/* $(...) select bit 0 */#
define D_select1 (
1L<<
21)
/* $(...) select bit 1 */#
define D_triggered (
1L<<
22)
/* rule action triggered */
#
define D_index (
1L<<
23)
/* load time index consistency */
#
define D_bindindex (
1L<<
24)
/* bind index table entry */
#
define D_hasscope (
1L<<
26)
/* has D_scope prereqs */#
define D_scope (
1L<<
27)
/* scoped var assignment */
#
define D_hasmake (
1L<<
28)
/* rule has .MAKE after prereqs */
#
define D_context (
1L<<
29)
/* ref may be diff dir context */
#
define D_lowres (
1L<<
30)
/* low resolution time */
#
define M_bind (
1<<0)
/* bind recursion mark */#
define M_compile (
1<<
1)
/* compilation mark */#
define M_generate (
1<<
3)
/* prereq generation mark */#
define M_mark (
1<<
4)
/* temporary mark */#
define M_metarule (
1<<
5)
/* metarule closure mark */#
define M_scan (
1<<
6)
/* scan recursion mark */#
define M_waiting (
1<<
7)
/* waiting to complete mark */
/*
* var.property flags
*/
#
define V_compiled (
1<<0)
/* variable has been compiled */#
define V_frozen (
1<<
1)
/* frozen in make object file */#
define V_functional (
1<<
2)
/* make rule name before access */#
define V_import (
1<<
3)
/* imported from environment */#
define V_local_D (
1<<
4)
/* :T=D: localview reference */#
define V_readonly (
1<<
6)
/* only dynamic modifications */#
define V_retain (
1<<
7)
/* retain value in state file */#
define V_scan (
1<<
8)
/* scan for implicit state var */
#
define V_local_E (
1<<
9)
/* :T=E: localview reference */
#
define V_auxiliary (
1<<
10)
/* auxiliary &= assignment */#
define V_append (
1<<
11)
/* cmd line += property or op */#
define V_free (
1<<
12)
/* value may be freed */#
define V_builtin (
1<<
13)
/* builtin V_functional */#
define V_scope (
1<<
14)
/* scoped value */
#
define V_restored (
1L<<
15)
/* retained value stored */
/*
* getval() flags
*/
#
define VAL_FILE (
1<<
2)
/* !notfile(r) */
/*
* dumpjob() flags
*/
typedef struct Fileid_s /* unique file id */ {
long dev;
/* device number */ long ino;
/* inode number */
typedef struct Dir_s /* scanned directory entry */ {
char*
name;
/* directory name */ unsigned char archive;
/* directory is an archive */ unsigned char directory;
/* directory is a real directory*/ unsigned char ignorecase;
/* pox on dirs that ignore case */ unsigned char truncate;
/* names truncated to this */
struct File_s /* file table entry */ {
Dir_t*
dir;
/* directory containing file */ };
struct Frame_s /* active target frame */ {
char*
action;
/* original action */ char*
original;
/* original bound name */ char*
primary;
/* metarule primary prereq name */ char*
stem;
/* metarule stem */
struct
{
char*
name;
/* original target name */ };
/*
* statevar data, staterule sync time and unbound rule name -- shared in rule.u1
*/
{
char*
name;
/* rule name */
union
{
char*
u_data;
/* state value */
char*
action;
/* update action */
unsigned char scan;
/* file scan strategy index */ unsigned char semaphore;
/* semaphore + count */ unsigned char status;
/* disposition */ unsigned char view;
/* view bind index */
unsigned char mark;
/* M_* marks */ unsigned char preview;
/* min prereq view */ unsigned short must;
/* cancel if == 0 */
unsigned long complink;
/* compilation link */
unsigned char source;
/* source bind index */ #endif
};
typedef struct Internal_s /* internal rule and list info */ {
/*
*/
Rule_t*
op;
/* .OPERATOR rule pointer */
/*
* readonly rule attributes
*/
/*
* special rules and names
*/
Rule_t*
include;
/* .INCLUDE rule pointer */
/*
* pattern association rules
*/
/*
* miscellaneous internal info
*/
Sfio_t*
tmp;
/* very temporary work buffer */ Sfio_t*
val;
/* initial getval return buffer */ Sfio_t*
wrk;
/* very temporary work buffer */
char*
freevars;
/* free variables list */
char*
openfile;
/* bind()-scan() optimization */ char*
pwd;
/* PWD value */ char*
ptr;
/* temporary for sfstrptr() */
int openfd;
/* bind()-scan() optimization */ int pwdlen;
/* strlen(internal.pwd) */
typedef struct External_s /* external engine name info */ {
/*
* names of variables defined by engine, init, or environment
*/
char*
args;
/* candidate args file name(s) */ char*
convert;
/* makefile converter patterns */ char*
file;
/* main input makefile name */ char*
files;
/* candidate makefile name(s) */ char*
import;
/* explicit env override vars */ char*
lib;
/* related file lib directory */ char*
make;
/* program path name */ char*
nproc;
/* # jobs for compatibility */ char*
old;
/* old program path name */ char*
pwd;
/* pwd name */ char*
rules;
/* candidate rules file name(s) */ char*
skip;
/* order directory skip pattern */ char*
version;
/* engine version stamp */ char*
viewdot;
/* . view dir list */ char*
viewnode;
/* view node dir list */
/*
* infrequently used engine interface names
*/
char*
compdone;
/* made after makefile compiled */ char*
compinit;
/* made before makefile compiled*/ char*
done;
/* made just before exit */ char*
init;
/* made before first user target*/ char*
interrupt;
/* made on first interrupt */ char*
jobdone;
/* made when each job done */ char*
makeinit;
/* made after before init */ char*
makeprompt;
/* made just before each prompt */ char*
makerun;
/* made just before each job */ char*
mamname;
/* external mam atom name */ char*
order;
/* :W=[OPR]: favorites */
/*
* related file suffixes
*/
char*
lock;
/* make lock file suffix */ char*
object;
/* make object file suffix */ char*
source;
/* make source file suffix */ char*
state;
/* make state file suffix */ char*
tmp;
/* make temporary file suffix */
typedef struct Tables_s /* hash table pointers */ {
{
#else
char*
path;
/* path name component */ #endif
char*
root;
/* path root */ unsigned char flags;
/* BIND_* flags */ unsigned char map;
/* external index map */
typedef struct Label_s /* resume label */ {
typedef struct Mam_s /* mam state */ {
int hold;
/* output hold nest level */ int level;
/* next error() message level */ int parent;
/* mam parent label */ int rootlen;
/* strlen(state.mam.root) */
char*
label;
/* instruction label */ char*
root;
/* names relative to this root */ char*
type;
/* mam type name */
unsigned char dynamic;
/* dynamic mam */ unsigned char regress;
/* regression mam */ unsigned char statix;
/* static mam */
unsigned char dontcare;
/* emit dontcare rules too */ unsigned char port;
/* emit porting hints */
typedef struct State_s /* program state */ {
unsigned char accept;
/* accept all existing targets */ unsigned char alias;
/* enable directory aliasing */ unsigned char base;
/* compile base|global rules */ unsigned char caught;
/* a signal was caught */ unsigned char compile;
/* make object compile state */ unsigned char cross;
/* don't run gen'd executables */ unsigned char exec;
/* execute shell actions */ unsigned char expandall;
/* expanding $(...) */ unsigned char expandview;
/* expand paths if fsview!=0 */ unsigned char explain;
/* explain reason for actions */ unsigned char finish;
/* in finish() */ unsigned char force;
/* force target updates */ unsigned char forceread;
/* force makefiles to be read */ unsigned char forcescan;
/* force implicit prereq scan */ unsigned char fsview;
/* file system handles views */ unsigned char fullscan;
/* scan for impl state prereqs */ unsigned char global;
/* reading global rules */ unsigned char ignore;
/* ignore sh action errors */ unsigned char import;
/* import var def precedence */ unsigned char init;
/* engine initialization */ unsigned char intermediate;
/* force intermediate targets */ unsigned char interpreter;
/* in interpreter main loop */ unsigned char keepgoing;
/* continue w/ sibling prereqs */ unsigned char list;
/* list readable definitions */ unsigned char localview;
/* automatics to local view */ unsigned char logical;
/* emit logical pathnames */ #endif
unsigned char never;
/* really - don't exec anything */ unsigned char op;
/* currently parsing operator */ unsigned char override;
/* override explicit rules */ unsigned char pushed;
/* --global state */ unsigned char push_user;
/* --global state */ unsigned char preprocess;
/* preprocess all makefiles */ unsigned char reading;
/* currently reading makefile */ unsigned char readonly;
/* current vars|opts readonly */ unsigned char ruledump;
/* dump rule information */ unsigned char savestate;
/* must save state variables */ unsigned char scan;
/* scan|check implicit prereqs */ unsigned char serialize;
/* serialize concurrent output */ unsigned char silent;
/* run silently */ unsigned char touch;
/* touch out of date targets */ unsigned char user;
/* user activities started */ unsigned char val;
/* internal.val in use */ unsigned char vardump;
/* dump variable information */ unsigned char virtualdot;
/* fsview . is virtual */ unsigned char waiting;
/* waiting for job completion */ unsigned char warn;
/* enable source file warnings */
int argc;
/* global argc */ int believe;
/* believe state from this level*/ int errors;
/* keepgoing error count */ int jobs;
/* sh action concurrency level */ int readstate;
/* state files to this view ok */ int reread;
/* input makefile reread count */ int tabstops;
/* tab stops for makefile parse */ int targetview;
/* most recent active targ view */ int tolerance;
/* time comparison tolerance */ int unwind;
/* make() dontcare unwind level */
char*
corrupt;
/* corrupt state file action */ char*
errorid;
/* error message id */ char*
hold;
/* hold error trap */ char*
loading;
/* loading this object file */ char*
makefile;
/* first makefile name */ char*
regress;
/* output for regression test */ char*
rules;
/* base rules base name */ char*
statefile;
/* state variable file name */ char*
tmppchar;
/* macro char* temporary */ char*
tmpfile;
/* temporary file name */ char*
writestate;
/* 0:nowrite or state file def */
int*
argf;
/* global argv ARG_* flags */
char**
argv;
/* global argv */
#endif
unsigned int maxview;
/* max view bind index */
int (*
compnew)(
const char*,
char*,
void*);
/* new compile rule */ void*
comparg;
/* compnew handle */
typedef struct Var_s /* variable */ {
char* (*
builtin)(
char**);
/* builtin function */
struct List_s /* rule cons cell */ {
};
/*
* make globals
*/
extern char null[];
/* null string */ extern char tmpname[];
/* temporary name buffer */
extern short ctypes[];
/* internal character types */
extern char*
idname;
/* interface id name */ extern char*
initstatic;
/* static initialization */ extern char*
version;
/* program version stamp */
/*
* make routines
*/
extern void edit(
Sfio_t*,
char*,
char*,
char*,
char*);
extern int forcescan(
const char*,
char* v,
void*);
extern char*
getarg(
char**,
int*);
extern char*
getval(
char*,
int);
extern int nametype(
const char*,
char**);
extern int resolve(
char*,
int,
int);
extern void rules(
char*);
extern int unbind(
const char*,
char*,
void*);