/* Definitions for using pattern rules in GNU Make.
Copyright (C) 1988-2020 Free Software Foundation, Inc.
This file is part of GNU Make.

GNU Make is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation; either version 3 of the License, or (at your option) any later
version.

GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with
this program.  If not, see <http://www.gnu.org/licenses/>.  */


/* Structure used for pattern (implicit) rules.  */

#ifndef _REMAKE_RULE_H
#define _REMAKE_RULE_H
#include "gnuremake.h"
#include "types.h"

struct rule
  {
    struct rule *next;
    const char **targets;       /* Targets of the rule.  */
    unsigned int *lens;         /* Lengths of each target.  */
    const char **suffixes;      /* Suffixes (after '%') of each target.  */
    struct dep *deps;           /* Dependencies of the rule.  */
    struct commands *cmds;      /* Commands to execute.  */
    unsigned short num;         /* Number of targets.  */
    char terminal;              /* If terminal (double-colon).  */
    char in_use;                /* If in use by a parent pattern_search.  */
    gmk_floc floc;              /* Location of rule */
    breakpoint_mask_t tracing;  /* breakpoint status of target. */
  };

/* For calling install_pattern_rule.  */
struct pspec
  {
    const char *target, *dep, *commands;
  };


extern struct rule *pattern_rules;
extern struct rule *last_pattern_rule;
extern unsigned int num_pattern_rules;

extern unsigned int max_pattern_deps;
extern unsigned int max_pattern_targets;
extern size_t max_pattern_dep_length;

extern struct file *suffix_file;


void snap_implicit_rules (void);
void convert_to_pattern (void);
void install_pattern_rule (struct pspec *p, int terminal);
void create_pattern_rule (const char **targets, const char **target_percents,
                          unsigned short num, int terminal, struct dep *deps,
                          struct commands *commands, int override);

/*! Show information about a given rule. Useful from the debugger or gdb.  */
extern void print_rule (rule_t *r, bool b_verbose);
extern void print_rule_data_base (bool b_verbose);

#endif /*REMAKE_RULE_H*/
