Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/nmake/mam.c
1808 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1984-2012 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* *
19
***********************************************************************/
20
#pragma prototyped
21
/*
22
* Glenn Fowler
23
* AT&T Research
24
*
25
* mam support routines
26
*/
27
28
#include "make.h"
29
30
/*
31
* mam special pathcanon()
32
*/
33
34
char*
35
mamcanon(char* path)
36
{
37
register char* s;
38
39
s = path + strlen(path);
40
while (s > path + 1 && *(s - 1) == '.' && *(s - 2) == '/')
41
{
42
for (s -= 2; s > path + 1 && *(s - 1) == '/'; s--);
43
*s = 0;
44
}
45
return s;
46
}
47
48
/*
49
* output dynamic mam error message
50
*/
51
52
ssize_t
53
mamerror(int fd, const void* b, size_t n)
54
{
55
register char* s = (char*)b;
56
register char* e;
57
char* t;
58
59
if (state.mam.level > 0)
60
{
61
if (e = strchr(s, ':'))
62
{
63
for (s = e; *++s && *s == ' ';);
64
n -= s - (char*)b;
65
}
66
switch (state.mam.level)
67
{
68
case ERROR_WARNING:
69
t = "warning";
70
break;
71
case ERROR_PANIC:
72
t = "panic";
73
break;
74
default:
75
t = 0;
76
break;
77
}
78
if (!t)
79
t = "error";
80
sfprintf(state.mam.out, "%sinfo %s %-.*s", state.mam.label, t, n, s);
81
if (state.mam.regress)
82
return 0;
83
}
84
return (fd == sffileno(sfstderr) && error_info.write == write) ? sfwrite(sfstderr, b, n) : write(fd, b, n);
85
}
86
87
/*
88
* translate mam target name
89
*/
90
91
char*
92
mamname(register Rule_t* r)
93
{
94
char* a;
95
char* s;
96
Stat_t st;
97
98
if (r->property & P_state)
99
return r->name;
100
if (state.mam.dynamic && (r->dynamic & D_alias))
101
r = makerule(r->name);
102
if (state.mam.statix)
103
{
104
a = localview(r);
105
if ((s = call(makerule(external.mamname), a)) && !streq(a, s))
106
a = s;
107
}
108
else
109
a = ((r->property & P_target) || !state.user) ? unbound(r) : (state.mam.regress || state.expandview) ? r->name : localview(r);
110
if (state.mam.root && (*a == '/' || (r->dynamic & (D_entries|D_member|D_membertoo|D_regular)) || stat(r->name, &st)))
111
{
112
if (*a != '/')
113
sfprintf(internal.nam, "%s/", internal.pwd);
114
sfprintf(internal.nam, "%s", a);
115
a = sfstruse(internal.nam);
116
pathcanon(a, 0, 0);
117
if (!strncmp(a, state.mam.root, state.mam.rootlen) && *(a + state.mam.rootlen) == '/')
118
a += state.mam.rootlen + 1;
119
}
120
if (state.mam.regress && *a == '/')
121
a = strrchr(a, '/') + 1;
122
return a;
123
}
124
125
/*
126
* push make|prev op
127
* non-zero returned if matching done required
128
*/
129
130
int
131
mampush(Sfio_t* sp, register Rule_t* r, Flags_t flags)
132
{
133
int pop;
134
135
if (strmatch(r->name, "${mam_*}"))
136
return 0;
137
pop = !(r->dynamic & D_built) || (flags & P_force);
138
if (!state.mam.hold)
139
{
140
sfprintf(sp, "%s%s %s%s%s%s%s\n"
141
, state.mam.label
142
, pop ? "make" : "prev"
143
, mamname(r)
144
, (r->property & P_archive) ? " archive" : null
145
, (flags & P_implicit) ? " implicit" : null
146
, (flags & P_joint) ? " joint" : null
147
, (r->property & P_state) ? " state" : null
148
);
149
if (pop && (state.mam.dynamic || state.mam.regress))
150
{
151
if (r->uname && strcmp(r->uname, mamname(r)))
152
sfprintf(sp, "%sbind %s %s %s\n", state.mam.label, r->uname, timefmt(NiL, r->time), mamname(r));
153
else
154
sfprintf(sp, "%sbind %s %s\n", state.mam.label, mamname(r), timefmt(NiL, r->time));
155
}
156
}
157
return pop;
158
}
159
160
/*
161
* pop done op
162
*/
163
164
void
165
mampop(Sfio_t* sp, register Rule_t* r, Flags_t flags)
166
{
167
Rule_t* s;
168
List_t* p;
169
170
if ((r->property & (P_joint|P_target)) == (P_joint|P_target) && r->prereqs->rule->prereqs->rule == r && mampush(sp, r->prereqs->rule, flags|P_joint|P_virtual) && !(r->prereqs->rule->property & P_target))
171
{
172
for (p = r->prereqs->rule->prereqs; p; p = p->next)
173
if (mampush(sp, p->rule, flags))
174
mampop(sp, p->rule, flags|P_joint);
175
mampop(sp, r->prereqs->rule, flags|P_joint|P_virtual);
176
r->prereqs->rule->property |= P_target;
177
}
178
if (!state.mam.hold)
179
{
180
s = staterule(RULE, r, NiL, 0);
181
sfprintf(sp, "%sdone %s%s%s%s%s\n"
182
, state.mam.label
183
, mamname(r)
184
, (r->property & P_dontcare) ? " dontcare" : null
185
, (r->property & P_ignore) ? " ignore" : null
186
, (flags & P_joint) ? " generated" : null
187
, (flags & P_virtual) && !(r->property & P_state) && ((r->property & P_virtual) || !(r->dynamic & (D_entries|D_member|D_membertoo|D_regular)) && (!s || !s->time)) ? " virtual" : s && (s->dynamic & D_built) ? " generated" : null
188
);
189
}
190
}
191
192
/*
193
* return mam output stream pointer for r
194
*/
195
196
Sfio_t*
197
mamout(register Rule_t* r)
198
{
199
register Rule_t* r0;
200
register char* s;
201
202
if (!state.mam.out || !state.user || r == internal.empty)
203
return 0;
204
if (state.mam.regress)
205
return (r->property & P_dontcare) && !state.mam.dontcare ? (Sfio_t*)0 : state.mam.out;
206
if (r->property & (P_make|P_state|P_virtual))
207
return 0;
208
if (state.mam.dynamic)
209
return state.mam.out;
210
if ((r->property & (P_after|P_before)) || (r->property & P_dontcare) && !(state.mam.dontcare || r->prereqs || r->action && *r->action || (r0 = staterule(RULE, r, NiL, 0)) && (r0->dynamic & D_built) && r0->action && *r0->action || !(r->dynamic & D_global)))
211
return 0;
212
if (*(s = mamname(r)) == '/' || !r->time && *s != '$' && strchr(s, '/'))
213
return 0;
214
return state.mam.out;
215
}
216
217