10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * CDDL HEADER START
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The contents of this file are subject to the terms of the
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Common Development and Distribution License (the "License").
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * You may not use this file except in compliance with the License.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * or http://www.opensolaris.org/os/licensing.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * See the License for the specific language governing permissions
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * and limitations under the License.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * When distributing Covered Code, include this CDDL HEADER in each
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * If applicable, add the following below this CDDL HEADER, with the
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * fields enclosed by brackets "[]" replaced with your own identifying
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * information: Portions Copyright [yyyy] [name of copyright owner]
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * CDDL HEADER END
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Use is subject to license terms.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Included files
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <mk/defs.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <mksh/misc.h> /* get_prop() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * File table of contents
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid print_dependencies(register Name target, register Property line);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void print_deps(register Name target, register Property line);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void print_more_deps(Name target, Name name);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void print_filename(Name name);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic Boolean should_print_dep(Property line);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void print_forest(Name target);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void print_deplist(Dependency head);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid print_value(register Name value, Daemon daemon);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void print_rule(register Name target);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void print_rec_info(Name target);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic Boolean is_out_of_date(Property line);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern void depvar_print_results (void);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * print_dependencies(target, line)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Print all the dependencies of a target. First print all the Makefiles.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Then print all the dependencies. Finally, print all the .INIT
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * dependencies.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target The target we print dependencies for
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * line We get the dependency list from here
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * done The Name ".DONE"
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * init The Name ".INIT"
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * makefiles_used List of all makefiles read
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweprint_dependencies(register Name target, register Property line)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Dependency dp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe static Boolean makefiles_printed = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (target_variants) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depvar_print_results();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!makefiles_printed) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Search the makefile list for the primary makefile,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * then print it and its inclusions. After that go back
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * and print the default.mk file and its inclusions.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (dp = makefiles_used; dp != NULL; dp = dp->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (dp->name == primary_makefile) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (dp) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe print_deplist(dp);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (dp = makefiles_used; dp != NULL; dp = dp->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (dp->name == primary_makefile) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)printf(" %s", dp->name->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("\n");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe makefiles_printed = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe print_deps(target, line);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe print_more_deps(target, init);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe print_more_deps(target, done);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (target_variants) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe print_forest(target);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * print_more_deps(target, name)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Print some special dependencies.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * These are the dependencies for the .INIT and .DONE targets.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target Target built during make run
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * name Special target to print dependencies for
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweprint_more_deps(Name target, Name name)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Property line;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Dependency dependencies;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line = get_prop(name->prop, line_prop);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (line != NULL && line->body.line.dependencies != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s:\t", target->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe print_deplist(line->body.line.dependencies);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("\n");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (dependencies= line->body.line.dependencies;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dependencies != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dependencies= dependencies->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe print_deps(dependencies->name,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe get_prop(dependencies->name->prop, line_prop));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * print_deps(target, line, go_recursive)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Print a regular dependency list. Append to this information which
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * indicates whether or not the target is recursive.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target target to print dependencies for
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * line We get the dependency list from here
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * go_recursive Should we show all dependencies recursively?
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * recursive_name The Name ".RECURSIVE", printed
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweprint_deps(register Name target, register Property line)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Dependency dep;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((target->dependency_printed) ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (target == force)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->dependency_printed = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* only print entries that are actually derived and are not leaf
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * files and are not the result of sccs get.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (should_print_dep(line)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((report_dependencies_level == 2) ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (report_dependencies_level == 4)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (is_out_of_date(line)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("1 ");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("0 ");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe print_filename(target);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf(":\t");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe print_deplist(line->body.line.dependencies);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe print_rec_info(target);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("\n");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (dep = line->body.line.dependencies;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dep != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dep = dep->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe print_deps(dep->name,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe get_prop(dep->name->prop, line_prop));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic Boolean
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweis_out_of_date(Property line)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Dependency dep;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Property line2;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (line == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (line->body.line.is_out_of_date) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (dep = line->body.line.dependencies;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dep != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dep = dep->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line2 = get_prop(dep->name->prop, line_prop);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (is_out_of_date(line2)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line->body.line.is_out_of_date = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Given a dependency print it and all its siblings.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweprint_deplist(Dependency head)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Dependency dp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (dp = head; dp != NULL; dp = dp->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((report_dependencies_level != 2) ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ((!dp->automatic) ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (dp->name->is_double_colon))) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (dp->name != force) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe putwchar(' ');
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe print_filename(dp->name);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Print the name of a file for the -P option.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * If the file is a directory put on a trailing slash.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweprint_filename(Name name)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s", name->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (name->stat.is_dir) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe putwchar('/');
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * should_print_dep(line)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Test if we should print the dependencies of this target.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The line must exist and either have children dependencies
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * or have a command that is not an SCCS command.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Return value:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * true if the dependencies should be printed
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * line We get the dependency list from here
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic Boolean
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweshould_print_dep(Property line)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (line == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (line->body.line.dependencies != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (line->body.line.sccs_command) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Print out the root nodes of all the dependency trees
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * in this makefile.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweprint_forest(Name target)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name_set::iterator np, e;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Property line;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (np = hashtab.begin(), e = hashtab.end(); np != e; np++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (np->is_target && !np->has_parent && np != target) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) doname_check(np, true, false, false);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line = get_prop(np->prop, line_prop);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe printf("-\n");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe print_deps(np, line);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * This is a set of routines for dumping the internal make state
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Used for the -p option
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweprint_value(register Name value, Daemon daemon)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Chain cp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (value == NULL)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)printf("=\n");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe else
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe switch (daemon) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case no_daemon:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)printf("= %s\n", value->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case chain_daemon:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (cp= (Chain) value; cp != NULL; cp= cp->next)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)printf(cp->next == NULL ? "%s" : "%s ",
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cp->name->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)printf("\n");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe };
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweprint_rule(register Name target)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Cmd_line rule;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Property line;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (((line= get_prop(target->prop, line_prop)) == NULL) ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ((line->body.line.command_template == NULL) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (line->body.line.dependencies == NULL)))
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe print_dependencies(target, line);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (rule= line->body.line.command_template; rule != NULL; rule= rule->next)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)printf("\t%s\n", rule->command_line->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * If target is recursive, print the following to standard out:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * .RECURSIVE subdir targ Makefile
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweprint_rec_info(Name target)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Recursive_make rp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *colon;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe report_recursive_init();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp = find_recursive_target(target);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rp) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * if found, print starting with the space after the ':'
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe colon = (wchar_t *) wcschr(rp->oldline, (int) colon_char);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s", colon + 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe