1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright 1995 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 */
25 /*
26 * @(#)depvar.cc 1.14 06/12/12
27 */
28
29 #pragma ident "@(#)depvar.cc 1.14 06/12/12"
30
31 /*
32 * Included files
33 */
34 #include <mk/defs.h>
35 #include <mksh/misc.h> /* getmem() */
36
37 /*
38 * This file deals with "Dependency Variables".
39 * The "-V var" command line option is used to indicate
40 * that var is a dependency variable. Used in conjunction with
41 * the -P option the user is asking if the named variables affect
42 * the dependencies of the given target.
43 */
44
45 struct _Depvar {
46 Name name; /* Name of variable */
47 struct _Depvar *next; /* Linked list */
48 Boolean cmdline; /* Macro defined on the cmdline? */
49 };
50
51 typedef struct _Depvar *Depvar;
52
53 static Depvar depvar_list;
54 static Depvar *bpatch = &depvar_list;
55 static Boolean variant_deps;
56
57 /*
58 * Add a name to the list.
59 */
60
61 void
62 depvar_add_to_list(Name name, Boolean cmdline)
63 {
64 Depvar dv;
65
66 #ifdef SUNOS4_AND_AFTER
67 dv = ALLOC(Depvar);
68 #else
69 dv = (Depvar) Malloc(sizeof(struct _Depvar));
70 #endif
71 dv->name = name;
72 dv->next = NULL;
73 dv->cmdline = cmdline;
74 *bpatch = dv;
75 bpatch = &dv->next;
76 }
77
78 /*
79 * The macro `name' has been used in either the left-hand or
80 * right-hand side of a dependency. See if it is in the
81 * list. Two things are looked for. Names given as args
82 * to the -V list are checked so as to set the same/differ
83 * output for the -P option. Names given as macro=value
84 * command-line args are checked and, if found, an NSE
85 * warning is produced.
86 */
87 void
88 depvar_dep_macro_used(Name name)
89 {
90 Depvar dv;
91
92 for (dv = depvar_list; dv != NULL; dv = dv->next) {
93 if (name == dv->name) {
94 #ifdef NSE
95 #ifdef SUNOS4_AND_AFTER
96 if (dv->cmdline) {
97 #else
98 if (is_true(dv->cmdline)) {
99 #endif
100 nse_dep_cmdmacro(dv->name->string);
101 }
102 #endif
103 variant_deps = true;
104 break;
105 }
106 }
107 }
108
109 #ifdef NSE
110 /*
111 * The macro `name' has been used in either the argument
112 * to a cd before a recursive make. See if it was
113 * defined on the command-line and, if so, complain.
114 */
115 void
116 depvar_rule_macro_used(Name name)
117 {
118 Depvar dv;
119
120 for (dv = depvar_list; dv != NULL; dv = dv->next) {
121 if (name == dv->name) {
122 #ifdef SUNOS4_AND_AFTER
123 if (dv->cmdline) {
124 #else
125 if (is_true(dv->cmdline)) {
126 #endif
127 nse_rule_cmdmacro(dv->name->string);
128 }
129 break;
130 }
131 }
132 }
133 #endif
134
135 /*
136 * Print the results. If any of the Dependency Variables
137 * affected the dependencies then the dependencies potentially
138 * differ because of these variables.
139 */
140 void
141 depvar_print_results(void)
142 {
143 if (variant_deps) {
144 printf(catgets(catd, 1, 234, "differ\n"));
145 } else {
146 printf(catgets(catd, 1, 235, "same\n"));
147 }
148 }
149