make.h revision 3f54fd611f536639ec30dd53c48e5ec1897cc7d9
/***********************************************************************
* *
* 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> *
* *
***********************************************************************/
#pragma prototyped
/*
* Glenn Fowler
* AT&T Research
*
* make common definitions
*/
#include <ast.h>
#include <ls.h>
#include <ctype.h>
#include <dirent.h>
#include <fs3d.h>
#include <glob.h>
#include <hash.h>
#include <swap.h>
#include <namval.h>
#include <error.h>
#include <coshell.h>
#include <times.h>
#include <tok.h>
#include <setjmp.h>
#include <sfdisc.h>
#include <tmx.h>
#if DEBUG
#else
#define debug(x)
#define PANIC ERROR_PANIC
#endif
#if _WINIX
#else
#endif
#define canon(x) ((state.context&&iscontextp(x,&state.tmppchar))?state.tmppchar:(state.mam.statix?mamcanon(x):pathcanon(x,0,0)))
#define clrbit(v,b) ((v)&=~(1L<<(b)))
#define notfile(r) (((r)->property&(P_attribute|P_functional|P_make|P_operator|P_state|P_use|P_virtual))||((r)->dynamic&D_scope)||(r)->semaphore||((r)->property&P_dontcare)&&((r)->dynamic&D_bound)&&!(r)->time)
#define oldname(r) do{if(getbound(r->uname))putbound(0,0);if(r->dynamic&D_alias)r->dynamic&=~D_alias;else putrule(r->name,0);r->name=r->uname;r->uname=0;}while(0)
#define rsfopen(f) ((f)==internal.openfile?(internal.openfile=0,sfnew(NiL,NiL,SF_UNBOUND,internal.openfd,SF_READ)):sfopen(NiL,f,"re"))
#define setbit(v,b) ((v)|=(1L<<(b)))
#define tstbit(v,b) ((v)&(1L<<(b)))
#define unviewname(s) (*(s)='(')
#define viewname(s,v) (*(s)=VIEWOFFSET+(v))
#define freelist(x) do{if(x){(x)->rule=(Rule_t*)internal.freelists;internal.freelists=(char*)(x);}}while(0)
#define freerule(r) do{zero(*r);*((char**)r)=internal.freerules;internal.freerules=(char*)(r);}while(0)
#define freevar(v) do{(v)->property&=(V_free|V_import);*((char**)v)=internal.freevars;internal.freevars=(char*)(v);}while(0)
#define newlist(x) do{if(x=(List_t*)internal.freelists){if(x->next){x=x->next;*((char**)internal.freelists)=(char*)x->next;}else internal.freelists=(char*)x->rule;}else x=(List_t*)newchunk(&internal.freelists,sizeof(List_t));}while(0)
#define newrule(r) do{if(r=(Rule_t*)internal.freerules){internal.freerules=(*((char**)r));zero(*r);}else r=(Rule_t*)newchunk(&internal.freerules,sizeof(Rule_t));}while(0)
#define newvar(v) do{if(v=(Var_t*)internal.freevars){internal.freevars=(*((char**)v));}else v=(Var_t*)newchunk(&internal.freevars,sizeof(Var_t));}while(0)
#if CHAR_MIN < 0
#else
#endif
#define NOTYET 0 /* don't know what to do yet */
/*
* VAR and RULE must not change -- the rest must be in sequence
*/
#define VAR 0 /* state var from var in staterule() */
#if BINDINDEX
#endif
/*
* rule.property flags
*/
/*
* rule.dynamic flags
*/
#define D_CLEAROBJECT (~(D_bindindex|D_built|D_compiled|D_context|D_dynamic|D_index|D_lower|D_lowres|D_scope))
/*
* var.property flags
*/
/*
* getval() flags
*/
/*
* dumpjob() flags
*/
typedef struct Fileid_s /* unique file id */
{
long dev; /* device number */
long ino; /* inode number */
} Fileid_t;
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 */
} Dir_t;
struct File_s /* file table entry */
{
};
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
*/
struct Rule_s /* rule */
{
char* name; /* rule name */
union
{
char* u_uname; /* unbound name */
char* u_data; /* state value */
} u1;
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 */
#if BINDINDEX
unsigned char source; /* source bind index */
#endif
};
typedef struct Internal_s /* internal rule and list info */
{
/*
*/
/*
* readonly rule attributes
*/
/*
* special rules and names
*/
Rule_t* include; /* .INCLUDE rule pointer */
/*
* pattern association rules
*/
/*
* miscellaneous internal info
*/
char* freelists; /* free lists list */
char* freerules; /* free rules list */
char* freevars; /* free variables list */
char* issource; /* internal.source* match pat */
char* openfile; /* bind()-scan() optimization */
char* pwd; /* PWD value */
char* ptr; /* temporary for sfstrptr() */
int openfd; /* bind()-scan() optimization */
int pwdlen; /* strlen(internal.pwd) */
} Internal_t;
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* makedone; /* made after 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* mamaction; /* external mam action */
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 */
} External_t;
typedef struct Tables_s /* hash table pointers */
{
} Tables_t;
typedef struct Binding_s /* binding info */
{
#if BINDINDEX
#else
char* path; /* path name component */
#endif
char* root; /* path root */
short pathlen; /* path length */
short rootlen; /* root length */
unsigned char flags; /* BIND_* flags */
unsigned char map; /* external index map */
} Binding_t;
typedef struct Label_s /* resume label */
{
} Label_t;
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* options; /* option string */
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 */
} Mam_t;
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 compileonly; /* only compile (force) */
unsigned char compatibility; /* disable compatibility msgs */
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 explicitrules; /* explicit rules statement */
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 ignorelock; /* ignore state lock */
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 */
#if BINDINDEX
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_global; /* --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 strictview; /* strict views */
unsigned char targetcontext; /* expand in target dir context */
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 interrupt; /* interrupt causing exit */
int jobs; /* sh action concurrency level */
int pid; /* make pid */
int readstate; /* state files to this view ok */
int reread; /* input makefile reread count */
int stateview; /* state file view index */
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* objectfile; /* make object file name */
char* regress; /* output for regression test */
char* rules; /* base rules base name */
char* statefile; /* state variable file name */
char* targetprefix; /* target prefix dir separator */
char* tmppchar; /* macro char* temporary */
char* tmpfile; /* temporary file name */
char* writeobject; /* 0:nowrite or object file def */
char* writestate; /* 0:nowrite or state file def */
int* argf; /* global argv ARG_* flags */
char** argv; /* global argv */
#if BINDINDEX
int maxsource; /* max source bind index */
#endif
unsigned int maxview; /* max view bind index */
int (*compnew)(const char*, char*, void*); /* new compile rule */
void* comparg; /* compnew handle */
} State_t;
typedef struct Var_s /* variable */
{
char* name; /* name */
char* value; /* value */
char* (*builtin)(char**); /* builtin function */
} Var_t;
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* initdynamic; /* dynamic initialization */
extern char* initstatic; /* static initialization */
extern char* version; /* program version stamp */
/*
* make routines
*/
extern void argcount(void);
extern void artouch(char*, char*);
extern char* arupdate(char*);
extern void bindattribute(Rule_t*);
extern int block(int);
extern void candidates(void);
extern void compile(char*, char*);
extern void drop(void);
extern void dumpaction(Sfio_t*, const char*, char*, const char*);
extern void dumpjobs(int, int);
extern void dumpregress(Sfio_t*, const char*, const char*, char*);
extern void explain(int, ...);
extern void finish(int);
extern int forcescan(const char*, char* v, void*);
extern char* getarg(char**, int*);
extern char* getval(char*, int);
extern int handle(void);
extern void initcode(void);
extern void inithash(void);
extern void initrule(void);
extern void initscan(int);
extern void inittrap(void);
extern void initview(void);
extern void initwakeup(int);
extern void interpreter(char*);
extern int isoption(const char*);
extern int nametype(const char*, char**);
extern void lockstate(int);
extern int makebefore(Rule_t*);
extern char* mamcanon(char*);
extern void metaexpand(Sfio_t*, char*, char*);
extern int metamatch(char*, char*, char*);
extern char* objectfile(void);
extern char* parsefile(void);
extern void poplocal(void*);
extern void punt(int);
extern void* pushlocal(void);
extern void readcheck(void);
extern void readclear(void);
extern void readenv(void);
extern int readfile(char*, int, char*);
extern void readstate(void);
extern void remtmp(int);
extern int resolve(char*, int, int);
extern void rules(char*);
extern void savestate(void);
extern int scanargs(int, char**, int*);
extern char* statefile(void);
extern void terminate(void);
extern int unbind(const char*, char*, void*);
extern void unparse(int);