summaryrefslogtreecommitdiff
path: root/usr/src/make_src/Make/bin/make/common/nse_printdep.cc
diff options
context:
space:
mode:
authorIgor Pashev <igor.pashev@nexenta.com>2012-06-29 14:36:07 +0400
committerIgor Pashev <igor.pashev@nexenta.com>2012-06-29 14:36:07 +0400
commite0463df9c3d2ee6155221cc443c571d5da47098a (patch)
tree5c6b99e64c1b65d986e2722728c74f202a578be6 /usr/src/make_src/Make/bin/make/common/nse_printdep.cc
downloadsunmake-orig.tar.gz
Initial import of DevPro make sourcesorig
Downloaded from http://dlc.sun.com/osol/devpro/downloads/current/ Licensed under CDDL http://www.opensource.org/licenses/CDDL-1.0
Diffstat (limited to 'usr/src/make_src/Make/bin/make/common/nse_printdep.cc')
-rw-r--r--usr/src/make_src/Make/bin/make/common/nse_printdep.cc517
1 files changed, 517 insertions, 0 deletions
diff --git a/usr/src/make_src/Make/bin/make/common/nse_printdep.cc b/usr/src/make_src/Make/bin/make/common/nse_printdep.cc
new file mode 100644
index 0000000..cda02f8
--- /dev/null
+++ b/usr/src/make_src/Make/bin/make/common/nse_printdep.cc
@@ -0,0 +1,517 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+/*
+ * @(#)nse_printdep.cc 1.18 06/12/12
+ */
+
+#pragma ident "@(#)nse_printdep.cc 1.18 06/12/12"
+
+/*
+ * Included files
+ */
+#include <mk/defs.h>
+#include <mksh/misc.h> /* get_prop() */
+
+/*
+ * File table of contents
+ */
+void print_dependencies(register Name target, register Property line);
+static void print_deps(register Name target, register Property line);
+static void print_more_deps(Name target, Name name);
+static void print_filename(Name name);
+static Boolean should_print_dep(Property line);
+static void print_forest(Name target);
+static void print_deplist(Dependency head);
+void print_value(register Name value, Daemon daemon);
+static void print_rule(register Name target);
+static void print_rec_info(Name target);
+static Boolean is_out_of_date(Property line);
+extern void depvar_print_results (void);
+extern int printf (const char *, ...);
+extern int _flsbuf (unsigned int, FILE *);
+
+/*
+ * print_dependencies(target, line)
+ *
+ * Print all the dependencies of a target. First print all the Makefiles.
+ * Then print all the dependencies. Finally, print all the .INIT
+ * dependencies.
+ *
+ * Parameters:
+ * target The target we print dependencies for
+ * line We get the dependency list from here
+ *
+ * Global variables used:
+ * done The Name ".DONE"
+ * init The Name ".INIT"
+ * makefiles_used List of all makefiles read
+ */
+void
+print_dependencies(register Name target, register Property line)
+{
+ Dependency dp;
+ static Boolean makefiles_printed = false;
+
+#ifdef SUNOS4_AND_AFTER
+ if (target_variants) {
+#else
+ if (is_true(flag.target_variants)) {
+#endif
+ depvar_print_results();
+ }
+
+ if (!makefiles_printed) {
+ /*
+ * Search the makefile list for the primary makefile,
+ * then print it and its inclusions. After that go back
+ * and print the default.mk file and its inclusions.
+ */
+ for (dp = makefiles_used; dp != NULL; dp = dp->next) {
+ if (dp->name == primary_makefile) {
+ break;
+ }
+ }
+ if (dp) {
+ print_deplist(dp);
+ for (dp = makefiles_used; dp != NULL; dp = dp->next) {
+ if (dp->name == primary_makefile) {
+ break;
+ }
+ (void)printf(" %s", dp->name->string_mb);
+ }
+ }
+ (void) printf("\n");
+ makefiles_printed = true;
+ }
+ print_deps(target, line);
+#ifdef SUNOS4_AND_AFTER
+/*
+ print_more_deps(target, init);
+ print_more_deps(target, done);
+ */
+ if (target_variants) {
+#else
+ print_more_deps(target, cached_names.init);
+ print_more_deps(target, cached_names.done);
+ if (is_true(flag.target_variants)) {
+#endif
+ print_forest(target);
+ }
+}
+
+/*
+ * print_more_deps(target, name)
+ *
+ * Print some special dependencies.
+ * These are the dependencies for the .INIT and .DONE targets.
+ *
+ * Parameters:
+ * target Target built during make run
+ * name Special target to print dependencies for
+ *
+ * Global variables used:
+ */
+static void
+print_more_deps(Name target, Name name)
+{
+ Property line;
+ register Dependency dependencies;
+
+ line = get_prop(name->prop, line_prop);
+ if (line != NULL && line->body.line.dependencies != NULL) {
+ (void) printf("%s:\t", target->string_mb);
+ print_deplist(line->body.line.dependencies);
+ (void) printf("\n");
+ for (dependencies= line->body.line.dependencies;
+ dependencies != NULL;
+ dependencies= dependencies->next) {
+ print_deps(dependencies->name,
+ get_prop(dependencies->name->prop, line_prop));
+ }
+ }
+}
+
+/*
+ * print_deps(target, line, go_recursive)
+ *
+ * Print a regular dependency list. Append to this information which
+ * indicates whether or not the target is recursive.
+ *
+ * Parameters:
+ * target target to print dependencies for
+ * line We get the dependency list from here
+ * go_recursive Should we show all dependencies recursively?
+ *
+ * Global variables used:
+ * recursive_name The Name ".RECURSIVE", printed
+ */
+static void
+print_deps(register Name target, register Property line)
+{
+ register Dependency dep;
+
+#ifdef SUNOS4_AND_AFTER
+ if ((target->dependency_printed) ||
+ (target == force)) {
+#else
+ if (is_true(target->dependency_printed)) {
+#endif
+ return;
+ }
+ target->dependency_printed = true;
+
+ /* only print entries that are actually derived and are not leaf
+ * files and are not the result of sccs get.
+ */
+ if (should_print_dep(line)) {
+#ifdef NSE
+ nse_check_no_deps_no_rule(target, line, line);
+#endif
+ if ((report_dependencies_level == 2) ||
+ (report_dependencies_level == 4)) {
+ if (is_out_of_date(line)) {
+ (void) printf("1 ");
+ } else {
+ (void) printf("0 ");
+ }
+ }
+ print_filename(target);
+ (void) printf(":\t");
+ print_deplist(line->body.line.dependencies);
+ print_rec_info(target);
+ (void) printf("\n");
+ for (dep = line->body.line.dependencies;
+ dep != NULL;
+ dep = dep->next) {
+ print_deps(dep->name,
+ get_prop(dep->name->prop, line_prop));
+ }
+ }
+}
+
+static Boolean
+is_out_of_date(Property line)
+{
+ Dependency dep;
+ Property line2;
+
+ if (line == NULL) {
+ return false;
+ }
+ if (line->body.line.is_out_of_date) {
+ return true;
+ }
+ for (dep = line->body.line.dependencies;
+ dep != NULL;
+ dep = dep->next) {
+ line2 = get_prop(dep->name->prop, line_prop);
+ if (is_out_of_date(line2)) {
+ line->body.line.is_out_of_date = true;
+ return true;
+ }
+ }
+ return false;
+}
+
+/*
+ * Given a dependency print it and all its siblings.
+ */
+static void
+print_deplist(Dependency head)
+{
+ Dependency dp;
+
+ for (dp = head; dp != NULL; dp = dp->next) {
+ if ((report_dependencies_level != 2) ||
+ ((!dp->automatic) ||
+ (dp->name->is_double_colon))) {
+ if (dp->name != force) {
+ putwchar(' ');
+ print_filename(dp->name);
+ }
+ }
+ }
+}
+
+/*
+ * Print the name of a file for the -P option.
+ * If the file is a directory put on a trailing slash.
+ */
+static void
+print_filename(Name name)
+{
+ (void) printf("%s", name->string_mb);
+/*
+ if (name->stat.is_dir) {
+ putwchar('/');
+ }
+ */
+}
+
+/*
+ * should_print_dep(line)
+ *
+ * Test if we should print the dependencies of this target.
+ * The line must exist and either have children dependencies
+ * or have a command that is not an SCCS command.
+ *
+ * Return value:
+ * true if the dependencies should be printed
+ *
+ * Parameters:
+ * line We get the dependency list from here
+ *
+ * Global variables used:
+ */
+static Boolean
+should_print_dep(Property line)
+{
+ if (line == NULL) {
+ return false;
+ }
+ if (line->body.line.dependencies != NULL) {
+ return true;
+ }
+#ifdef SUNOS4_AND_AFTER
+ if (line->body.line.sccs_command) {
+#else
+ if (is_true(line->body.line.sccs_command)) {
+#endif
+ return false;
+ }
+ return true;
+}
+
+/*
+ * Print out the root nodes of all the dependency trees
+ * in this makefile.
+ */
+static void
+print_forest(Name target)
+{
+ Name_set::iterator np, e;
+ Property line;
+
+ for (np = hashtab.begin(), e = hashtab.end(); np != e; np++) {
+#ifdef SUNOS4_AND_AFTER
+ if (np->is_target && !np->has_parent && np != target) {
+#else
+ if (is_true(np->is_target) &&
+ is_false(np->has_parent) &&
+ np != target) {
+#endif
+ (void) doname_check(np, true, false, false);
+ line = get_prop(np->prop, line_prop);
+ printf("-\n");
+ print_deps(np, line);
+ }
+ }
+}
+
+#ifndef SUNOS4_AND_AFTER
+printdesc()
+{
+ Name_set::iterator p, e;
+ register Property prop;
+ register Dependency dep;
+ register Cmd_line rule;
+ Percent percent, percent_depe;
+
+ /* Default target */
+ if (default_target_to_build != NULL) {
+ print_rule(default_target_to_build);
+ default_target_to_build->dependency_printed= true;
+ };
+ (void)printf("\n");
+
+ /* .AR_REPLACE */
+ if (ar_replace_rule != NULL) {
+ (void)printf("%s:\n", cached_names.ar_replace->string_mb);
+ for (rule= ar_replace_rule; rule != NULL; rule= rule->next)
+ (void)printf("\t%s\n", rule->command_line->string_mb);
+ };
+
+ /* .DEFAULT */
+ if (default_rule != NULL) {
+ (void)printf("%s:\n", cached_names.default_rule->string_mb);
+ for (rule= default_rule; rule != NULL; rule= rule->next)
+ (void)printf("\t%s\n", rule->command_line->string_mb);
+ };
+
+ /* .IGNORE */
+ if (is_true(flag.ignore_errors))
+ (void)printf("%s:\n", cached_names.ignore->string_mb);
+
+ /* .KEEP_STATE: */
+ if (is_true(flag.keep_state))
+ (void)printf("%s:\n\n", cached_names.dot_keep_state->string_mb);
+
+ /* .PRECIOUS */
+ (void)printf("%s: ", cached_names.precious->string_mb);
+ for (p = hashtab.begin(), e = hashtab.end(); p != e; p++)
+ if (is_true(p->stat.is_precious | all_precious))
+ (void)printf("%s ", p->string_mb);
+ (void)printf("\n");
+
+ /* .SCCS_GET */
+ if (sccs_get_rule != NULL) {
+ (void)printf("%s:\n", cached_names.sccs_get->string_mb);
+ for (rule= sccs_get_rule; rule != NULL; rule= rule->next)
+ (void)printf("\t%s\n", rule->command_line->string_mb);
+ };
+
+ /* .SILENT */
+ if (is_true(flag.silent))
+ (void)printf("%s:\n", cached_names.silent->string_mb);
+
+ /* .SUFFIXES: */
+ (void)printf("%s: ", cached_names.suffixes->string_mb);
+ for (dep= suffixes; dep != NULL; dep= dep->next) {
+ (void)printf("%s ", dep->name->string_mb);
+ build_suffix_list(dep->name);
+ };
+ (void)printf("\n\n");
+
+ /* % rules */
+ for (percent= percent_list; percent != NULL; percent= percent->next) {
+ (void) printf("%s:", percent->name->string_mb);
+
+ for (percent_depe= percent->dependencies; percent_depe != NULL; percent_depe = percent_depe->next)
+ (void) printf(" %s", percent_depe->name->string_mb);
+
+ (void) printf("\n");
+
+ for (rule= percent->command_template; rule != NULL; rule= rule->next)
+ (void)printf("\t%s\n", rule->command_line->string_mb);
+ };
+
+ /* Suffix rules */
+ for (p = hashtab.begin(), e = hashtab.end(); p != e; p++)
+ if (is_false(p->dependency_printed) && (p->string[0] == PERIOD)) {
+ print_rule(p);
+ p->dependency_printed= true;
+ };
+
+ /* Macro assignments */
+ for (p = hashtab.begin(), e = hashtab.end(); p != e; p++)
+ if (((prop= get_prop(p->prop, macro_prop)) != NULL) &&
+ (prop->body.macro.value != NULL)) {
+ (void)printf("%s", p->string_mb);
+ print_value(prop->body.macro.value,
+ prop->body.macro.daemon);
+ };
+ (void)printf("\n");
+
+ /* Delays */
+ for (p = hashtab.begin(), e = hashtab.end(); p != e; p++)
+ for (prop= get_prop(p->prop, conditional_prop);
+ prop != NULL;
+ prop= get_prop(prop->next, conditional_prop)) {
+ (void)printf("%s := %s",
+ p->string_mb,
+ prop->body.conditional.name->string_mb);
+ print_value(prop->body.conditional.value, no_daemon);
+ };
+ (void)printf("\n");
+
+ /* All other dependencies */
+ for (p = hashtab.begin(), e = hashtab.end(); p != e; p++)
+ if (is_false(p->dependency_printed) && (p->colons != no_colon))
+ print_rule(p);
+ (void)printf("\n");
+ exit(0);
+}
+#endif
+
+/*
+ * This is a set of routines for dumping the internal make state
+ * Used for the -p option
+ */
+void
+print_value(register Name value, Daemon daemon)
+
+#ifdef SUNOS4_AND_AFTER
+
+#else
+
+#endif
+{
+ Chain cp;
+
+ if (value == NULL)
+ (void)printf("=\n");
+ else
+ switch (daemon) {
+ case no_daemon:
+ (void)printf("= %s\n", value->string_mb);
+ break;
+ case chain_daemon:
+ for (cp= (Chain) value; cp != NULL; cp= cp->next)
+ (void)printf(cp->next == NULL ? "%s" : "%s ",
+ cp->name->string_mb);
+ (void)printf("\n");
+ break;
+ };
+}
+
+static void
+print_rule(register Name target)
+{
+ register Cmd_line rule;
+ register Property line;
+
+ if (((line= get_prop(target->prop, line_prop)) == NULL) ||
+ ((line->body.line.command_template == NULL) &&
+ (line->body.line.dependencies == NULL)))
+ return;
+ print_dependencies(target, line);
+ for (rule= line->body.line.command_template; rule != NULL; rule= rule->next)
+ (void)printf("\t%s\n", rule->command_line->string_mb);
+}
+
+
+/*
+ * If target is recursive, print the following to standard out:
+ * .RECURSIVE subdir targ Makefile
+ */
+static void
+print_rec_info(Name target)
+{
+ Recursive_make rp;
+ wchar_t *colon;
+
+ report_recursive_init();
+
+ rp = find_recursive_target(target);
+
+ if (rp) {
+ /*
+ * if found, print starting with the space after the ':'
+ */
+ colon = (wchar_t *) wschr(rp->oldline, (int) colon_char);
+ (void) printf("%s", colon + 1);
+ }
+}
+