-sub process_input_mk ($$$$$$$$$);
-sub process_input_mk ($$$$$$$$$) {
- my ($dir_prefix, $dir_suffix, $dir_name,
- $var_prefix, $var_prefix_name, $targets,
- $f, $esclitr, $enoent_ok) = @_;
+our %varref;
+our %varref_exp;
+
+our ($dir_prefix, $dir_suffix, $dir_name,
+ $var_prefix, $var_prefix_name);
+
+sub dir_prefix ($) {
+ my ($path) = @_;
+ join '', map { "$_/" } @$path;
+}
+
+sub set_dir_vars ($) {
+ my ($path) = @_;
+ $dir_prefix = dir_prefix($path);
+ $dir_suffix = join '', map { "/$_" } @$path;
+ $dir_name = join '/', @$path ? @$path : '.';
+ $var_prefix_name = join '_', @$path ? @$path : qw(TOP);
+ $var_prefix = "${var_prefix_name}_";
+}
+
+our $err_file;
+
+our @warn_ena_dfl = map { $_ => 1 } qw(
+ local+global
+ single-char-var
+ unknown-warning
+ broken-var-ref
+);
+our %warn_ena = @warn_ena_dfl;
+
+our $warned;
+our %warn_unk;
+
+sub err ($) {
+ my ($m) = @_;
+ die "subdirmk: ${err_file}:$.: $m\n";
+}
+
+sub wrncore ($$) {
+ my ($wk,$m) = @_;
+ return 0 unless $warn_ena{$wk} // warn "internal error $wk ?";
+ $warned++;
+ print STDERR "subdirmk: warning ($wk): $m\n";
+ return 1;
+}
+
+sub wrn ($$) {
+ my ($wk,$m) = @_;
+ our %warn_dedupe;
+ return 0 if $warn_dedupe{$err_file,$.,$wk,$m}++;
+ wrncore($wk, "${err_file}:$.: $m");
+}
+
+sub ddbl_only ($) {
+ my ($e) = @_;
+ return if $ddbl;
+ err "escape &$e is valid only during \$-doubling";
+}
+
+sub process_input_mk ($$$$);
+sub process_input_mk ($$$$) {
+ my ($targets, $f, $esclitr, $enoent_ok) = @_;