xf.li | 8402749 | 2024-04-09 00:17:51 -0700 | [diff] [blame^] | 1 | #!/usr/bin/perl |
| 2 | # automake - create Makefile.in from Makefile.am -*- perl -*- |
| 3 | # Generated from bin/automake.in; do not edit by hand. |
| 4 | # Copyright (C) 1994-2021 Free Software Foundation, Inc. |
| 5 | |
| 6 | # This program is free software; you can redistribute it and/or modify |
| 7 | # it under the terms of the GNU General Public License as published by |
| 8 | # the Free Software Foundation; either version 2, or (at your option) |
| 9 | # any later version. |
| 10 | |
| 11 | # This program is distributed in the hope that it will be useful, |
| 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 14 | # GNU General Public License for more details. |
| 15 | |
| 16 | # You should have received a copy of the GNU General Public License |
| 17 | # along with this program. If not, see <https://www.gnu.org/licenses/>. |
| 18 | |
| 19 | # Originally written by David Mackenzie <djm@gnu.ai.mit.edu>. |
| 20 | # Perl reimplementation by Tom Tromey <tromey@redhat.com>, and |
| 21 | # Alexandre Duret-Lutz <adl@gnu.org>. |
| 22 | |
| 23 | package Automake; |
| 24 | |
| 25 | use 5.006; |
| 26 | use strict; |
| 27 | use warnings FATAL => 'all'; |
| 28 | |
| 29 | BEGIN |
| 30 | { |
| 31 | unshift (@INC, '/home/zhouguopo/code2/0616/ap/project/zx297520v3/prj_mdl/build/../../../../build/depends/install/share/automake-1.16') |
| 32 | unless $ENV{AUTOMAKE_UNINSTALLED}; |
| 33 | |
| 34 | # Override SHELL. This is required on DJGPP so that system() uses |
| 35 | # bash, not COMMAND.COM which doesn't quote arguments properly. |
| 36 | # Other systems aren't expected to use $SHELL when Automake |
| 37 | # runs, but it should be safe to drop the "if DJGPP" guard if |
| 38 | # it turns up other systems need the same thing. After all, |
| 39 | # if SHELL is used, ./configure's SHELL is always better than |
| 40 | # the user's SHELL (which may be something like tcsh). |
| 41 | $ENV{'SHELL'} = '/bin/bash' if exists $ENV{'DJDIR'}; |
| 42 | } |
| 43 | |
| 44 | use Carp; |
| 45 | use File::Basename; |
| 46 | use File::Spec; |
| 47 | |
| 48 | use Automake::Config; |
| 49 | BEGIN |
| 50 | { |
| 51 | if ($perl_threads) |
| 52 | { |
| 53 | require threads; |
| 54 | import threads; |
| 55 | require Thread::Queue; |
| 56 | import Thread::Queue; |
| 57 | } |
| 58 | } |
| 59 | use Automake::General; |
| 60 | use Automake::XFile; |
| 61 | use Automake::Channels; |
| 62 | use Automake::ChannelDefs; |
| 63 | use Automake::Configure_ac; |
| 64 | use Automake::FileUtils; |
| 65 | use Automake::Location; |
| 66 | use Automake::Condition qw/TRUE FALSE/; |
| 67 | use Automake::DisjConditions; |
| 68 | use Automake::Options; |
| 69 | use Automake::Variable; |
| 70 | use Automake::VarDef; |
| 71 | use Automake::Rule; |
| 72 | use Automake::RuleDef; |
| 73 | use Automake::Wrap 'makefile_wrap'; |
| 74 | use Automake::Language; |
| 75 | |
| 76 | ## ----------------------- ## |
| 77 | ## Subroutine prototypes. ## |
| 78 | ## ----------------------- ## |
| 79 | |
| 80 | sub append_exeext (&$); |
| 81 | sub check_gnits_standards (); |
| 82 | sub check_gnu_standards (); |
| 83 | sub check_trailing_slash ($\$); |
| 84 | sub check_typos (); |
| 85 | sub define_files_variable ($\@$$); |
| 86 | sub define_standard_variables (); |
| 87 | sub define_verbose_libtool (); |
| 88 | sub define_verbose_texinfo (); |
| 89 | sub do_check_merge_target (); |
| 90 | sub get_number_of_threads (); |
| 91 | sub handle_compile (); |
| 92 | sub handle_data (); |
| 93 | sub handle_dist (); |
| 94 | sub handle_emacs_lisp (); |
| 95 | sub handle_factored_dependencies (); |
| 96 | sub handle_footer (); |
| 97 | sub handle_gettext (); |
| 98 | sub handle_headers (); |
| 99 | sub handle_install (); |
| 100 | sub handle_java (); |
| 101 | sub handle_languages (); |
| 102 | sub handle_libraries (); |
| 103 | sub handle_libtool (); |
| 104 | sub handle_ltlibraries (); |
| 105 | sub handle_makefiles_serial (); |
| 106 | sub handle_man_pages (); |
| 107 | sub handle_minor_options (); |
| 108 | sub handle_options (); |
| 109 | sub handle_programs (); |
| 110 | sub handle_python (); |
| 111 | sub handle_scripts (); |
| 112 | sub handle_silent (); |
| 113 | sub handle_subdirs (); |
| 114 | sub handle_tags (); |
| 115 | sub handle_targets (); |
| 116 | sub handle_tests (); |
| 117 | sub handle_tests_dejagnu (); |
| 118 | sub handle_texinfo (); |
| 119 | sub handle_user_recursion (); |
| 120 | sub initialize_per_input (); |
| 121 | sub lang_lex_finish (); |
| 122 | sub lang_sub_obj (); |
| 123 | sub lang_vala_finish (); |
| 124 | sub lang_yacc_finish (); |
| 125 | sub locate_aux_dir (); |
| 126 | sub parse_arguments (); |
| 127 | sub scan_aclocal_m4 (); |
| 128 | sub scan_autoconf_files (); |
| 129 | sub silent_flag (); |
| 130 | sub transform ($\%); |
| 131 | sub transform_token ($\%$); |
| 132 | sub usage (); |
| 133 | sub version (); |
| 134 | sub yacc_lex_finish_helper (); |
| 135 | |
| 136 | ## ----------- ## |
| 137 | ## Constants. ## |
| 138 | ## ----------- ## |
| 139 | |
| 140 | # Some regular expressions. One reason to put them here is that it |
| 141 | # makes indentation work better in Emacs. |
| 142 | |
| 143 | # Writing singled-quoted-$-terminated regexes is a pain because |
| 144 | # perl-mode thinks of $' as the ${'} variable (instead of a $ followed |
| 145 | # by a closing quote. Letting perl-mode think the quote is not closed |
| 146 | # leads to all sort of misindentations. On the other hand, defining |
| 147 | # regexes as double-quoted strings is far less readable. So usually |
| 148 | # we will write: |
| 149 | # |
| 150 | # $REGEX = '^regex_value' . "\$"; |
| 151 | |
| 152 | my $IGNORE_PATTERN = '^\s*##([^#\n].*)?\n'; |
| 153 | my $WHITE_PATTERN = '^\s*' . "\$"; |
| 154 | my $COMMENT_PATTERN = '^#'; |
| 155 | my $TARGET_PATTERN='[$a-zA-Z0-9_.@%][-.a-zA-Z0-9_(){}/$+@%]*'; |
| 156 | # A rule has three parts: a list of targets, a list of dependencies, |
| 157 | # and optionally actions. |
| 158 | my $RULE_PATTERN = |
| 159 | "^($TARGET_PATTERN(?:(?:\\\\\n|\\s)+$TARGET_PATTERN)*) *:([^=].*|)\$"; |
| 160 | |
| 161 | # Only recognize leading spaces, not leading tabs. If we recognize |
| 162 | # leading tabs here then we need to make the reader smarter, because |
| 163 | # otherwise it will think rules like 'foo=bar; \' are errors. |
| 164 | my $ASSIGNMENT_PATTERN = '^ *([^ \t=:+]*)\s*([:+]?)=\s*(.*)' . "\$"; |
| 165 | # This pattern recognizes a Gnits version id and sets $1 if the |
| 166 | # release is an alpha release. We also allow a suffix which can be |
| 167 | # used to extend the version number with a "fork" identifier. |
| 168 | my $GNITS_VERSION_PATTERN = '\d+\.\d+([a-z]|\.\d+)?(-[A-Za-z0-9]+)?'; |
| 169 | |
| 170 | my $IF_PATTERN = '^if\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*)\s*(?:#.*)?' . "\$"; |
| 171 | my $ELSE_PATTERN = |
| 172 | '^else(?:\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*))?\s*(?:#.*)?' . "\$"; |
| 173 | my $ENDIF_PATTERN = |
| 174 | '^endif(?:\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*))?\s*(?:#.*)?' . "\$"; |
| 175 | my $PATH_PATTERN = '(\w|[+/.-])+'; |
| 176 | # This will pass through anything not of the prescribed form. |
| 177 | my $INCLUDE_PATTERN = ('^include\s+' |
| 178 | . '((\$\(top_srcdir\)/' . $PATH_PATTERN . ')' |
| 179 | . '|(\$\(srcdir\)/' . $PATH_PATTERN . ')' |
| 180 | . '|([^/\$]' . $PATH_PATTERN . '))\s*(#.*)?' . "\$"); |
| 181 | |
| 182 | # Directories installed during 'install-exec' phase. |
| 183 | my $EXEC_DIR_PATTERN = |
| 184 | '^(?:bin|sbin|libexec|sysconf|localstate|lib|pkglib|.*exec.*)' . "\$"; |
| 185 | |
| 186 | # Values for AC_CANONICAL_* |
| 187 | use constant AC_CANONICAL_BUILD => 1; |
| 188 | use constant AC_CANONICAL_HOST => 2; |
| 189 | use constant AC_CANONICAL_TARGET => 3; |
| 190 | |
| 191 | # Values indicating when something should be cleaned. |
| 192 | use constant MOSTLY_CLEAN => 0; |
| 193 | use constant CLEAN => 1; |
| 194 | use constant DIST_CLEAN => 2; |
| 195 | use constant MAINTAINER_CLEAN => 3; |
| 196 | |
| 197 | # Libtool files. |
| 198 | my @libtool_files = qw(ltmain.sh config.guess config.sub); |
| 199 | # ltconfig appears here for compatibility with old versions of libtool. |
| 200 | my @libtool_sometimes = qw(ltconfig ltcf-c.sh ltcf-cxx.sh ltcf-gcj.sh); |
| 201 | |
| 202 | # Top-level files that can be foo.md instead of foo. We assume that all |
| 203 | # but THANKS are required at strictness level gnu. |
| 204 | my @toplevelmd_ok = qw(AUTHORS ChangeLog INSTALL NEWS README THANKS); |
| 205 | |
| 206 | # Commonly found files we look for and automatically include in DISTFILES. |
| 207 | my @common_files = |
| 208 | (qw(ABOUT-GNU ABOUT-NLS BACKLOG COPYING |
| 209 | COPYING.DOC COPYING.LIB COPYING.LESSER TODO |
| 210 | ar-lib compile config.guess config.rpath |
| 211 | config.sub depcomp install-sh libversion.in mdate-sh |
| 212 | missing mkinstalldirs py-compile texinfo.tex ylwrap), |
| 213 | @libtool_files, @libtool_sometimes); |
| 214 | |
| 215 | # Commonly used files we auto-include, but only sometimes. This list |
| 216 | # is used for the --help output only. |
| 217 | my @common_sometimes = |
| 218 | qw(aclocal.m4 acconfig.h config.h.top config.h.bot configure |
| 219 | configure.ac configure.in stamp-vti); |
| 220 | |
| 221 | # Standard directories from the GNU Coding Standards, and additional |
| 222 | # pkg* directories from Automake. Stored in a hash for fast member check. |
| 223 | my %standard_prefix = |
| 224 | map { $_ => 1 } (qw(bin data dataroot doc dvi exec html include info |
| 225 | lib libexec lisp locale localstate man man1 man2 |
| 226 | man3 man4 man5 man6 man7 man8 man9 oldinclude pdf |
| 227 | pkgdata pkginclude pkglib pkglibexec ps sbin |
| 228 | sharedstate sysconf)); |
| 229 | |
| 230 | # Copyright on generated Makefile.ins. |
| 231 | my $gen_copyright = "\ |
| 232 | # Copyright (C) 1994-$RELEASE_YEAR Free Software Foundation, Inc. |
| 233 | |
| 234 | # This Makefile.in is free software; the Free Software Foundation |
| 235 | # gives unlimited permission to copy and/or distribute it, |
| 236 | # with or without modifications, as long as this notice is preserved. |
| 237 | |
| 238 | # This program is distributed in the hope that it will be useful, |
| 239 | # but WITHOUT ANY WARRANTY, to the extent permitted by law; without |
| 240 | # even the implied warranty of MERCHANTABILITY or FITNESS FOR A |
| 241 | # PARTICULAR PURPOSE. |
| 242 | "; |
| 243 | |
| 244 | # These constants are returned by the lang_*_rewrite functions. |
| 245 | # LANG_SUBDIR means that the resulting object file should be in a |
| 246 | # subdir if the source file is. In this case the file name cannot |
| 247 | # have '..' components. |
| 248 | use constant LANG_IGNORE => 0; |
| 249 | use constant LANG_PROCESS => 1; |
| 250 | use constant LANG_SUBDIR => 2; |
| 251 | |
| 252 | # These are used when keeping track of whether an object can be built |
| 253 | # by two different paths. |
| 254 | use constant COMPILE_LIBTOOL => 1; |
| 255 | use constant COMPILE_ORDINARY => 2; |
| 256 | |
| 257 | # We can't always associate a location to a variable or a rule, |
| 258 | # when it's defined by Automake. We use INTERNAL in this case. |
| 259 | use constant INTERNAL => new Automake::Location; |
| 260 | |
| 261 | # Serialization keys for message queues. |
| 262 | use constant QUEUE_MESSAGE => "msg"; |
| 263 | use constant QUEUE_CONF_FILE => "conf file"; |
| 264 | use constant QUEUE_LOCATION => "location"; |
| 265 | use constant QUEUE_STRING => "string"; |
| 266 | |
| 267 | ## ---------------------------------- ## |
| 268 | ## Variables related to the options. ## |
| 269 | ## ---------------------------------- ## |
| 270 | |
| 271 | # TRUE if we should always generate Makefile.in. |
| 272 | my $force_generation = 1; |
| 273 | |
| 274 | # From the Perl manual. |
| 275 | my $symlink_exists = (eval 'symlink ("", "");', $@ eq ''); |
| 276 | |
| 277 | # TRUE if missing standard files should be installed. |
| 278 | my $add_missing = 0; |
| 279 | |
| 280 | # TRUE if we should copy missing files; otherwise symlink if possible. |
| 281 | my $copy_missing = 0; |
| 282 | |
| 283 | # TRUE if we should always update files that we know about. |
| 284 | my $force_missing = 0; |
| 285 | |
| 286 | |
| 287 | ## ---------------------------------------- ## |
| 288 | ## Variables filled during files scanning. ## |
| 289 | ## ---------------------------------------- ## |
| 290 | |
| 291 | # Name of the configure.ac file. |
| 292 | my $configure_ac; |
| 293 | |
| 294 | # Files found by scanning configure.ac for LIBOBJS. |
| 295 | my %libsources = (); |
| 296 | |
| 297 | # Names used in AC_CONFIG_HEADERS call. |
| 298 | my @config_headers = (); |
| 299 | |
| 300 | # Names used in AC_CONFIG_LINKS call. |
| 301 | my @config_links = (); |
| 302 | |
| 303 | # List of Makefile.am's to process, and their corresponding outputs. |
| 304 | my @input_files = (); |
| 305 | my %output_files = (); |
| 306 | |
| 307 | # Complete list of Makefile.am's that exist. |
| 308 | my @configure_input_files = (); |
| 309 | |
| 310 | # List of files in AC_CONFIG_FILES/AC_OUTPUT without Makefile.am's, |
| 311 | # and their outputs. |
| 312 | my @other_input_files = (); |
| 313 | # Where each AC_CONFIG_FILES/AC_OUTPUT/AC_CONFIG_LINK/AC_CONFIG_HEADERS |
| 314 | # appears. The keys are the files created by these macros. |
| 315 | my %ac_config_files_location = (); |
| 316 | # The condition under which AC_CONFIG_FOOS appears. |
| 317 | my %ac_config_files_condition = (); |
| 318 | |
| 319 | # Directory to search for configure-required files. This |
| 320 | # will be computed by locate_aux_dir() and can be set using |
| 321 | # AC_CONFIG_AUX_DIR in configure.ac. |
| 322 | # $CONFIG_AUX_DIR is the 'raw' directory, valid only in the source-tree. |
| 323 | my $config_aux_dir = ''; |
| 324 | my $config_aux_dir_set_in_configure_ac = 0; |
| 325 | # $AM_CONFIG_AUX_DIR is prefixed with $(top_srcdir), so it can be used |
| 326 | # in Makefiles. |
| 327 | my $am_config_aux_dir = ''; |
| 328 | |
| 329 | # Directory to search for AC_LIBSOURCE files, as set by AC_CONFIG_LIBOBJ_DIR |
| 330 | # in configure.ac. |
| 331 | my $config_libobj_dir = ''; |
| 332 | |
| 333 | # Whether AM_GNU_GETTEXT has been seen in configure.ac. |
| 334 | my $seen_gettext = 0; |
| 335 | # Whether AM_GNU_GETTEXT([external]) is used. |
| 336 | my $seen_gettext_external = 0; |
| 337 | # Where AM_GNU_GETTEXT appears. |
| 338 | my $ac_gettext_location; |
| 339 | # Whether AM_GNU_GETTEXT_INTL_SUBDIR has been seen. |
| 340 | my $seen_gettext_intl = 0; |
| 341 | |
| 342 | # The arguments of the AM_EXTRA_RECURSIVE_TARGETS call (if any). |
| 343 | my @extra_recursive_targets = (); |
| 344 | |
| 345 | # Lists of tags supported by Libtool. |
| 346 | my %libtool_tags = (); |
| 347 | # 1 if Libtool uses LT_SUPPORTED_TAG. If it does, then it also |
| 348 | # uses AC_REQUIRE_AUX_FILE. |
| 349 | my $libtool_new_api = 0; |
| 350 | |
| 351 | # Most important AC_CANONICAL_* macro seen so far. |
| 352 | my $seen_canonical = 0; |
| 353 | |
| 354 | # Where AM_MAINTAINER_MODE appears. |
| 355 | my $seen_maint_mode; |
| 356 | |
| 357 | # Actual version we've seen. |
| 358 | my $package_version = ''; |
| 359 | |
| 360 | # Where version is defined. |
| 361 | my $package_version_location; |
| 362 | |
| 363 | # TRUE if we've seen AM_PROG_AR |
| 364 | my $seen_ar = 0; |
| 365 | |
| 366 | # Location of AC_REQUIRE_AUX_FILE calls, indexed by their argument. |
| 367 | my %required_aux_file = (); |
| 368 | |
| 369 | # Where AM_INIT_AUTOMAKE is called. |
| 370 | my $seen_init_automake = 0; |
| 371 | |
| 372 | # TRUE if we've seen AM_AUTOMAKE_VERSION. |
| 373 | my $seen_automake_version = 0; |
| 374 | |
| 375 | # Hash table of discovered configure substitutions. Keys are names, |
| 376 | # values are 'FILE:LINE' strings which are used by error message |
| 377 | # generation. |
| 378 | my %configure_vars = (); |
| 379 | |
| 380 | # Ignored configure substitutions (i.e., variables not to be output in |
| 381 | # Makefile.in) |
| 382 | my %ignored_configure_vars = (); |
| 383 | |
| 384 | # Files included by $configure_ac. |
| 385 | my @configure_deps = (); |
| 386 | |
| 387 | # Greatest timestamp of configure's dependencies. |
| 388 | my $configure_deps_greatest_timestamp = 0; |
| 389 | |
| 390 | # Hash table of AM_CONDITIONAL variables seen in configure. |
| 391 | my %configure_cond = (); |
| 392 | |
| 393 | # This maps extensions onto language names. |
| 394 | my %extension_map = (); |
| 395 | |
| 396 | # List of the DIST_COMMON files we discovered while reading |
| 397 | # configure.ac. |
| 398 | my @configure_dist_common = (); |
| 399 | |
| 400 | # This maps languages names onto objects. |
| 401 | my %languages = (); |
| 402 | # Maps each linker variable onto a language object. |
| 403 | my %link_languages = (); |
| 404 | |
| 405 | # maps extensions to needed source flags. |
| 406 | my %sourceflags = (); |
| 407 | |
| 408 | # List of targets we must always output. |
| 409 | # FIXME: Complete, and remove falsely required targets. |
| 410 | my %required_targets = |
| 411 | ( |
| 412 | 'all' => 1, |
| 413 | 'dvi' => 1, |
| 414 | 'pdf' => 1, |
| 415 | 'ps' => 1, |
| 416 | 'info' => 1, |
| 417 | 'install-info' => 1, |
| 418 | 'install' => 1, |
| 419 | 'install-data' => 1, |
| 420 | 'install-exec' => 1, |
| 421 | 'uninstall' => 1, |
| 422 | |
| 423 | # FIXME: Not required, temporary hacks. |
| 424 | # Well, actually they are sort of required: the -recursive |
| 425 | # targets will run them anyway... |
| 426 | 'html-am' => 1, |
| 427 | 'dvi-am' => 1, |
| 428 | 'pdf-am' => 1, |
| 429 | 'ps-am' => 1, |
| 430 | 'info-am' => 1, |
| 431 | 'install-data-am' => 1, |
| 432 | 'install-exec-am' => 1, |
| 433 | 'install-html-am' => 1, |
| 434 | 'install-dvi-am' => 1, |
| 435 | 'install-pdf-am' => 1, |
| 436 | 'install-ps-am' => 1, |
| 437 | 'install-info-am' => 1, |
| 438 | 'installcheck-am' => 1, |
| 439 | 'uninstall-am' => 1, |
| 440 | 'tags-am' => 1, |
| 441 | 'ctags-am' => 1, |
| 442 | 'cscopelist-am' => 1, |
| 443 | 'install-man' => 1, |
| 444 | ); |
| 445 | |
| 446 | # Queue to push require_conf_file requirements to. |
| 447 | my $required_conf_file_queue; |
| 448 | |
| 449 | # The name of the Makefile currently being processed. |
| 450 | my $am_file = 'BUG'; |
| 451 | |
| 452 | ################################################################ |
| 453 | |
| 454 | ## ------------------------------------------ ## |
| 455 | ## Variables reset by &initialize_per_input. ## |
| 456 | ## ------------------------------------------ ## |
| 457 | |
| 458 | # Relative dir of the output makefile. |
| 459 | my $relative_dir; |
| 460 | |
| 461 | # Greatest timestamp of the output's dependencies (excluding |
| 462 | # configure's dependencies). |
| 463 | my $output_deps_greatest_timestamp; |
| 464 | |
| 465 | # These variables are used when generating each Makefile.in. |
| 466 | # They hold the Makefile.in until it is ready to be printed. |
| 467 | my $output_vars; |
| 468 | my $output_all; |
| 469 | my $output_header; |
| 470 | my $output_rules; |
| 471 | my $output_trailer; |
| 472 | |
| 473 | # This is the conditional stack, updated on if/else/endif, and |
| 474 | # used to build Condition objects. |
| 475 | my @cond_stack; |
| 476 | |
| 477 | # This holds the set of included files. |
| 478 | my @include_stack; |
| 479 | |
| 480 | # List of dependencies for the obvious targets. |
| 481 | my @all; |
| 482 | my @check; |
| 483 | my @check_tests; |
| 484 | |
| 485 | # Keys in this hash table are files to delete. The associated |
| 486 | # value tells when this should happen (MOSTLY_CLEAN, DIST_CLEAN, etc.) |
| 487 | my %clean_files; |
| 488 | |
| 489 | # Keys in this hash table are object files or other files in |
| 490 | # subdirectories which need to be removed. This only holds files |
| 491 | # which are created by compilations. The value in the hash indicates |
| 492 | # when the file should be removed. |
| 493 | my %compile_clean_files; |
| 494 | |
| 495 | # Keys in this hash table are directories where we expect to build a |
| 496 | # libtool object. We use this information to decide what directories |
| 497 | # to delete. |
| 498 | my %libtool_clean_directories; |
| 499 | |
| 500 | # Value of $(SOURCES), used by tags.am. |
| 501 | my @sources; |
| 502 | # Sources which go in the distribution. |
| 503 | my @dist_sources; |
| 504 | |
| 505 | # This hash maps object file names onto their corresponding source |
| 506 | # file names. This is used to ensure that each object is created |
| 507 | # by a single source file. |
| 508 | my %object_map; |
| 509 | |
| 510 | # This hash maps object file names onto an integer value representing |
| 511 | # whether this object has been built via ordinary compilation or |
| 512 | # libtool compilation (the COMPILE_* constants). |
| 513 | my %object_compilation_map; |
| 514 | |
| 515 | |
| 516 | # This keeps track of the directories for which we've already |
| 517 | # created dirstamp code. Keys are directories, values are stamp files. |
| 518 | # Several keys can share the same stamp files if they are equivalent |
| 519 | # (as are './/foo' and 'foo'). |
| 520 | my %directory_map; |
| 521 | |
| 522 | # All .P files. |
| 523 | my %dep_files; |
| 524 | |
| 525 | # This is a list of all targets to run during "make dist". |
| 526 | my @dist_targets; |
| 527 | |
| 528 | # List of all programs, libraries and ltlibraries as returned |
| 529 | # by am_install_var |
| 530 | my @proglist; |
| 531 | my @liblist; |
| 532 | my @ltliblist; |
| 533 | # Blacklist of targets (as canonical base name) for which object file names |
| 534 | # may not be automatically shortened |
| 535 | my @dup_shortnames; |
| 536 | |
| 537 | # Keep track of all programs declared in this Makefile, without |
| 538 | # $(EXEEXT). @substitutions@ are not listed. |
| 539 | my %known_programs; |
| 540 | my %known_libraries; |
| 541 | |
| 542 | # This keeps track of which extensions we've seen (that we care |
| 543 | # about). |
| 544 | my %extension_seen; |
| 545 | |
| 546 | # This is random scratch space for the language finish functions. |
| 547 | # Don't randomly overwrite it; examine other uses of keys first. |
| 548 | my %language_scratch; |
| 549 | |
| 550 | # We keep track of which objects need special (per-executable) |
| 551 | # handling on a per-language basis. |
| 552 | my %lang_specific_files; |
| 553 | |
| 554 | # List of distributed files to be put in DIST_COMMON. |
| 555 | my @dist_common; |
| 556 | |
| 557 | # This is set when 'handle_dist' has finished. Once this happens, |
| 558 | # we should no longer push on dist_common. |
| 559 | my $handle_dist_run; |
| 560 | |
| 561 | # Used to store a set of linkers needed to generate the sources currently |
| 562 | # under consideration. |
| 563 | my %linkers_used; |
| 564 | |
| 565 | # True if we need 'LINK' defined. This is a hack. |
| 566 | my $need_link; |
| 567 | |
| 568 | # Does the generated Makefile have to build some compiled object |
| 569 | # (for binary programs, or plain or libtool libraries)? |
| 570 | my $must_handle_compiled_objects; |
| 571 | |
| 572 | # Record each file processed by make_paragraphs. |
| 573 | my %transformed_files; |
| 574 | |
| 575 | ################################################################ |
| 576 | |
| 577 | ## ---------------------------------------------- ## |
| 578 | ## Variables not reset by &initialize_per_input. ## |
| 579 | ## ---------------------------------------------- ## |
| 580 | |
| 581 | # Cache each file processed by make_paragraphs. |
| 582 | # (This is different from %transformed_files because |
| 583 | # %transformed_files is reset for each file while %am_file_cache |
| 584 | # it global to the run.) |
| 585 | my %am_file_cache; |
| 586 | |
| 587 | ################################################################ |
| 588 | |
| 589 | # var_SUFFIXES_trigger ($TYPE, $VALUE) |
| 590 | # ------------------------------------ |
| 591 | # This is called by Automake::Variable::define() when SUFFIXES |
| 592 | # is defined ($TYPE eq '') or appended ($TYPE eq '+'). |
| 593 | # The work here needs to be performed as a side-effect of the |
| 594 | # macro_define() call because SUFFIXES definitions impact |
| 595 | # on $KNOWN_EXTENSIONS_PATTERN which is used used when parsing |
| 596 | # the input am file. |
| 597 | sub var_SUFFIXES_trigger |
| 598 | { |
| 599 | my ($type, $value) = @_; |
| 600 | accept_extensions (split (' ', $value)); |
| 601 | } |
| 602 | Automake::Variable::hook ('SUFFIXES', \&var_SUFFIXES_trigger); |
| 603 | |
| 604 | ################################################################ |
| 605 | |
| 606 | |
| 607 | # initialize_per_input () |
| 608 | # ----------------------- |
| 609 | # (Re)-Initialize per-Makefile.am variables. |
| 610 | sub initialize_per_input () |
| 611 | { |
| 612 | reset_local_duplicates (); |
| 613 | |
| 614 | $relative_dir = undef; |
| 615 | |
| 616 | $output_deps_greatest_timestamp = 0; |
| 617 | |
| 618 | $output_vars = ''; |
| 619 | $output_all = ''; |
| 620 | $output_header = ''; |
| 621 | $output_rules = ''; |
| 622 | $output_trailer = ''; |
| 623 | |
| 624 | Automake::Options::reset; |
| 625 | Automake::Variable::reset; |
| 626 | Automake::Rule::reset; |
| 627 | |
| 628 | @cond_stack = (); |
| 629 | |
| 630 | @include_stack = (); |
| 631 | |
| 632 | @all = (); |
| 633 | @check = (); |
| 634 | @check_tests = (); |
| 635 | |
| 636 | %clean_files = (); |
| 637 | %compile_clean_files = (); |
| 638 | |
| 639 | # We always include '.'. This isn't strictly correct. |
| 640 | %libtool_clean_directories = ('.' => 1); |
| 641 | |
| 642 | @sources = (); |
| 643 | @dist_sources = (); |
| 644 | |
| 645 | %object_map = (); |
| 646 | %object_compilation_map = (); |
| 647 | |
| 648 | %directory_map = (); |
| 649 | |
| 650 | %dep_files = (); |
| 651 | |
| 652 | @dist_targets = (); |
| 653 | |
| 654 | @dist_common = (); |
| 655 | $handle_dist_run = 0; |
| 656 | |
| 657 | @proglist = (); |
| 658 | @liblist = (); |
| 659 | @ltliblist = (); |
| 660 | @dup_shortnames = (); |
| 661 | |
| 662 | %known_programs = (); |
| 663 | %known_libraries = (); |
| 664 | |
| 665 | %extension_seen = (); |
| 666 | |
| 667 | %language_scratch = (); |
| 668 | |
| 669 | %lang_specific_files = (); |
| 670 | |
| 671 | $need_link = 0; |
| 672 | |
| 673 | $must_handle_compiled_objects = 0; |
| 674 | |
| 675 | %transformed_files = (); |
| 676 | } |
| 677 | |
| 678 | |
| 679 | ################################################################ |
| 680 | |
| 681 | # Initialize our list of languages that are internally supported. |
| 682 | |
| 683 | my @cpplike_flags = |
| 684 | qw{ |
| 685 | $(DEFS) |
| 686 | $(DEFAULT_INCLUDES) |
| 687 | $(INCLUDES) |
| 688 | $(AM_CPPFLAGS) |
| 689 | $(CPPFLAGS) |
| 690 | }; |
| 691 | |
| 692 | # C. |
| 693 | register_language ('name' => 'c', |
| 694 | 'Name' => 'C', |
| 695 | 'config_vars' => ['CC'], |
| 696 | 'autodep' => '', |
| 697 | 'flags' => ['CFLAGS', 'CPPFLAGS'], |
| 698 | 'ccer' => 'CC', |
| 699 | 'compiler' => 'COMPILE', |
| 700 | 'compile' => "\$(CC) @cpplike_flags \$(AM_CFLAGS) \$(CFLAGS)", |
| 701 | 'lder' => 'CCLD', |
| 702 | 'ld' => '$(CC)', |
| 703 | 'linker' => 'LINK', |
| 704 | 'link' => '$(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', |
| 705 | 'compile_flag' => '-c', |
| 706 | 'output_flag' => '-o', |
| 707 | 'libtool_tag' => 'CC', |
| 708 | 'extensions' => ['.c']); |
| 709 | |
| 710 | # C++. |
| 711 | register_language ('name' => 'cxx', |
| 712 | 'Name' => 'C++', |
| 713 | 'config_vars' => ['CXX'], |
| 714 | 'linker' => 'CXXLINK', |
| 715 | 'link' => '$(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', |
| 716 | 'autodep' => 'CXX', |
| 717 | 'flags' => ['CXXFLAGS', 'CPPFLAGS'], |
| 718 | 'compile' => "\$(CXX) @cpplike_flags \$(AM_CXXFLAGS) \$(CXXFLAGS)", |
| 719 | 'ccer' => 'CXX', |
| 720 | 'compiler' => 'CXXCOMPILE', |
| 721 | 'compile_flag' => '-c', |
| 722 | 'output_flag' => '-o', |
| 723 | 'libtool_tag' => 'CXX', |
| 724 | 'lder' => 'CXXLD', |
| 725 | 'ld' => '$(CXX)', |
| 726 | 'pure' => 1, |
| 727 | 'extensions' => ['.c++', '.cc', '.cpp', '.cxx', '.C']); |
| 728 | |
| 729 | # Objective C. |
| 730 | register_language ('name' => 'objc', |
| 731 | 'Name' => 'Objective C', |
| 732 | 'config_vars' => ['OBJC'], |
| 733 | 'linker' => 'OBJCLINK', |
| 734 | 'link' => '$(OBJCLD) $(AM_OBJCFLAGS) $(OBJCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', |
| 735 | 'autodep' => 'OBJC', |
| 736 | 'flags' => ['OBJCFLAGS', 'CPPFLAGS'], |
| 737 | 'compile' => "\$(OBJC) @cpplike_flags \$(AM_OBJCFLAGS) \$(OBJCFLAGS)", |
| 738 | 'ccer' => 'OBJC', |
| 739 | 'compiler' => 'OBJCCOMPILE', |
| 740 | 'compile_flag' => '-c', |
| 741 | 'output_flag' => '-o', |
| 742 | 'lder' => 'OBJCLD', |
| 743 | 'ld' => '$(OBJC)', |
| 744 | 'pure' => 1, |
| 745 | 'extensions' => ['.m']); |
| 746 | |
| 747 | # Objective C++. |
| 748 | register_language ('name' => 'objcxx', |
| 749 | 'Name' => 'Objective C++', |
| 750 | 'config_vars' => ['OBJCXX'], |
| 751 | 'linker' => 'OBJCXXLINK', |
| 752 | 'link' => '$(OBJCXXLD) $(AM_OBJCXXFLAGS) $(OBJCXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', |
| 753 | 'autodep' => 'OBJCXX', |
| 754 | 'flags' => ['OBJCXXFLAGS', 'CPPFLAGS'], |
| 755 | 'compile' => "\$(OBJCXX) @cpplike_flags \$(AM_OBJCXXFLAGS) \$(OBJCXXFLAGS)", |
| 756 | 'ccer' => 'OBJCXX', |
| 757 | 'compiler' => 'OBJCXXCOMPILE', |
| 758 | 'compile_flag' => '-c', |
| 759 | 'output_flag' => '-o', |
| 760 | 'lder' => 'OBJCXXLD', |
| 761 | 'ld' => '$(OBJCXX)', |
| 762 | 'pure' => 1, |
| 763 | 'extensions' => ['.mm']); |
| 764 | |
| 765 | # Unified Parallel C. |
| 766 | register_language ('name' => 'upc', |
| 767 | 'Name' => 'Unified Parallel C', |
| 768 | 'config_vars' => ['UPC'], |
| 769 | 'linker' => 'UPCLINK', |
| 770 | 'link' => '$(UPCLD) $(AM_UPCFLAGS) $(UPCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', |
| 771 | 'autodep' => 'UPC', |
| 772 | 'flags' => ['UPCFLAGS', 'CPPFLAGS'], |
| 773 | 'compile' => "\$(UPC) @cpplike_flags \$(AM_UPCFLAGS) \$(UPCFLAGS)", |
| 774 | 'ccer' => 'UPC', |
| 775 | 'compiler' => 'UPCCOMPILE', |
| 776 | 'compile_flag' => '-c', |
| 777 | 'output_flag' => '-o', |
| 778 | 'lder' => 'UPCLD', |
| 779 | 'ld' => '$(UPC)', |
| 780 | 'pure' => 1, |
| 781 | 'extensions' => ['.upc']); |
| 782 | |
| 783 | # Headers. |
| 784 | register_language ('name' => 'header', |
| 785 | 'Name' => 'Header', |
| 786 | 'extensions' => ['.h', '.H', '.hxx', '.h++', '.hh', |
| 787 | '.hpp', '.inc'], |
| 788 | # No output. |
| 789 | 'output_extensions' => sub { return () }, |
| 790 | # Nothing to do. |
| 791 | '_finish' => sub { }); |
| 792 | |
| 793 | # Vala |
| 794 | register_language ('name' => 'vala', |
| 795 | 'Name' => 'Vala', |
| 796 | 'config_vars' => ['VALAC'], |
| 797 | 'flags' => [], |
| 798 | 'compile' => '$(VALAC) $(AM_VALAFLAGS) $(VALAFLAGS)', |
| 799 | 'ccer' => 'VALAC', |
| 800 | 'compiler' => 'VALACOMPILE', |
| 801 | 'extensions' => ['.vala'], |
| 802 | 'output_extensions' => sub { (my $ext = $_[0]) =~ s/vala$/c/; |
| 803 | return ($ext,) }, |
| 804 | 'rule_file' => 'vala', |
| 805 | '_finish' => \&lang_vala_finish, |
| 806 | '_target_hook' => \&lang_vala_target_hook, |
| 807 | 'nodist_specific' => 1); |
| 808 | |
| 809 | # Yacc (C & C++). |
| 810 | register_language ('name' => 'yacc', |
| 811 | 'Name' => 'Yacc', |
| 812 | 'config_vars' => ['YACC'], |
| 813 | 'flags' => ['YFLAGS'], |
| 814 | 'compile' => '$(YACC) $(AM_YFLAGS) $(YFLAGS)', |
| 815 | 'ccer' => 'YACC', |
| 816 | 'compiler' => 'YACCCOMPILE', |
| 817 | 'extensions' => ['.y'], |
| 818 | 'output_extensions' => sub { (my $ext = $_[0]) =~ tr/y/c/; |
| 819 | return ($ext,) }, |
| 820 | 'rule_file' => 'yacc', |
| 821 | '_finish' => \&lang_yacc_finish, |
| 822 | '_target_hook' => \&lang_yacc_target_hook, |
| 823 | 'nodist_specific' => 1); |
| 824 | register_language ('name' => 'yaccxx', |
| 825 | 'Name' => 'Yacc (C++)', |
| 826 | 'config_vars' => ['YACC'], |
| 827 | 'rule_file' => 'yacc', |
| 828 | 'flags' => ['YFLAGS'], |
| 829 | 'ccer' => 'YACC', |
| 830 | 'compiler' => 'YACCCOMPILE', |
| 831 | 'compile' => '$(YACC) $(AM_YFLAGS) $(YFLAGS)', |
| 832 | 'extensions' => ['.y++', '.yy', '.yxx', '.ypp'], |
| 833 | 'output_extensions' => sub { (my $ext = $_[0]) =~ tr/y/c/; |
| 834 | return ($ext,) }, |
| 835 | '_finish' => \&lang_yacc_finish, |
| 836 | '_target_hook' => \&lang_yacc_target_hook, |
| 837 | 'nodist_specific' => 1); |
| 838 | |
| 839 | # Lex (C & C++). |
| 840 | register_language ('name' => 'lex', |
| 841 | 'Name' => 'Lex', |
| 842 | 'config_vars' => ['LEX'], |
| 843 | 'rule_file' => 'lex', |
| 844 | 'flags' => ['LFLAGS'], |
| 845 | 'compile' => '$(LEX) $(AM_LFLAGS) $(LFLAGS)', |
| 846 | 'ccer' => 'LEX', |
| 847 | 'compiler' => 'LEXCOMPILE', |
| 848 | 'extensions' => ['.l'], |
| 849 | 'output_extensions' => sub { (my $ext = $_[0]) =~ tr/l/c/; |
| 850 | return ($ext,) }, |
| 851 | '_finish' => \&lang_lex_finish, |
| 852 | '_target_hook' => \&lang_lex_target_hook, |
| 853 | 'nodist_specific' => 1); |
| 854 | register_language ('name' => 'lexxx', |
| 855 | 'Name' => 'Lex (C++)', |
| 856 | 'config_vars' => ['LEX'], |
| 857 | 'rule_file' => 'lex', |
| 858 | 'flags' => ['LFLAGS'], |
| 859 | 'compile' => '$(LEX) $(AM_LFLAGS) $(LFLAGS)', |
| 860 | 'ccer' => 'LEX', |
| 861 | 'compiler' => 'LEXCOMPILE', |
| 862 | 'extensions' => ['.l++', '.ll', '.lxx', '.lpp'], |
| 863 | 'output_extensions' => sub { (my $ext = $_[0]) =~ tr/l/c/; |
| 864 | return ($ext,) }, |
| 865 | '_finish' => \&lang_lex_finish, |
| 866 | '_target_hook' => \&lang_lex_target_hook, |
| 867 | 'nodist_specific' => 1); |
| 868 | |
| 869 | # Assembler. |
| 870 | register_language ('name' => 'asm', |
| 871 | 'Name' => 'Assembler', |
| 872 | 'config_vars' => ['CCAS', 'CCASFLAGS'], |
| 873 | |
| 874 | 'flags' => ['CCASFLAGS'], |
| 875 | # Users can set AM_CCASFLAGS to include DEFS, INCLUDES, |
| 876 | # or anything else required. They can also set CCAS. |
| 877 | # Or simply use Preprocessed Assembler. |
| 878 | 'compile' => '$(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS)', |
| 879 | 'ccer' => 'CCAS', |
| 880 | 'compiler' => 'CCASCOMPILE', |
| 881 | 'compile_flag' => '-c', |
| 882 | 'output_flag' => '-o', |
| 883 | 'extensions' => ['.s']); |
| 884 | |
| 885 | # Preprocessed Assembler. |
| 886 | register_language ('name' => 'cppasm', |
| 887 | 'Name' => 'Preprocessed Assembler', |
| 888 | 'config_vars' => ['CCAS', 'CCASFLAGS'], |
| 889 | |
| 890 | 'autodep' => 'CCAS', |
| 891 | 'flags' => ['CCASFLAGS', 'CPPFLAGS'], |
| 892 | 'compile' => "\$(CCAS) @cpplike_flags \$(AM_CCASFLAGS) \$(CCASFLAGS)", |
| 893 | 'ccer' => 'CPPAS', |
| 894 | 'compiler' => 'CPPASCOMPILE', |
| 895 | 'libtool_tag' => 'CC', |
| 896 | 'compile_flag' => '-c', |
| 897 | 'output_flag' => '-o', |
| 898 | 'extensions' => ['.S', '.sx']); |
| 899 | |
| 900 | # Fortran 77 |
| 901 | register_language ('name' => 'f77', |
| 902 | 'Name' => 'Fortran 77', |
| 903 | 'config_vars' => ['F77'], |
| 904 | 'linker' => 'F77LINK', |
| 905 | 'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', |
| 906 | 'flags' => ['FFLAGS'], |
| 907 | 'compile' => '$(F77) $(AM_FFLAGS) $(FFLAGS)', |
| 908 | 'ccer' => 'F77', |
| 909 | 'compiler' => 'F77COMPILE', |
| 910 | 'compile_flag' => '-c', |
| 911 | 'output_flag' => '-o', |
| 912 | 'libtool_tag' => 'F77', |
| 913 | 'lder' => 'F77LD', |
| 914 | 'ld' => '$(F77)', |
| 915 | 'pure' => 1, |
| 916 | 'extensions' => ['.f', '.for']); |
| 917 | |
| 918 | # Fortran |
| 919 | register_language ('name' => 'fc', |
| 920 | 'Name' => 'Fortran', |
| 921 | 'config_vars' => ['FC'], |
| 922 | 'linker' => 'FCLINK', |
| 923 | 'link' => '$(FCLD) $(AM_FCFLAGS) $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', |
| 924 | 'flags' => ['FCFLAGS'], |
| 925 | 'compile' => '$(FC) $(AM_FCFLAGS) $(FCFLAGS)', |
| 926 | 'ccer' => 'FC', |
| 927 | 'compiler' => 'FCCOMPILE', |
| 928 | 'compile_flag' => '-c', |
| 929 | 'output_flag' => '-o', |
| 930 | 'libtool_tag' => 'FC', |
| 931 | 'lder' => 'FCLD', |
| 932 | 'ld' => '$(FC)', |
| 933 | 'pure' => 1, |
| 934 | 'extensions' => ['.f90', '.f95', '.f03', '.f08']); |
| 935 | |
| 936 | # Preprocessed Fortran |
| 937 | register_language ('name' => 'ppfc', |
| 938 | 'Name' => 'Preprocessed Fortran', |
| 939 | 'config_vars' => ['FC'], |
| 940 | 'linker' => 'FCLINK', |
| 941 | 'link' => '$(FCLD) $(AM_FCFLAGS) $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', |
| 942 | 'lder' => 'FCLD', |
| 943 | 'ld' => '$(FC)', |
| 944 | 'flags' => ['FCFLAGS', 'CPPFLAGS'], |
| 945 | 'ccer' => 'PPFC', |
| 946 | 'compiler' => 'PPFCCOMPILE', |
| 947 | 'compile' => "\$(FC) @cpplike_flags \$(AM_FCFLAGS) \$(FCFLAGS)", |
| 948 | 'compile_flag' => '-c', |
| 949 | 'output_flag' => '-o', |
| 950 | 'libtool_tag' => 'FC', |
| 951 | 'pure' => 1, |
| 952 | 'extensions' => ['.F90','.F95', '.F03', '.F08']); |
| 953 | |
| 954 | # Preprocessed Fortran 77 |
| 955 | # |
| 956 | # The current support for preprocessing Fortran 77 just involves |
| 957 | # passing "$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) |
| 958 | # $(CPPFLAGS)" as additional flags to the Fortran 77 compiler, since |
| 959 | # this is how GNU Make does it; see the "GNU Make Manual, Edition 0.51 |
| 960 | # for 'make' Version 3.76 Beta" (specifically, from info file |
| 961 | # '(make)Catalogue of Rules'). |
| 962 | # |
| 963 | # A better approach would be to write an Autoconf test |
| 964 | # (i.e. AC_PROG_FPP) for a Fortran 77 preprocessor, because not all |
| 965 | # Fortran 77 compilers know how to do preprocessing. The Autoconf |
| 966 | # macro AC_PROG_FPP should test the Fortran 77 compiler first for |
| 967 | # preprocessing capabilities, and then fall back on cpp (if cpp were |
| 968 | # available). |
| 969 | register_language ('name' => 'ppf77', |
| 970 | 'Name' => 'Preprocessed Fortran 77', |
| 971 | 'config_vars' => ['F77'], |
| 972 | 'linker' => 'F77LINK', |
| 973 | 'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', |
| 974 | 'lder' => 'F77LD', |
| 975 | 'ld' => '$(F77)', |
| 976 | 'flags' => ['FFLAGS', 'CPPFLAGS'], |
| 977 | 'ccer' => 'PPF77', |
| 978 | 'compiler' => 'PPF77COMPILE', |
| 979 | 'compile' => "\$(F77) @cpplike_flags \$(AM_FFLAGS) \$(FFLAGS)", |
| 980 | 'compile_flag' => '-c', |
| 981 | 'output_flag' => '-o', |
| 982 | 'libtool_tag' => 'F77', |
| 983 | 'pure' => 1, |
| 984 | 'extensions' => ['.F']); |
| 985 | |
| 986 | # Ratfor. |
| 987 | register_language ('name' => 'ratfor', |
| 988 | 'Name' => 'Ratfor', |
| 989 | 'config_vars' => ['F77'], |
| 990 | 'linker' => 'F77LINK', |
| 991 | 'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', |
| 992 | 'lder' => 'F77LD', |
| 993 | 'ld' => '$(F77)', |
| 994 | 'flags' => ['RFLAGS', 'FFLAGS'], |
| 995 | # FIXME also FFLAGS. |
| 996 | 'compile' => '$(F77) $(AM_FFLAGS) $(FFLAGS) $(AM_RFLAGS) $(RFLAGS)', |
| 997 | 'ccer' => 'F77', |
| 998 | 'compiler' => 'RCOMPILE', |
| 999 | 'compile_flag' => '-c', |
| 1000 | 'output_flag' => '-o', |
| 1001 | 'libtool_tag' => 'F77', |
| 1002 | 'pure' => 1, |
| 1003 | 'extensions' => ['.r']); |
| 1004 | |
| 1005 | # Java via gcj. |
| 1006 | register_language ('name' => 'java', |
| 1007 | 'Name' => 'Java', |
| 1008 | 'config_vars' => ['GCJ'], |
| 1009 | 'linker' => 'GCJLINK', |
| 1010 | 'link' => '$(GCJLD) $(AM_GCJFLAGS) $(GCJFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', |
| 1011 | 'autodep' => 'GCJ', |
| 1012 | 'flags' => ['GCJFLAGS'], |
| 1013 | 'compile' => '$(GCJ) $(AM_GCJFLAGS) $(GCJFLAGS)', |
| 1014 | 'ccer' => 'GCJ', |
| 1015 | 'compiler' => 'GCJCOMPILE', |
| 1016 | 'compile_flag' => '-c', |
| 1017 | 'output_flag' => '-o', |
| 1018 | 'libtool_tag' => 'GCJ', |
| 1019 | 'lder' => 'GCJLD', |
| 1020 | 'ld' => '$(GCJ)', |
| 1021 | 'pure' => 1, |
| 1022 | 'extensions' => ['.java', '.class', '.zip', '.jar']); |
| 1023 | |
| 1024 | ################################################################ |
| 1025 | |
| 1026 | # Error reporting functions. |
| 1027 | |
| 1028 | # err_am ($MESSAGE, [%OPTIONS]) |
| 1029 | # ----------------------------- |
| 1030 | # Uncategorized errors about the current Makefile.am. |
| 1031 | sub err_am |
| 1032 | { |
| 1033 | msg_am ('error', @_); |
| 1034 | } |
| 1035 | |
| 1036 | # err_ac ($MESSAGE, [%OPTIONS]) |
| 1037 | # ----------------------------- |
| 1038 | # Uncategorized errors about configure.ac. |
| 1039 | sub err_ac |
| 1040 | { |
| 1041 | msg_ac ('error', @_); |
| 1042 | } |
| 1043 | |
| 1044 | # msg_am ($CHANNEL, $MESSAGE, [%OPTIONS]) |
| 1045 | # --------------------------------------- |
| 1046 | # Messages about about the current Makefile.am. |
| 1047 | sub msg_am |
| 1048 | { |
| 1049 | my ($channel, $msg, %opts) = @_; |
| 1050 | msg $channel, "${am_file}.am", $msg, %opts; |
| 1051 | } |
| 1052 | |
| 1053 | # msg_ac ($CHANNEL, $MESSAGE, [%OPTIONS]) |
| 1054 | # --------------------------------------- |
| 1055 | # Messages about about configure.ac. |
| 1056 | sub msg_ac |
| 1057 | { |
| 1058 | my ($channel, $msg, %opts) = @_; |
| 1059 | msg $channel, $configure_ac, $msg, %opts; |
| 1060 | } |
| 1061 | |
| 1062 | ################################################################ |
| 1063 | |
| 1064 | # subst ($TEXT) |
| 1065 | # ------------- |
| 1066 | # Return a configure-style substitution using the indicated text. |
| 1067 | # We do this to avoid having the substitutions directly in automake.in; |
| 1068 | # when we do that they are sometimes removed and this causes confusion |
| 1069 | # and bugs. |
| 1070 | sub subst |
| 1071 | { |
| 1072 | my ($text) = @_; |
| 1073 | return '@' . $text . '@'; |
| 1074 | } |
| 1075 | |
| 1076 | ################################################################ |
| 1077 | |
| 1078 | |
| 1079 | # $BACKPATH |
| 1080 | # backname ($RELDIR) |
| 1081 | # ------------------- |
| 1082 | # If I "cd $RELDIR", then to come back, I should "cd $BACKPATH". |
| 1083 | # For instance 'src/foo' => '../..'. |
| 1084 | # Works with non strictly increasing paths, i.e., 'src/../lib' => '..'. |
| 1085 | sub backname |
| 1086 | { |
| 1087 | my ($file) = @_; |
| 1088 | my @res; |
| 1089 | foreach (split (/\//, $file)) |
| 1090 | { |
| 1091 | next if $_ eq '.' || $_ eq ''; |
| 1092 | if ($_ eq '..') |
| 1093 | { |
| 1094 | pop @res |
| 1095 | or prog_error ("trying to reverse path '$file' pointing outside tree"); |
| 1096 | } |
| 1097 | else |
| 1098 | { |
| 1099 | push (@res, '..'); |
| 1100 | } |
| 1101 | } |
| 1102 | return join ('/', @res) || '.'; |
| 1103 | } |
| 1104 | |
| 1105 | ################################################################ |
| 1106 | |
| 1107 | # Silent rules handling functions. |
| 1108 | |
| 1109 | # verbose_var (NAME) |
| 1110 | # ------------------ |
| 1111 | # The public variable stem used to implement silent rules. |
| 1112 | sub verbose_var |
| 1113 | { |
| 1114 | my ($name) = @_; |
| 1115 | return 'AM_V_' . $name; |
| 1116 | } |
| 1117 | |
| 1118 | # verbose_private_var (NAME) |
| 1119 | # -------------------------- |
| 1120 | # The naming policy for the private variables for silent rules. |
| 1121 | sub verbose_private_var |
| 1122 | { |
| 1123 | my ($name) = @_; |
| 1124 | return 'am__v_' . $name; |
| 1125 | } |
| 1126 | |
| 1127 | # define_verbose_var (NAME, VAL-IF-SILENT, [VAL-IF-VERBOSE]) |
| 1128 | # ---------------------------------------------------------- |
| 1129 | # For silent rules, setup VAR and dispatcher, to expand to |
| 1130 | # VAL-IF-SILENT if silent, to VAL-IF-VERBOSE (defaulting to |
| 1131 | # empty) if not. |
| 1132 | sub define_verbose_var |
| 1133 | { |
| 1134 | my ($name, $silent_val, $verbose_val) = @_; |
| 1135 | $verbose_val = '' unless defined $verbose_val; |
| 1136 | my $var = verbose_var ($name); |
| 1137 | my $pvar = verbose_private_var ($name); |
| 1138 | my $silent_var = $pvar . '_0'; |
| 1139 | my $verbose_var = $pvar . '_1'; |
| 1140 | # For typical 'make's, 'configure' replaces AM_V (inside @@) with $(V) |
| 1141 | # and AM_DEFAULT_V (inside @@) with $(AM_DEFAULT_VERBOSITY). |
| 1142 | # For strict POSIX 2008 'make's, it replaces them with 0 or 1 instead. |
| 1143 | # See AM_SILENT_RULES in m4/silent.m4. |
| 1144 | define_variable ($var, '$(' . $pvar . '_@'.'AM_V'.'@)', INTERNAL); |
| 1145 | define_variable ($pvar . '_', '$(' . $pvar . '_@'.'AM_DEFAULT_V'.'@)', |
| 1146 | INTERNAL); |
| 1147 | Automake::Variable::define ($silent_var, VAR_AUTOMAKE, '', TRUE, |
| 1148 | $silent_val, '', INTERNAL, VAR_ASIS) |
| 1149 | if (! vardef ($silent_var, TRUE)); |
| 1150 | Automake::Variable::define ($verbose_var, VAR_AUTOMAKE, '', TRUE, |
| 1151 | $verbose_val, '', INTERNAL, VAR_ASIS) |
| 1152 | if (! vardef ($verbose_var, TRUE)); |
| 1153 | } |
| 1154 | |
| 1155 | # verbose_flag (NAME) |
| 1156 | # ------------------- |
| 1157 | # Contents of '%VERBOSE%' variable to expand before rule command. |
| 1158 | sub verbose_flag |
| 1159 | { |
| 1160 | my ($name) = @_; |
| 1161 | return '$(' . verbose_var ($name) . ')'; |
| 1162 | } |
| 1163 | |
| 1164 | sub verbose_nodep_flag |
| 1165 | { |
| 1166 | my ($name) = @_; |
| 1167 | return '$(' . verbose_var ($name) . subst ('am__nodep') . ')'; |
| 1168 | } |
| 1169 | |
| 1170 | # silent_flag |
| 1171 | # ----------- |
| 1172 | # Contents of %SILENT%: variable to expand to '@' when silent. |
| 1173 | sub silent_flag () |
| 1174 | { |
| 1175 | return verbose_flag ('at'); |
| 1176 | } |
| 1177 | |
| 1178 | # define_verbose_tagvar (NAME) |
| 1179 | # ---------------------------- |
| 1180 | # Engage the needed silent rules machinery for tag NAME. |
| 1181 | sub define_verbose_tagvar |
| 1182 | { |
| 1183 | my ($name) = @_; |
| 1184 | define_verbose_var ($name, '@echo " '. $name . ' ' x (8 - length ($name)) . '" $@;'); |
| 1185 | } |
| 1186 | |
| 1187 | # Engage the needed silent rules machinery for assorted texinfo commands. |
| 1188 | sub define_verbose_texinfo () |
| 1189 | { |
| 1190 | my @tagvars = ('DVIPS', 'MAKEINFO', 'INFOHTML', 'TEXI2DVI', 'TEXI2PDF'); |
| 1191 | foreach my $tag (@tagvars) |
| 1192 | { |
| 1193 | define_verbose_tagvar($tag); |
| 1194 | } |
| 1195 | define_verbose_var('texinfo', '-q'); |
| 1196 | define_verbose_var('texidevnull', '> /dev/null'); |
| 1197 | } |
| 1198 | |
| 1199 | # Engage the needed silent rules machinery for 'libtool --silent'. |
| 1200 | sub define_verbose_libtool () |
| 1201 | { |
| 1202 | define_verbose_var ('lt', '--silent'); |
| 1203 | return verbose_flag ('lt'); |
| 1204 | } |
| 1205 | |
| 1206 | sub handle_silent () |
| 1207 | { |
| 1208 | # Define "$(AM_V_P)", expanding to a shell conditional that can be |
| 1209 | # used in make recipes to determine whether we are being run in |
| 1210 | # silent mode or not. The choice of the name derives from the LISP |
| 1211 | # convention of appending the letter 'P' to denote a predicate (see |
| 1212 | # also "the '-P' convention" in the Jargon File); we do so for lack |
| 1213 | # of a better convention. |
| 1214 | define_verbose_var ('P', 'false', ':'); |
| 1215 | # *Always* provide the user with '$(AM_V_GEN)', unconditionally. |
| 1216 | define_verbose_tagvar ('GEN'); |
| 1217 | define_verbose_var ('at', '@'); |
| 1218 | } |
| 1219 | |
| 1220 | |
| 1221 | ################################################################ |
| 1222 | |
| 1223 | |
| 1224 | # Handle AUTOMAKE_OPTIONS variable. Return 0 on error, 1 otherwise. |
| 1225 | sub handle_options () |
| 1226 | { |
| 1227 | my $var = var ('AUTOMAKE_OPTIONS'); |
| 1228 | if ($var) |
| 1229 | { |
| 1230 | if ($var->has_conditional_contents) |
| 1231 | { |
| 1232 | msg_var ('unsupported', $var, |
| 1233 | "'AUTOMAKE_OPTIONS' cannot have conditional contents"); |
| 1234 | } |
| 1235 | my @options = map { { option => $_->[1], where => $_->[0] } } |
| 1236 | $var->value_as_list_recursive (cond_filter => TRUE, |
| 1237 | location => 1); |
| 1238 | return 0 unless process_option_list (@options); |
| 1239 | } |
| 1240 | |
| 1241 | if ($strictness == GNITS) |
| 1242 | { |
| 1243 | set_option ('readme-alpha', INTERNAL); |
| 1244 | set_option ('std-options', INTERNAL); |
| 1245 | set_option ('check-news', INTERNAL); |
| 1246 | } |
| 1247 | |
| 1248 | return 1; |
| 1249 | } |
| 1250 | |
| 1251 | # shadow_unconditionally ($varname, $where) |
| 1252 | # ----------------------------------------- |
| 1253 | # Return a $(variable) that contains all possible values |
| 1254 | # $varname can take. |
| 1255 | # If the VAR wasn't defined conditionally, return $(VAR). |
| 1256 | # Otherwise we create an am__VAR_DIST variable which contains |
| 1257 | # all possible values, and return $(am__VAR_DIST). |
| 1258 | sub shadow_unconditionally |
| 1259 | { |
| 1260 | my ($varname, $where) = @_; |
| 1261 | my $var = var $varname; |
| 1262 | if ($var->has_conditional_contents) |
| 1263 | { |
| 1264 | $varname = "am__${varname}_DIST"; |
| 1265 | my @files = uniq ($var->value_as_list_recursive); |
| 1266 | define_pretty_variable ($varname, TRUE, $where, @files); |
| 1267 | } |
| 1268 | return "\$($varname)" |
| 1269 | } |
| 1270 | |
| 1271 | # check_user_variables (@LIST) |
| 1272 | # ---------------------------- |
| 1273 | # Make sure each variable VAR in @LIST does not exist, suggest using AM_VAR |
| 1274 | # otherwise. |
| 1275 | sub check_user_variables |
| 1276 | { |
| 1277 | my @dont_override = @_; |
| 1278 | foreach my $flag (@dont_override) |
| 1279 | { |
| 1280 | my $var = var $flag; |
| 1281 | if ($var) |
| 1282 | { |
| 1283 | for my $cond ($var->conditions->conds) |
| 1284 | { |
| 1285 | if ($var->rdef ($cond)->owner == VAR_MAKEFILE) |
| 1286 | { |
| 1287 | msg_cond_var ('gnu', $cond, $flag, |
| 1288 | "'$flag' is a user variable, " |
| 1289 | . "you should not override it;\n" |
| 1290 | . "use 'AM_$flag' instead"); |
| 1291 | } |
| 1292 | } |
| 1293 | } |
| 1294 | } |
| 1295 | } |
| 1296 | |
| 1297 | # Call finish function for each language that was used. |
| 1298 | sub handle_languages () |
| 1299 | { |
| 1300 | if (! option 'no-dependencies') |
| 1301 | { |
| 1302 | # Include auto-dep code. Don't include it if DEP_FILES would |
| 1303 | # be empty. |
| 1304 | if (keys %extension_seen && keys %dep_files) |
| 1305 | { |
| 1306 | my @dep_files = sort keys %dep_files; |
| 1307 | # Set location of depcomp. |
| 1308 | define_variable ('depcomp', |
| 1309 | "\$(SHELL) $am_config_aux_dir/depcomp", |
| 1310 | INTERNAL); |
| 1311 | define_variable ('am__maybe_remake_depfiles', 'depfiles', INTERNAL); |
| 1312 | define_variable ('am__depfiles_remade', "@dep_files", INTERNAL); |
| 1313 | $output_rules .= "\n"; |
| 1314 | my @dist_rms; |
| 1315 | foreach my $depfile (@dep_files) |
| 1316 | { |
| 1317 | push @dist_rms, "\t-rm -f $depfile"; |
| 1318 | # Generate each 'include' directive individually. Several |
| 1319 | # make implementations (IRIX 6, Solaris 10, FreeBSD 8) will |
| 1320 | # fail to properly include several files resulting from a |
| 1321 | # variable expansion. Just Generating many separate includes |
| 1322 | # seems thus safest. |
| 1323 | $output_rules .= subst ('AMDEP_TRUE') . |
| 1324 | subst ('am__include') . |
| 1325 | " " . |
| 1326 | subst('am__quote') . |
| 1327 | $depfile . |
| 1328 | subst('am__quote') . |
| 1329 | " " . |
| 1330 | "# am--include-marker\n"; |
| 1331 | } |
| 1332 | |
| 1333 | require_conf_file ("$am_file.am", FOREIGN, 'depcomp'); |
| 1334 | |
| 1335 | $output_rules .= file_contents ( |
| 1336 | 'depend', new Automake::Location, |
| 1337 | 'DISTRMS' => join ("\n", @dist_rms)); |
| 1338 | } |
| 1339 | } |
| 1340 | else |
| 1341 | { |
| 1342 | define_variable ('depcomp', '', INTERNAL); |
| 1343 | define_variable ('am__maybe_remake_depfiles', '', INTERNAL); |
| 1344 | } |
| 1345 | |
| 1346 | my %done; |
| 1347 | |
| 1348 | # Is the C linker needed? |
| 1349 | my $needs_c = 0; |
| 1350 | foreach my $ext (sort keys %extension_seen) |
| 1351 | { |
| 1352 | next unless $extension_map{$ext}; |
| 1353 | |
| 1354 | my $lang = $languages{$extension_map{$ext}}; |
| 1355 | |
| 1356 | my $rule_file = $lang->rule_file || 'depend2'; |
| 1357 | |
| 1358 | # Get information on $LANG. |
| 1359 | my $pfx = $lang->autodep; |
| 1360 | my $fpfx = ($pfx eq '') ? 'CC' : $pfx; |
| 1361 | |
| 1362 | my ($AMDEP, $FASTDEP) = |
| 1363 | (option 'no-dependencies' || $lang->autodep eq 'no') |
| 1364 | ? ('FALSE', 'FALSE') : ('AMDEP', "am__fastdep$fpfx"); |
| 1365 | |
| 1366 | my $verbose = verbose_flag ($lang->ccer || 'GEN'); |
| 1367 | my $verbose_nodep = ($AMDEP eq 'FALSE') |
| 1368 | ? $verbose : verbose_nodep_flag ($lang->ccer || 'GEN'); |
| 1369 | my $silent = silent_flag (); |
| 1370 | |
| 1371 | my %transform = ('EXT' => $ext, |
| 1372 | 'PFX' => $pfx, |
| 1373 | 'FPFX' => $fpfx, |
| 1374 | 'AMDEP' => $AMDEP, |
| 1375 | 'FASTDEP' => $FASTDEP, |
| 1376 | '-c' => $lang->compile_flag || '', |
| 1377 | # These are not used, but they need to be defined |
| 1378 | # so transform() do not complain. |
| 1379 | SUBDIROBJ => 0, |
| 1380 | 'DERIVED-EXT' => 'BUG', |
| 1381 | DIST_SOURCE => 1, |
| 1382 | VERBOSE => $verbose, |
| 1383 | 'VERBOSE-NODEP' => $verbose_nodep, |
| 1384 | SILENT => $silent, |
| 1385 | ); |
| 1386 | |
| 1387 | # Generate the appropriate rules for this extension. |
| 1388 | if (((! option 'no-dependencies') && $lang->autodep ne 'no') |
| 1389 | || defined $lang->compile) |
| 1390 | { |
| 1391 | # Compute a possible derived extension. |
| 1392 | # This is not used by depend2.am. |
| 1393 | my $der_ext = ($lang->output_extensions->($ext))[0]; |
| 1394 | |
| 1395 | # When we output an inference rule like '.c.o:' we |
| 1396 | # have two cases to consider: either subdir-objects |
| 1397 | # is used, or it is not. |
| 1398 | # |
| 1399 | # In the latter case the rule is used to build objects |
| 1400 | # in the current directory, and dependencies always |
| 1401 | # go into './$(DEPDIR)/'. We can hard-code this value. |
| 1402 | # |
| 1403 | # In the former case the rule can be used to build |
| 1404 | # objects in sub-directories too. Dependencies should |
| 1405 | # go into the appropriate sub-directories, e.g., |
| 1406 | # 'sub/$(DEPDIR)/'. The value of this directory |
| 1407 | # needs to be computed on-the-fly. |
| 1408 | # |
| 1409 | # DEPBASE holds the name of this directory, plus the |
| 1410 | # basename part of the object file (extensions Po, TPo, |
| 1411 | # Plo, TPlo will be added later as appropriate). It is |
| 1412 | # either hardcoded, or a shell variable ('$depbase') that |
| 1413 | # will be computed by the rule. |
| 1414 | my $depbase = |
| 1415 | option ('subdir-objects') ? '$$depbase' : '$(DEPDIR)/$*'; |
| 1416 | $output_rules .= |
| 1417 | file_contents ($rule_file, |
| 1418 | new Automake::Location, |
| 1419 | %transform, |
| 1420 | GENERIC => 1, |
| 1421 | |
| 1422 | 'DERIVED-EXT' => $der_ext, |
| 1423 | |
| 1424 | DEPBASE => $depbase, |
| 1425 | BASE => '$*', |
| 1426 | SOURCE => '$<', |
| 1427 | SOURCEFLAG => $sourceflags{$ext} || '', |
| 1428 | OBJ => '$@', |
| 1429 | OBJOBJ => '$@', |
| 1430 | LTOBJ => '$@', |
| 1431 | |
| 1432 | COMPILE => '$(' . $lang->compiler . ')', |
| 1433 | LTCOMPILE => '$(LT' . $lang->compiler . ')', |
| 1434 | -o => $lang->output_flag, |
| 1435 | SUBDIROBJ => !! option 'subdir-objects'); |
| 1436 | } |
| 1437 | |
| 1438 | # Now include code for each specially handled object with this |
| 1439 | # language. |
| 1440 | my %seen_files = (); |
| 1441 | foreach my $file (@{$lang_specific_files{$lang->name}}) |
| 1442 | { |
| 1443 | my ($derived, $source, $obj, $myext, $srcext, %file_transform) = @$file; |
| 1444 | |
| 1445 | # We might see a given object twice, for instance if it is |
| 1446 | # used under different conditions. |
| 1447 | next if defined $seen_files{$obj}; |
| 1448 | $seen_files{$obj} = 1; |
| 1449 | |
| 1450 | prog_error ("found " . $lang->name . |
| 1451 | " in handle_languages, but compiler not defined") |
| 1452 | unless defined $lang->compile; |
| 1453 | |
| 1454 | my $obj_compile = $lang->compile; |
| 1455 | |
| 1456 | # Rewrite each occurrence of 'AM_$flag' in the compile |
| 1457 | # rule into '${derived}_$flag' if it exists. |
| 1458 | for my $flag (@{$lang->flags}) |
| 1459 | { |
| 1460 | my $val = "${derived}_$flag"; |
| 1461 | $obj_compile =~ s/\(AM_$flag\)/\($val\)/ |
| 1462 | if set_seen ($val); |
| 1463 | } |
| 1464 | |
| 1465 | my $libtool_tag = ''; |
| 1466 | if ($lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag}) |
| 1467 | { |
| 1468 | $libtool_tag = '--tag=' . $lang->libtool_tag . ' ' |
| 1469 | } |
| 1470 | |
| 1471 | my $ptltflags = "${derived}_LIBTOOLFLAGS"; |
| 1472 | $ptltflags = 'AM_LIBTOOLFLAGS' unless set_seen $ptltflags; |
| 1473 | |
| 1474 | my $ltverbose = define_verbose_libtool (); |
| 1475 | my $obj_ltcompile = |
| 1476 | "\$(LIBTOOL) $ltverbose $libtool_tag\$($ptltflags) \$(LIBTOOLFLAGS) " |
| 1477 | . "--mode=compile $obj_compile"; |
| 1478 | |
| 1479 | # We _need_ '-o' for per object rules. |
| 1480 | my $output_flag = $lang->output_flag || '-o'; |
| 1481 | |
| 1482 | my $depbase = dirname ($obj); |
| 1483 | $depbase = '' |
| 1484 | if $depbase eq '.'; |
| 1485 | $depbase .= '/' |
| 1486 | unless $depbase eq ''; |
| 1487 | $depbase .= '$(DEPDIR)/' . basename ($obj); |
| 1488 | |
| 1489 | $output_rules .= |
| 1490 | file_contents ($rule_file, |
| 1491 | new Automake::Location, |
| 1492 | %transform, |
| 1493 | GENERIC => 0, |
| 1494 | |
| 1495 | DEPBASE => $depbase, |
| 1496 | BASE => $obj, |
| 1497 | SOURCE => $source, |
| 1498 | SOURCEFLAG => $sourceflags{$srcext} || '', |
| 1499 | # Use $myext and not '.o' here, in case |
| 1500 | # we are actually building a new source |
| 1501 | # file -- e.g. via yacc. |
| 1502 | OBJ => "$obj$myext", |
| 1503 | OBJOBJ => "$obj.obj", |
| 1504 | LTOBJ => "$obj.lo", |
| 1505 | |
| 1506 | VERBOSE => $verbose, |
| 1507 | 'VERBOSE-NODEP' => $verbose_nodep, |
| 1508 | SILENT => $silent, |
| 1509 | COMPILE => $obj_compile, |
| 1510 | LTCOMPILE => $obj_ltcompile, |
| 1511 | -o => $output_flag, |
| 1512 | %file_transform); |
| 1513 | } |
| 1514 | |
| 1515 | # The rest of the loop is done once per language. |
| 1516 | next if defined $done{$lang}; |
| 1517 | $done{$lang} = 1; |
| 1518 | |
| 1519 | # Load the language dependent Makefile chunks. |
| 1520 | my %lang = map { uc ($_) => 0 } keys %languages; |
| 1521 | $lang{uc ($lang->name)} = 1; |
| 1522 | $output_rules .= file_contents ('lang-compile', |
| 1523 | new Automake::Location, |
| 1524 | %transform, %lang); |
| 1525 | |
| 1526 | # If the source to a program consists entirely of code from a |
| 1527 | # 'pure' language, for instance C++ or Fortran 77, then we |
| 1528 | # don't need the C compiler code. However if we run into |
| 1529 | # something unusual then we do generate the C code. There are |
| 1530 | # probably corner cases here that do not work properly. |
| 1531 | # People linking Java code to Fortran code deserve pain. |
| 1532 | $needs_c ||= ! $lang->pure; |
| 1533 | |
| 1534 | define_compiler_variable ($lang) |
| 1535 | if ($lang->compile); |
| 1536 | |
| 1537 | define_linker_variable ($lang) |
| 1538 | if ($lang->link); |
| 1539 | |
| 1540 | require_variables ("$am_file.am", $lang->Name . " source seen", |
| 1541 | TRUE, @{$lang->config_vars}); |
| 1542 | |
| 1543 | # Call the finisher. |
| 1544 | $lang->finish; |
| 1545 | |
| 1546 | # Flags listed in '->flags' are user variables (per GNU Standards), |
| 1547 | # they should not be overridden in the Makefile... |
| 1548 | my @dont_override = @{$lang->flags}; |
| 1549 | # ... and so is LDFLAGS. |
| 1550 | push @dont_override, 'LDFLAGS' if $lang->link; |
| 1551 | |
| 1552 | check_user_variables @dont_override; |
| 1553 | } |
| 1554 | |
| 1555 | # If the project is entirely C++ or entirely Fortran 77 (i.e., 1 |
| 1556 | # suffix rule was learned), don't bother with the C stuff. But if |
| 1557 | # anything else creeps in, then use it. |
| 1558 | my @languages_seen = map { $languages{$extension_map{$_}}->name } |
| 1559 | (keys %extension_seen); |
| 1560 | @languages_seen = uniq (@languages_seen); |
| 1561 | $needs_c = 1 if @languages_seen > 1; |
| 1562 | if ($need_link || $needs_c) |
| 1563 | { |
| 1564 | define_compiler_variable ($languages{'c'}) |
| 1565 | unless defined $done{$languages{'c'}}; |
| 1566 | define_linker_variable ($languages{'c'}); |
| 1567 | } |
| 1568 | } |
| 1569 | |
| 1570 | |
| 1571 | # append_exeext { PREDICATE } $MACRO |
| 1572 | # ---------------------------------- |
| 1573 | # Append $(EXEEXT) to each filename in $F appearing in the Makefile |
| 1574 | # variable $MACRO if &PREDICATE($F) is true. @substitutions@ are |
| 1575 | # ignored. |
| 1576 | # |
| 1577 | # This is typically used on all filenames of *_PROGRAMS, and filenames |
| 1578 | # of TESTS that are programs. |
| 1579 | sub append_exeext (&$) |
| 1580 | { |
| 1581 | my ($pred, $macro) = @_; |
| 1582 | |
| 1583 | transform_variable_recursively |
| 1584 | ($macro, $macro, 'am__EXEEXT', 0, INTERNAL, |
| 1585 | sub { |
| 1586 | my ($subvar, $val, $cond, $full_cond) = @_; |
| 1587 | # Append $(EXEEXT) unless the user did it already, or it's a |
| 1588 | # @substitution@. |
| 1589 | $val .= '$(EXEEXT)' |
| 1590 | if $val !~ /(?:\$\(EXEEXT\)$|^[@]\w+[@]$)/ && &$pred ($val); |
| 1591 | return $val; |
| 1592 | }); |
| 1593 | } |
| 1594 | |
| 1595 | |
| 1596 | # Check to make sure a source defined in LIBOBJS is not explicitly |
| 1597 | # mentioned. This is a separate function (as opposed to being inlined |
| 1598 | # in handle_source_transform) because it isn't always appropriate to |
| 1599 | # do this check. |
| 1600 | sub check_libobjs_sources |
| 1601 | { |
| 1602 | my ($one_file, $unxformed) = @_; |
| 1603 | |
| 1604 | foreach my $prefix ('', 'EXTRA_', 'dist_', 'nodist_', |
| 1605 | 'dist_EXTRA_', 'nodist_EXTRA_') |
| 1606 | { |
| 1607 | my @files; |
| 1608 | my $varname = $prefix . $one_file . '_SOURCES'; |
| 1609 | my $var = var ($varname); |
| 1610 | if ($var) |
| 1611 | { |
| 1612 | @files = $var->value_as_list_recursive; |
| 1613 | } |
| 1614 | elsif ($prefix eq '') |
| 1615 | { |
| 1616 | @files = ($unxformed . '.c'); |
| 1617 | } |
| 1618 | else |
| 1619 | { |
| 1620 | next; |
| 1621 | } |
| 1622 | |
| 1623 | foreach my $file (@files) |
| 1624 | { |
| 1625 | err_var ($prefix . $one_file . '_SOURCES', |
| 1626 | "automatically discovered file '$file' should not" . |
| 1627 | " be explicitly mentioned") |
| 1628 | if defined $libsources{$file}; |
| 1629 | } |
| 1630 | } |
| 1631 | } |
| 1632 | |
| 1633 | |
| 1634 | # @OBJECTS |
| 1635 | # handle_single_transform ($VAR, $TOPPARENT, $DERIVED, $OBJ, $FILE, %TRANSFORM) |
| 1636 | # ----------------------------------------------------------------------------- |
| 1637 | # Does much of the actual work for handle_source_transform. |
| 1638 | # Arguments are: |
| 1639 | # $VAR is the name of the variable that the source filenames come from |
| 1640 | # $TOPPARENT is the name of the _SOURCES variable which is being processed |
| 1641 | # $DERIVED is the name of resulting executable or library |
| 1642 | # $OBJ is the object extension (e.g., '.lo') |
| 1643 | # $FILE the source file to transform |
| 1644 | # %TRANSFORM contains extras arguments to pass to file_contents |
| 1645 | # when producing explicit rules |
| 1646 | # Result is a list of the names of objects |
| 1647 | # %linkers_used will be updated with any linkers needed |
| 1648 | sub handle_single_transform |
| 1649 | { |
| 1650 | my ($var, $topparent, $derived, $obj, $_file, %transform) = @_; |
| 1651 | my @files = ($_file); |
| 1652 | my @result = (); |
| 1653 | |
| 1654 | # Turn sources into objects. We use a while loop like this |
| 1655 | # because we might add to @files in the loop. |
| 1656 | while (scalar @files > 0) |
| 1657 | { |
| 1658 | $_ = shift @files; |
| 1659 | |
| 1660 | # Configure substitutions in _SOURCES variables are errors. |
| 1661 | if (/^\@.*\@$/) |
| 1662 | { |
| 1663 | my $parent_msg = ''; |
| 1664 | $parent_msg = "\nand is referred to from '$topparent'" |
| 1665 | if $topparent ne $var->name; |
| 1666 | err_var ($var, |
| 1667 | "'" . $var->name . "' includes configure substitution '$_'" |
| 1668 | . $parent_msg . ";\nconfigure " . |
| 1669 | "substitutions are not allowed in _SOURCES variables"); |
| 1670 | next; |
| 1671 | } |
| 1672 | |
| 1673 | # If the source file is in a subdirectory then the '.o' is put |
| 1674 | # into the current directory, unless the subdir-objects option |
| 1675 | # is in effect. |
| 1676 | |
| 1677 | # Split file name into base and extension. |
| 1678 | next if ! /^(?:(.*)\/)?([^\/]*)($KNOWN_EXTENSIONS_PATTERN)$/; |
| 1679 | my $full = $_; |
| 1680 | my $directory = $1 || ''; |
| 1681 | my $base = $2; |
| 1682 | my $extension = $3; |
| 1683 | |
| 1684 | # We must generate a rule for the object if it requires its own flags. |
| 1685 | my $renamed = 0; |
| 1686 | my ($linker, $object); |
| 1687 | |
| 1688 | # This records whether we've seen a derived source file (e.g., yacc |
| 1689 | # or lex output). |
| 1690 | my $derived_source; |
| 1691 | |
| 1692 | # This holds the 'aggregate context' of the file we are |
| 1693 | # currently examining. If the file is compiled with |
| 1694 | # per-object flags, then it will be the name of the object. |
| 1695 | # Otherwise it will be 'AM'. This is used by the target hook |
| 1696 | # language function. |
| 1697 | my $aggregate = 'AM'; |
| 1698 | |
| 1699 | $extension = derive_suffix ($extension, $obj); |
| 1700 | my $lang; |
| 1701 | if ($extension_map{$extension} && |
| 1702 | ($lang = $languages{$extension_map{$extension}})) |
| 1703 | { |
| 1704 | # Found the language, so see what it says. |
| 1705 | saw_extension ($extension); |
| 1706 | |
| 1707 | # Do we have per-executable flags for this executable? |
| 1708 | my $have_per_exec_flags = 0; |
| 1709 | my @peflags = @{$lang->flags}; |
| 1710 | push @peflags, 'LIBTOOLFLAGS' if $obj eq '.lo'; |
| 1711 | foreach my $flag (@peflags) |
| 1712 | { |
| 1713 | if (set_seen ("${derived}_$flag")) |
| 1714 | { |
| 1715 | $have_per_exec_flags = 1; |
| 1716 | last; |
| 1717 | } |
| 1718 | } |
| 1719 | |
| 1720 | # Note: computed subr call. The language rewrite function |
| 1721 | # should return one of the LANG_* constants. It could |
| 1722 | # also return a list whose first value is such a constant |
| 1723 | # and whose second value is a new source extension which |
| 1724 | # should be applied. This means this particular language |
| 1725 | # generates another source file which we must then process |
| 1726 | # further. |
| 1727 | my $subr = \&{'lang_' . $lang->name . '_rewrite'}; |
| 1728 | defined &$subr or $subr = \&lang_sub_obj; |
| 1729 | my ($r, $source_extension) |
| 1730 | = &$subr ($directory, $base, $extension, |
| 1731 | $obj, $have_per_exec_flags, $var); |
| 1732 | # Skip this entry if we were asked not to process it. |
| 1733 | next if $r == LANG_IGNORE; |
| 1734 | |
| 1735 | # Now extract linker and other info. |
| 1736 | $linker = $lang->linker; |
| 1737 | |
| 1738 | my $this_obj_ext; |
| 1739 | if (defined $source_extension) |
| 1740 | { |
| 1741 | $this_obj_ext = $source_extension; |
| 1742 | $derived_source = 1; |
| 1743 | } |
| 1744 | else |
| 1745 | { |
| 1746 | $this_obj_ext = $obj; |
| 1747 | $derived_source = 0; |
| 1748 | # Don't ever place built object files in $(srcdir), |
| 1749 | # even when sources are specified explicitly as (say) |
| 1750 | # '$(srcdir)/foo.c' or '$(top_srcdir)/foo.c'. |
| 1751 | # See automake bug#13928. |
| 1752 | my @d = split '/', $directory; |
| 1753 | if (@d > 0 && option 'subdir-objects') |
| 1754 | { |
| 1755 | my $d = $d[0]; |
| 1756 | if ($d eq '$(srcdir)' or $d eq '${srcdir}') |
| 1757 | { |
| 1758 | shift @d; |
| 1759 | } |
| 1760 | elsif ($d eq '$(top_srcdir)' or $d eq '${top_srcdir}') |
| 1761 | { |
| 1762 | $d[0] = '$(top_builddir)'; |
| 1763 | } |
| 1764 | $directory = join '/', @d; |
| 1765 | } |
| 1766 | } |
| 1767 | $object = $base . $this_obj_ext; |
| 1768 | |
| 1769 | if ($have_per_exec_flags) |
| 1770 | { |
| 1771 | # We have a per-executable flag in effect for this |
| 1772 | # object. In this case we rewrite the object's |
| 1773 | # name to ensure it is unique. |
| 1774 | |
| 1775 | # We choose the name 'DERIVED_OBJECT' to ensure (1) uniqueness, |
| 1776 | # and (2) continuity between invocations. However, this will |
| 1777 | # result in a name that is too long for losing systems, in some |
| 1778 | # situations. So we attempt to shorten automatically under |
| 1779 | # subdir-objects, and provide _SHORTNAME to override as a last |
| 1780 | # resort. If subdir-object is in effect, it's usually |
| 1781 | # unnecessary to use the complete 'DERIVED_OBJECT' (that is |
| 1782 | # often the result from %canon_reldir%/%C% usage) since objects |
| 1783 | # are placed next to their source file. Generally, this means |
| 1784 | # it is already unique within that directory (see below for an |
| 1785 | # exception). Thus, we try to avoid unnecessarily long file |
| 1786 | # names by stripping the directory components of |
| 1787 | # 'DERIVED_OBJECT'. This allows avoiding explicit _SHORTNAME |
| 1788 | # usage in many cases. EXCEPTION: If two (or more) targets in |
| 1789 | # different directories but with the same base name (after |
| 1790 | # canonicalization), using target-specific FLAGS, link the same |
| 1791 | # object, then this logic clashes. Thus, we don't strip if |
| 1792 | # this is detected. |
| 1793 | my $dname = $derived; |
| 1794 | if ($directory ne '' |
| 1795 | && option 'subdir-objects' |
| 1796 | && none { $dname =~ /$_[0]$/ } @dup_shortnames) |
| 1797 | { |
| 1798 | # At this point, we don't clear information about what |
| 1799 | # parts of $derived are truly file name components. We can |
| 1800 | # determine that by comparing against the canonicalization |
| 1801 | # of $directory. |
| 1802 | my $dir = $directory . "/"; |
| 1803 | my $cdir = canonicalize ($dir); |
| 1804 | my $dir_len = length ($dir); |
| 1805 | # Make sure we only strip full file name components. This |
| 1806 | # is done by repeatedly trying to find cdir at the |
| 1807 | # beginning. Each iteration removes one file name |
| 1808 | # component from the end of cdir. |
| 1809 | while ($dir_len > 0 && index ($derived, $cdir) != 0) |
| 1810 | { |
| 1811 | # Eventually $dir_len becomes 0. |
| 1812 | $dir_len = rindex ($dir, "/", $dir_len - 2) + 1; |
| 1813 | $cdir = substr ($cdir, 0, $dir_len); |
| 1814 | } |
| 1815 | $dname = substr ($derived, $dir_len); |
| 1816 | } |
| 1817 | my $var = var ($derived . '_SHORTNAME'); |
| 1818 | if ($var) |
| 1819 | { |
| 1820 | # FIXME: should use the same Condition as |
| 1821 | # the _SOURCES variable. But this is really |
| 1822 | # silly overkill -- nobody should have |
| 1823 | # conditional shortnames. |
| 1824 | $dname = $var->variable_value; |
| 1825 | } |
| 1826 | $object = $dname . '-' . $object; |
| 1827 | |
| 1828 | prog_error ($lang->name . " flags defined without compiler") |
| 1829 | if ! defined $lang->compile; |
| 1830 | |
| 1831 | $renamed = 1; |
| 1832 | } |
| 1833 | |
| 1834 | # If rewrite said it was ok, put the object into a subdir. |
| 1835 | if ($directory ne '') |
| 1836 | { |
| 1837 | if ($r == LANG_SUBDIR) |
| 1838 | { |
| 1839 | $object = $directory . '/' . $object; |
| 1840 | } |
| 1841 | else |
| 1842 | { |
| 1843 | # Since the next major version of automake (2.0) will |
| 1844 | # make the behaviour so far only activated with the |
| 1845 | # 'subdir-objects' option mandatory, it's better if we |
| 1846 | # start warning users not using that option. |
| 1847 | # As suggested by Peter Johansson, we strive to avoid |
| 1848 | # the warning when it would be irrelevant, i.e., if |
| 1849 | # all source files sit in "current" directory. |
| 1850 | # |
| 1851 | # There are problems with making this change; see |
| 1852 | # https://bugs.gnu.org/20699 before making |
| 1853 | # subdir-objects, let alone unconditional. |
| 1854 | # (Making it non-overridable seems especially wrong.) |
| 1855 | # |
| 1856 | msg_var 'unsupported', $var, |
| 1857 | "source file '$full' is in a subdirectory," |
| 1858 | . "\nbut option 'subdir-objects' is disabled"; |
| 1859 | msg 'unsupported', INTERNAL, <<'EOF', uniq_scope => US_GLOBAL; |
| 1860 | possible forward-incompatibility. |
| 1861 | At least one source file is in a subdirectory, but the 'subdir-objects' |
| 1862 | automake option hasn't been enabled. For now, the corresponding output |
| 1863 | object file(s) will be placed in the top-level directory. However, this |
| 1864 | behavior may change in a future Automake major version, with object |
| 1865 | files being placed in the same subdirectory as the corresponding sources. |
| 1866 | You are advised to start using 'subdir-objects' option throughout your |
| 1867 | project, to avoid future incompatibilities. |
| 1868 | EOF |
| 1869 | } |
| 1870 | } |
| 1871 | |
| 1872 | # If the object file has been renamed (because per-target |
| 1873 | # flags are used) we cannot compile the file with an |
| 1874 | # inference rule: we need an explicit rule. |
| 1875 | # |
| 1876 | # If the source is in a subdirectory and the object is in |
| 1877 | # the current directory, we also need an explicit rule. |
| 1878 | # |
| 1879 | # If both source and object files are in a subdirectory |
| 1880 | # (this happens when the subdir-objects option is used), |
| 1881 | # then the inference will work. |
| 1882 | # |
| 1883 | # The latter case deserves a historical note. When the |
| 1884 | # subdir-objects option was added on 1999-04-11 it was |
| 1885 | # thought that inferences rules would work for |
| 1886 | # subdirectory objects too. Later, on 1999-11-22, |
| 1887 | # automake was changed to output explicit rules even for |
| 1888 | # subdir-objects. Nobody remembers why, but this occurred |
| 1889 | # soon after the merge of the user-dep-gen-branch so it |
| 1890 | # might be related. In late 2003 people complained about |
| 1891 | # the size of the generated Makefile.ins (libgcj, with |
| 1892 | # 2200+ subdir objects was reported to have a 9MB |
| 1893 | # Makefile), so we now rely on inference rules again. |
| 1894 | # Maybe we'll run across the same issue as in the past, |
| 1895 | # but at least this time we can document it. However since |
| 1896 | # dependency tracking has evolved it is possible that |
| 1897 | # our old problem no longer exists. |
| 1898 | # Using inference rules for subdir-objects has been tested |
| 1899 | # with GNU make, Solaris make, Ultrix make, BSD make, |
| 1900 | # HP-UX make, and OSF1 make successfully. |
| 1901 | if ($renamed |
| 1902 | || ($directory ne '' && ! option 'subdir-objects') |
| 1903 | # We must also use specific rules for a nodist_ source |
| 1904 | # if its language requests it. |
| 1905 | || ($lang->nodist_specific && ! $transform{'DIST_SOURCE'})) |
| 1906 | { |
| 1907 | my $obj_sans_ext = substr ($object, 0, |
| 1908 | - length ($this_obj_ext)); |
| 1909 | my $full_ansi; |
| 1910 | if ($directory ne '') |
| 1911 | { |
| 1912 | $full_ansi = $directory . '/' . $base . $extension; |
| 1913 | } |
| 1914 | else |
| 1915 | { |
| 1916 | $full_ansi = $base . $extension; |
| 1917 | } |
| 1918 | |
| 1919 | my @specifics = ($full_ansi, $obj_sans_ext, |
| 1920 | # Only use $this_obj_ext in the derived |
| 1921 | # source case because in the other case we |
| 1922 | # *don't* want $(OBJEXT) to appear here. |
| 1923 | ($derived_source ? $this_obj_ext : '.o'), |
| 1924 | $extension); |
| 1925 | |
| 1926 | # If we renamed the object then we want to use the |
| 1927 | # per-executable flag name. But if this is simply a |
| 1928 | # subdir build then we still want to use the AM_ flag |
| 1929 | # name. |
| 1930 | if ($renamed) |
| 1931 | { |
| 1932 | unshift @specifics, $derived; |
| 1933 | $aggregate = $derived; |
| 1934 | } |
| 1935 | else |
| 1936 | { |
| 1937 | unshift @specifics, 'AM'; |
| 1938 | } |
| 1939 | |
| 1940 | # Each item on this list is a reference to a list consisting |
| 1941 | # of four values followed by additional transform flags for |
| 1942 | # file_contents. The four values are the derived flag prefix |
| 1943 | # (e.g. for 'foo_CFLAGS', it is 'foo'), the name of the |
| 1944 | # source file, the base name of the output file, and |
| 1945 | # the extension for the object file. |
| 1946 | push (@{$lang_specific_files{$lang->name}}, |
| 1947 | [@specifics, %transform]); |
| 1948 | } |
| 1949 | } |
| 1950 | elsif ($extension eq $obj) |
| 1951 | { |
| 1952 | # This is probably the result of a direct suffix rule. |
| 1953 | # In this case we just accept the rewrite. |
| 1954 | $object = "$base$extension"; |
| 1955 | $object = "$directory/$object" if $directory ne ''; |
| 1956 | $linker = ''; |
| 1957 | } |
| 1958 | else |
| 1959 | { |
| 1960 | # No error message here. Used to have one, but it was |
| 1961 | # very unpopular. |
| 1962 | # FIXME: we could potentially do more processing here, |
| 1963 | # perhaps treating the new extension as though it were a |
| 1964 | # new source extension (as above). This would require |
| 1965 | # more restructuring than is appropriate right now. |
| 1966 | next; |
| 1967 | } |
| 1968 | |
| 1969 | err_am "object '$object' created by '$full' and '$object_map{$object}'" |
| 1970 | if (defined $object_map{$object} |
| 1971 | && $object_map{$object} ne $full); |
| 1972 | |
| 1973 | my $comp_val = (($object =~ /\.lo$/) |
| 1974 | ? COMPILE_LIBTOOL : COMPILE_ORDINARY); |
| 1975 | (my $comp_obj = $object) =~ s/\.lo$/.\$(OBJEXT)/; |
| 1976 | if (defined $object_compilation_map{$comp_obj} |
| 1977 | && $object_compilation_map{$comp_obj} != 0 |
| 1978 | # Only see the error once. |
| 1979 | && ($object_compilation_map{$comp_obj} |
| 1980 | != (COMPILE_LIBTOOL | COMPILE_ORDINARY)) |
| 1981 | && $object_compilation_map{$comp_obj} != $comp_val) |
| 1982 | { |
| 1983 | err_am "object '$comp_obj' created both with libtool and without"; |
| 1984 | } |
| 1985 | $object_compilation_map{$comp_obj} |= $comp_val; |
| 1986 | |
| 1987 | if (defined $lang) |
| 1988 | { |
| 1989 | # Let the language do some special magic if required. |
| 1990 | $lang->target_hook ($aggregate, $object, $full, %transform); |
| 1991 | } |
| 1992 | |
| 1993 | if ($derived_source) |
| 1994 | { |
| 1995 | prog_error ($lang->name . " has automatic dependency tracking") |
| 1996 | if $lang->autodep ne 'no'; |
| 1997 | # Make sure this new source file is handled next. That will |
| 1998 | # make it appear to be at the right place in the list. |
| 1999 | unshift (@files, $object); |
| 2000 | # Distribute derived sources unless the source they are |
| 2001 | # derived from is not. |
| 2002 | push_dist_common ($object) |
| 2003 | unless ($topparent =~ /^(?:nobase_)?nodist_/); |
| 2004 | next; |
| 2005 | } |
| 2006 | |
| 2007 | $linkers_used{$linker} = 1; |
| 2008 | |
| 2009 | push (@result, $object); |
| 2010 | |
| 2011 | if (! defined $object_map{$object}) |
| 2012 | { |
| 2013 | my @dep_list = (); |
| 2014 | $object_map{$object} = $full; |
| 2015 | |
| 2016 | # If resulting object is in subdir, we need to make |
| 2017 | # sure the subdir exists at build time. |
| 2018 | if ($object =~ /\//) |
| 2019 | { |
| 2020 | # FIXME: check that $DIRECTORY is somewhere in the |
| 2021 | # project |
| 2022 | |
| 2023 | # For Java, the way we're handling it right now, a |
| 2024 | # '..' component doesn't make sense. |
| 2025 | if ($lang && $lang->name eq 'java' && $object =~ /(\/|^)\.\.\//) |
| 2026 | { |
| 2027 | err_am "'$full' should not contain a '..' component"; |
| 2028 | } |
| 2029 | |
| 2030 | # Make sure *all* objects files in the subdirectory are |
| 2031 | # removed by "make mostlyclean". Not only this is more |
| 2032 | # efficient than listing the object files to be removed |
| 2033 | # individually (which would cause an 'rm' invocation for |
| 2034 | # each of them -- very inefficient, see bug#10697), it |
| 2035 | # would also leave stale object files in the subdirectory |
| 2036 | # whenever a source file there is removed or renamed. |
| 2037 | $compile_clean_files{"$directory/*.\$(OBJEXT)"} = MOSTLY_CLEAN; |
| 2038 | if ($object =~ /\.lo$/) |
| 2039 | { |
| 2040 | # If we have a libtool object, then we also must remove |
| 2041 | # any '.lo' objects in its same subdirectory. |
| 2042 | $compile_clean_files{"$directory/*.lo"} = MOSTLY_CLEAN; |
| 2043 | # Remember to cleanup .libs/ in this directory. |
| 2044 | $libtool_clean_directories{$directory} = 1; |
| 2045 | } |
| 2046 | |
| 2047 | push (@dep_list, require_build_directory ($directory)); |
| 2048 | |
| 2049 | # If we're generating dependencies, we also want |
| 2050 | # to make sure that the appropriate subdir of the |
| 2051 | # .deps directory is created. |
| 2052 | push (@dep_list, |
| 2053 | require_build_directory ($directory . '/$(DEPDIR)')) |
| 2054 | unless option 'no-dependencies'; |
| 2055 | } |
| 2056 | |
| 2057 | pretty_print_rule ($object . ':', "\t", @dep_list) |
| 2058 | if scalar @dep_list > 0; |
| 2059 | } |
| 2060 | |
| 2061 | # Transform .o or $o file into .P file (for automatic |
| 2062 | # dependency code). |
| 2063 | # Properly flatten multiple adjacent slashes, as Solaris 10 make |
| 2064 | # might fail over them in an include statement. |
| 2065 | # Leading double slashes may be special, as per Posix, so deal |
| 2066 | # with them carefully. |
| 2067 | if ($lang && $lang->autodep ne 'no') |
| 2068 | { |
| 2069 | my $depfile = $object; |
| 2070 | $depfile =~ s/\.([^.]*)$/.P$1/; |
| 2071 | $depfile =~ s/\$\(OBJEXT\)$/o/; |
| 2072 | my $maybe_extra_leading_slash = ''; |
| 2073 | $maybe_extra_leading_slash = '/' if $depfile =~ m,^//[^/],; |
| 2074 | $depfile =~ s,/+,/,g; |
| 2075 | my $basename = basename ($depfile); |
| 2076 | # This might make $dirname empty, but we account for that below. |
| 2077 | (my $dirname = dirname ($depfile)) =~ s/\/*$//; |
| 2078 | $dirname = $maybe_extra_leading_slash . $dirname; |
| 2079 | $dep_files{$dirname . '/$(DEPDIR)/' . $basename} = 1; |
| 2080 | } |
| 2081 | } |
| 2082 | |
| 2083 | return @result; |
| 2084 | } |
| 2085 | |
| 2086 | |
| 2087 | # $LINKER |
| 2088 | # define_objects_from_sources ($VAR, $OBJVAR, $NODEFINE, $ONE_FILE, |
| 2089 | # $OBJ, $PARENT, $TOPPARENT, $WHERE, %TRANSFORM) |
| 2090 | # --------------------------------------------------------------------------- |
| 2091 | # Define an _OBJECTS variable for a _SOURCES variable (or subvariable) |
| 2092 | # |
| 2093 | # Arguments are: |
| 2094 | # $VAR is the name of the _SOURCES variable |
| 2095 | # $OBJVAR is the name of the _OBJECTS variable if known (otherwise |
| 2096 | # it will be generated and returned). |
| 2097 | # $NODEFINE is a boolean: if true, $OBJVAR will not be defined (but |
| 2098 | # work done to determine the linker will be). |
| 2099 | # $ONE_FILE is the canonical (transformed) name of object to build |
| 2100 | # $OBJ is the object extension (i.e. either '.o' or '.lo'). |
| 2101 | # $TOPPARENT is the _SOURCES variable being processed. |
| 2102 | # $WHERE context into which this definition is done |
| 2103 | # %TRANSFORM extra arguments to pass to file_contents when producing |
| 2104 | # rules |
| 2105 | # |
| 2106 | # Result is a pair ($LINKER, $OBJVAR): |
| 2107 | # $LINKER is a boolean, true if a linker is needed to deal with the objects |
| 2108 | sub define_objects_from_sources |
| 2109 | { |
| 2110 | my ($var, $objvar, $nodefine, $one_file, |
| 2111 | $obj, $topparent, $where, %transform) = @_; |
| 2112 | |
| 2113 | my $needlinker = ""; |
| 2114 | |
| 2115 | transform_variable_recursively |
| 2116 | ($var, $objvar, 'am__objects', $nodefine, $where, |
| 2117 | # The transform code to run on each filename. |
| 2118 | sub { |
| 2119 | my ($subvar, $val, $cond, $full_cond) = @_; |
| 2120 | my @trans = handle_single_transform ($subvar, $topparent, |
| 2121 | $one_file, $obj, $val, |
| 2122 | %transform); |
| 2123 | $needlinker = "true" if @trans; |
| 2124 | return @trans; |
| 2125 | }); |
| 2126 | |
| 2127 | return $needlinker; |
| 2128 | } |
| 2129 | |
| 2130 | |
| 2131 | # handle_source_transform ($CANON_TARGET, $TARGET, $OBJEXT, $WHERE, %TRANSFORM) |
| 2132 | # ----------------------------------------------------------------------------- |
| 2133 | # Handle SOURCE->OBJECT transform for one program or library. |
| 2134 | # Arguments are: |
| 2135 | # canonical (transformed) name of target to build |
| 2136 | # actual target of object to build |
| 2137 | # object extension (i.e., either '.o' or '$o') |
| 2138 | # location of the source variable |
| 2139 | # extra arguments to pass to file_contents when producing rules |
| 2140 | # Return the name of the linker variable that must be used. |
| 2141 | # Empty return means just use 'LINK'. |
| 2142 | sub handle_source_transform |
| 2143 | { |
| 2144 | # one_file is canonical name. unxformed is given name. obj is |
| 2145 | # object extension. |
| 2146 | my ($one_file, $unxformed, $obj, $where, %transform) = @_; |
| 2147 | |
| 2148 | my $linker = ''; |
| 2149 | |
| 2150 | # No point in continuing if _OBJECTS is defined. |
| 2151 | return if reject_var ($one_file . '_OBJECTS', |
| 2152 | $one_file . '_OBJECTS should not be defined'); |
| 2153 | |
| 2154 | my %used_pfx = (); |
| 2155 | my $needlinker; |
| 2156 | %linkers_used = (); |
| 2157 | foreach my $prefix ('', 'EXTRA_', 'dist_', 'nodist_', |
| 2158 | 'dist_EXTRA_', 'nodist_EXTRA_') |
| 2159 | { |
| 2160 | my $varname = $prefix . $one_file . "_SOURCES"; |
| 2161 | my $var = var $varname; |
| 2162 | next unless $var; |
| 2163 | |
| 2164 | # We are going to define _OBJECTS variables using the prefix. |
| 2165 | # Then we glom them all together. So we can't use the null |
| 2166 | # prefix here as we need it later. |
| 2167 | my $xpfx = ($prefix eq '') ? 'am_' : $prefix; |
| 2168 | |
| 2169 | # Keep track of which prefixes we saw. |
| 2170 | $used_pfx{$xpfx} = 1 |
| 2171 | unless $prefix =~ /EXTRA_/; |
| 2172 | |
| 2173 | push @sources, "\$($varname)"; |
| 2174 | push @dist_sources, shadow_unconditionally ($varname, $where) |
| 2175 | unless (option ('no-dist') || $prefix =~ /^nodist_/); |
| 2176 | |
| 2177 | $needlinker |= |
| 2178 | define_objects_from_sources ($varname, |
| 2179 | $xpfx . $one_file . '_OBJECTS', |
| 2180 | !!($prefix =~ /EXTRA_/), |
| 2181 | $one_file, $obj, $varname, $where, |
| 2182 | DIST_SOURCE => ($prefix !~ /^nodist_/), |
| 2183 | %transform); |
| 2184 | } |
| 2185 | if ($needlinker) |
| 2186 | { |
| 2187 | $linker ||= resolve_linker (%linkers_used); |
| 2188 | } |
| 2189 | |
| 2190 | my @keys = sort keys %used_pfx; |
| 2191 | if (scalar @keys == 0) |
| 2192 | { |
| 2193 | # The default source for libfoo.la is libfoo.c, but for |
| 2194 | # backward compatibility we first look at libfoo_la.c, |
| 2195 | # if no default source suffix is given. |
| 2196 | my $old_default_source = "$one_file.c"; |
| 2197 | my $ext_var = var ('AM_DEFAULT_SOURCE_EXT'); |
| 2198 | my $default_source_ext = $ext_var ? variable_value ($ext_var) : '.c'; |
| 2199 | msg_var ('unsupported', $ext_var, $ext_var->name . " can assume at most one value") |
| 2200 | if $default_source_ext =~ /[\t ]/; |
| 2201 | (my $default_source = $unxformed) =~ s,(\.[^./\\]*)?$,$default_source_ext,; |
| 2202 | # TODO: Remove this backward-compatibility hack in Automake 2.0. |
| 2203 | if ($old_default_source ne $default_source |
| 2204 | && !$ext_var |
| 2205 | && (rule $old_default_source |
| 2206 | || rule '$(srcdir)/' . $old_default_source |
| 2207 | || rule '${srcdir}/' . $old_default_source |
| 2208 | || -f $old_default_source)) |
| 2209 | { |
| 2210 | my $loc = $where->clone; |
| 2211 | $loc->pop_context; |
| 2212 | msg ('obsolete', $loc, |
| 2213 | "the default source for '$unxformed' has been changed " |
| 2214 | . "to '$default_source'.\n(Using '$old_default_source' for " |
| 2215 | . "backward compatibility.)"); |
| 2216 | $default_source = $old_default_source; |
| 2217 | } |
| 2218 | # If a rule exists to build this source with a $(srcdir) |
| 2219 | # prefix, use that prefix in our variables too. This is for |
| 2220 | # the sake of BSD Make. |
| 2221 | if (rule '$(srcdir)/' . $default_source |
| 2222 | || rule '${srcdir}/' . $default_source) |
| 2223 | { |
| 2224 | $default_source = '$(srcdir)/' . $default_source; |
| 2225 | } |
| 2226 | |
| 2227 | define_variable ($one_file . "_SOURCES", $default_source, $where); |
| 2228 | push (@sources, $default_source); |
| 2229 | push (@dist_sources, $default_source); |
| 2230 | |
| 2231 | %linkers_used = (); |
| 2232 | my (@result) = |
| 2233 | handle_single_transform ($one_file . '_SOURCES', |
| 2234 | $one_file . '_SOURCES', |
| 2235 | $one_file, $obj, |
| 2236 | $default_source, %transform); |
| 2237 | $linker ||= resolve_linker (%linkers_used); |
| 2238 | define_pretty_variable ($one_file . '_OBJECTS', TRUE, $where, @result); |
| 2239 | } |
| 2240 | else |
| 2241 | { |
| 2242 | @keys = map { '$(' . $_ . $one_file . '_OBJECTS)' } @keys; |
| 2243 | define_pretty_variable ($one_file . '_OBJECTS', TRUE, $where, @keys); |
| 2244 | } |
| 2245 | |
| 2246 | # If we want to use 'LINK' we must make sure it is defined. |
| 2247 | if ($linker eq '') |
| 2248 | { |
| 2249 | $need_link = 1; |
| 2250 | } |
| 2251 | |
| 2252 | return $linker; |
| 2253 | } |
| 2254 | |
| 2255 | |
| 2256 | # handle_lib_objects ($XNAME, $VAR) |
| 2257 | # --------------------------------- |
| 2258 | # Special-case ALLOCA and LIBOBJS substitutions in _LDADD or _LIBADD variables. |
| 2259 | # Also, generate _DEPENDENCIES variable if appropriate. |
| 2260 | # Arguments are: |
| 2261 | # transformed name of object being built, or empty string if no object |
| 2262 | # name of _LDADD/_LIBADD-type variable to examine |
| 2263 | # Returns 1 if LIBOBJS seen, 0 otherwise. |
| 2264 | sub handle_lib_objects |
| 2265 | { |
| 2266 | my ($xname, $varname) = @_; |
| 2267 | |
| 2268 | my $var = var ($varname); |
| 2269 | prog_error "'$varname' undefined" |
| 2270 | unless $var; |
| 2271 | prog_error "unexpected variable name '$varname'" |
| 2272 | unless $varname =~ /^(.*)(?:LIB|LD)ADD$/; |
| 2273 | my $prefix = $1 || 'AM_'; |
| 2274 | |
| 2275 | my $seen_libobjs = 0; |
| 2276 | my $flagvar = 0; |
| 2277 | |
| 2278 | transform_variable_recursively |
| 2279 | ($varname, $xname . '_DEPENDENCIES', 'am__DEPENDENCIES', |
| 2280 | ! $xname, INTERNAL, |
| 2281 | # Transformation function, run on each filename. |
| 2282 | sub { |
| 2283 | my ($subvar, $val, $cond, $full_cond) = @_; |
| 2284 | |
| 2285 | if ($val =~ /^-/) |
| 2286 | { |
| 2287 | # Skip -lfoo and -Ldir silently; these are explicitly allowed. |
| 2288 | if ($val !~ /^-[lL]/ && |
| 2289 | # Skip -dlopen and -dlpreopen; these are explicitly allowed |
| 2290 | # for Libtool libraries or programs. (Actually we are a bit |
| 2291 | # lax here since this code also applies to non-libtool |
| 2292 | # libraries or programs, for which -dlopen and -dlopreopen |
| 2293 | # are pure nonsense. Diagnosing this doesn't seem very |
| 2294 | # important: the developer will quickly get complaints from |
| 2295 | # the linker.) |
| 2296 | $val !~ /^-dl(?:pre)?open$/ && |
| 2297 | # Only get this error once. |
| 2298 | ! $flagvar) |
| 2299 | { |
| 2300 | $flagvar = 1; |
| 2301 | # FIXME: should display a stack of nested variables |
| 2302 | # as context when $var != $subvar. |
| 2303 | err_var ($var, "linker flags such as '$val' belong in " |
| 2304 | . "'${prefix}LDFLAGS'"); |
| 2305 | } |
| 2306 | return (); |
| 2307 | } |
| 2308 | elsif ($val !~ /^\@.*\@$/) |
| 2309 | { |
| 2310 | # Assume we have a file of some sort, and output it into the |
| 2311 | # dependency variable. Autoconf substitutions are not output; |
| 2312 | # rarely is a new dependency substituted into e.g. foo_LDADD |
| 2313 | # -- but bad things (e.g. -lX11) are routinely substituted. |
| 2314 | # Note that LIBOBJS and ALLOCA are exceptions to this rule, |
| 2315 | # and handled specially below. |
| 2316 | return $val; |
| 2317 | } |
| 2318 | elsif ($val =~ /^\@(LT)?LIBOBJS\@$/) |
| 2319 | { |
| 2320 | handle_LIBOBJS ($subvar, $cond, $1); |
| 2321 | $seen_libobjs = 1; |
| 2322 | return $val; |
| 2323 | } |
| 2324 | elsif ($val =~ /^\@(LT)?ALLOCA\@$/) |
| 2325 | { |
| 2326 | handle_ALLOCA ($subvar, $cond, $1); |
| 2327 | return $val; |
| 2328 | } |
| 2329 | else |
| 2330 | { |
| 2331 | return (); |
| 2332 | } |
| 2333 | }); |
| 2334 | |
| 2335 | return $seen_libobjs; |
| 2336 | } |
| 2337 | |
| 2338 | # handle_LIBOBJS_or_ALLOCA ($VAR, $BASE) |
| 2339 | # -------------------------------------- |
| 2340 | # Definitions common to LIBOBJS and ALLOCA. |
| 2341 | # VAR should be one of LIBOBJS, LTLIBOBJS, ALLOCA, or LTALLOCA. |
| 2342 | # BASE should be one base file name from AC_LIBSOURCE, or alloca. |
| 2343 | sub handle_LIBOBJS_or_ALLOCA |
| 2344 | { |
| 2345 | my ($var, $base) = @_; |
| 2346 | |
| 2347 | my $dir = ''; |
| 2348 | |
| 2349 | # If LIBOBJS files must be built in another directory we have |
| 2350 | # to define LIBOBJDIR and ensure the files get cleaned. |
| 2351 | # Otherwise LIBOBJDIR can be left undefined, and the cleaning |
| 2352 | # is achieved by 'rm -f *.$(OBJEXT)' in compile.am. |
| 2353 | if ($config_libobj_dir |
| 2354 | && $relative_dir ne $config_libobj_dir) |
| 2355 | { |
| 2356 | if (option 'subdir-objects') |
| 2357 | { |
| 2358 | # In the top-level Makefile we do not use $(top_builddir), because |
| 2359 | # we are already there, and since the targets are built without |
| 2360 | # a $(top_builddir), it helps BSD Make to match them with |
| 2361 | # dependencies. |
| 2362 | $dir = "$config_libobj_dir/" |
| 2363 | if $config_libobj_dir ne '.'; |
| 2364 | $dir = backname ($relative_dir) . "/$dir" |
| 2365 | if $relative_dir ne '.'; |
| 2366 | define_variable ('LIBOBJDIR', "$dir", INTERNAL); |
| 2367 | if ($dir && !defined $clean_files{"$dir$base.\$(OBJEXT)"}) |
| 2368 | { |
| 2369 | my $dirstamp = require_build_directory ($dir); |
| 2370 | $output_rules .= "$dir$base.\$(OBJEXT): $dirstamp\n"; |
| 2371 | $output_rules .= "$dir$base.lo: $dirstamp\n" |
| 2372 | if ($var =~ /^LT/); |
| 2373 | } |
| 2374 | # libtool might create .$(OBJEXT) as a side-effect of using |
| 2375 | # LTLIBOBJS or LTALLOCA. |
| 2376 | $clean_files{"$dir$base.\$(OBJEXT)"} = MOSTLY_CLEAN; |
| 2377 | $clean_files{"$dir$base.lo"} = MOSTLY_CLEAN |
| 2378 | if ($var =~ /^LT/); |
| 2379 | } |
| 2380 | else |
| 2381 | { |
| 2382 | error ("'\$($var)' cannot be used outside '$config_libobj_dir' if" |
| 2383 | . " 'subdir-objects' is not set"); |
| 2384 | } |
| 2385 | } |
| 2386 | |
| 2387 | return $dir; |
| 2388 | } |
| 2389 | |
| 2390 | sub handle_LIBOBJS |
| 2391 | { |
| 2392 | my ($var, $cond, $lt) = @_; |
| 2393 | my $myobjext = $lt ? 'lo' : 'o'; |
| 2394 | $lt ||= ''; |
| 2395 | |
| 2396 | $var->requires_variables ("\@${lt}LIBOBJS\@ used", $lt . 'LIBOBJS') |
| 2397 | if ! keys %libsources; |
| 2398 | |
| 2399 | foreach my $iter (sort keys %libsources) |
| 2400 | { |
| 2401 | my $dir = ''; |
| 2402 | if ($iter =~ /^(.*)(\.[cly])$/) |
| 2403 | { |
| 2404 | saw_extension ($2); |
| 2405 | saw_extension ('.c'); |
| 2406 | $dir = handle_LIBOBJS_or_ALLOCA ("${lt}LIBOBJS", $1); |
| 2407 | } |
| 2408 | |
| 2409 | if ($iter =~ /\.h$/) |
| 2410 | { |
| 2411 | require_libsource_with_macro ($cond, $var, FOREIGN, $iter); |
| 2412 | } |
| 2413 | elsif ($iter ne 'alloca.c') |
| 2414 | { |
| 2415 | my $rewrite = $iter; |
| 2416 | $rewrite =~ s/\.c$/.P$myobjext/; |
| 2417 | $dep_files{$dir . '$(DEPDIR)/' . $rewrite} = 1; |
| 2418 | $rewrite = "^" . quotemeta ($iter) . "\$"; |
| 2419 | # Only require the file if it is not a built source. |
| 2420 | my $bs = var ('BUILT_SOURCES'); |
| 2421 | if (! $bs || ! grep (/$rewrite/, $bs->value_as_list_recursive)) |
| 2422 | { |
| 2423 | require_libsource_with_macro ($cond, $var, FOREIGN, $iter); |
| 2424 | } |
| 2425 | } |
| 2426 | } |
| 2427 | } |
| 2428 | |
| 2429 | sub handle_ALLOCA |
| 2430 | { |
| 2431 | my ($var, $cond, $lt) = @_; |
| 2432 | my $myobjext = $lt ? 'lo' : 'o'; |
| 2433 | $lt ||= ''; |
| 2434 | my $dir = handle_LIBOBJS_or_ALLOCA ("${lt}ALLOCA", "alloca"); |
| 2435 | |
| 2436 | $dir eq '' and $dir = './'; |
| 2437 | $var->requires_variables ("\@${lt}ALLOCA\@ used", $lt . 'ALLOCA'); |
| 2438 | $dep_files{$dir . '$(DEPDIR)/alloca.P' . $myobjext} = 1; |
| 2439 | require_libsource_with_macro ($cond, $var, FOREIGN, 'alloca.c'); |
| 2440 | saw_extension ('.c'); |
| 2441 | } |
| 2442 | |
| 2443 | # Canonicalize the input parameter. |
| 2444 | sub canonicalize |
| 2445 | { |
| 2446 | my ($string) = @_; |
| 2447 | $string =~ tr/A-Za-z0-9_\@/_/c; |
| 2448 | return $string; |
| 2449 | } |
| 2450 | |
| 2451 | # Canonicalize a name, and check to make sure the non-canonical name |
| 2452 | # is never used. Returns canonical name. Arguments are name and a |
| 2453 | # list of suffixes to check for. |
| 2454 | sub check_canonical_spelling |
| 2455 | { |
| 2456 | my ($name, @suffixes) = @_; |
| 2457 | |
| 2458 | my $xname = canonicalize ($name); |
| 2459 | if ($xname ne $name) |
| 2460 | { |
| 2461 | foreach my $xt (@suffixes) |
| 2462 | { |
| 2463 | reject_var ("$name$xt", "use '$xname$xt', not '$name$xt'"); |
| 2464 | } |
| 2465 | } |
| 2466 | |
| 2467 | return $xname; |
| 2468 | } |
| 2469 | |
| 2470 | # Set up the compile suite. |
| 2471 | sub handle_compile () |
| 2472 | { |
| 2473 | return if ! $must_handle_compiled_objects; |
| 2474 | |
| 2475 | # Boilerplate. |
| 2476 | my $default_includes = ''; |
| 2477 | if (! option 'nostdinc') |
| 2478 | { |
| 2479 | my @incs = ('-I.', subst ('am__isrc')); |
| 2480 | |
| 2481 | my $var = var 'CONFIG_HEADER'; |
| 2482 | if ($var) |
| 2483 | { |
| 2484 | foreach my $hdr (split (' ', $var->variable_value)) |
| 2485 | { |
| 2486 | push @incs, '-I' . dirname ($hdr); |
| 2487 | } |
| 2488 | } |
| 2489 | # We want '-I. -I$(srcdir)', but the latter -I is redundant |
| 2490 | # and unaesthetic in non-VPATH builds. We use `-I.@am__isrc@` |
| 2491 | # instead. It will be replaced by '-I.' or '-I. -I$(srcdir)'. |
| 2492 | # Items in CONFIG_HEADER are never in $(srcdir) so it is safe |
| 2493 | # to just put @am__isrc@ right after '-I.', without a space. |
| 2494 | ($default_includes = ' ' . uniq (@incs)) =~ s/ @/@/; |
| 2495 | } |
| 2496 | |
| 2497 | my (@mostly_rms, @dist_rms); |
| 2498 | foreach my $item (sort keys %compile_clean_files) |
| 2499 | { |
| 2500 | if ($compile_clean_files{$item} == MOSTLY_CLEAN) |
| 2501 | { |
| 2502 | push (@mostly_rms, "\t-rm -f $item"); |
| 2503 | } |
| 2504 | elsif ($compile_clean_files{$item} == DIST_CLEAN) |
| 2505 | { |
| 2506 | push (@dist_rms, "\t-rm -f $item"); |
| 2507 | } |
| 2508 | else |
| 2509 | { |
| 2510 | prog_error 'invalid entry in %compile_clean_files'; |
| 2511 | } |
| 2512 | } |
| 2513 | |
| 2514 | my ($coms, $vars, $rules) = |
| 2515 | file_contents_internal (1, "$libdir/am/compile.am", |
| 2516 | new Automake::Location, |
| 2517 | 'DEFAULT_INCLUDES' => $default_includes, |
| 2518 | 'MOSTLYRMS' => join ("\n", @mostly_rms), |
| 2519 | 'DISTRMS' => join ("\n", @dist_rms)); |
| 2520 | $output_vars .= $vars; |
| 2521 | $output_rules .= "$coms$rules"; |
| 2522 | } |
| 2523 | |
| 2524 | # Handle libtool rules. |
| 2525 | sub handle_libtool () |
| 2526 | { |
| 2527 | return unless var ('LIBTOOL'); |
| 2528 | |
| 2529 | # Libtool requires some files, but only at top level. |
| 2530 | # (Starting with Libtool 2.0 we do not have to bother. These |
| 2531 | # requirements are done with AC_REQUIRE_AUX_FILE.) |
| 2532 | require_conf_file_with_macro (TRUE, 'LIBTOOL', FOREIGN, @libtool_files) |
| 2533 | if $relative_dir eq '.' && ! $libtool_new_api; |
| 2534 | |
| 2535 | my @libtool_rms; |
| 2536 | foreach my $item (sort keys %libtool_clean_directories) |
| 2537 | { |
| 2538 | my $dir = ($item eq '.') ? '' : "$item/"; |
| 2539 | # .libs is for Unix, _libs for DOS. |
| 2540 | push (@libtool_rms, "\t-rm -rf ${dir}.libs ${dir}_libs"); |
| 2541 | } |
| 2542 | |
| 2543 | check_user_variables 'LIBTOOLFLAGS'; |
| 2544 | |
| 2545 | # Output the libtool compilation rules. |
| 2546 | $output_rules .= file_contents ('libtool', |
| 2547 | new Automake::Location, |
| 2548 | LTRMS => join ("\n", @libtool_rms)); |
| 2549 | } |
| 2550 | |
| 2551 | # Check for duplicate targets |
| 2552 | sub handle_targets () |
| 2553 | { |
| 2554 | my %seen = (); |
| 2555 | my @dups = (); |
| 2556 | @proglist = am_install_var ('progs', 'PROGRAMS', |
| 2557 | 'bin', 'sbin', 'libexec', 'pkglibexec', |
| 2558 | 'noinst', 'check'); |
| 2559 | @liblist = am_install_var ('libs', 'LIBRARIES', |
| 2560 | 'lib', 'pkglib', 'noinst', 'check'); |
| 2561 | @ltliblist = am_install_var ('ltlib', 'LTLIBRARIES', |
| 2562 | 'noinst', 'lib', 'pkglib', 'check'); |
| 2563 | |
| 2564 | # Record duplications that may arise after canonicalization of the |
| 2565 | # base names, in order to prevent object file clashes in the presence |
| 2566 | # of target-specific *FLAGS |
| 2567 | my @targetlist = (@proglist, @liblist, @ltliblist); |
| 2568 | foreach my $pair (@targetlist) |
| 2569 | { |
| 2570 | my $base = canonicalize (basename (@$pair[1])); |
| 2571 | push (@dup_shortnames, $base) if ($seen{$base}); |
| 2572 | $seen{$base} = $base; |
| 2573 | } |
| 2574 | } |
| 2575 | |
| 2576 | sub handle_programs () |
| 2577 | { |
| 2578 | return if ! @proglist; |
| 2579 | $must_handle_compiled_objects = 1; |
| 2580 | |
| 2581 | my $seen_global_libobjs = |
| 2582 | var ('LDADD') && handle_lib_objects ('', 'LDADD'); |
| 2583 | |
| 2584 | foreach my $pair (@proglist) |
| 2585 | { |
| 2586 | my ($where, $one_file) = @$pair; |
| 2587 | |
| 2588 | my $seen_libobjs = 0; |
| 2589 | my $obj = '.$(OBJEXT)'; |
| 2590 | |
| 2591 | $known_programs{$one_file} = $where; |
| 2592 | |
| 2593 | # Canonicalize names and check for misspellings. |
| 2594 | my $xname = check_canonical_spelling ($one_file, '_LDADD', '_LDFLAGS', |
| 2595 | '_SOURCES', '_OBJECTS', |
| 2596 | '_DEPENDENCIES'); |
| 2597 | |
| 2598 | $where->push_context ("while processing program '$one_file'"); |
| 2599 | $where->set (INTERNAL->get); |
| 2600 | |
| 2601 | my $linker = handle_source_transform ($xname, $one_file, $obj, $where, |
| 2602 | NONLIBTOOL => 1, LIBTOOL => 0); |
| 2603 | |
| 2604 | if (var ($xname . "_LDADD")) |
| 2605 | { |
| 2606 | $seen_libobjs = handle_lib_objects ($xname, $xname . '_LDADD'); |
| 2607 | } |
| 2608 | else |
| 2609 | { |
| 2610 | # User didn't define prog_LDADD override. So do it. |
| 2611 | define_variable ($xname . '_LDADD', '$(LDADD)', $where); |
| 2612 | |
| 2613 | # This does a bit too much work. But we need it to |
| 2614 | # generate _DEPENDENCIES when appropriate. |
| 2615 | if (var ('LDADD')) |
| 2616 | { |
| 2617 | $seen_libobjs = handle_lib_objects ($xname, 'LDADD'); |
| 2618 | } |
| 2619 | } |
| 2620 | |
| 2621 | reject_var ($xname . '_LIBADD', |
| 2622 | "use '${xname}_LDADD', not '${xname}_LIBADD'"); |
| 2623 | |
| 2624 | set_seen ($xname . '_DEPENDENCIES'); |
| 2625 | set_seen ('EXTRA_' . $xname . '_DEPENDENCIES'); |
| 2626 | set_seen ($xname . '_LDFLAGS'); |
| 2627 | |
| 2628 | # Determine program to use for link. |
| 2629 | my($xlink, $vlink) = define_per_target_linker_variable ($linker, $xname); |
| 2630 | $vlink = verbose_flag ($vlink || 'GEN'); |
| 2631 | |
| 2632 | # If the resulting program lies in a subdirectory, |
| 2633 | # ensure that the directory exists before we need it. |
| 2634 | my $dirstamp = require_build_directory_maybe ($one_file); |
| 2635 | |
| 2636 | $libtool_clean_directories{dirname ($one_file)} = 1; |
| 2637 | |
| 2638 | $output_rules .= file_contents ('program', |
| 2639 | $where, |
| 2640 | PROGRAM => $one_file, |
| 2641 | XPROGRAM => $xname, |
| 2642 | XLINK => $xlink, |
| 2643 | VERBOSE => $vlink, |
| 2644 | DIRSTAMP => $dirstamp, |
| 2645 | EXEEXT => '$(EXEEXT)'); |
| 2646 | |
| 2647 | if ($seen_libobjs || $seen_global_libobjs) |
| 2648 | { |
| 2649 | if (var ($xname . '_LDADD')) |
| 2650 | { |
| 2651 | check_libobjs_sources ($xname, $xname . '_LDADD'); |
| 2652 | } |
| 2653 | elsif (var ('LDADD')) |
| 2654 | { |
| 2655 | check_libobjs_sources ($xname, 'LDADD'); |
| 2656 | } |
| 2657 | } |
| 2658 | } |
| 2659 | } |
| 2660 | |
| 2661 | |
| 2662 | sub handle_libraries () |
| 2663 | { |
| 2664 | return if ! @liblist; |
| 2665 | $must_handle_compiled_objects = 1; |
| 2666 | |
| 2667 | my @prefix = am_primary_prefixes ('LIBRARIES', 0, 'lib', 'pkglib', |
| 2668 | 'noinst', 'check'); |
| 2669 | |
| 2670 | if (@prefix) |
| 2671 | { |
| 2672 | my $var = rvar ($prefix[0] . '_LIBRARIES'); |
| 2673 | $var->requires_variables ('library used', 'RANLIB'); |
| 2674 | } |
| 2675 | |
| 2676 | define_variable ('AR', 'ar', INTERNAL); |
| 2677 | define_variable ('ARFLAGS', 'cru', INTERNAL); |
| 2678 | define_verbose_tagvar ('AR'); |
| 2679 | |
| 2680 | foreach my $pair (@liblist) |
| 2681 | { |
| 2682 | my ($where, $onelib) = @$pair; |
| 2683 | |
| 2684 | my $seen_libobjs = 0; |
| 2685 | # Check that the library fits the standard naming convention. |
| 2686 | my $bn = basename ($onelib); |
| 2687 | if ($bn !~ /^lib.*\.a$/) |
| 2688 | { |
| 2689 | $bn =~ s/^(?:lib)?(.*?)(?:\.[^.]*)?$/lib$1.a/; |
| 2690 | my $suggestion = dirname ($onelib) . "/$bn"; |
| 2691 | $suggestion =~ s|^\./||g; |
| 2692 | msg ('error-gnu/warn', $where, |
| 2693 | "'$onelib' is not a standard library name\n" |
| 2694 | . "did you mean '$suggestion'?") |
| 2695 | } |
| 2696 | |
| 2697 | ($known_libraries{$onelib} = $bn) =~ s/\.a$//; |
| 2698 | |
| 2699 | $where->push_context ("while processing library '$onelib'"); |
| 2700 | $where->set (INTERNAL->get); |
| 2701 | |
| 2702 | my $obj = '.$(OBJEXT)'; |
| 2703 | |
| 2704 | # Canonicalize names and check for misspellings. |
| 2705 | my $xlib = check_canonical_spelling ($onelib, '_LIBADD', '_SOURCES', |
| 2706 | '_OBJECTS', '_DEPENDENCIES', |
| 2707 | '_AR'); |
| 2708 | |
| 2709 | if (! var ($xlib . '_AR')) |
| 2710 | { |
| 2711 | define_variable ($xlib . '_AR', '$(AR) $(ARFLAGS)', $where); |
| 2712 | } |
| 2713 | |
| 2714 | # Generate support for conditional object inclusion in |
| 2715 | # libraries. |
| 2716 | if (var ($xlib . '_LIBADD')) |
| 2717 | { |
| 2718 | if (handle_lib_objects ($xlib, $xlib . '_LIBADD')) |
| 2719 | { |
| 2720 | $seen_libobjs = 1; |
| 2721 | } |
| 2722 | } |
| 2723 | else |
| 2724 | { |
| 2725 | define_variable ($xlib . "_LIBADD", '', $where); |
| 2726 | } |
| 2727 | |
| 2728 | reject_var ($xlib . '_LDADD', |
| 2729 | "use '${xlib}_LIBADD', not '${xlib}_LDADD'"); |
| 2730 | |
| 2731 | # Make sure we at look at this. |
| 2732 | set_seen ($xlib . '_DEPENDENCIES'); |
| 2733 | set_seen ('EXTRA_' . $xlib . '_DEPENDENCIES'); |
| 2734 | |
| 2735 | handle_source_transform ($xlib, $onelib, $obj, $where, |
| 2736 | NONLIBTOOL => 1, LIBTOOL => 0); |
| 2737 | |
| 2738 | # If the resulting library lies in a subdirectory, |
| 2739 | # make sure this directory will exist. |
| 2740 | my $dirstamp = require_build_directory_maybe ($onelib); |
| 2741 | my $verbose = verbose_flag ('AR'); |
| 2742 | my $silent = silent_flag (); |
| 2743 | |
| 2744 | $output_rules .= file_contents ('library', |
| 2745 | $where, |
| 2746 | VERBOSE => $verbose, |
| 2747 | SILENT => $silent, |
| 2748 | LIBRARY => $onelib, |
| 2749 | XLIBRARY => $xlib, |
| 2750 | DIRSTAMP => $dirstamp); |
| 2751 | |
| 2752 | if ($seen_libobjs) |
| 2753 | { |
| 2754 | if (var ($xlib . '_LIBADD')) |
| 2755 | { |
| 2756 | check_libobjs_sources ($xlib, $xlib . '_LIBADD'); |
| 2757 | } |
| 2758 | } |
| 2759 | |
| 2760 | if (! $seen_ar) |
| 2761 | { |
| 2762 | msg ('extra-portability', $where, |
| 2763 | "'$onelib': linking libraries using a non-POSIX\n" |
| 2764 | . "archiver requires 'AM_PROG_AR' in '$configure_ac'") |
| 2765 | } |
| 2766 | } |
| 2767 | } |
| 2768 | |
| 2769 | |
| 2770 | sub handle_ltlibraries () |
| 2771 | { |
| 2772 | return if ! @ltliblist; |
| 2773 | $must_handle_compiled_objects = 1; |
| 2774 | |
| 2775 | my @prefix = am_primary_prefixes ('LTLIBRARIES', 0, 'lib', 'pkglib', |
| 2776 | 'noinst', 'check'); |
| 2777 | |
| 2778 | if (@prefix) |
| 2779 | { |
| 2780 | my $var = rvar ($prefix[0] . '_LTLIBRARIES'); |
| 2781 | $var->requires_variables ('Libtool library used', 'LIBTOOL'); |
| 2782 | } |
| 2783 | |
| 2784 | my %instdirs = (); |
| 2785 | my %instsubdirs = (); |
| 2786 | my %instconds = (); |
| 2787 | my %liblocations = (); # Location (in Makefile.am) of each library. |
| 2788 | |
| 2789 | foreach my $key (@prefix) |
| 2790 | { |
| 2791 | # Get the installation directory of each library. |
| 2792 | my $dir = $key; |
| 2793 | my $strip_subdir = 1; |
| 2794 | if ($dir =~ /^nobase_/) |
| 2795 | { |
| 2796 | $dir =~ s/^nobase_//; |
| 2797 | $strip_subdir = 0; |
| 2798 | } |
| 2799 | my $var = rvar ($key . '_LTLIBRARIES'); |
| 2800 | |
| 2801 | # We reject libraries which are installed in several places |
| 2802 | # in the same condition, because we can only specify one |
| 2803 | # '-rpath' option. |
| 2804 | $var->traverse_recursively |
| 2805 | (sub |
| 2806 | { |
| 2807 | my ($var, $val, $cond, $full_cond) = @_; |
| 2808 | my $hcond = $full_cond->human; |
| 2809 | my $where = $var->rdef ($cond)->location; |
| 2810 | my $ldir = ''; |
| 2811 | $ldir = '/' . dirname ($val) |
| 2812 | if (!$strip_subdir); |
| 2813 | # A library cannot be installed in different directories |
| 2814 | # in overlapping conditions. |
| 2815 | if (exists $instconds{$val}) |
| 2816 | { |
| 2817 | my ($msg, $acond) = |
| 2818 | $instconds{$val}->ambiguous_p ($val, $full_cond); |
| 2819 | |
| 2820 | if ($msg) |
| 2821 | { |
| 2822 | error ($where, $msg, partial => 1); |
| 2823 | my $dirtxt = "installed " . ($strip_subdir ? "in" : "below") . " '$dir'"; |
| 2824 | $dirtxt = "built for '$dir'" |
| 2825 | if $dir eq 'EXTRA' || $dir eq 'noinst' || $dir eq 'check'; |
| 2826 | my $dircond = |
| 2827 | $full_cond->true ? "" : " in condition $hcond"; |
| 2828 | |
| 2829 | error ($where, "'$val' should be $dirtxt$dircond ...", |
| 2830 | partial => 1); |
| 2831 | |
| 2832 | my $hacond = $acond->human; |
| 2833 | my $adir = $instdirs{$val}{$acond}; |
| 2834 | my $adirtxt = "installed in '$adir'"; |
| 2835 | $adirtxt = "built for '$adir'" |
| 2836 | if ($adir eq 'EXTRA' || $adir eq 'noinst' |
| 2837 | || $adir eq 'check'); |
| 2838 | my $adircond = $acond->true ? "" : " in condition $hacond"; |
| 2839 | |
| 2840 | my $onlyone = ($dir ne $adir) ? |
| 2841 | ("\nLibtool libraries can be built for only one " |
| 2842 | . "destination") : ""; |
| 2843 | |
| 2844 | error ($liblocations{$val}{$acond}, |
| 2845 | "... and should also be $adirtxt$adircond.$onlyone"); |
| 2846 | return; |
| 2847 | } |
| 2848 | } |
| 2849 | else |
| 2850 | { |
| 2851 | $instconds{$val} = new Automake::DisjConditions; |
| 2852 | } |
| 2853 | $instdirs{$val}{$full_cond} = $dir; |
| 2854 | $instsubdirs{$val}{$full_cond} = $ldir; |
| 2855 | $liblocations{$val}{$full_cond} = $where; |
| 2856 | $instconds{$val} = $instconds{$val}->merge ($full_cond); |
| 2857 | }, |
| 2858 | sub |
| 2859 | { |
| 2860 | return (); |
| 2861 | }, |
| 2862 | skip_ac_subst => 1); |
| 2863 | } |
| 2864 | |
| 2865 | foreach my $pair (@ltliblist) |
| 2866 | { |
| 2867 | my ($where, $onelib) = @$pair; |
| 2868 | |
| 2869 | my $seen_libobjs = 0; |
| 2870 | my $obj = '.lo'; |
| 2871 | |
| 2872 | # Canonicalize names and check for misspellings. |
| 2873 | my $xlib = check_canonical_spelling ($onelib, '_LIBADD', '_LDFLAGS', |
| 2874 | '_SOURCES', '_OBJECTS', |
| 2875 | '_DEPENDENCIES'); |
| 2876 | |
| 2877 | # Check that the library fits the standard naming convention. |
| 2878 | my $libname_rx = '^lib.*\.la'; |
| 2879 | my $ldvar = var ("${xlib}_LDFLAGS") || var ('AM_LDFLAGS'); |
| 2880 | my $ldvar2 = var ('LDFLAGS'); |
| 2881 | if (($ldvar && grep (/-module/, $ldvar->value_as_list_recursive)) |
| 2882 | || ($ldvar2 && grep (/-module/, $ldvar2->value_as_list_recursive))) |
| 2883 | { |
| 2884 | # Relax name checking for libtool modules. |
| 2885 | $libname_rx = '\.la'; |
| 2886 | } |
| 2887 | |
| 2888 | my $bn = basename ($onelib); |
| 2889 | if ($bn !~ /$libname_rx$/) |
| 2890 | { |
| 2891 | my $type = 'library'; |
| 2892 | if ($libname_rx eq '\.la') |
| 2893 | { |
| 2894 | $bn =~ s/^(lib|)(.*?)(?:\.[^.]*)?$/$1$2.la/; |
| 2895 | $type = 'module'; |
| 2896 | } |
| 2897 | else |
| 2898 | { |
| 2899 | $bn =~ s/^(?:lib)?(.*?)(?:\.[^.]*)?$/lib$1.la/; |
| 2900 | } |
| 2901 | my $suggestion = dirname ($onelib) . "/$bn"; |
| 2902 | $suggestion =~ s|^\./||g; |
| 2903 | msg ('error-gnu/warn', $where, |
| 2904 | "'$onelib' is not a standard libtool $type name\n" |
| 2905 | . "did you mean '$suggestion'?") |
| 2906 | } |
| 2907 | |
| 2908 | ($known_libraries{$onelib} = $bn) =~ s/\.la$//; |
| 2909 | |
| 2910 | $where->push_context ("while processing Libtool library '$onelib'"); |
| 2911 | $where->set (INTERNAL->get); |
| 2912 | |
| 2913 | # Make sure we look at these. |
| 2914 | set_seen ($xlib . '_LDFLAGS'); |
| 2915 | set_seen ($xlib . '_DEPENDENCIES'); |
| 2916 | set_seen ('EXTRA_' . $xlib . '_DEPENDENCIES'); |
| 2917 | |
| 2918 | # Generate support for conditional object inclusion in |
| 2919 | # libraries. |
| 2920 | if (var ($xlib . '_LIBADD')) |
| 2921 | { |
| 2922 | if (handle_lib_objects ($xlib, $xlib . '_LIBADD')) |
| 2923 | { |
| 2924 | $seen_libobjs = 1; |
| 2925 | } |
| 2926 | } |
| 2927 | else |
| 2928 | { |
| 2929 | define_variable ($xlib . "_LIBADD", '', $where); |
| 2930 | } |
| 2931 | |
| 2932 | reject_var ("${xlib}_LDADD", |
| 2933 | "use '${xlib}_LIBADD', not '${xlib}_LDADD'"); |
| 2934 | |
| 2935 | |
| 2936 | my $linker = handle_source_transform ($xlib, $onelib, $obj, $where, |
| 2937 | NONLIBTOOL => 0, LIBTOOL => 1); |
| 2938 | |
| 2939 | # Determine program to use for link. |
| 2940 | my($xlink, $vlink) = define_per_target_linker_variable ($linker, $xlib); |
| 2941 | $vlink = verbose_flag ($vlink || 'GEN'); |
| 2942 | |
| 2943 | my $rpathvar = "am_${xlib}_rpath"; |
| 2944 | my $rpath = "\$($rpathvar)"; |
| 2945 | foreach my $rcond ($instconds{$onelib}->conds) |
| 2946 | { |
| 2947 | my $val; |
| 2948 | if ($instdirs{$onelib}{$rcond} eq 'EXTRA' |
| 2949 | || $instdirs{$onelib}{$rcond} eq 'noinst' |
| 2950 | || $instdirs{$onelib}{$rcond} eq 'check') |
| 2951 | { |
| 2952 | # It's an EXTRA_ library, so we can't specify -rpath, |
| 2953 | # because we don't know where the library will end up. |
| 2954 | # The user probably knows, but generally speaking automake |
| 2955 | # doesn't -- and in fact configure could decide |
| 2956 | # dynamically between two different locations. |
| 2957 | $val = ''; |
| 2958 | } |
| 2959 | else |
| 2960 | { |
| 2961 | $val = ('-rpath $(' . $instdirs{$onelib}{$rcond} . 'dir)'); |
| 2962 | $val .= $instsubdirs{$onelib}{$rcond} |
| 2963 | if defined $instsubdirs{$onelib}{$rcond}; |
| 2964 | } |
| 2965 | if ($rcond->true) |
| 2966 | { |
| 2967 | # If $rcond is true there is only one condition and |
| 2968 | # there is no point defining an helper variable. |
| 2969 | $rpath = $val; |
| 2970 | } |
| 2971 | else |
| 2972 | { |
| 2973 | define_pretty_variable ($rpathvar, $rcond, INTERNAL, $val); |
| 2974 | } |
| 2975 | } |
| 2976 | |
| 2977 | # If the resulting library lies in a subdirectory, |
| 2978 | # make sure this directory will exist. |
| 2979 | my $dirstamp = require_build_directory_maybe ($onelib); |
| 2980 | |
| 2981 | # Remember to cleanup .libs/ in this directory. |
| 2982 | my $dirname = dirname $onelib; |
| 2983 | $libtool_clean_directories{$dirname} = 1; |
| 2984 | |
| 2985 | $output_rules .= file_contents ('ltlibrary', |
| 2986 | $where, |
| 2987 | LTLIBRARY => $onelib, |
| 2988 | XLTLIBRARY => $xlib, |
| 2989 | RPATH => $rpath, |
| 2990 | XLINK => $xlink, |
| 2991 | VERBOSE => $vlink, |
| 2992 | DIRSTAMP => $dirstamp); |
| 2993 | if ($seen_libobjs) |
| 2994 | { |
| 2995 | if (var ($xlib . '_LIBADD')) |
| 2996 | { |
| 2997 | check_libobjs_sources ($xlib, $xlib . '_LIBADD'); |
| 2998 | } |
| 2999 | } |
| 3000 | |
| 3001 | if (! $seen_ar) |
| 3002 | { |
| 3003 | msg ('extra-portability', $where, |
| 3004 | "'$onelib': linking libtool libraries using a non-POSIX\n" |
| 3005 | . "archiver requires 'AM_PROG_AR' in '$configure_ac'") |
| 3006 | } |
| 3007 | } |
| 3008 | } |
| 3009 | |
| 3010 | # See if any _SOURCES variable were misspelled. |
| 3011 | sub check_typos () |
| 3012 | { |
| 3013 | # It is ok if the user sets this particular variable. |
| 3014 | set_seen 'AM_LDFLAGS'; |
| 3015 | |
| 3016 | foreach my $primary ('SOURCES', 'LIBADD', 'LDADD', 'LDFLAGS', 'DEPENDENCIES') |
| 3017 | { |
| 3018 | foreach my $var (variables $primary) |
| 3019 | { |
| 3020 | my $varname = $var->name; |
| 3021 | # A configure variable is always legitimate. |
| 3022 | next if exists $configure_vars{$varname}; |
| 3023 | |
| 3024 | for my $cond ($var->conditions->conds) |
| 3025 | { |
| 3026 | $varname =~ /^(?:EXTRA_)?(?:nobase_)?(?:dist_|nodist_)?(.*)_[[:alnum:]]+$/; |
| 3027 | msg_var ('syntax', $var, "variable '$varname' is defined but no" |
| 3028 | . " program or\nlibrary has '$1' as canonical name" |
| 3029 | . " (possible typo)") |
| 3030 | unless $var->rdef ($cond)->seen; |
| 3031 | } |
| 3032 | } |
| 3033 | } |
| 3034 | } |
| 3035 | |
| 3036 | |
| 3037 | sub handle_scripts () |
| 3038 | { |
| 3039 | # NOTE we no longer automatically clean SCRIPTS, because it is |
| 3040 | # useful to sometimes distribute scripts verbatim. This happens |
| 3041 | # e.g. in Automake itself. |
| 3042 | am_install_var ('-candist', 'scripts', 'SCRIPTS', |
| 3043 | 'bin', 'sbin', 'libexec', 'pkglibexec', 'pkgdata', |
| 3044 | 'noinst', 'check'); |
| 3045 | } |
| 3046 | |
| 3047 | |
| 3048 | ## ------------------------ ## |
| 3049 | ## Handling Texinfo files. ## |
| 3050 | ## ------------------------ ## |
| 3051 | |
| 3052 | # ($OUTFILE, $VFILE) |
| 3053 | # scan_texinfo_file ($FILENAME) |
| 3054 | # ----------------------------- |
| 3055 | # $OUTFILE - name of the info file produced by $FILENAME. |
| 3056 | # $VFILE - name of the version.texi file used (undef if none). |
| 3057 | sub scan_texinfo_file |
| 3058 | { |
| 3059 | my ($filename) = @_; |
| 3060 | |
| 3061 | my $texi = new Automake::XFile "< $filename"; |
| 3062 | verb "reading $filename"; |
| 3063 | |
| 3064 | my ($outfile, $vfile); |
| 3065 | while ($_ = $texi->getline) |
| 3066 | { |
| 3067 | if (/^\@setfilename +(\S+)/) |
| 3068 | { |
| 3069 | # Honor only the first @setfilename. (It's possible to have |
| 3070 | # more occurrences later if the manual shows examples of how |
| 3071 | # to use @setfilename...) |
| 3072 | next if $outfile; |
| 3073 | |
| 3074 | $outfile = $1; |
| 3075 | if (index ($outfile, '.') < 0) |
| 3076 | { |
| 3077 | msg 'obsolete', "$filename:$.", |
| 3078 | "use of suffix-less info files is discouraged" |
| 3079 | } |
| 3080 | elsif ($outfile !~ /\.info$/) |
| 3081 | { |
| 3082 | error ("$filename:$.", |
| 3083 | "output '$outfile' has unrecognized extension"); |
| 3084 | return; |
| 3085 | } |
| 3086 | } |
| 3087 | # A "version.texi" file is actually any file whose name matches |
| 3088 | # "vers*.texi". |
| 3089 | elsif (/^\@include\s+(vers[^.]*\.texi)\s*$/) |
| 3090 | { |
| 3091 | $vfile = $1; |
| 3092 | } |
| 3093 | } |
| 3094 | |
| 3095 | if (! $outfile) |
| 3096 | { |
| 3097 | # Replace a .texi extension with .info |
| 3098 | $outfile = basename($filename); |
| 3099 | $outfile =~ s/\.[^.]+$//; |
| 3100 | $outfile .= '.info'; |
| 3101 | } |
| 3102 | |
| 3103 | return ($outfile, $vfile); |
| 3104 | } |
| 3105 | |
| 3106 | |
| 3107 | # ($DIRSTAMP, @CLEAN_FILES) |
| 3108 | # output_texinfo_build_rules ($SOURCE, $DEST, $INSRC, @DEPENDENCIES) |
| 3109 | # ------------------------------------------------------------------ |
| 3110 | # SOURCE - the source Texinfo file |
| 3111 | # DEST - the destination Info file |
| 3112 | # INSRC - whether DEST should be built in the source tree |
| 3113 | # DEPENDENCIES - known dependencies |
| 3114 | sub output_texinfo_build_rules |
| 3115 | { |
| 3116 | my ($source, $dest, $insrc, @deps) = @_; |
| 3117 | |
| 3118 | # Split 'a.texi' into 'a' and '.texi'. |
| 3119 | my ($spfx, $ssfx) = ($source =~ /^(.*?)(\.[^.]*)?$/); |
| 3120 | my ($dpfx, $dsfx) = ($dest =~ /^(.*?)(\.[^.]*)?$/); |
| 3121 | |
| 3122 | $ssfx ||= ""; |
| 3123 | $dsfx ||= ""; |
| 3124 | |
| 3125 | # We can output two kinds of rules: the "generic" rules use Make |
| 3126 | # suffix rules and are appropriate when $source and $dest do not lie |
| 3127 | # in a sub-directory; the "specific" rules are needed in the other |
| 3128 | # case. |
| 3129 | # |
| 3130 | # The former are output only once (this is not really apparent here, |
| 3131 | # but just remember that some logic deeper in Automake will not |
| 3132 | # output the same rule twice); while the later need to be output for |
| 3133 | # each Texinfo source. |
| 3134 | my $generic; |
| 3135 | my $makeinfoflags; |
| 3136 | my $sdir = dirname $source; |
| 3137 | if ($sdir eq '.' && dirname ($dest) eq '.') |
| 3138 | { |
| 3139 | $generic = 1; |
| 3140 | $makeinfoflags = '-I $(srcdir)'; |
| 3141 | } |
| 3142 | else |
| 3143 | { |
| 3144 | $generic = 0; |
| 3145 | $makeinfoflags = "-I $sdir -I \$(srcdir)/$sdir"; |
| 3146 | } |
| 3147 | |
| 3148 | # A directory can contain two kinds of info files: some built in the |
| 3149 | # source tree, and some built in the build tree. The rules are |
| 3150 | # different in each case. However we cannot output two different |
| 3151 | # set of generic rules. Because in-source builds are more usual, we |
| 3152 | # use generic rules in this case and fall back to "specific" rules |
| 3153 | # for build-dir builds. (It should not be a problem to invert this |
| 3154 | # if needed.) |
| 3155 | $generic = 0 unless $insrc; |
| 3156 | |
| 3157 | # We cannot use a suffix rule to build info files with an empty |
| 3158 | # extension. Otherwise we would output a single suffix inference |
| 3159 | # rule, with separate dependencies, as in |
| 3160 | # |
| 3161 | # .texi: |
| 3162 | # $(MAKEINFO) ... |
| 3163 | # foo.info: foo.texi |
| 3164 | # |
| 3165 | # which confuse Solaris make. (See the Autoconf manual for |
| 3166 | # details.) Therefore we use a specific rule in this case. This |
| 3167 | # applies to info files only (dvi and pdf files always have an |
| 3168 | # extension). |
| 3169 | my $generic_info = ($generic && $dsfx) ? 1 : 0; |
| 3170 | |
| 3171 | # If the resulting file lies in a subdirectory, |
| 3172 | # make sure this directory will exist. |
| 3173 | my $dirstamp = require_build_directory_maybe ($dest); |
| 3174 | |
| 3175 | my $dipfx = ($insrc ? '$(srcdir)/' : '') . $dpfx; |
| 3176 | |
| 3177 | $output_rules .= file_contents ('texibuild', |
| 3178 | new Automake::Location, |
| 3179 | AM_V_MAKEINFO => verbose_flag('MAKEINFO'), |
| 3180 | AM_V_TEXI2DVI => verbose_flag('TEXI2DVI'), |
| 3181 | AM_V_TEXI2PDF => verbose_flag('TEXI2PDF'), |
| 3182 | DEPS => "@deps", |
| 3183 | DEST_PREFIX => $dpfx, |
| 3184 | DEST_INFO_PREFIX => $dipfx, |
| 3185 | DEST_SUFFIX => $dsfx, |
| 3186 | DIRSTAMP => $dirstamp, |
| 3187 | GENERIC => $generic, |
| 3188 | GENERIC_INFO => $generic_info, |
| 3189 | INSRC => $insrc, |
| 3190 | MAKEINFOFLAGS => $makeinfoflags, |
| 3191 | SILENT => silent_flag(), |
| 3192 | SOURCE => ($generic |
| 3193 | ? '$<' : $source), |
| 3194 | SOURCE_INFO => ($generic_info |
| 3195 | ? '$<' : $source), |
| 3196 | SOURCE_REAL => $source, |
| 3197 | SOURCE_SUFFIX => $ssfx, |
| 3198 | TEXIQUIET => verbose_flag('texinfo'), |
| 3199 | TEXIDEVNULL => verbose_flag('texidevnull'), |
| 3200 | ); |
| 3201 | return ($dirstamp, "$dpfx.dvi", "$dpfx.pdf", "$dpfx.ps", "$dpfx.html"); |
| 3202 | } |
| 3203 | |
| 3204 | |
| 3205 | # ($MOSTLYCLEAN, $TEXICLEAN, $MAINTCLEAN) |
| 3206 | # handle_texinfo_helper ($info_texinfos) |
| 3207 | # -------------------------------------- |
| 3208 | # Handle all Texinfo source; helper for 'handle_texinfo'. |
| 3209 | sub handle_texinfo_helper |
| 3210 | { |
| 3211 | my ($info_texinfos) = @_; |
| 3212 | my (@infobase, @info_deps_list, @texi_deps); |
| 3213 | my %versions; |
| 3214 | my $done = 0; |
| 3215 | my (@mostly_cleans, @texi_cleans, @maint_cleans) = ('', '', ''); |
| 3216 | |
| 3217 | # Build a regex matching user-cleaned files. |
| 3218 | my $d = var 'DISTCLEANFILES'; |
| 3219 | my $c = var 'CLEANFILES'; |
| 3220 | my @f = (); |
| 3221 | push @f, $d->value_as_list_recursive (inner_expand => 1) if $d; |
| 3222 | push @f, $c->value_as_list_recursive (inner_expand => 1) if $c; |
| 3223 | @f = map { s|[^A-Za-z_0-9*\[\]\-]|\\$&|g; s|\*|[^/]*|g; $_; } @f; |
| 3224 | my $user_cleaned_files = '^(?:' . join ('|', @f) . ')$'; |
| 3225 | |
| 3226 | foreach my $texi |
| 3227 | ($info_texinfos->value_as_list_recursive (inner_expand => 1)) |
| 3228 | { |
| 3229 | my $infobase = $texi; |
| 3230 | if ($infobase =~ s/\.texi$//) |
| 3231 | { |
| 3232 | 1; # Nothing more to do. |
| 3233 | } |
| 3234 | elsif ($infobase =~ s/\.(txi|texinfo)$//) |
| 3235 | { |
| 3236 | msg_var 'obsolete', $info_texinfos, |
| 3237 | "suffix '.$1' for Texinfo files is discouraged;" . |
| 3238 | " use '.texi' instead"; |
| 3239 | } |
| 3240 | else |
| 3241 | { |
| 3242 | # FIXME: report line number. |
| 3243 | err_am "texinfo file '$texi' has unrecognized extension"; |
| 3244 | next; |
| 3245 | } |
| 3246 | |
| 3247 | push @infobase, $infobase; |
| 3248 | |
| 3249 | # If 'version.texi' is referenced by input file, then include |
| 3250 | # automatic versioning capability. |
| 3251 | my ($out_file, $vtexi) = |
| 3252 | scan_texinfo_file ("$relative_dir/$texi") |
| 3253 | or next; |
| 3254 | # Directory of auxiliary files and build by-products used by texi2dvi |
| 3255 | # and texi2pdf. |
| 3256 | push @mostly_cleans, "$infobase.t2d"; |
| 3257 | push @mostly_cleans, "$infobase.t2p"; |
| 3258 | |
| 3259 | # If the Texinfo source is in a subdirectory, create the |
| 3260 | # resulting info in this subdirectory. If it is in the current |
| 3261 | # directory, try hard to not prefix "./" because it breaks the |
| 3262 | # generic rules. |
| 3263 | my $outdir = dirname ($texi) . '/'; |
| 3264 | $outdir = "" if $outdir eq './'; |
| 3265 | $out_file = $outdir . $out_file; |
| 3266 | |
| 3267 | # Until Automake 1.6.3, .info files were built in the |
| 3268 | # source tree. This was an obstacle to the support of |
| 3269 | # non-distributed .info files, and non-distributed .texi |
| 3270 | # files. |
| 3271 | # |
| 3272 | # * Non-distributed .texi files is important in some packages |
| 3273 | # where .texi files are built at make time, probably using |
| 3274 | # other binaries built in the package itself, maybe using |
| 3275 | # tools or information found on the build host. Because |
| 3276 | # these files are not distributed they are always rebuilt |
| 3277 | # at make time; they should therefore not lie in the source |
| 3278 | # directory. One plan was to support this using |
| 3279 | # nodist_info_TEXINFOS or something similar. (Doing this |
| 3280 | # requires some sanity checks. For instance Automake should |
| 3281 | # not allow: |
| 3282 | # dist_info_TEXINFOS = foo.texi |
| 3283 | # nodist_foo_TEXINFOS = included.texi |
| 3284 | # because a distributed file should never depend on a |
| 3285 | # non-distributed file.) |
| 3286 | # |
| 3287 | # * If .texi files are not distributed, then .info files should |
| 3288 | # not be distributed either. There are also cases where one |
| 3289 | # wants to distribute .texi files, but does not want to |
| 3290 | # distribute the .info files. For instance the Texinfo package |
| 3291 | # distributes the tool used to build these files; it would |
| 3292 | # be a waste of space to distribute them. It's not clear |
| 3293 | # which syntax we should use to indicate that .info files should |
| 3294 | # not be distributed. Akim Demaille suggested that eventually |
| 3295 | # we switch to a new syntax: |
| 3296 | # | Maybe we should take some inspiration from what's already |
| 3297 | # | done in the rest of Automake. Maybe there is too much |
| 3298 | # | syntactic sugar here, and you want |
| 3299 | # | nodist_INFO = bar.info |
| 3300 | # | dist_bar_info_SOURCES = bar.texi |
| 3301 | # | bar_texi_DEPENDENCIES = foo.texi |
| 3302 | # | with a bit of magic to have bar.info represent the whole |
| 3303 | # | bar*info set. That's a lot more verbose that the current |
| 3304 | # | situation, but it is # not new, hence the user has less |
| 3305 | # | to learn. |
| 3306 | # | |
| 3307 | # | But there is still too much room for meaningless specs: |
| 3308 | # | nodist_INFO = bar.info |
| 3309 | # | dist_bar_info_SOURCES = bar.texi |
| 3310 | # | dist_PS = bar.ps something-written-by-hand.ps |
| 3311 | # | nodist_bar_ps_SOURCES = bar.texi |
| 3312 | # | bar_texi_DEPENDENCIES = foo.texi |
| 3313 | # | here bar.texi is dist_ in line 2, and nodist_ in 4. |
| 3314 | # |
| 3315 | # Back to the point, it should be clear that in order to support |
| 3316 | # non-distributed .info files, we need to build them in the |
| 3317 | # build tree, not in the source tree (non-distributed .texi |
| 3318 | # files are less of a problem, because we do not output build |
| 3319 | # rules for them). In Automake 1.7 .info build rules have been |
| 3320 | # largely cleaned up so that .info files get always build in the |
| 3321 | # build tree, even when distributed. The idea was that |
| 3322 | # (1) if during a VPATH build the .info file was found to be |
| 3323 | # absent or out-of-date (in the source tree or in the |
| 3324 | # build tree), Make would rebuild it in the build tree. |
| 3325 | # If an up-to-date source-tree of the .info file existed, |
| 3326 | # make would not rebuild it in the build tree. |
| 3327 | # (2) having two copies of .info files, one in the source tree |
| 3328 | # and one (newer) in the build tree is not a problem |
| 3329 | # because 'make dist' always pick files in the build tree |
| 3330 | # first. |
| 3331 | # However it turned out the be a bad idea for several reasons: |
| 3332 | # * Tru64, OpenBSD, and FreeBSD (not NetBSD) Make do not behave |
| 3333 | # like GNU Make on point (1) above. These implementations |
| 3334 | # of Make would always rebuild .info files in the build |
| 3335 | # tree, even if such files were up to date in the source |
| 3336 | # tree. Consequently, it was impossible to perform a VPATH |
| 3337 | # build of a package containing Texinfo files using these |
| 3338 | # Make implementations. |
| 3339 | # (Refer to the Autoconf Manual, section "Limitation of |
| 3340 | # Make", paragraph "VPATH", item "target lookup", for |
| 3341 | # an account of the differences between these |
| 3342 | # implementations.) |
| 3343 | # * The GNU Coding Standards require these files to be built |
| 3344 | # in the source-tree (when they are distributed, that is). |
| 3345 | # * Keeping a fresher copy of distributed files in the |
| 3346 | # build tree can be annoying during development because |
| 3347 | # - if the files is kept under CVS, you really want it |
| 3348 | # to be updated in the source tree |
| 3349 | # - it is confusing that 'make distclean' does not erase |
| 3350 | # all files in the build tree. |
| 3351 | # |
| 3352 | # Consequently, starting with Automake 1.8, .info files are |
| 3353 | # built in the source tree again. Because we still plan to |
| 3354 | # support non-distributed .info files at some point, we |
| 3355 | # have a single variable ($INSRC) that controls whether |
| 3356 | # the current .info file must be built in the source tree |
| 3357 | # or in the build tree. Actually this variable is switched |
| 3358 | # off in two cases: |
| 3359 | # (1) For '.info' files that appear to be cleaned; this is for |
| 3360 | # backward compatibility with package such as Texinfo, |
| 3361 | # which do things like |
| 3362 | # info_TEXINFOS = texinfo.txi info-stnd.texi info.texi |
| 3363 | # DISTCLEANFILES = texinfo texinfo-* info*.info* |
| 3364 | # # Do not create info files for distribution. |
| 3365 | # dist-info: |
| 3366 | # in order not to distribute .info files. |
| 3367 | # (2) When the undocumented option 'info-in-builddir' is given. |
| 3368 | # This is done to allow the developers of GCC, GDB, GNU |
| 3369 | # binutils and the GNU bfd library to force the '.info' files |
| 3370 | # to be generated in the builddir rather than the srcdir, as |
| 3371 | # was once done when the (now removed) 'cygnus' option was |
| 3372 | # given. See automake bug#11034 for more discussion. |
| 3373 | my $insrc = 1; |
| 3374 | my $soutdir = '$(srcdir)/' . $outdir; |
| 3375 | |
| 3376 | if (option 'info-in-builddir') |
| 3377 | { |
| 3378 | $insrc = 0; |
| 3379 | } |
| 3380 | elsif ($out_file =~ $user_cleaned_files) |
| 3381 | { |
| 3382 | $insrc = 0; |
| 3383 | msg 'obsolete', "$am_file.am", <<EOF; |
| 3384 | Oops! |
| 3385 | It appears this file (or files included by it) are triggering |
| 3386 | an undocumented, soon-to-be-removed automake hack. |
| 3387 | Future automake versions will no longer place in the builddir |
| 3388 | (rather than in the srcdir) the generated '.info' files that |
| 3389 | appear to be cleaned, by e.g. being listed in CLEANFILES or |
| 3390 | DISTCLEANFILES. |
| 3391 | If you want your '.info' files to be placed in the builddir |
| 3392 | rather than in the srcdir, you have to use the shiny new |
| 3393 | 'info-in-builddir' automake option. |
| 3394 | EOF |
| 3395 | } |
| 3396 | |
| 3397 | $outdir = $soutdir if $insrc; |
| 3398 | |
| 3399 | # If user specified file_TEXINFOS, then use that as explicit |
| 3400 | # dependency list. |
| 3401 | @texi_deps = (); |
| 3402 | push (@texi_deps, "${soutdir}${vtexi}") if $vtexi; |
| 3403 | |
| 3404 | my $canonical = canonicalize ($infobase); |
| 3405 | if (var ($canonical . "_TEXINFOS")) |
| 3406 | { |
| 3407 | push (@texi_deps, '$(' . $canonical . '_TEXINFOS)'); |
| 3408 | push_dist_common ('$(' . $canonical . '_TEXINFOS)'); |
| 3409 | } |
| 3410 | |
| 3411 | my ($dirstamp, @cfiles) = |
| 3412 | output_texinfo_build_rules ($texi, $out_file, $insrc, @texi_deps); |
| 3413 | push (@texi_cleans, @cfiles); |
| 3414 | |
| 3415 | push (@info_deps_list, $out_file); |
| 3416 | |
| 3417 | # If a vers*.texi file is needed, emit the rule. |
| 3418 | if ($vtexi) |
| 3419 | { |
| 3420 | err_am ("'$vtexi', included in '$texi', " |
| 3421 | . "also included in '$versions{$vtexi}'") |
| 3422 | if defined $versions{$vtexi}; |
| 3423 | $versions{$vtexi} = $texi; |
| 3424 | |
| 3425 | # We number the stamp-vti files. This is doable since the |
| 3426 | # actual names don't matter much. We only number starting |
| 3427 | # with the second one, so that the common case looks nice. |
| 3428 | my $vti = ($done ? $done : 'vti'); |
| 3429 | ++$done; |
| 3430 | |
| 3431 | # This is ugly, but it is our historical practice. |
| 3432 | if ($config_aux_dir_set_in_configure_ac) |
| 3433 | { |
| 3434 | require_conf_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN, |
| 3435 | 'mdate-sh'); |
| 3436 | } |
| 3437 | else |
| 3438 | { |
| 3439 | require_file_with_macro (TRUE, 'info_TEXINFOS', |
| 3440 | FOREIGN, 'mdate-sh'); |
| 3441 | } |
| 3442 | |
| 3443 | my $conf_dir; |
| 3444 | if ($config_aux_dir_set_in_configure_ac) |
| 3445 | { |
| 3446 | $conf_dir = "$am_config_aux_dir/"; |
| 3447 | } |
| 3448 | else |
| 3449 | { |
| 3450 | $conf_dir = '$(srcdir)/'; |
| 3451 | } |
| 3452 | $output_rules .= file_contents ('texi-vers', |
| 3453 | new Automake::Location, |
| 3454 | TEXI => $texi, |
| 3455 | VTI => $vti, |
| 3456 | STAMPVTI => "${soutdir}stamp-$vti", |
| 3457 | VTEXI => "$soutdir$vtexi", |
| 3458 | MDDIR => $conf_dir, |
| 3459 | DIRSTAMP => $dirstamp); |
| 3460 | } |
| 3461 | } |
| 3462 | |
| 3463 | # Handle location of texinfo.tex. |
| 3464 | my $need_texi_file = 0; |
| 3465 | my $texinfodir; |
| 3466 | if (var ('TEXINFO_TEX')) |
| 3467 | { |
| 3468 | # The user defined TEXINFO_TEX so assume he knows what he is |
| 3469 | # doing. |
| 3470 | $texinfodir = ('$(srcdir)/' |
| 3471 | . dirname (variable_value ('TEXINFO_TEX'))); |
| 3472 | } |
| 3473 | elsif ($config_aux_dir_set_in_configure_ac) |
| 3474 | { |
| 3475 | $texinfodir = $am_config_aux_dir; |
| 3476 | define_variable ('TEXINFO_TEX', "$texinfodir/texinfo.tex", INTERNAL); |
| 3477 | $need_texi_file = 2; # so that we require_conf_file later |
| 3478 | } |
| 3479 | else |
| 3480 | { |
| 3481 | $texinfodir = '$(srcdir)'; |
| 3482 | $need_texi_file = 1; |
| 3483 | } |
| 3484 | define_variable ('am__TEXINFO_TEX_DIR', $texinfodir, INTERNAL); |
| 3485 | |
| 3486 | push (@dist_targets, 'dist-info'); |
| 3487 | |
| 3488 | if (! option 'no-installinfo') |
| 3489 | { |
| 3490 | # Make sure documentation is made and installed first. Use |
| 3491 | # $(INFO_DEPS), not 'info', because otherwise recursive makes |
| 3492 | # get run twice during "make all". |
| 3493 | unshift (@all, '$(INFO_DEPS)'); |
| 3494 | } |
| 3495 | |
| 3496 | define_files_variable ("DVIS", @infobase, 'dvi', INTERNAL); |
| 3497 | define_files_variable ("PDFS", @infobase, 'pdf', INTERNAL); |
| 3498 | define_files_variable ("PSS", @infobase, 'ps', INTERNAL); |
| 3499 | define_files_variable ("HTMLS", @infobase, 'html', INTERNAL); |
| 3500 | |
| 3501 | # This next isn't strictly needed now -- the places that look here |
| 3502 | # could easily be changed to look in info_TEXINFOS. But this is |
| 3503 | # probably better, in case noinst_TEXINFOS is ever supported. |
| 3504 | define_variable ("TEXINFOS", variable_value ('info_TEXINFOS'), INTERNAL); |
| 3505 | |
| 3506 | # Do some error checking. Note that this file is not required |
| 3507 | # when in Cygnus mode; instead we defined TEXINFO_TEX explicitly |
| 3508 | # up above. |
| 3509 | if ($need_texi_file && ! option 'no-texinfo.tex') |
| 3510 | { |
| 3511 | if ($need_texi_file > 1) |
| 3512 | { |
| 3513 | require_conf_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN, |
| 3514 | 'texinfo.tex'); |
| 3515 | } |
| 3516 | else |
| 3517 | { |
| 3518 | require_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN, |
| 3519 | 'texinfo.tex'); |
| 3520 | } |
| 3521 | } |
| 3522 | |
| 3523 | return (makefile_wrap ("", "\t ", @mostly_cleans), |
| 3524 | makefile_wrap ("", "\t ", @texi_cleans), |
| 3525 | makefile_wrap ("", "\t ", @maint_cleans)); |
| 3526 | } |
| 3527 | |
| 3528 | |
| 3529 | sub handle_texinfo () |
| 3530 | { |
| 3531 | reject_var 'TEXINFOS', "'TEXINFOS' is an anachronism; use 'info_TEXINFOS'"; |
| 3532 | # FIXME: I think this is an obsolete future feature name. |
| 3533 | reject_var 'html_TEXINFOS', "HTML generation not yet supported"; |
| 3534 | |
| 3535 | my $info_texinfos = var ('info_TEXINFOS'); |
| 3536 | my ($mostlyclean, $clean, $maintclean) = ('', '', ''); |
| 3537 | if ($info_texinfos) |
| 3538 | { |
| 3539 | define_verbose_texinfo; |
| 3540 | ($mostlyclean, $clean, $maintclean) = handle_texinfo_helper ($info_texinfos); |
| 3541 | chomp $mostlyclean; |
| 3542 | chomp $clean; |
| 3543 | chomp $maintclean; |
| 3544 | } |
| 3545 | |
| 3546 | $output_rules .= file_contents ('texinfos', |
| 3547 | new Automake::Location, |
| 3548 | AM_V_DVIPS => verbose_flag('DVIPS'), |
| 3549 | MOSTLYCLEAN => $mostlyclean, |
| 3550 | TEXICLEAN => $clean, |
| 3551 | MAINTCLEAN => $maintclean, |
| 3552 | 'LOCAL-TEXIS' => !!$info_texinfos, |
| 3553 | TEXIQUIET => verbose_flag('texinfo')); |
| 3554 | } |
| 3555 | |
| 3556 | |
| 3557 | sub handle_man_pages () |
| 3558 | { |
| 3559 | reject_var 'MANS', "'MANS' is an anachronism; use 'man_MANS'"; |
| 3560 | |
| 3561 | # Find all the sections in use. We do this by first looking for |
| 3562 | # "standard" sections, and then looking for any additional |
| 3563 | # sections used in man_MANS. |
| 3564 | my (%sections, %notrans_sections, %trans_sections, |
| 3565 | %notrans_vars, %trans_vars, %notrans_sect_vars, %trans_sect_vars); |
| 3566 | # We handle nodist_ for uniformity. man pages aren't distributed |
| 3567 | # by default so it isn't actually very important. |
| 3568 | foreach my $npfx ('', 'notrans_') |
| 3569 | { |
| 3570 | foreach my $pfx ('', 'dist_', 'nodist_') |
| 3571 | { |
| 3572 | # Add more sections as needed. |
| 3573 | foreach my $section ('0'..'9', 'n', 'l') |
| 3574 | { |
| 3575 | my $varname = $npfx . $pfx . 'man' . $section . '_MANS'; |
| 3576 | if (var ($varname)) |
| 3577 | { |
| 3578 | $sections{$section} = 1; |
| 3579 | $varname = '$(' . $varname . ')'; |
| 3580 | if ($npfx eq 'notrans_') |
| 3581 | { |
| 3582 | $notrans_sections{$section} = 1; |
| 3583 | $notrans_sect_vars{$varname} = 1; |
| 3584 | } |
| 3585 | else |
| 3586 | { |
| 3587 | $trans_sections{$section} = 1; |
| 3588 | $trans_sect_vars{$varname} = 1; |
| 3589 | } |
| 3590 | |
| 3591 | push_dist_common ($varname) |
| 3592 | if $pfx eq 'dist_'; |
| 3593 | } |
| 3594 | } |
| 3595 | |
| 3596 | my $varname = $npfx . $pfx . 'man_MANS'; |
| 3597 | my $var = var ($varname); |
| 3598 | if ($var) |
| 3599 | { |
| 3600 | foreach ($var->value_as_list_recursive) |
| 3601 | { |
| 3602 | # A page like 'foo.1c' goes into man1dir. |
| 3603 | if (/\.([0-9a-z])([a-z]*)$/) |
| 3604 | { |
| 3605 | $sections{$1} = 1; |
| 3606 | if ($npfx eq 'notrans_') |
| 3607 | { |
| 3608 | $notrans_sections{$1} = 1; |
| 3609 | } |
| 3610 | else |
| 3611 | { |
| 3612 | $trans_sections{$1} = 1; |
| 3613 | } |
| 3614 | } |
| 3615 | } |
| 3616 | |
| 3617 | $varname = '$(' . $varname . ')'; |
| 3618 | if ($npfx eq 'notrans_') |
| 3619 | { |
| 3620 | $notrans_vars{$varname} = 1; |
| 3621 | } |
| 3622 | else |
| 3623 | { |
| 3624 | $trans_vars{$varname} = 1; |
| 3625 | } |
| 3626 | push_dist_common ($varname) |
| 3627 | if $pfx eq 'dist_'; |
| 3628 | } |
| 3629 | } |
| 3630 | } |
| 3631 | |
| 3632 | return unless %sections; |
| 3633 | |
| 3634 | my @unsorted_deps; |
| 3635 | |
| 3636 | # Build section independent variables. |
| 3637 | my $have_notrans = %notrans_vars; |
| 3638 | my @notrans_list = sort keys %notrans_vars; |
| 3639 | my $have_trans = %trans_vars; |
| 3640 | my @trans_list = sort keys %trans_vars; |
| 3641 | |
| 3642 | # Now for each section, generate an install and uninstall rule. |
| 3643 | # Sort sections so output is deterministic. |
| 3644 | foreach my $section (sort keys %sections) |
| 3645 | { |
| 3646 | # Build section dependent variables. |
| 3647 | my $notrans_mans = $have_notrans || exists $notrans_sections{$section}; |
| 3648 | my $trans_mans = $have_trans || exists $trans_sections{$section}; |
| 3649 | my (%notrans_this_sect, %trans_this_sect); |
| 3650 | my $expr = 'man' . $section . '_MANS'; |
| 3651 | foreach my $varname (keys %notrans_sect_vars) |
| 3652 | { |
| 3653 | if ($varname =~ /$expr/) |
| 3654 | { |
| 3655 | $notrans_this_sect{$varname} = 1; |
| 3656 | } |
| 3657 | } |
| 3658 | foreach my $varname (keys %trans_sect_vars) |
| 3659 | { |
| 3660 | if ($varname =~ /$expr/) |
| 3661 | { |
| 3662 | $trans_this_sect{$varname} = 1; |
| 3663 | } |
| 3664 | } |
| 3665 | my @notrans_sect_list = sort keys %notrans_this_sect; |
| 3666 | my @trans_sect_list = sort keys %trans_this_sect; |
| 3667 | @unsorted_deps = (keys %notrans_vars, keys %trans_vars, |
| 3668 | keys %notrans_this_sect, keys %trans_this_sect); |
| 3669 | my @deps = sort @unsorted_deps; |
| 3670 | $output_rules .= file_contents ('mans', |
| 3671 | new Automake::Location, |
| 3672 | SECTION => $section, |
| 3673 | DEPS => "@deps", |
| 3674 | NOTRANS_MANS => $notrans_mans, |
| 3675 | NOTRANS_SECT_LIST => "@notrans_sect_list", |
| 3676 | HAVE_NOTRANS => $have_notrans, |
| 3677 | NOTRANS_LIST => "@notrans_list", |
| 3678 | TRANS_MANS => $trans_mans, |
| 3679 | TRANS_SECT_LIST => "@trans_sect_list", |
| 3680 | HAVE_TRANS => $have_trans, |
| 3681 | TRANS_LIST => "@trans_list"); |
| 3682 | } |
| 3683 | |
| 3684 | @unsorted_deps = (keys %notrans_vars, keys %trans_vars, |
| 3685 | keys %notrans_sect_vars, keys %trans_sect_vars); |
| 3686 | my @mans = sort @unsorted_deps; |
| 3687 | $output_vars .= file_contents ('mans-vars', |
| 3688 | new Automake::Location, |
| 3689 | MANS => "@mans"); |
| 3690 | |
| 3691 | push (@all, '$(MANS)') |
| 3692 | unless option 'no-installman'; |
| 3693 | } |
| 3694 | |
| 3695 | |
| 3696 | sub handle_data () |
| 3697 | { |
| 3698 | am_install_var ('-noextra', '-candist', 'data', 'DATA', |
| 3699 | 'data', 'dataroot', 'doc', 'dvi', 'html', 'pdf', |
| 3700 | 'ps', 'sysconf', 'sharedstate', 'localstate', |
| 3701 | 'pkgdata', 'lisp', 'noinst', 'check'); |
| 3702 | } |
| 3703 | |
| 3704 | |
| 3705 | sub handle_tags () |
| 3706 | { |
| 3707 | my @config; |
| 3708 | foreach my $spec (@config_headers) |
| 3709 | { |
| 3710 | my ($out, @ins) = split_config_file_spec ($spec); |
| 3711 | foreach my $in (@ins) |
| 3712 | { |
| 3713 | # If the config header source is in this directory, |
| 3714 | # require it. |
| 3715 | push @config, basename ($in) |
| 3716 | if $relative_dir eq dirname ($in); |
| 3717 | } |
| 3718 | } |
| 3719 | |
| 3720 | define_variable ('am__tagged_files', |
| 3721 | '$(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)' |
| 3722 | . " @config", INTERNAL); |
| 3723 | |
| 3724 | if (rvar('am__tagged_files')->value_as_list_recursive |
| 3725 | || var ('ETAGS_ARGS') || var ('SUBDIRS')) |
| 3726 | { |
| 3727 | $output_rules .= file_contents ('tags', new Automake::Location); |
| 3728 | set_seen 'TAGS_DEPENDENCIES'; |
| 3729 | } |
| 3730 | else |
| 3731 | { |
| 3732 | reject_var ('TAGS_DEPENDENCIES', |
| 3733 | "it doesn't make sense to define 'TAGS_DEPENDENCIES'" |
| 3734 | . " without\nsources or 'ETAGS_ARGS'"); |
| 3735 | # Every Makefile must define some sort of TAGS rule. |
| 3736 | # Otherwise, it would be possible for a top-level "make TAGS" |
| 3737 | # to fail because some subdirectory failed. Ditto ctags and |
| 3738 | # cscope. |
| 3739 | $output_rules .= |
| 3740 | "tags TAGS:\n\n" . |
| 3741 | "ctags CTAGS:\n\n" . |
| 3742 | "cscope cscopelist:\n\n"; |
| 3743 | } |
| 3744 | } |
| 3745 | |
| 3746 | |
| 3747 | # user_phony_rule ($NAME) |
| 3748 | # ----------------------- |
| 3749 | # Return false if rule $NAME does not exist. Otherwise, |
| 3750 | # declare it as phony, complete its definition (in case it is |
| 3751 | # conditional), and return its Automake::Rule instance. |
| 3752 | sub user_phony_rule |
| 3753 | { |
| 3754 | my ($name) = @_; |
| 3755 | my $rule = rule $name; |
| 3756 | if ($rule) |
| 3757 | { |
| 3758 | depend ('.PHONY', $name); |
| 3759 | # Define $NAME in all condition where it is not already defined, |
| 3760 | # so that it is always OK to depend on $NAME. |
| 3761 | for my $c ($rule->not_always_defined_in_cond (TRUE)->conds) |
| 3762 | { |
| 3763 | Automake::Rule::define ($name, 'internal', RULE_AUTOMAKE, |
| 3764 | $c, INTERNAL); |
| 3765 | $output_rules .= $c->subst_string . "$name:\n"; |
| 3766 | } |
| 3767 | } |
| 3768 | return $rule; |
| 3769 | } |
| 3770 | |
| 3771 | |
| 3772 | # Handle 'dist' target. |
| 3773 | sub handle_dist () |
| 3774 | { |
| 3775 | # Substitutions for distdir.am |
| 3776 | my %transform; |
| 3777 | |
| 3778 | # Define DIST_SUBDIRS. This must always be done, regardless of the |
| 3779 | # no-dist setting: target like 'distclean' or 'maintainer-clean' use it. |
| 3780 | my $subdirs = var ('SUBDIRS'); |
| 3781 | if ($subdirs) |
| 3782 | { |
| 3783 | # If SUBDIRS is conditionally defined, then set DIST_SUBDIRS |
| 3784 | # to all possible directories, and use it. If DIST_SUBDIRS is |
| 3785 | # defined, just use it. |
| 3786 | |
| 3787 | # Note that we check DIST_SUBDIRS first on purpose, so that |
| 3788 | # we don't call has_conditional_contents for now reason. |
| 3789 | # (In the past one project used so many conditional subdirectories |
| 3790 | # that calling has_conditional_contents on SUBDIRS caused |
| 3791 | # automake to grow to 150Mb -- this should not happen with |
| 3792 | # the current implementation of has_conditional_contents, |
| 3793 | # but it's more efficient to avoid the call anyway.) |
| 3794 | if (var ('DIST_SUBDIRS')) |
| 3795 | { |
| 3796 | } |
| 3797 | elsif ($subdirs->has_conditional_contents) |
| 3798 | { |
| 3799 | define_pretty_variable |
| 3800 | ('DIST_SUBDIRS', TRUE, INTERNAL, |
| 3801 | uniq ($subdirs->value_as_list_recursive)); |
| 3802 | } |
| 3803 | else |
| 3804 | { |
| 3805 | # We always define this because that is what 'distclean' |
| 3806 | # wants. |
| 3807 | define_pretty_variable ('DIST_SUBDIRS', TRUE, INTERNAL, |
| 3808 | '$(SUBDIRS)'); |
| 3809 | } |
| 3810 | } |
| 3811 | |
| 3812 | # The remaining definitions are only required when a dist target is used. |
| 3813 | return if option 'no-dist'; |
| 3814 | |
| 3815 | # At least one of the archive formats must be enabled. |
| 3816 | if ($relative_dir eq '.') |
| 3817 | { |
| 3818 | my $archive_defined = option 'no-dist-gzip' ? 0 : 1; |
| 3819 | $archive_defined ||= |
| 3820 | grep { option "dist-$_" } qw(shar zip tarZ bzip2 lzip xz zstd); |
| 3821 | error (option 'no-dist-gzip', |
| 3822 | "no-dist-gzip specified but no dist-* specified,\n" |
| 3823 | . "at least one archive format must be enabled") |
| 3824 | unless $archive_defined; |
| 3825 | } |
| 3826 | |
| 3827 | # Look for common files that should be included in distribution. |
| 3828 | # If the aux dir is set, and it does not have a Makefile.am, then |
| 3829 | # we check for these files there as well. |
| 3830 | my $check_aux = 0; |
| 3831 | if ($relative_dir eq '.' |
| 3832 | && $config_aux_dir_set_in_configure_ac) |
| 3833 | { |
| 3834 | if (! is_make_dir ($config_aux_dir)) |
| 3835 | { |
| 3836 | $check_aux = 1; |
| 3837 | } |
| 3838 | } |
| 3839 | foreach my $cfile (@toplevelmd_ok, @common_files) |
| 3840 | { |
| 3841 | if (dir_has_case_matching_file ($relative_dir, $cfile) |
| 3842 | # The file might be absent, but if it can be built it's ok. |
| 3843 | || rule $cfile) |
| 3844 | { |
| 3845 | push_dist_common ($cfile); |
| 3846 | } |
| 3847 | elsif (grep { $_ eq $cfile } @toplevelmd_ok) |
| 3848 | { # Irritatingly, have to repeat the checks, now for .md files; |
| 3849 | # we want to prefer non-.md, so do this second, and only "elsif". |
| 3850 | if (dir_has_case_matching_file ($relative_dir, "$cfile.md") |
| 3851 | || rule "$cfile.md") |
| 3852 | { |
| 3853 | push_dist_common ("$cfile.md"); |
| 3854 | } |
| 3855 | } |
| 3856 | |
| 3857 | # Don't use 'elsif' here because a file might meaningfully |
| 3858 | # appear in both $relative_dir and $config_aux_dir. |
| 3859 | if ($check_aux && dir_has_case_matching_file ($config_aux_dir, $cfile)) |
| 3860 | { |
| 3861 | push_dist_common ("$config_aux_dir/$cfile") |
| 3862 | } |
| 3863 | elsif ($check_aux && grep { $_ eq $cfile } @toplevelmd_ok) |
| 3864 | { |
| 3865 | if (dir_has_case_matching_file ($config_aux_dir, "$cfile.md") |
| 3866 | || rule "$cfile.md") |
| 3867 | { |
| 3868 | push_dist_common ("$cfile.md"); |
| 3869 | } |
| 3870 | } |
| 3871 | } |
| 3872 | |
| 3873 | # We might copy elements from @configure_dist_common to |
| 3874 | # @dist_common if we think we need to. If the file appears in our |
| 3875 | # directory, we would have discovered it already, so we don't |
| 3876 | # check that. But if the file is in a subdir without a Makefile, |
| 3877 | # we want to distribute it here if we are doing '.'. Ugly! |
| 3878 | # Also, in some corner cases, it's possible that the following code |
| 3879 | # will cause the same file to appear in the $(DIST_COMMON) variables |
| 3880 | # of two distinct Makefiles; but this is not a problem, since the |
| 3881 | # 'distdir' target in 'lib/am/distdir.am' can deal with the same |
| 3882 | # file being distributed multiple times. |
| 3883 | # See also automake bug#9651. |
| 3884 | if ($relative_dir eq '.') |
| 3885 | { |
| 3886 | foreach my $file (@configure_dist_common) |
| 3887 | { |
| 3888 | my $dir = dirname ($file); |
| 3889 | push_dist_common ($file) |
| 3890 | if ($dir eq '.' || ! is_make_dir ($dir)); |
| 3891 | } |
| 3892 | @configure_dist_common = (); |
| 3893 | } |
| 3894 | |
| 3895 | # $(am__DIST_COMMON): files to be distributed automatically. Will be |
| 3896 | # appended to $(DIST_COMMON) in the generated Makefile. |
| 3897 | # Use 'sort' so that the expansion of $(DIST_COMMON) in the generated |
| 3898 | # Makefile is deterministic, in face of m4 and/or perl randomizations |
| 3899 | # (see automake bug#17908). |
| 3900 | define_pretty_variable ('am__DIST_COMMON', TRUE, INTERNAL, |
| 3901 | uniq (sort @dist_common)); |
| 3902 | |
| 3903 | # Now that we've processed @dist_common, disallow further attempts |
| 3904 | # to modify it. |
| 3905 | $handle_dist_run = 1; |
| 3906 | |
| 3907 | $transform{'DISTCHECK-HOOK'} = !! rule 'distcheck-hook'; |
| 3908 | $transform{'GETTEXT'} = $seen_gettext && !$seen_gettext_external; |
| 3909 | |
| 3910 | # If the target 'dist-hook' exists, make sure it is run. This |
| 3911 | # allows users to do random weird things to the distribution |
| 3912 | # before it is packaged up. |
| 3913 | push (@dist_targets, 'dist-hook') |
| 3914 | if user_phony_rule 'dist-hook'; |
| 3915 | $transform{'DIST-TARGETS'} = join (' ', @dist_targets); |
| 3916 | |
| 3917 | my $flm = option ('filename-length-max'); |
| 3918 | my $filename_filter = $flm ? '.' x $flm->[1] : ''; |
| 3919 | |
| 3920 | $output_rules .= file_contents ('distdir', |
| 3921 | new Automake::Location, |
| 3922 | %transform, |
| 3923 | FILENAME_FILTER => $filename_filter); |
| 3924 | } |
| 3925 | |
| 3926 | |
| 3927 | # check_directory ($NAME, $WHERE [, $RELATIVE_DIR = "."]) |
| 3928 | # ------------------------------------------------------- |
| 3929 | # Ensure $NAME is a directory (in $RELATIVE_DIR), and that it uses a sane |
| 3930 | # name. Use $WHERE as a location in the diagnostic, if any. |
| 3931 | sub check_directory |
| 3932 | { |
| 3933 | my ($dir, $where, $reldir) = @_; |
| 3934 | $reldir = '.' unless defined $reldir; |
| 3935 | |
| 3936 | error $where, "required directory $reldir/$dir does not exist" |
| 3937 | unless -d "$reldir/$dir"; |
| 3938 | |
| 3939 | # If an 'obj/' directory exists, BSD make will enter it before |
| 3940 | # reading 'Makefile'. Hence the 'Makefile' in the current directory |
| 3941 | # will not be read. |
| 3942 | # |
| 3943 | # % cat Makefile |
| 3944 | # all: |
| 3945 | # echo Hello |
| 3946 | # % cat obj/Makefile |
| 3947 | # all: |
| 3948 | # echo World |
| 3949 | # % make # GNU make |
| 3950 | # echo Hello |
| 3951 | # Hello |
| 3952 | # % pmake # BSD make |
| 3953 | # echo World |
| 3954 | # World |
| 3955 | msg ('portability', $where, |
| 3956 | "naming a subdirectory 'obj' causes troubles with BSD make") |
| 3957 | if $dir eq 'obj'; |
| 3958 | |
| 3959 | # 'aux' is probably the most important of the following forbidden name, |
| 3960 | # since it's tempting to use it as an AC_CONFIG_AUX_DIR. |
| 3961 | msg ('portability', $where, |
| 3962 | "name '$dir' is reserved on W32 and DOS platforms") |
| 3963 | if grep (/^\Q$dir\E$/i, qw/aux lpt1 lpt2 lpt3 com1 com2 com3 com4 con prn/); |
| 3964 | } |
| 3965 | |
| 3966 | # check_directories_in_var ($VARIABLE) |
| 3967 | # ------------------------------------ |
| 3968 | # Recursively check all items in variables $VARIABLE as directories |
| 3969 | sub check_directories_in_var |
| 3970 | { |
| 3971 | my ($var) = @_; |
| 3972 | $var->traverse_recursively |
| 3973 | (sub |
| 3974 | { |
| 3975 | my ($var, $val, $cond, $full_cond) = @_; |
| 3976 | check_directory ($val, $var->rdef ($cond)->location, $relative_dir); |
| 3977 | return (); |
| 3978 | }, |
| 3979 | undef, |
| 3980 | skip_ac_subst => 1); |
| 3981 | } |
| 3982 | |
| 3983 | |
| 3984 | sub handle_subdirs () |
| 3985 | { |
| 3986 | my $subdirs = var ('SUBDIRS'); |
| 3987 | return |
| 3988 | unless $subdirs; |
| 3989 | |
| 3990 | check_directories_in_var $subdirs; |
| 3991 | |
| 3992 | my $dsubdirs = var ('DIST_SUBDIRS'); |
| 3993 | check_directories_in_var $dsubdirs |
| 3994 | if $dsubdirs; |
| 3995 | |
| 3996 | $output_rules .= file_contents ('subdirs', new Automake::Location); |
| 3997 | rvar ('RECURSIVE_TARGETS')->rdef (TRUE)->{'pretty'} = VAR_SORTED; # Gross! |
| 3998 | } |
| 3999 | |
| 4000 | |
| 4001 | # ($REGEN, @DEPENDENCIES) |
| 4002 | # scan_aclocal_m4 |
| 4003 | # --------------- |
| 4004 | # If aclocal.m4 creation is automated, return the list of its dependencies. |
| 4005 | sub scan_aclocal_m4 () |
| 4006 | { |
| 4007 | my $regen_aclocal = 0; |
| 4008 | |
| 4009 | set_seen 'CONFIG_STATUS_DEPENDENCIES'; |
| 4010 | set_seen 'CONFIGURE_DEPENDENCIES'; |
| 4011 | |
| 4012 | if (-f 'aclocal.m4') |
| 4013 | { |
| 4014 | define_variable ("ACLOCAL_M4", '$(top_srcdir)/aclocal.m4', INTERNAL); |
| 4015 | |
| 4016 | my $aclocal = new Automake::XFile "< aclocal.m4"; |
| 4017 | my $line = $aclocal->getline; |
| 4018 | $regen_aclocal = $line =~ 'generated automatically by aclocal'; |
| 4019 | } |
| 4020 | |
| 4021 | my @ac_deps = (); |
| 4022 | |
| 4023 | if (set_seen ('ACLOCAL_M4_SOURCES')) |
| 4024 | { |
| 4025 | push (@ac_deps, '$(ACLOCAL_M4_SOURCES)'); |
| 4026 | msg_var ('obsolete', 'ACLOCAL_M4_SOURCES', |
| 4027 | "'ACLOCAL_M4_SOURCES' is obsolete.\n" |
| 4028 | . "It should be safe to simply remove it"); |
| 4029 | } |
| 4030 | |
| 4031 | # Note that it might be possible that aclocal.m4 doesn't exist but |
| 4032 | # should be auto-generated. This case probably isn't very |
| 4033 | # important. |
| 4034 | |
| 4035 | return ($regen_aclocal, @ac_deps); |
| 4036 | } |
| 4037 | |
| 4038 | |
| 4039 | # Helper function for 'substitute_ac_subst_variables'. |
| 4040 | sub substitute_ac_subst_variables_worker |
| 4041 | { |
| 4042 | my ($token) = @_; |
| 4043 | return "\@$token\@" if var $token; |
| 4044 | return "\${$token\}"; |
| 4045 | } |
| 4046 | |
| 4047 | # substitute_ac_subst_variables ($TEXT) |
| 4048 | # ------------------------------------- |
| 4049 | # Replace any occurrence of ${FOO} in $TEXT by @FOO@ if FOO is an AC_SUBST |
| 4050 | # variable. |
| 4051 | sub substitute_ac_subst_variables |
| 4052 | { |
| 4053 | my ($text) = @_; |
| 4054 | $text =~ s/\$[{]([^ \t=:+{}]+)}/substitute_ac_subst_variables_worker ($1)/ge; |
| 4055 | return $text; |
| 4056 | } |
| 4057 | |
| 4058 | # @DEPENDENCIES |
| 4059 | # prepend_srcdir (@INPUTS) |
| 4060 | # ------------------------ |
| 4061 | # Prepend $(srcdir) or $(top_srcdir) to all @INPUTS. The idea is that |
| 4062 | # if an input file has a directory part the same as the current |
| 4063 | # directory, then the directory part is simply replaced by $(srcdir). |
| 4064 | # But if the directory part is different, then $(top_srcdir) is |
| 4065 | # prepended. |
| 4066 | sub prepend_srcdir |
| 4067 | { |
| 4068 | my (@inputs) = @_; |
| 4069 | my @newinputs; |
| 4070 | |
| 4071 | foreach my $single (@inputs) |
| 4072 | { |
| 4073 | if (dirname ($single) eq $relative_dir) |
| 4074 | { |
| 4075 | push (@newinputs, '$(srcdir)/' . basename ($single)); |
| 4076 | } |
| 4077 | else |
| 4078 | { |
| 4079 | push (@newinputs, '$(top_srcdir)/' . $single); |
| 4080 | } |
| 4081 | } |
| 4082 | return @newinputs; |
| 4083 | } |
| 4084 | |
| 4085 | # @DEPENDENCIES |
| 4086 | # rewrite_inputs_into_dependencies ($OUTPUT, @INPUTS) |
| 4087 | # --------------------------------------------------- |
| 4088 | # Compute a list of dependencies appropriate for the rebuild |
| 4089 | # rule of |
| 4090 | # AC_CONFIG_FILES($OUTPUT:$INPUT[0]:$INPUTS[1]:...) |
| 4091 | # Also distribute $INPUTs which are not built by another AC_CONFIG_FOOs. |
| 4092 | sub rewrite_inputs_into_dependencies |
| 4093 | { |
| 4094 | my ($file, @inputs) = @_; |
| 4095 | my @res = (); |
| 4096 | |
| 4097 | for my $i (@inputs) |
| 4098 | { |
| 4099 | # We cannot create dependencies on shell variables. |
| 4100 | next if (substitute_ac_subst_variables $i) =~ /\$/; |
| 4101 | |
| 4102 | if (exists $ac_config_files_location{$i} && $i ne $file) |
| 4103 | { |
| 4104 | my $di = dirname $i; |
| 4105 | if ($di eq $relative_dir) |
| 4106 | { |
| 4107 | $i = basename $i; |
| 4108 | } |
| 4109 | # In the top-level Makefile we do not use $(top_builddir), because |
| 4110 | # we are already there, and since the targets are built without |
| 4111 | # a $(top_builddir), it helps BSD Make to match them with |
| 4112 | # dependencies. |
| 4113 | elsif ($relative_dir ne '.') |
| 4114 | { |
| 4115 | $i = '$(top_builddir)/' . $i; |
| 4116 | } |
| 4117 | } |
| 4118 | else |
| 4119 | { |
| 4120 | msg ('error', $ac_config_files_location{$file}, |
| 4121 | "required file '$i' not found") |
| 4122 | unless $i =~ /\$/ || exists $output_files{$i} || -f $i; |
| 4123 | ($i) = prepend_srcdir ($i); |
| 4124 | push_dist_common ($i); |
| 4125 | } |
| 4126 | push @res, $i; |
| 4127 | } |
| 4128 | return @res; |
| 4129 | } |
| 4130 | |
| 4131 | |
| 4132 | |
| 4133 | # handle_configure ($MAKEFILE_AM, $MAKEFILE_IN, $MAKEFILE, @INPUTS) |
| 4134 | # ----------------------------------------------------------------- |
| 4135 | # Handle remaking and configure stuff. |
| 4136 | # We need the name of the input file, to do proper remaking rules. |
| 4137 | sub handle_configure |
| 4138 | { |
| 4139 | my ($makefile_am, $makefile_in, $makefile, @inputs) = @_; |
| 4140 | |
| 4141 | prog_error 'empty @inputs' |
| 4142 | unless @inputs; |
| 4143 | |
| 4144 | my ($rel_makefile_am, $rel_makefile_in) = prepend_srcdir ($makefile_am, |
| 4145 | $makefile_in); |
| 4146 | my $rel_makefile = basename $makefile; |
| 4147 | |
| 4148 | my $colon_infile = ':' . join (':', @inputs); |
| 4149 | $colon_infile = '' if $colon_infile eq ":$makefile.in"; |
| 4150 | my @rewritten = rewrite_inputs_into_dependencies ($makefile, @inputs); |
| 4151 | my ($regen_aclocal_m4, @aclocal_m4_deps) = scan_aclocal_m4; |
| 4152 | define_pretty_variable ('am__aclocal_m4_deps', TRUE, INTERNAL, |
| 4153 | @configure_deps, @aclocal_m4_deps, |
| 4154 | '$(top_srcdir)/' . $configure_ac); |
| 4155 | my @configuredeps = ('$(am__aclocal_m4_deps)', '$(CONFIGURE_DEPENDENCIES)'); |
| 4156 | push @configuredeps, '$(ACLOCAL_M4)' if -f 'aclocal.m4'; |
| 4157 | define_pretty_variable ('am__configure_deps', TRUE, INTERNAL, |
| 4158 | @configuredeps); |
| 4159 | |
| 4160 | my $automake_options = '--' . $strictness_name . |
| 4161 | (global_option 'no-dependencies' ? ' --ignore-deps' : ''); |
| 4162 | |
| 4163 | $output_rules .= file_contents |
| 4164 | ('configure', |
| 4165 | new Automake::Location, |
| 4166 | MAKEFILE => $rel_makefile, |
| 4167 | 'MAKEFILE-DEPS' => "@rewritten", |
| 4168 | 'CONFIG-MAKEFILE' => ($relative_dir eq '.') ? '$@' : '$(subdir)/$@', |
| 4169 | 'MAKEFILE-IN' => $rel_makefile_in, |
| 4170 | 'HAVE-MAKEFILE-IN-DEPS' => (@include_stack > 0), |
| 4171 | 'MAKEFILE-IN-DEPS' => "@include_stack", |
| 4172 | 'MAKEFILE-AM' => $rel_makefile_am, |
| 4173 | 'AUTOMAKE-OPTIONS' => $automake_options, |
| 4174 | 'MAKEFILE-AM-SOURCES' => "$makefile$colon_infile", |
| 4175 | 'REGEN-ACLOCAL-M4' => $regen_aclocal_m4, |
| 4176 | VERBOSE => verbose_flag ('GEN')); |
| 4177 | |
| 4178 | if ($relative_dir eq '.') |
| 4179 | { |
| 4180 | push_dist_common ('acconfig.h') |
| 4181 | if -f 'acconfig.h'; |
| 4182 | } |
| 4183 | |
| 4184 | # If we have a configure header, require it. |
| 4185 | my $hdr_index = 0; |
| 4186 | my @distclean_config; |
| 4187 | foreach my $spec (@config_headers) |
| 4188 | { |
| 4189 | $hdr_index += 1; |
| 4190 | # $CONFIG_H_PATH: config.h from top level. |
| 4191 | my ($config_h_path, @ins) = split_config_file_spec ($spec); |
| 4192 | my $config_h_dir = dirname ($config_h_path); |
| 4193 | |
| 4194 | # If the header is in the current directory we want to build |
| 4195 | # the header here. Otherwise, if we're at the topmost |
| 4196 | # directory and the header's directory doesn't have a |
| 4197 | # Makefile, then we also want to build the header. |
| 4198 | if ($relative_dir eq $config_h_dir |
| 4199 | || ($relative_dir eq '.' && ! is_make_dir ($config_h_dir))) |
| 4200 | { |
| 4201 | my ($cn_sans_dir, $stamp_dir); |
| 4202 | if ($relative_dir eq $config_h_dir) |
| 4203 | { |
| 4204 | $cn_sans_dir = basename ($config_h_path); |
| 4205 | $stamp_dir = ''; |
| 4206 | } |
| 4207 | else |
| 4208 | { |
| 4209 | $cn_sans_dir = $config_h_path; |
| 4210 | if ($config_h_dir eq '.') |
| 4211 | { |
| 4212 | $stamp_dir = ''; |
| 4213 | } |
| 4214 | else |
| 4215 | { |
| 4216 | $stamp_dir = $config_h_dir . '/'; |
| 4217 | } |
| 4218 | } |
| 4219 | |
| 4220 | # This will also distribute all inputs. |
| 4221 | @ins = rewrite_inputs_into_dependencies ($config_h_path, @ins); |
| 4222 | |
| 4223 | # Cannot define rebuild rules for filenames with shell variables. |
| 4224 | next if (substitute_ac_subst_variables $config_h_path) =~ /\$/; |
| 4225 | |
| 4226 | # Header defined in this directory. |
| 4227 | my @files; |
| 4228 | if (-f $config_h_path . '.top') |
| 4229 | { |
| 4230 | push (@files, "$cn_sans_dir.top"); |
| 4231 | } |
| 4232 | if (-f $config_h_path . '.bot') |
| 4233 | { |
| 4234 | push (@files, "$cn_sans_dir.bot"); |
| 4235 | } |
| 4236 | |
| 4237 | push_dist_common (@files); |
| 4238 | |
| 4239 | # For now, acconfig.h can only appear in the top srcdir. |
| 4240 | if (-f 'acconfig.h') |
| 4241 | { |
| 4242 | push (@files, '$(top_srcdir)/acconfig.h'); |
| 4243 | } |
| 4244 | |
| 4245 | my $stamp = "${stamp_dir}stamp-h${hdr_index}"; |
| 4246 | $output_rules .= |
| 4247 | file_contents ('remake-hdr', |
| 4248 | new Automake::Location, |
| 4249 | FILES => "@files", |
| 4250 | 'FIRST-HDR' => ($hdr_index == 1), |
| 4251 | CONFIG_H => $cn_sans_dir, |
| 4252 | CONFIG_HIN => $ins[0], |
| 4253 | CONFIG_H_DEPS => "@ins", |
| 4254 | CONFIG_H_PATH => $config_h_path, |
| 4255 | STAMP => "$stamp"); |
| 4256 | |
| 4257 | push @distclean_config, $cn_sans_dir, $stamp; |
| 4258 | } |
| 4259 | } |
| 4260 | |
| 4261 | $output_rules .= file_contents ('clean-hdr', |
| 4262 | new Automake::Location, |
| 4263 | FILES => "@distclean_config") |
| 4264 | if @distclean_config; |
| 4265 | |
| 4266 | # Distribute and define mkinstalldirs only if it is already present |
| 4267 | # in the package, for backward compatibility (some people may still |
| 4268 | # use $(mkinstalldirs)). |
| 4269 | # TODO: start warning about this in Automake 1.14, and have |
| 4270 | # TODO: Automake 2.0 drop it (and the mkinstalldirs script |
| 4271 | # TODO: as well). |
| 4272 | my $mkidpath = "$config_aux_dir/mkinstalldirs"; |
| 4273 | if (-f $mkidpath) |
| 4274 | { |
| 4275 | # Use require_file so that any existing script gets updated |
| 4276 | # by --force-missing. |
| 4277 | require_conf_file ($mkidpath, FOREIGN, 'mkinstalldirs'); |
| 4278 | define_variable ('mkinstalldirs', |
| 4279 | "\$(SHELL) $am_config_aux_dir/mkinstalldirs", INTERNAL); |
| 4280 | } |
| 4281 | else |
| 4282 | { |
| 4283 | # Use $(install_sh), not $(MKDIR_P) because the latter requires |
| 4284 | # at least one argument, and $(mkinstalldirs) used to work |
| 4285 | # even without arguments (e.g. $(mkinstalldirs) $(conditional_dir)). |
| 4286 | # Also, $(MKDIR_P) uses the umask for any intermediate directories |
| 4287 | # created, whereas we want them to be created with umask 022 |
| 4288 | # so that they are mode 755. |
| 4289 | define_variable ('mkinstalldirs', '$(install_sh) -d', INTERNAL); |
| 4290 | } |
| 4291 | |
| 4292 | reject_var ('CONFIG_HEADER', |
| 4293 | "'CONFIG_HEADER' is an anachronism; now determined " |
| 4294 | . "automatically\nfrom '$configure_ac'"); |
| 4295 | |
| 4296 | my @config_h; |
| 4297 | foreach my $spec (@config_headers) |
| 4298 | { |
| 4299 | my ($out, @ins) = split_config_file_spec ($spec); |
| 4300 | # Generate CONFIG_HEADER define. |
| 4301 | if ($relative_dir eq dirname ($out)) |
| 4302 | { |
| 4303 | push @config_h, basename ($out); |
| 4304 | } |
| 4305 | else |
| 4306 | { |
| 4307 | push @config_h, "\$(top_builddir)/$out"; |
| 4308 | } |
| 4309 | } |
| 4310 | define_variable ("CONFIG_HEADER", "@config_h", INTERNAL) |
| 4311 | if @config_h; |
| 4312 | |
| 4313 | # Now look for other files in this directory which must be remade |
| 4314 | # by config.status, and generate rules for them. |
| 4315 | my @actual_other_files = (); |
| 4316 | # These get cleaned only in a VPATH build. |
| 4317 | my @actual_other_vpath_files = (); |
| 4318 | foreach my $lfile (@other_input_files) |
| 4319 | { |
| 4320 | my $file; |
| 4321 | my @inputs; |
| 4322 | if ($lfile =~ /^([^:]*):(.*)$/) |
| 4323 | { |
| 4324 | # This is the ":" syntax of AC_OUTPUT. |
| 4325 | $file = $1; |
| 4326 | @inputs = split (':', $2); |
| 4327 | } |
| 4328 | else |
| 4329 | { |
| 4330 | # Normal usage. |
| 4331 | $file = $lfile; |
| 4332 | @inputs = $file . '.in'; |
| 4333 | } |
| 4334 | |
| 4335 | # Automake files should not be stored in here, but in %MAKE_LIST. |
| 4336 | prog_error ("$lfile in \@other_input_files\n" |
| 4337 | . "\@other_input_files = (@other_input_files)") |
| 4338 | if -f $file . '.am'; |
| 4339 | |
| 4340 | my $local = basename ($file); |
| 4341 | |
| 4342 | # We skip files that aren't in this directory. However, if |
| 4343 | # the file's directory does not have a Makefile, and we are |
| 4344 | # currently doing '.', then we create a rule to rebuild the |
| 4345 | # file in the subdir. |
| 4346 | my $fd = dirname ($file); |
| 4347 | if ($fd ne $relative_dir) |
| 4348 | { |
| 4349 | if ($relative_dir eq '.' && ! is_make_dir ($fd)) |
| 4350 | { |
| 4351 | $local = $file; |
| 4352 | } |
| 4353 | else |
| 4354 | { |
| 4355 | next; |
| 4356 | } |
| 4357 | } |
| 4358 | |
| 4359 | my @rewritten_inputs = rewrite_inputs_into_dependencies ($file, @inputs); |
| 4360 | |
| 4361 | # Cannot output rules for shell variables. |
| 4362 | next if (substitute_ac_subst_variables $local) =~ /\$/; |
| 4363 | |
| 4364 | my $condstr = ''; |
| 4365 | my $cond = $ac_config_files_condition{$lfile}; |
| 4366 | if (defined $cond) |
| 4367 | { |
| 4368 | $condstr = $cond->subst_string; |
| 4369 | Automake::Rule::define ($local, $configure_ac, RULE_AUTOMAKE, $cond, |
| 4370 | $ac_config_files_location{$file}); |
| 4371 | } |
| 4372 | $output_rules .= ($condstr . $local . ': ' |
| 4373 | . '$(top_builddir)/config.status ' |
| 4374 | . "@rewritten_inputs\n" |
| 4375 | . $condstr . "\t" |
| 4376 | . 'cd $(top_builddir) && ' |
| 4377 | . '$(SHELL) ./config.status ' |
| 4378 | . ($relative_dir eq '.' ? '' : '$(subdir)/') |
| 4379 | . '$@' |
| 4380 | . "\n"); |
| 4381 | push (@actual_other_files, $local); |
| 4382 | } |
| 4383 | |
| 4384 | # For links we should clean destinations and distribute sources. |
| 4385 | foreach my $spec (@config_links) |
| 4386 | { |
| 4387 | my ($link, $file) = split /:/, $spec; |
| 4388 | # Some people do AC_CONFIG_LINKS($computed). We only handle |
| 4389 | # the DEST:SRC form. |
| 4390 | next unless $file; |
| 4391 | my $where = $ac_config_files_location{$link}; |
| 4392 | |
| 4393 | # Skip destinations that contain shell variables. |
| 4394 | if ((substitute_ac_subst_variables $link) !~ /\$/) |
| 4395 | { |
| 4396 | # We skip links that aren't in this directory. However, if |
| 4397 | # the link's directory does not have a Makefile, and we are |
| 4398 | # currently doing '.', then we add the link to CONFIG_CLEAN_FILES |
| 4399 | # in '.'s Makefile.in. |
| 4400 | my $local = basename ($link); |
| 4401 | my $fd = dirname ($link); |
| 4402 | if ($fd ne $relative_dir) |
| 4403 | { |
| 4404 | if ($relative_dir eq '.' && ! is_make_dir ($fd)) |
| 4405 | { |
| 4406 | $local = $link; |
| 4407 | } |
| 4408 | else |
| 4409 | { |
| 4410 | $local = undef; |
| 4411 | } |
| 4412 | } |
| 4413 | if ($file ne $link) |
| 4414 | { |
| 4415 | push @actual_other_files, $local if $local; |
| 4416 | } |
| 4417 | else |
| 4418 | { |
| 4419 | push @actual_other_vpath_files, $local if $local; |
| 4420 | } |
| 4421 | } |
| 4422 | |
| 4423 | # Do not process sources that contain shell variables. |
| 4424 | if ((substitute_ac_subst_variables $file) !~ /\$/) |
| 4425 | { |
| 4426 | my $fd = dirname ($file); |
| 4427 | |
| 4428 | # We distribute files that are in this directory. |
| 4429 | # At the top-level ('.') we also distribute files whose |
| 4430 | # directory does not have a Makefile. |
| 4431 | if (($fd eq $relative_dir) |
| 4432 | || ($relative_dir eq '.' && ! is_make_dir ($fd))) |
| 4433 | { |
| 4434 | # The following will distribute $file as a side-effect when |
| 4435 | # it is appropriate (i.e., when $file is not already an output). |
| 4436 | # We do not need the result, just the side-effect. |
| 4437 | rewrite_inputs_into_dependencies ($link, $file); |
| 4438 | } |
| 4439 | } |
| 4440 | } |
| 4441 | |
| 4442 | # These files get removed by "make distclean". |
| 4443 | define_pretty_variable ('CONFIG_CLEAN_FILES', TRUE, INTERNAL, |
| 4444 | @actual_other_files); |
| 4445 | define_pretty_variable ('CONFIG_CLEAN_VPATH_FILES', TRUE, INTERNAL, |
| 4446 | @actual_other_vpath_files); |
| 4447 | } |
| 4448 | |
| 4449 | sub handle_headers () |
| 4450 | { |
| 4451 | my @r = am_install_var ('-defaultdist', 'header', 'HEADERS', 'include', |
| 4452 | 'oldinclude', 'pkginclude', |
| 4453 | 'noinst', 'check'); |
| 4454 | foreach (@r) |
| 4455 | { |
| 4456 | next unless $_->[1] =~ /\..*$/; |
| 4457 | saw_extension ($&); |
| 4458 | } |
| 4459 | } |
| 4460 | |
| 4461 | sub handle_gettext () |
| 4462 | { |
| 4463 | return if ! $seen_gettext || $relative_dir ne '.'; |
| 4464 | |
| 4465 | my $subdirs = var 'SUBDIRS'; |
| 4466 | |
| 4467 | if (! $subdirs) |
| 4468 | { |
| 4469 | err_ac "AM_GNU_GETTEXT used but SUBDIRS not defined"; |
| 4470 | return; |
| 4471 | } |
| 4472 | |
| 4473 | # Perform some sanity checks to help users get the right setup. |
| 4474 | # We disable these tests when po/ doesn't exist in order not to disallow |
| 4475 | # unusual gettext setups. |
| 4476 | # |
| 4477 | # Bruno Haible: |
| 4478 | # | The idea is: |
| 4479 | # | |
| 4480 | # | 1) If a package doesn't have a directory po/ at top level, it |
| 4481 | # | will likely have multiple po/ directories in subpackages. |
| 4482 | # | |
| 4483 | # | 2) It is useful to warn for the absence of intl/ if AM_GNU_GETTEXT |
| 4484 | # | is used without 'external'. It is also useful to warn for the |
| 4485 | # | presence of intl/ if AM_GNU_GETTEXT([external]) is used. Both |
| 4486 | # | warnings apply only to the usual layout of packages, therefore |
| 4487 | # | they should both be disabled if no po/ directory is found at |
| 4488 | # | top level. |
| 4489 | |
| 4490 | if (-d 'po') |
| 4491 | { |
| 4492 | my @subdirs = $subdirs->value_as_list_recursive; |
| 4493 | |
| 4494 | msg_var ('syntax', $subdirs, |
| 4495 | "AM_GNU_GETTEXT used but 'po' not in SUBDIRS") |
| 4496 | if ! grep ($_ eq 'po', @subdirs); |
| 4497 | |
| 4498 | # intl/ is not required when AM_GNU_GETTEXT is called with the |
| 4499 | # 'external' option and AM_GNU_GETTEXT_INTL_SUBDIR is not called. |
| 4500 | msg_var ('syntax', $subdirs, |
| 4501 | "AM_GNU_GETTEXT used but 'intl' not in SUBDIRS") |
| 4502 | if (! ($seen_gettext_external && ! $seen_gettext_intl) |
| 4503 | && ! grep ($_ eq 'intl', @subdirs)); |
| 4504 | |
| 4505 | # intl/ should not be used with AM_GNU_GETTEXT([external]), except |
| 4506 | # if AM_GNU_GETTEXT_INTL_SUBDIR is called. |
| 4507 | msg_var ('syntax', $subdirs, |
| 4508 | "'intl' should not be in SUBDIRS when " |
| 4509 | . "AM_GNU_GETTEXT([external]) is used") |
| 4510 | if ($seen_gettext_external && ! $seen_gettext_intl |
| 4511 | && grep ($_ eq 'intl', @subdirs)); |
| 4512 | } |
| 4513 | |
| 4514 | require_file ($ac_gettext_location, GNU, 'ABOUT-NLS'); |
| 4515 | } |
| 4516 | |
| 4517 | # Emit makefile footer. |
| 4518 | sub handle_footer () |
| 4519 | { |
| 4520 | reject_rule ('.SUFFIXES', |
| 4521 | "use variable 'SUFFIXES', not target '.SUFFIXES'"); |
| 4522 | |
| 4523 | # Note: AIX 4.1 /bin/make will fail if any suffix rule appears |
| 4524 | # before .SUFFIXES. So we make sure that .SUFFIXES appears before |
| 4525 | # anything else, by sticking it right after the default: target. |
| 4526 | $output_header .= ".SUFFIXES:\n"; |
| 4527 | my $suffixes = var 'SUFFIXES'; |
| 4528 | my @suffixes = Automake::Rule::suffixes; |
| 4529 | if (@suffixes || $suffixes) |
| 4530 | { |
| 4531 | # Make sure SUFFIXES has unique elements. Sort them to ensure |
| 4532 | # the output remains consistent. However, $(SUFFIXES) is |
| 4533 | # always at the start of the list, unsorted. This is done |
| 4534 | # because make will choose rules depending on the ordering of |
| 4535 | # suffixes, and this lets the user have some control. Push |
| 4536 | # actual suffixes, and not $(SUFFIXES). Some versions of make |
| 4537 | # do not like variable substitutions on the .SUFFIXES line. |
| 4538 | my @user_suffixes = ($suffixes |
| 4539 | ? $suffixes->value_as_list_recursive : ()); |
| 4540 | |
| 4541 | my %suffixes = map { $_ => 1 } @suffixes; |
| 4542 | delete @suffixes{@user_suffixes}; |
| 4543 | |
| 4544 | $output_header .= (".SUFFIXES: " |
| 4545 | . join (' ', @user_suffixes, sort keys %suffixes) |
| 4546 | . "\n"); |
| 4547 | } |
| 4548 | |
| 4549 | $output_trailer .= file_contents ('footer', new Automake::Location); |
| 4550 | } |
| 4551 | |
| 4552 | |
| 4553 | # Generate 'make install' rules. |
| 4554 | sub handle_install () |
| 4555 | { |
| 4556 | $output_rules .= file_contents |
| 4557 | ('install', |
| 4558 | new Automake::Location, |
| 4559 | maybe_BUILT_SOURCES => (set_seen ('BUILT_SOURCES') |
| 4560 | ? (" \$(BUILT_SOURCES)\n" |
| 4561 | . "\t\$(MAKE) \$(AM_MAKEFLAGS)") |
| 4562 | : ''), |
| 4563 | 'installdirs-local' => (user_phony_rule ('installdirs-local') |
| 4564 | ? ' installdirs-local' : ''), |
| 4565 | am__installdirs => variable_value ('am__installdirs') || ''); |
| 4566 | } |
| 4567 | |
| 4568 | |
| 4569 | # handle_all ($MAKEFILE) |
| 4570 | #----------------------- |
| 4571 | # Deal with 'all' and 'all-am'. |
| 4572 | sub handle_all |
| 4573 | { |
| 4574 | my ($makefile) = @_; |
| 4575 | |
| 4576 | # Output 'all-am'. |
| 4577 | |
| 4578 | # Put this at the beginning for the sake of non-GNU makes. This |
| 4579 | # is still wrong if these makes can run parallel jobs. But it is |
| 4580 | # right enough. |
| 4581 | unshift (@all, basename ($makefile)); |
| 4582 | |
| 4583 | foreach my $spec (@config_headers) |
| 4584 | { |
| 4585 | my ($out, @ins) = split_config_file_spec ($spec); |
| 4586 | push (@all, basename ($out)) |
| 4587 | if dirname ($out) eq $relative_dir; |
| 4588 | } |
| 4589 | |
| 4590 | # Install 'all' hooks. |
| 4591 | push (@all, "all-local") |
| 4592 | if user_phony_rule "all-local"; |
| 4593 | |
| 4594 | pretty_print_rule ("all-am:", "\t\t", @all); |
| 4595 | depend ('.PHONY', 'all-am', 'all'); |
| 4596 | |
| 4597 | |
| 4598 | # Output 'all'. |
| 4599 | |
| 4600 | my @local_headers = (); |
| 4601 | push @local_headers, '$(BUILT_SOURCES)' |
| 4602 | if var ('BUILT_SOURCES'); |
| 4603 | foreach my $spec (@config_headers) |
| 4604 | { |
| 4605 | my ($out, @ins) = split_config_file_spec ($spec); |
| 4606 | push @local_headers, basename ($out) |
| 4607 | if dirname ($out) eq $relative_dir; |
| 4608 | } |
| 4609 | |
| 4610 | if (@local_headers) |
| 4611 | { |
| 4612 | # We need to make sure config.h is built before we recurse. |
| 4613 | # We also want to make sure that built sources are built |
| 4614 | # before any ordinary 'all' targets are run. We can't do this |
| 4615 | # by changing the order of dependencies to the "all" because |
| 4616 | # that breaks when using parallel makes. Instead we handle |
| 4617 | # things explicitly. |
| 4618 | $output_all .= ("all: @local_headers" |
| 4619 | . "\n\t" |
| 4620 | . '$(MAKE) $(AM_MAKEFLAGS) ' |
| 4621 | . (var ('SUBDIRS') ? 'all-recursive' : 'all-am') |
| 4622 | . "\n\n"); |
| 4623 | depend ('.MAKE', 'all'); |
| 4624 | } |
| 4625 | else |
| 4626 | { |
| 4627 | $output_all .= "all: " . (var ('SUBDIRS') |
| 4628 | ? 'all-recursive' : 'all-am') . "\n\n"; |
| 4629 | } |
| 4630 | } |
| 4631 | |
| 4632 | # Generate helper targets for user-defined recursive targets, where needed. |
| 4633 | sub handle_user_recursion () |
| 4634 | { |
| 4635 | return unless @extra_recursive_targets; |
| 4636 | |
| 4637 | define_pretty_variable ('am__extra_recursive_targets', TRUE, INTERNAL, |
| 4638 | map { "$_-recursive" } @extra_recursive_targets); |
| 4639 | my $aux = var ('SUBDIRS') ? 'recursive' : 'am'; |
| 4640 | foreach my $target (@extra_recursive_targets) |
| 4641 | { |
| 4642 | # This allows the default target's rules to be overridden in |
| 4643 | # Makefile.am. |
| 4644 | user_phony_rule ($target); |
| 4645 | depend ("$target", "$target-$aux"); |
| 4646 | depend ("$target-am", "$target-local"); |
| 4647 | # Every user-defined recursive target 'foo' *must* have a valid |
| 4648 | # associated 'foo-local' rule; we define it as an empty rule by |
| 4649 | # default, so that the user can transparently extend it in his |
| 4650 | # own Makefile.am. |
| 4651 | pretty_print_rule ("$target-local:", '', ''); |
| 4652 | # $target-recursive might as well be undefined, so do not add |
| 4653 | # it here; it's taken care of in subdirs.am anyway. |
| 4654 | depend (".PHONY", "$target-am", "$target-local"); |
| 4655 | } |
| 4656 | } |
| 4657 | |
| 4658 | |
| 4659 | # Handle check merge target specially. |
| 4660 | sub do_check_merge_target () |
| 4661 | { |
| 4662 | # Include user-defined local form of target. |
| 4663 | push @check_tests, 'check-local' |
| 4664 | if user_phony_rule 'check-local'; |
| 4665 | |
| 4666 | # The check target must depend on the local equivalent of |
| 4667 | # 'all', to ensure all the primary targets are built. Then it |
| 4668 | # must build the local check rules. |
| 4669 | $output_rules .= "check-am: all-am\n"; |
| 4670 | if (@check) |
| 4671 | { |
| 4672 | pretty_print_rule ("\t\$(MAKE) \$(AM_MAKEFLAGS)", "\t ", @check); |
| 4673 | depend ('.MAKE', 'check-am'); |
| 4674 | } |
| 4675 | |
| 4676 | if (@check_tests) |
| 4677 | { |
| 4678 | pretty_print_rule ("\t\$(MAKE) \$(AM_MAKEFLAGS)", "\t ", |
| 4679 | @check_tests); |
| 4680 | depend ('.MAKE', 'check-am'); |
| 4681 | } |
| 4682 | |
| 4683 | depend '.PHONY', 'check', 'check-am'; |
| 4684 | # Handle recursion. We have to honor BUILT_SOURCES like for 'all:'. |
| 4685 | $output_rules .= ("check: " |
| 4686 | . (var ('BUILT_SOURCES') |
| 4687 | ? "\$(BUILT_SOURCES)\n\t\$(MAKE) \$(AM_MAKEFLAGS) " |
| 4688 | : '') |
| 4689 | . (var ('SUBDIRS') ? 'check-recursive' : 'check-am') |
| 4690 | . "\n"); |
| 4691 | depend ('.MAKE', 'check') |
| 4692 | if var ('BUILT_SOURCES'); |
| 4693 | } |
| 4694 | |
| 4695 | # Handle all 'clean' targets. |
| 4696 | sub handle_clean |
| 4697 | { |
| 4698 | my ($makefile) = @_; |
| 4699 | |
| 4700 | # Clean the files listed in user variables if they exist. |
| 4701 | $clean_files{'$(MOSTLYCLEANFILES)'} = MOSTLY_CLEAN |
| 4702 | if var ('MOSTLYCLEANFILES'); |
| 4703 | $clean_files{'$(CLEANFILES)'} = CLEAN |
| 4704 | if var ('CLEANFILES'); |
| 4705 | $clean_files{'$(DISTCLEANFILES)'} = DIST_CLEAN |
| 4706 | if var ('DISTCLEANFILES'); |
| 4707 | $clean_files{'$(MAINTAINERCLEANFILES)'} = MAINTAINER_CLEAN |
| 4708 | if var ('MAINTAINERCLEANFILES'); |
| 4709 | |
| 4710 | # Built sources are automatically removed by maintainer-clean. |
| 4711 | $clean_files{'$(BUILT_SOURCES)'} = MAINTAINER_CLEAN |
| 4712 | if var ('BUILT_SOURCES'); |
| 4713 | |
| 4714 | # Compute a list of "rm"s to run for each target. |
| 4715 | my %rms = (MOSTLY_CLEAN, [], |
| 4716 | CLEAN, [], |
| 4717 | DIST_CLEAN, [], |
| 4718 | MAINTAINER_CLEAN, []); |
| 4719 | |
| 4720 | foreach my $file (sort keys %clean_files) |
| 4721 | { |
| 4722 | my $when = $clean_files{$file}; |
| 4723 | prog_error 'invalid entry in %clean_files' |
| 4724 | unless exists $rms{$when}; |
| 4725 | |
| 4726 | my $rm = "rm -f $file"; |
| 4727 | # If file is a variable, make sure when don't call 'rm -f' without args. |
| 4728 | $rm ="test -z \"$file\" || $rm" |
| 4729 | if ($file =~ /^\s*\$(\(.*\)|\{.*\})\s*$/); |
| 4730 | |
| 4731 | push @{$rms{$when}}, "\t-$rm\n"; |
| 4732 | } |
| 4733 | |
| 4734 | $output_rules .= file_contents |
| 4735 | ('clean', |
| 4736 | new Automake::Location, |
| 4737 | MOSTLYCLEAN_RMS => join ('', sort @{$rms{&MOSTLY_CLEAN}}), |
| 4738 | CLEAN_RMS => join ('', sort @{$rms{&CLEAN}}), |
| 4739 | DISTCLEAN_RMS => join ('', sort @{$rms{&DIST_CLEAN}}), |
| 4740 | MAINTAINER_CLEAN_RMS => join ('', sort @{$rms{&MAINTAINER_CLEAN}}), |
| 4741 | MAKEFILE => basename $makefile, |
| 4742 | ); |
| 4743 | } |
| 4744 | |
| 4745 | |
| 4746 | # Subroutine for handle_factored_dependencies() to let '.PHONY' and |
| 4747 | # other '.TARGETS' be last. This is meant to be used as a comparison |
| 4748 | # subroutine passed to the sort built-int. |
| 4749 | sub target_cmp |
| 4750 | { |
| 4751 | return 0 if $a eq $b; |
| 4752 | |
| 4753 | my $a1 = substr ($a, 0, 1); |
| 4754 | my $b1 = substr ($b, 0, 1); |
| 4755 | if ($a1 ne $b1) |
| 4756 | { |
| 4757 | return -1 if $b1 eq '.'; |
| 4758 | return 1 if $a1 eq '.'; |
| 4759 | } |
| 4760 | return $a cmp $b; |
| 4761 | } |
| 4762 | |
| 4763 | |
| 4764 | # Handle everything related to gathered targets. |
| 4765 | sub handle_factored_dependencies () |
| 4766 | { |
| 4767 | # Reject bad hooks. |
| 4768 | foreach my $utarg ('uninstall-data-local', 'uninstall-data-hook', |
| 4769 | 'uninstall-exec-local', 'uninstall-exec-hook', |
| 4770 | 'uninstall-dvi-local', |
| 4771 | 'uninstall-html-local', |
| 4772 | 'uninstall-info-local', |
| 4773 | 'uninstall-pdf-local', |
| 4774 | 'uninstall-ps-local') |
| 4775 | { |
| 4776 | my $x = $utarg; |
| 4777 | $x =~ s/-.*-/-/; |
| 4778 | reject_rule ($utarg, "use '$x', not '$utarg'"); |
| 4779 | } |
| 4780 | |
| 4781 | reject_rule ('install-local', |
| 4782 | "use 'install-data-local' or 'install-exec-local', " |
| 4783 | . "not 'install-local'"); |
| 4784 | |
| 4785 | reject_rule ('install-hook', |
| 4786 | "use 'install-data-hook' or 'install-exec-hook', " |
| 4787 | . "not 'install-hook'"); |
| 4788 | |
| 4789 | # Install the -local hooks. |
| 4790 | foreach (sort keys %dependencies) |
| 4791 | { |
| 4792 | # Hooks are installed on the -am targets. |
| 4793 | s/-am$// or next; |
| 4794 | depend ("$_-am", "$_-local") |
| 4795 | if user_phony_rule "$_-local"; |
| 4796 | } |
| 4797 | |
| 4798 | # Install the -hook hooks. |
| 4799 | # FIXME: Why not be as liberal as we are with -local hooks? |
| 4800 | foreach ('install-exec', 'install-data', 'uninstall') |
| 4801 | { |
| 4802 | if (user_phony_rule "$_-hook") |
| 4803 | { |
| 4804 | depend ('.MAKE', "$_-am"); |
| 4805 | register_action("$_-am", |
| 4806 | ("\t\@\$(NORMAL_INSTALL)\n" |
| 4807 | . "\t\$(MAKE) \$(AM_MAKEFLAGS) $_-hook")); |
| 4808 | } |
| 4809 | } |
| 4810 | |
| 4811 | # All the required targets are phony. |
| 4812 | depend ('.PHONY', sort keys %required_targets); |
| 4813 | |
| 4814 | # Actually output gathered targets. |
| 4815 | foreach (sort target_cmp keys %dependencies) |
| 4816 | { |
| 4817 | # If there is nothing about this guy, skip it. |
| 4818 | next |
| 4819 | unless (@{$dependencies{$_}} |
| 4820 | || $actions{$_} |
| 4821 | || $required_targets{$_}); |
| 4822 | |
| 4823 | # Define gathered targets in undefined conditions. |
| 4824 | # FIXME: Right now we must handle .PHONY as an exception, |
| 4825 | # because people write things like |
| 4826 | # .PHONY: myphonytarget |
| 4827 | # to append dependencies. This would not work if Automake |
| 4828 | # refrained from defining its own .PHONY target as it does |
| 4829 | # with other overridden targets. |
| 4830 | # Likewise for '.MAKE' and '.PRECIOUS'. |
| 4831 | my @undefined_conds = (TRUE,); |
| 4832 | if ($_ ne '.PHONY' && $_ ne '.MAKE' && $_ ne '.PRECIOUS') |
| 4833 | { |
| 4834 | @undefined_conds = |
| 4835 | Automake::Rule::define ($_, 'internal', |
| 4836 | RULE_AUTOMAKE, TRUE, INTERNAL); |
| 4837 | } |
| 4838 | my @uniq_deps = uniq (sort @{$dependencies{$_}}); |
| 4839 | foreach my $cond (@undefined_conds) |
| 4840 | { |
| 4841 | my $condstr = $cond->subst_string; |
| 4842 | pretty_print_rule ("$condstr$_:", "$condstr\t", @uniq_deps); |
| 4843 | $output_rules .= $actions{$_} if defined $actions{$_}; |
| 4844 | $output_rules .= "\n"; |
| 4845 | } |
| 4846 | } |
| 4847 | } |
| 4848 | |
| 4849 | |
| 4850 | sub handle_tests_dejagnu () |
| 4851 | { |
| 4852 | push (@check_tests, 'check-DEJAGNU'); |
| 4853 | $output_rules .= file_contents ('dejagnu', new Automake::Location); |
| 4854 | } |
| 4855 | |
| 4856 | # handle_per_suffix_test ($TEST_SUFFIX, [%TRANSFORM]) |
| 4857 | #---------------------------------------------------- |
| 4858 | sub handle_per_suffix_test |
| 4859 | { |
| 4860 | my ($test_suffix, %transform) = @_; |
| 4861 | my ($pfx, $generic, $am_exeext); |
| 4862 | if ($test_suffix eq '') |
| 4863 | { |
| 4864 | $pfx = ''; |
| 4865 | $generic = 0; |
| 4866 | $am_exeext = 'FALSE'; |
| 4867 | } |
| 4868 | else |
| 4869 | { |
| 4870 | prog_error ("test suffix '$test_suffix' lacks leading dot") |
| 4871 | unless $test_suffix =~ m/^\.(.*)/; |
| 4872 | $pfx = uc ($1) . '_'; |
| 4873 | $generic = 1; |
| 4874 | $am_exeext = exists $configure_vars{'EXEEXT'} ? 'am__EXEEXT' |
| 4875 | : 'FALSE'; |
| 4876 | } |
| 4877 | # The "test driver" program, deputed to handle tests protocol used by |
| 4878 | # test scripts. By default, it's assumed that no protocol is used, so |
| 4879 | # we fall back to the old behaviour, implemented by the 'test-driver' |
| 4880 | # auxiliary script. |
| 4881 | if (! var "${pfx}LOG_DRIVER") |
| 4882 | { |
| 4883 | require_conf_file ("parallel-tests", FOREIGN, 'test-driver'); |
| 4884 | define_variable ("${pfx}LOG_DRIVER", |
| 4885 | "\$(SHELL) $am_config_aux_dir/test-driver", |
| 4886 | INTERNAL); |
| 4887 | } |
| 4888 | my $driver = '$(' . $pfx . 'LOG_DRIVER)'; |
| 4889 | my $driver_flags = '$(AM_' . $pfx . 'LOG_DRIVER_FLAGS)' |
| 4890 | . ' $(' . $pfx . 'LOG_DRIVER_FLAGS)'; |
| 4891 | my $compile = "${pfx}LOG_COMPILE"; |
| 4892 | define_variable ($compile, |
| 4893 | '$(' . $pfx . 'LOG_COMPILER)' |
| 4894 | . ' $(AM_' . $pfx . 'LOG_FLAGS)' |
| 4895 | . ' $(' . $pfx . 'LOG_FLAGS)', |
| 4896 | INTERNAL); |
| 4897 | $output_rules .= file_contents ('check2', new Automake::Location, |
| 4898 | GENERIC => $generic, |
| 4899 | DRIVER => $driver, |
| 4900 | DRIVER_FLAGS => $driver_flags, |
| 4901 | COMPILE => '$(' . $compile . ')', |
| 4902 | EXT => $test_suffix, |
| 4903 | am__EXEEXT => $am_exeext, |
| 4904 | %transform); |
| 4905 | } |
| 4906 | |
| 4907 | # is_valid_test_extension ($EXT) |
| 4908 | # ------------------------------ |
| 4909 | # Return true if $EXT can appear in $(TEST_EXTENSIONS), return false |
| 4910 | # otherwise. |
| 4911 | sub is_valid_test_extension |
| 4912 | { |
| 4913 | my $ext = shift; |
| 4914 | return 1 |
| 4915 | if ($ext =~ /^\.[a-zA-Z_][a-zA-Z0-9_]*$/); |
| 4916 | return 1 |
| 4917 | if (exists $configure_vars{'EXEEXT'} && $ext eq subst ('EXEEXT')); |
| 4918 | return 0; |
| 4919 | } |
| 4920 | |
| 4921 | |
| 4922 | sub handle_tests () |
| 4923 | { |
| 4924 | if (option 'dejagnu') |
| 4925 | { |
| 4926 | handle_tests_dejagnu; |
| 4927 | } |
| 4928 | else |
| 4929 | { |
| 4930 | foreach my $c ('DEJATOOL', 'RUNTEST', 'RUNTESTFLAGS') |
| 4931 | { |
| 4932 | reject_var ($c, "'$c' defined but 'dejagnu' not in " |
| 4933 | . "'AUTOMAKE_OPTIONS'"); |
| 4934 | } |
| 4935 | } |
| 4936 | |
| 4937 | if (var ('TESTS')) |
| 4938 | { |
| 4939 | push (@check_tests, 'check-TESTS'); |
| 4940 | my $check_deps = "@check"; |
| 4941 | $output_rules .= file_contents ('check', new Automake::Location, |
| 4942 | SERIAL_TESTS => !! option 'serial-tests', |
| 4943 | CHECK_DEPS => $check_deps); |
| 4944 | |
| 4945 | # Tests that are known programs should have $(EXEEXT) appended. |
| 4946 | # For matching purposes, we need to adjust XFAIL_TESTS as well. |
| 4947 | append_exeext { exists $known_programs{$_[0]} } 'TESTS'; |
| 4948 | append_exeext { exists $known_programs{$_[0]} } 'XFAIL_TESTS' |
| 4949 | if (var ('XFAIL_TESTS')); |
| 4950 | |
| 4951 | if (! option 'serial-tests') |
| 4952 | { |
| 4953 | define_variable ('TEST_SUITE_LOG', 'test-suite.log', INTERNAL); |
| 4954 | my $suff = '.test'; |
| 4955 | my $at_exeext = ''; |
| 4956 | my $handle_exeext = exists $configure_vars{'EXEEXT'}; |
| 4957 | if ($handle_exeext) |
| 4958 | { |
| 4959 | $at_exeext = subst ('EXEEXT'); |
| 4960 | $suff = $at_exeext . ' ' . $suff; |
| 4961 | } |
| 4962 | if (! var 'TEST_EXTENSIONS') |
| 4963 | { |
| 4964 | define_variable ('TEST_EXTENSIONS', $suff, INTERNAL); |
| 4965 | } |
| 4966 | my $var = var 'TEST_EXTENSIONS'; |
| 4967 | # Currently, we are not able to deal with conditional contents |
| 4968 | # in TEST_EXTENSIONS. |
| 4969 | if ($var->has_conditional_contents) |
| 4970 | { |
| 4971 | msg_var 'unsupported', $var, |
| 4972 | "'TEST_EXTENSIONS' cannot have conditional contents"; |
| 4973 | } |
| 4974 | my @test_suffixes = $var->value_as_list_recursive; |
| 4975 | if ((my @invalid_test_suffixes = |
| 4976 | grep { !is_valid_test_extension $_ } @test_suffixes) > 0) |
| 4977 | { |
| 4978 | error $var->rdef (TRUE)->location, |
| 4979 | "invalid test extensions: @invalid_test_suffixes"; |
| 4980 | } |
| 4981 | @test_suffixes = grep { is_valid_test_extension $_ } @test_suffixes; |
| 4982 | if ($handle_exeext) |
| 4983 | { |
| 4984 | unshift (@test_suffixes, $at_exeext) |
| 4985 | unless @test_suffixes && $test_suffixes[0] eq $at_exeext; |
| 4986 | } |
| 4987 | unshift (@test_suffixes, ''); |
| 4988 | |
| 4989 | transform_variable_recursively |
| 4990 | ('TESTS', 'TEST_LOGS', 'am__testlogs', 1, INTERNAL, |
| 4991 | sub { |
| 4992 | my ($subvar, $val, $cond, $full_cond) = @_; |
| 4993 | my $obj = $val; |
| 4994 | return $obj |
| 4995 | if $val =~ /^\@.*\@$/; |
| 4996 | $obj =~ s/\$\(EXEEXT\)$//o; |
| 4997 | |
| 4998 | if ($val =~ /(\$\((top_)?srcdir\))\//o) |
| 4999 | { |
| 5000 | msg ('error', $subvar->rdef ($cond)->location, |
| 5001 | "using '$1' in TESTS is currently broken: '$val'"); |
| 5002 | } |
| 5003 | |
| 5004 | foreach my $test_suffix (@test_suffixes) |
| 5005 | { |
| 5006 | next |
| 5007 | if $test_suffix eq $at_exeext || $test_suffix eq ''; |
| 5008 | return substr ($obj, 0, length ($obj) - length ($test_suffix)) . '.log' |
| 5009 | if substr ($obj, - length ($test_suffix)) eq $test_suffix; |
| 5010 | } |
| 5011 | my $base = $obj; |
| 5012 | $obj .= '.log'; |
| 5013 | handle_per_suffix_test ('', |
| 5014 | OBJ => $obj, |
| 5015 | BASE => $base, |
| 5016 | SOURCE => $val); |
| 5017 | return $obj; |
| 5018 | }); |
| 5019 | |
| 5020 | my $nhelper=1; |
| 5021 | my $prev = 'TESTS'; |
| 5022 | my $post = ''; |
| 5023 | my $last_suffix = $test_suffixes[$#test_suffixes]; |
| 5024 | my $cur = ''; |
| 5025 | foreach my $test_suffix (@test_suffixes) |
| 5026 | { |
| 5027 | if ($test_suffix eq $last_suffix) |
| 5028 | { |
| 5029 | $cur = 'TEST_LOGS'; |
| 5030 | } |
| 5031 | else |
| 5032 | { |
| 5033 | $cur = 'am__test_logs' . $nhelper; |
| 5034 | } |
| 5035 | define_variable ($cur, |
| 5036 | '$(' . $prev . ':' . $test_suffix . $post . '=.log)', INTERNAL); |
| 5037 | $post = '.log'; |
| 5038 | $prev = $cur; |
| 5039 | $nhelper++; |
| 5040 | if ($test_suffix ne $at_exeext && $test_suffix ne '') |
| 5041 | { |
| 5042 | handle_per_suffix_test ($test_suffix, |
| 5043 | OBJ => '', |
| 5044 | BASE => '$*', |
| 5045 | SOURCE => '$<'); |
| 5046 | } |
| 5047 | } |
| 5048 | $clean_files{'$(TEST_LOGS)'} = MOSTLY_CLEAN; |
| 5049 | $clean_files{'$(TEST_LOGS:.log=.trs)'} = MOSTLY_CLEAN; |
| 5050 | $clean_files{'$(TEST_SUITE_LOG)'} = MOSTLY_CLEAN; |
| 5051 | } |
| 5052 | } |
| 5053 | } |
| 5054 | |
| 5055 | sub handle_emacs_lisp () |
| 5056 | { |
| 5057 | my @elfiles = am_install_var ('-candist', 'lisp', 'LISP', |
| 5058 | 'lisp', 'noinst'); |
| 5059 | |
| 5060 | return if ! @elfiles; |
| 5061 | |
| 5062 | define_pretty_variable ('am__ELFILES', TRUE, INTERNAL, |
| 5063 | map { $_->[1] } @elfiles); |
| 5064 | define_pretty_variable ('am__ELCFILES', TRUE, INTERNAL, |
| 5065 | '$(am__ELFILES:.el=.elc)'); |
| 5066 | # This one can be overridden by users. |
| 5067 | define_pretty_variable ('ELCFILES', TRUE, INTERNAL, '$(LISP:.el=.elc)'); |
| 5068 | |
| 5069 | push @all, '$(ELCFILES)'; |
| 5070 | |
| 5071 | require_variables ($elfiles[0][0], "Emacs Lisp sources seen", TRUE, |
| 5072 | 'EMACS', 'lispdir'); |
| 5073 | } |
| 5074 | |
| 5075 | sub handle_python () |
| 5076 | { |
| 5077 | my @pyfiles = am_install_var ('-defaultdist', 'python', 'PYTHON', |
| 5078 | 'noinst'); |
| 5079 | return if ! @pyfiles; |
| 5080 | |
| 5081 | require_variables ($pyfiles[0][0], "Python sources seen", TRUE, 'PYTHON'); |
| 5082 | require_conf_file ($pyfiles[0][0], FOREIGN, 'py-compile'); |
| 5083 | define_variable ('py_compile', "$am_config_aux_dir/py-compile", INTERNAL); |
| 5084 | } |
| 5085 | |
| 5086 | sub handle_java () |
| 5087 | { |
| 5088 | my @sourcelist = am_install_var ('-candist', |
| 5089 | 'java', 'JAVA', |
| 5090 | 'noinst', 'check'); |
| 5091 | return if ! @sourcelist; |
| 5092 | |
| 5093 | my @prefixes = am_primary_prefixes ('JAVA', 1, |
| 5094 | 'noinst', 'check'); |
| 5095 | |
| 5096 | my $dir; |
| 5097 | my @java_sources = (); |
| 5098 | foreach my $prefix (@prefixes) |
| 5099 | { |
| 5100 | (my $curs = $prefix) =~ s/^(?:nobase_)?(?:dist_|nodist_)?//; |
| 5101 | |
| 5102 | next |
| 5103 | if $curs eq 'EXTRA'; |
| 5104 | |
| 5105 | push @java_sources, '$(' . $prefix . '_JAVA' . ')'; |
| 5106 | |
| 5107 | if (defined $dir) |
| 5108 | { |
| 5109 | err_var "${curs}_JAVA", "multiple _JAVA primaries in use" |
| 5110 | unless $curs eq $dir; |
| 5111 | } |
| 5112 | |
| 5113 | $dir = $curs; |
| 5114 | } |
| 5115 | |
| 5116 | define_pretty_variable ('am__java_sources', TRUE, INTERNAL, |
| 5117 | "@java_sources"); |
| 5118 | |
| 5119 | if ($dir eq 'check') |
| 5120 | { |
| 5121 | push (@check, "class$dir.stamp"); |
| 5122 | } |
| 5123 | else |
| 5124 | { |
| 5125 | push (@all, "class$dir.stamp"); |
| 5126 | } |
| 5127 | } |
| 5128 | |
| 5129 | |
| 5130 | sub handle_minor_options () |
| 5131 | { |
| 5132 | if (option 'readme-alpha') |
| 5133 | { |
| 5134 | if ($relative_dir eq '.') |
| 5135 | { |
| 5136 | if ($package_version !~ /^$GNITS_VERSION_PATTERN$/) |
| 5137 | { |
| 5138 | msg ('error-gnits', $package_version_location, |
| 5139 | "version '$package_version' doesn't follow " . |
| 5140 | "Gnits standards"); |
| 5141 | } |
| 5142 | if (defined $1 && (-f 'README-alpha' || -f 'README-alpha.md')) |
| 5143 | { |
| 5144 | # This means we have an alpha release. See |
| 5145 | # GNITS_VERSION_PATTERN for details. |
| 5146 | my $af = -f 'README-alpha' ? 'README-alpha' : 'README-alpha.md'; |
| 5147 | push_dist_common ($af); |
| 5148 | } |
| 5149 | } |
| 5150 | } |
| 5151 | } |
| 5152 | |
| 5153 | ################################################################ |
| 5154 | |
| 5155 | # ($OUTPUT, @INPUTS) |
| 5156 | # split_config_file_spec ($SPEC) |
| 5157 | # ------------------------------ |
| 5158 | # Decode the Autoconf syntax for config files (files, headers, links |
| 5159 | # etc.). |
| 5160 | sub split_config_file_spec |
| 5161 | { |
| 5162 | my ($spec) = @_; |
| 5163 | my ($output, @inputs) = split (/:/, $spec); |
| 5164 | |
| 5165 | push @inputs, "$output.in" |
| 5166 | unless @inputs; |
| 5167 | |
| 5168 | return ($output, @inputs); |
| 5169 | } |
| 5170 | |
| 5171 | # $input |
| 5172 | # locate_am (@POSSIBLE_SOURCES) |
| 5173 | # ----------------------------- |
| 5174 | # AC_CONFIG_FILES allow specifications such as Makefile:top.in:mid.in:bot.in |
| 5175 | # This functions returns the first *.in file for which a *.am exists. |
| 5176 | # It returns undef otherwise. |
| 5177 | sub locate_am |
| 5178 | { |
| 5179 | my (@rest) = @_; |
| 5180 | my $input; |
| 5181 | foreach my $file (@rest) |
| 5182 | { |
| 5183 | if (($file =~ /^(.*)\.in$/) && -f "$1.am") |
| 5184 | { |
| 5185 | $input = $file; |
| 5186 | last; |
| 5187 | } |
| 5188 | } |
| 5189 | return $input; |
| 5190 | } |
| 5191 | |
| 5192 | my %make_list; |
| 5193 | |
| 5194 | # scan_autoconf_config_files ($WHERE, $CONFIG-FILES) |
| 5195 | # -------------------------------------------------- |
| 5196 | # Study $CONFIG-FILES which is the first argument to AC_CONFIG_FILES |
| 5197 | # (or AC_OUTPUT). |
| 5198 | sub scan_autoconf_config_files |
| 5199 | { |
| 5200 | my ($where, $config_files) = @_; |
| 5201 | |
| 5202 | # Look at potential Makefile.am's. |
| 5203 | foreach (split ' ', $config_files) |
| 5204 | { |
| 5205 | # Must skip empty string for Perl 4. |
| 5206 | next if $_ eq "\\" || $_ eq ''; |
| 5207 | |
| 5208 | # Handle $local:$input syntax. |
| 5209 | my ($local, @rest) = split (/:/); |
| 5210 | @rest = ("$local.in",) unless @rest; |
| 5211 | # Keep in sync with test 'conffile-leading-dot.sh'. |
| 5212 | msg ('unsupported', $where, |
| 5213 | "omit leading './' from config file names such as '$local';" |
| 5214 | . "\nremake rules might be subtly broken otherwise") |
| 5215 | if ($local =~ /^\.\//); |
| 5216 | my $input = locate_am @rest; |
| 5217 | if ($input) |
| 5218 | { |
| 5219 | # We have a file that automake should generate. |
| 5220 | $make_list{$input} = join (':', ($local, @rest)); |
| 5221 | } |
| 5222 | else |
| 5223 | { |
| 5224 | # We have a file that automake should cause to be |
| 5225 | # rebuilt, but shouldn't generate itself. |
| 5226 | push (@other_input_files, $_); |
| 5227 | } |
| 5228 | $ac_config_files_location{$local} = $where; |
| 5229 | $ac_config_files_condition{$local} = |
| 5230 | new Automake::Condition (@cond_stack) |
| 5231 | if (@cond_stack); |
| 5232 | } |
| 5233 | } |
| 5234 | |
| 5235 | |
| 5236 | sub scan_autoconf_traces |
| 5237 | { |
| 5238 | my ($filename) = @_; |
| 5239 | |
| 5240 | # Macros to trace, with their minimal number of arguments. |
| 5241 | # |
| 5242 | # IMPORTANT: If you add a macro here, you should also add this macro |
| 5243 | # ========= to Automake-preselection in autoconf/lib/autom4te.in. |
| 5244 | my %traced = ( |
| 5245 | AC_CANONICAL_BUILD => 0, |
| 5246 | AC_CANONICAL_HOST => 0, |
| 5247 | AC_CANONICAL_TARGET => 0, |
| 5248 | AC_CONFIG_AUX_DIR => 1, |
| 5249 | AC_CONFIG_FILES => 1, |
| 5250 | AC_CONFIG_HEADERS => 1, |
| 5251 | AC_CONFIG_LIBOBJ_DIR => 1, |
| 5252 | AC_CONFIG_LINKS => 1, |
| 5253 | AC_FC_SRCEXT => 1, |
| 5254 | AC_INIT => 0, |
| 5255 | AC_LIBSOURCE => 1, |
| 5256 | AC_REQUIRE_AUX_FILE => 1, |
| 5257 | AC_SUBST_TRACE => 1, |
| 5258 | AM_AUTOMAKE_VERSION => 1, |
| 5259 | AM_PROG_MKDIR_P => 0, |
| 5260 | AM_CONDITIONAL => 2, |
| 5261 | AM_EXTRA_RECURSIVE_TARGETS => 1, |
| 5262 | AM_GNU_GETTEXT => 0, |
| 5263 | AM_GNU_GETTEXT_INTL_SUBDIR => 0, |
| 5264 | AM_INIT_AUTOMAKE => 0, |
| 5265 | AM_MAINTAINER_MODE => 0, |
| 5266 | AM_PROG_AR => 0, |
| 5267 | _AM_SUBST_NOTMAKE => 1, |
| 5268 | _AM_COND_IF => 1, |
| 5269 | _AM_COND_ELSE => 1, |
| 5270 | _AM_COND_ENDIF => 1, |
| 5271 | LT_SUPPORTED_TAG => 1, |
| 5272 | _LT_AC_TAGCONFIG => 0, |
| 5273 | m4_include => 1, |
| 5274 | m4_sinclude => 1, |
| 5275 | sinclude => 1, |
| 5276 | ); |
| 5277 | |
| 5278 | # Suppress all warnings from this invocation of autoconf. |
| 5279 | # The user is presumably about to run autoconf themselves |
| 5280 | # and will see its warnings then. |
| 5281 | local $ENV{WARNINGS} = 'none'; |
| 5282 | |
| 5283 | my $traces = ($ENV{AUTOCONF} || 'autoconf') . " "; |
| 5284 | |
| 5285 | # Use a separator unlikely to be used, not ':', the default, which |
| 5286 | # has a precise meaning for AC_CONFIG_FILES and so on. |
| 5287 | $traces .= join (' ', |
| 5288 | map { "--trace=$_" . ':\$f:\$l::\$d::\$n::\${::}%' } |
| 5289 | (sort keys %traced)); |
| 5290 | |
| 5291 | verb "running WARNINGS=$ENV{WARNINGS} $traces"; |
| 5292 | my $tracefh = new Automake::XFile ("$traces $filename |"); |
| 5293 | |
| 5294 | @cond_stack = (); |
| 5295 | my $where; |
| 5296 | |
| 5297 | while ($_ = $tracefh->getline) |
| 5298 | { |
| 5299 | chomp; |
| 5300 | my ($here, $depth, @args) = split (/::/); |
| 5301 | $where = new Automake::Location $here; |
| 5302 | my $macro = $args[0]; |
| 5303 | |
| 5304 | prog_error ("unrequested trace '$macro'") |
| 5305 | unless exists $traced{$macro}; |
| 5306 | |
| 5307 | # Skip and diagnose malformed calls. |
| 5308 | if ($#args < $traced{$macro}) |
| 5309 | { |
| 5310 | msg ('syntax', $where, "not enough arguments for $macro"); |
| 5311 | next; |
| 5312 | } |
| 5313 | |
| 5314 | # Alphabetical ordering please. |
| 5315 | if ($macro eq 'AC_CANONICAL_BUILD') |
| 5316 | { |
| 5317 | if ($seen_canonical <= AC_CANONICAL_BUILD) |
| 5318 | { |
| 5319 | $seen_canonical = AC_CANONICAL_BUILD; |
| 5320 | } |
| 5321 | } |
| 5322 | elsif ($macro eq 'AC_CANONICAL_HOST') |
| 5323 | { |
| 5324 | if ($seen_canonical <= AC_CANONICAL_HOST) |
| 5325 | { |
| 5326 | $seen_canonical = AC_CANONICAL_HOST; |
| 5327 | } |
| 5328 | } |
| 5329 | elsif ($macro eq 'AC_CANONICAL_TARGET') |
| 5330 | { |
| 5331 | $seen_canonical = AC_CANONICAL_TARGET; |
| 5332 | } |
| 5333 | elsif ($macro eq 'AC_CONFIG_AUX_DIR') |
| 5334 | { |
| 5335 | if ($seen_init_automake) |
| 5336 | { |
| 5337 | error ($where, "AC_CONFIG_AUX_DIR must be called before " |
| 5338 | . "AM_INIT_AUTOMAKE ...", partial => 1); |
| 5339 | error ($seen_init_automake, "... AM_INIT_AUTOMAKE called here"); |
| 5340 | } |
| 5341 | $config_aux_dir = $args[1]; |
| 5342 | $config_aux_dir_set_in_configure_ac = 1; |
| 5343 | check_directory ($config_aux_dir, $where); |
| 5344 | } |
| 5345 | elsif ($macro eq 'AC_CONFIG_FILES') |
| 5346 | { |
| 5347 | # Look at potential Makefile.am's. |
| 5348 | scan_autoconf_config_files ($where, $args[1]); |
| 5349 | } |
| 5350 | elsif ($macro eq 'AC_CONFIG_HEADERS') |
| 5351 | { |
| 5352 | foreach my $spec (split (' ', $args[1])) |
| 5353 | { |
| 5354 | my ($dest, @src) = split (':', $spec); |
| 5355 | $ac_config_files_location{$dest} = $where; |
| 5356 | push @config_headers, $spec; |
| 5357 | } |
| 5358 | } |
| 5359 | elsif ($macro eq 'AC_CONFIG_LIBOBJ_DIR') |
| 5360 | { |
| 5361 | $config_libobj_dir = $args[1]; |
| 5362 | check_directory ($config_libobj_dir, $where); |
| 5363 | } |
| 5364 | elsif ($macro eq 'AC_CONFIG_LINKS') |
| 5365 | { |
| 5366 | foreach my $spec (split (' ', $args[1])) |
| 5367 | { |
| 5368 | my ($dest, $src) = split (':', $spec); |
| 5369 | $ac_config_files_location{$dest} = $where; |
| 5370 | push @config_links, $spec; |
| 5371 | } |
| 5372 | } |
| 5373 | elsif ($macro eq 'AC_FC_SRCEXT') |
| 5374 | { |
| 5375 | my $suffix = $args[1]; |
| 5376 | # These flags are used as %SOURCEFLAG% in depend2.am, |
| 5377 | # where the trailing space is important. |
| 5378 | $sourceflags{'.' . $suffix} = '$(FCFLAGS_' . $suffix . ') ' |
| 5379 | if ($suffix eq 'f90' || $suffix eq 'f95' || $suffix eq 'f03' || $suffix eq 'f08'); |
| 5380 | } |
| 5381 | elsif ($macro eq 'AC_INIT') |
| 5382 | { |
| 5383 | if (defined $args[2]) |
| 5384 | { |
| 5385 | $package_version = $args[2]; |
| 5386 | $package_version_location = $where; |
| 5387 | } |
| 5388 | } |
| 5389 | elsif ($macro eq 'AC_LIBSOURCE') |
| 5390 | { |
| 5391 | $libsources{$args[1]} = $here; |
| 5392 | } |
| 5393 | elsif ($macro eq 'AC_REQUIRE_AUX_FILE') |
| 5394 | { |
| 5395 | # Only remember the first time a file is required. |
| 5396 | $required_aux_file{$args[1]} = $where |
| 5397 | unless exists $required_aux_file{$args[1]}; |
| 5398 | } |
| 5399 | elsif ($macro eq 'AC_SUBST_TRACE') |
| 5400 | { |
| 5401 | # Just check for alphanumeric in AC_SUBST_TRACE. If you do |
| 5402 | # AC_SUBST(5), then too bad. |
| 5403 | $configure_vars{$args[1]} = $where |
| 5404 | if $args[1] =~ /^\w+$/; |
| 5405 | } |
| 5406 | elsif ($macro eq 'AM_AUTOMAKE_VERSION') |
| 5407 | { |
| 5408 | error ($where, |
| 5409 | "version mismatch. This is Automake $VERSION,\n" . |
| 5410 | "but the definition used by this AM_INIT_AUTOMAKE\n" . |
| 5411 | "comes from Automake $args[1]. You should recreate\n" . |
| 5412 | "aclocal.m4 with aclocal and run automake again.\n", |
| 5413 | # $? = 63 is used to indicate version mismatch to missing. |
| 5414 | exit_code => 63) |
| 5415 | if $VERSION ne $args[1]; |
| 5416 | |
| 5417 | $seen_automake_version = 1; |
| 5418 | } |
| 5419 | elsif ($macro eq 'AM_PROG_MKDIR_P') |
| 5420 | { |
| 5421 | msg 'obsolete', $where, <<'EOF'; |
| 5422 | The 'AM_PROG_MKDIR_P' macro is deprecated, and its use is discouraged. |
| 5423 | You should use the Autoconf-provided 'AC_PROG_MKDIR_P' macro instead, |
| 5424 | and use '$(MKDIR_P)' instead of '$(mkdir_p)'in your Makefile.am files. |
| 5425 | EOF |
| 5426 | } |
| 5427 | elsif ($macro eq 'AM_CONDITIONAL') |
| 5428 | { |
| 5429 | $configure_cond{$args[1]} = $where; |
| 5430 | } |
| 5431 | elsif ($macro eq 'AM_EXTRA_RECURSIVE_TARGETS') |
| 5432 | { |
| 5433 | # Empty leading/trailing fields might be produced by split, |
| 5434 | # hence the grep is really needed. |
| 5435 | push @extra_recursive_targets, |
| 5436 | grep (/./, (split /\s+/, $args[1])); |
| 5437 | } |
| 5438 | elsif ($macro eq 'AM_GNU_GETTEXT') |
| 5439 | { |
| 5440 | $seen_gettext = $where; |
| 5441 | $ac_gettext_location = $where; |
| 5442 | $seen_gettext_external = grep ($_ eq 'external', @args); |
| 5443 | } |
| 5444 | elsif ($macro eq 'AM_GNU_GETTEXT_INTL_SUBDIR') |
| 5445 | { |
| 5446 | $seen_gettext_intl = $where; |
| 5447 | } |
| 5448 | elsif ($macro eq 'AM_INIT_AUTOMAKE') |
| 5449 | { |
| 5450 | $seen_init_automake = $where; |
| 5451 | if (defined $args[2]) |
| 5452 | { |
| 5453 | msg 'obsolete', $where, <<'EOF'; |
| 5454 | AM_INIT_AUTOMAKE: two- and three-arguments forms are deprecated. For more info, see: |
| 5455 | https://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_005fINIT_005fAUTOMAKE-invocation |
| 5456 | EOF |
| 5457 | $package_version = $args[2]; |
| 5458 | $package_version_location = $where; |
| 5459 | } |
| 5460 | elsif (defined $args[1]) |
| 5461 | { |
| 5462 | my @opts = split (' ', $args[1]); |
| 5463 | @opts = map { { option => $_, where => $where } } @opts; |
| 5464 | exit $exit_code unless process_global_option_list (@opts); |
| 5465 | } |
| 5466 | } |
| 5467 | elsif ($macro eq 'AM_MAINTAINER_MODE') |
| 5468 | { |
| 5469 | $seen_maint_mode = $where; |
| 5470 | } |
| 5471 | elsif ($macro eq 'AM_PROG_AR') |
| 5472 | { |
| 5473 | $seen_ar = $where; |
| 5474 | } |
| 5475 | elsif ($macro eq '_AM_COND_IF') |
| 5476 | { |
| 5477 | cond_stack_if ('', $args[1], $where); |
| 5478 | error ($where, "missing m4 quoting, macro depth $depth") |
| 5479 | if ($depth != 1); |
| 5480 | } |
| 5481 | elsif ($macro eq '_AM_COND_ELSE') |
| 5482 | { |
| 5483 | cond_stack_else ('!', $args[1], $where); |
| 5484 | error ($where, "missing m4 quoting, macro depth $depth") |
| 5485 | if ($depth != 1); |
| 5486 | } |
| 5487 | elsif ($macro eq '_AM_COND_ENDIF') |
| 5488 | { |
| 5489 | cond_stack_endif (undef, undef, $where); |
| 5490 | error ($where, "missing m4 quoting, macro depth $depth") |
| 5491 | if ($depth != 1); |
| 5492 | } |
| 5493 | elsif ($macro eq '_AM_SUBST_NOTMAKE') |
| 5494 | { |
| 5495 | $ignored_configure_vars{$args[1]} = $where; |
| 5496 | } |
| 5497 | elsif ($macro eq 'm4_include' |
| 5498 | || $macro eq 'm4_sinclude' |
| 5499 | || $macro eq 'sinclude') |
| 5500 | { |
| 5501 | # Skip missing 'sinclude'd files. |
| 5502 | next if $macro ne 'm4_include' && ! -f $args[1]; |
| 5503 | |
| 5504 | # Some modified versions of Autoconf don't use |
| 5505 | # frozen files. Consequently it's possible that we see all |
| 5506 | # m4_include's performed during Autoconf's startup. |
| 5507 | # Obviously we don't want to distribute Autoconf's files |
| 5508 | # so we skip absolute filenames here. |
| 5509 | push @configure_deps, '$(top_srcdir)/' . $args[1] |
| 5510 | unless $here =~ m,^(?:\w:)?[\\/],; |
| 5511 | # Keep track of the greatest timestamp. |
| 5512 | if (-e $args[1]) |
| 5513 | { |
| 5514 | my $mtime = mtime $args[1]; |
| 5515 | $configure_deps_greatest_timestamp = $mtime |
| 5516 | if $mtime > $configure_deps_greatest_timestamp; |
| 5517 | } |
| 5518 | } |
| 5519 | elsif ($macro eq 'LT_SUPPORTED_TAG') |
| 5520 | { |
| 5521 | $libtool_tags{$args[1]} = 1; |
| 5522 | $libtool_new_api = 1; |
| 5523 | } |
| 5524 | elsif ($macro eq '_LT_AC_TAGCONFIG') |
| 5525 | { |
| 5526 | # _LT_AC_TAGCONFIG is an old macro present in Libtool 1.5. |
| 5527 | # We use it to detect whether tags are supported. Our |
| 5528 | # preferred interface is LT_SUPPORTED_TAG, but it was |
| 5529 | # introduced in Libtool 1.6. |
| 5530 | if (0 == keys %libtool_tags) |
| 5531 | { |
| 5532 | # Hardcode the tags supported by Libtool 1.5. |
| 5533 | %libtool_tags = (CC => 1, CXX => 1, GCJ => 1, F77 => 1); |
| 5534 | } |
| 5535 | } |
| 5536 | } |
| 5537 | |
| 5538 | error ($where, "condition stack not properly closed") |
| 5539 | if (@cond_stack); |
| 5540 | |
| 5541 | $tracefh->close; |
| 5542 | } |
| 5543 | |
| 5544 | |
| 5545 | # Check whether we use 'configure.ac' or 'configure.in'. |
| 5546 | # Scan it (and possibly 'aclocal.m4') for interesting things. |
| 5547 | # We must scan aclocal.m4 because there might be AC_SUBSTs and such there. |
| 5548 | sub scan_autoconf_files () |
| 5549 | { |
| 5550 | # Reinitialize libsources here. This isn't really necessary, |
| 5551 | # since we currently assume there is only one configure.ac. But |
| 5552 | # that won't always be the case. |
| 5553 | %libsources = (); |
| 5554 | |
| 5555 | # Keep track of the youngest configure dependency. |
| 5556 | $configure_deps_greatest_timestamp = mtime $configure_ac; |
| 5557 | if (-e 'aclocal.m4') |
| 5558 | { |
| 5559 | my $mtime = mtime 'aclocal.m4'; |
| 5560 | $configure_deps_greatest_timestamp = $mtime |
| 5561 | if $mtime > $configure_deps_greatest_timestamp; |
| 5562 | } |
| 5563 | |
| 5564 | scan_autoconf_traces ($configure_ac); |
| 5565 | |
| 5566 | @configure_input_files = sort keys %make_list; |
| 5567 | # Set input and output files if not specified by user. |
| 5568 | if (! @input_files) |
| 5569 | { |
| 5570 | @input_files = @configure_input_files; |
| 5571 | %output_files = %make_list; |
| 5572 | } |
| 5573 | |
| 5574 | |
| 5575 | if (! $seen_init_automake) |
| 5576 | { |
| 5577 | err_ac ("no proper invocation of AM_INIT_AUTOMAKE was found.\nYou " |
| 5578 | . "should verify that $configure_ac invokes AM_INIT_AUTOMAKE," |
| 5579 | . "\nthat aclocal.m4 is present in the top-level directory,\n" |
| 5580 | . "and that aclocal.m4 was recently regenerated " |
| 5581 | . "(using aclocal)"); |
| 5582 | } |
| 5583 | else |
| 5584 | { |
| 5585 | if (! $seen_automake_version) |
| 5586 | { |
| 5587 | if (-f 'aclocal.m4') |
| 5588 | { |
| 5589 | error ($seen_init_automake, |
| 5590 | "your implementation of AM_INIT_AUTOMAKE comes from " . |
| 5591 | "an\nold Automake version. You should recreate " . |
| 5592 | "aclocal.m4\nwith aclocal and run automake again", |
| 5593 | # $? = 63 is used to indicate version mismatch to missing. |
| 5594 | exit_code => 63); |
| 5595 | } |
| 5596 | else |
| 5597 | { |
| 5598 | error ($seen_init_automake, |
| 5599 | "no proper implementation of AM_INIT_AUTOMAKE was " . |
| 5600 | "found,\nprobably because aclocal.m4 is missing.\n" . |
| 5601 | "You should run aclocal to create this file, then\n" . |
| 5602 | "run automake again"); |
| 5603 | } |
| 5604 | } |
| 5605 | } |
| 5606 | |
| 5607 | locate_aux_dir (); |
| 5608 | |
| 5609 | # Look for some files we need. Always check for these. This |
| 5610 | # check must be done for every run, even those where we are only |
| 5611 | # looking at a subdir Makefile. We must set relative_dir for |
| 5612 | # push_required_file to work. |
| 5613 | # Sort the files for stable verbose output. |
| 5614 | $relative_dir = '.'; |
| 5615 | foreach my $file (sort keys %required_aux_file) |
| 5616 | { |
| 5617 | require_conf_file ($required_aux_file{$file}->get, FOREIGN, $file) |
| 5618 | } |
| 5619 | err_am "'install.sh' is an anachronism; use 'install-sh' instead" |
| 5620 | if -f $config_aux_dir . '/install.sh'; |
| 5621 | |
| 5622 | # Preserve dist_common for later. |
| 5623 | @configure_dist_common = @dist_common; |
| 5624 | } |
| 5625 | |
| 5626 | ################################################################ |
| 5627 | |
| 5628 | # Do any extra checking for GNU standards. |
| 5629 | sub check_gnu_standards () |
| 5630 | { |
| 5631 | if ($relative_dir eq '.') |
| 5632 | { |
| 5633 | # In top level (or only) directory. |
| 5634 | |
| 5635 | foreach my $file (@toplevelmd_ok) |
| 5636 | { |
| 5637 | next if $file eq 'THANKS'; # gnits, checked below |
| 5638 | # if non-.md is absent, and .md is present, require .md; |
| 5639 | # otherwise require non-.md. |
| 5640 | my $required |
| 5641 | = (! -f $file && -f "$file.md") ? "$file.md" : $file; |
| 5642 | require_file ("$am_file.am", GNU, $required); |
| 5643 | } |
| 5644 | |
| 5645 | # Accept one of these three licenses; default to COPYING. |
| 5646 | # Make sure we do not overwrite an existing license. |
| 5647 | my $license; |
| 5648 | foreach (qw /COPYING COPYING.LIB COPYING.LESSER/) |
| 5649 | { |
| 5650 | if (-f $_) |
| 5651 | { |
| 5652 | $license = $_; |
| 5653 | last; |
| 5654 | } |
| 5655 | } |
| 5656 | require_file ("$am_file.am", GNU, 'COPYING') |
| 5657 | unless $license; |
| 5658 | } |
| 5659 | |
| 5660 | for my $opt ('no-installman', 'no-installinfo') |
| 5661 | { |
| 5662 | msg ('error-gnu', option $opt, |
| 5663 | "option '$opt' disallowed by GNU standards") |
| 5664 | if option $opt; |
| 5665 | } |
| 5666 | } |
| 5667 | |
| 5668 | # Do any extra checking for GNITS standards. |
| 5669 | sub check_gnits_standards () |
| 5670 | { |
| 5671 | if ($relative_dir eq '.') |
| 5672 | { |
| 5673 | # In top level (or only) directory. |
| 5674 | my $file = 'THANKS'; |
| 5675 | my $required |
| 5676 | = (! -f $file && -f "$file.md") ? "$file.md" : $file; |
| 5677 | require_file ("$am_file.am", GNITS, $file); |
| 5678 | } |
| 5679 | } |
| 5680 | |
| 5681 | ################################################################ |
| 5682 | # |
| 5683 | # Functions to handle files of each language. |
| 5684 | |
| 5685 | # Each 'lang_X_rewrite($DIRECTORY, $BASE, $EXT)' function follows a |
| 5686 | # simple formula: Return value is LANG_SUBDIR if the resulting object |
| 5687 | # file should be in a subdir if the source file is, LANG_PROCESS if |
| 5688 | # file is to be dealt with, LANG_IGNORE otherwise. |
| 5689 | |
| 5690 | # Much of the actual processing is handled in |
| 5691 | # handle_single_transform. These functions exist so that |
| 5692 | # auxiliary information can be recorded for a later cleanup pass. |
| 5693 | # Note that the calls to these functions are computed, so don't bother |
| 5694 | # searching for their precise names in the source. |
| 5695 | |
| 5696 | # This is just a convenience function that can be used to determine |
| 5697 | # when a subdir object should be used. |
| 5698 | sub lang_sub_obj () |
| 5699 | { |
| 5700 | return option 'subdir-objects' ? LANG_SUBDIR : LANG_PROCESS; |
| 5701 | } |
| 5702 | |
| 5703 | # Rewrite a single header file. |
| 5704 | sub lang_header_rewrite |
| 5705 | { |
| 5706 | # Header files are simply ignored. |
| 5707 | return LANG_IGNORE; |
| 5708 | } |
| 5709 | |
| 5710 | # Rewrite a single Vala source file. |
| 5711 | sub lang_vala_rewrite |
| 5712 | { |
| 5713 | my ($directory, $base, $ext) = @_; |
| 5714 | |
| 5715 | (my $newext = $ext) =~ s/vala$/c/; |
| 5716 | return (LANG_SUBDIR, $newext); |
| 5717 | } |
| 5718 | |
| 5719 | # Rewrite a single yacc/yacc++ file. |
| 5720 | sub lang_yacc_rewrite |
| 5721 | { |
| 5722 | my ($directory, $base, $ext) = @_; |
| 5723 | |
| 5724 | my $r = lang_sub_obj; |
| 5725 | (my $newext = $ext) =~ tr/y/c/; |
| 5726 | return ($r, $newext); |
| 5727 | } |
| 5728 | sub lang_yaccxx_rewrite { lang_yacc_rewrite (@_); }; |
| 5729 | |
| 5730 | # Rewrite a single lex/lex++ file. |
| 5731 | sub lang_lex_rewrite |
| 5732 | { |
| 5733 | my ($directory, $base, $ext) = @_; |
| 5734 | |
| 5735 | my $r = lang_sub_obj; |
| 5736 | (my $newext = $ext) =~ tr/l/c/; |
| 5737 | return ($r, $newext); |
| 5738 | } |
| 5739 | sub lang_lexxx_rewrite { lang_lex_rewrite (@_); }; |
| 5740 | |
| 5741 | # Rewrite a single Java file. |
| 5742 | sub lang_java_rewrite |
| 5743 | { |
| 5744 | return LANG_SUBDIR; |
| 5745 | } |
| 5746 | |
| 5747 | # The lang_X_finish functions are called after all source file |
| 5748 | # processing is done. Each should handle defining rules for the |
| 5749 | # language, etc. A finish function is only called if a source file of |
| 5750 | # the appropriate type has been seen. |
| 5751 | |
| 5752 | sub lang_vala_finish_target |
| 5753 | { |
| 5754 | my ($self, $name) = @_; |
| 5755 | |
| 5756 | my $derived = canonicalize ($name); |
| 5757 | my $var = var "${derived}_SOURCES"; |
| 5758 | return unless $var; |
| 5759 | |
| 5760 | my @vala_sources = grep { /\.(vala|vapi)$/ } ($var->value_as_list_recursive); |
| 5761 | |
| 5762 | # For automake bug#11229. |
| 5763 | return unless @vala_sources; |
| 5764 | |
| 5765 | foreach my $vala_file (@vala_sources) |
| 5766 | { |
| 5767 | my $c_file = $vala_file; |
| 5768 | if ($c_file =~ s/(.*)\.vala$/$1.c/) |
| 5769 | { |
| 5770 | my $built_c_file = "\$(builddir)/$c_file"; |
| 5771 | my $built_dir = dirname $built_c_file; |
| 5772 | my $base_c_file = basename $c_file; |
| 5773 | # |
| 5774 | # The -newer test here is checking "C file not older than Vala |
| 5775 | # file" (not "C file newer than Vala file"; see |
| 5776 | # https://bugs.gnu.org/44772. The log message on the commit |
| 5777 | # misleadingly says "reversed". |
| 5778 | # |
| 5779 | $output_rules .= "$built_c_file: \$(builddir)/${derived}_vala.stamp\n" |
| 5780 | . "\t\@if test ! -f \$@ && test \$(srcdir) != \$(builddir) && test -n \"\$\$(find -L \$(srcdir)/$vala_file -prune \! -newer \$(srcdir)/$c_file)\"; then cp -p \$(srcdir)/$c_file $built_c_file; fi\n" |
| 5781 | . "\t\@if test -f \$@; then :; else rm -f \$(builddir)/${derived}_vala.stamp; fi\n" |
| 5782 | . "\t\@if test -f \$@; then :; else \\\n" |
| 5783 | . "\t \$(MAKE) \$(AM_MAKEFLAGS) \$(builddir)/${derived}_vala.stamp; \\\n" |
| 5784 | . "\t if test $built_dir != .; then mv $base_c_file $built_dir/; fi \\\n" |
| 5785 | . "\tfi\n"; |
| 5786 | $clean_files{$built_c_file} = DIST_CLEAN; |
| 5787 | $clean_files{"\$(srcdir)/$c_file"} = MAINTAINER_CLEAN; |
| 5788 | } |
| 5789 | } |
| 5790 | |
| 5791 | # Add rebuild rules for generated header and vapi files |
| 5792 | my $flags = var ($derived . '_VALAFLAGS'); |
| 5793 | if ($flags) |
| 5794 | { |
| 5795 | my $lastflag = ''; |
| 5796 | foreach my $flag ($flags->value_as_list_recursive) |
| 5797 | { |
| 5798 | if (grep (/^$lastflag$/, ('-H', '-h', '--header', '--internal-header', |
| 5799 | '--vapi', '--internal-vapi', '--gir'))) |
| 5800 | { |
| 5801 | my $headerfile = "\$(builddir)/$flag"; |
| 5802 | $output_rules .= "$headerfile: \$(builddir)/${derived}_vala.stamp\n" |
| 5803 | . "\t\@if test -f \$@; then :; else rm -f \$(builddir)/${derived}_vala.stamp; fi\n" |
| 5804 | . "\t\@if test -f \$@; then :; else \\\n" |
| 5805 | . "\t \$(MAKE) \$(AM_MAKEFLAGS) \$(builddir)/${derived}_vala.stamp; \\\n" |
| 5806 | . "\tfi\n"; |
| 5807 | |
| 5808 | # valac is not used when building from dist tarballs |
| 5809 | # distribute the generated files |
| 5810 | push_dist_common ($headerfile); |
| 5811 | $clean_files{$headerfile} = MAINTAINER_CLEAN; |
| 5812 | } |
| 5813 | if (grep (/$lastflag/, ('--library'))) |
| 5814 | { |
| 5815 | my $headerfile = "\$(builddir)/$flag"; |
| 5816 | $output_rules .= "$headerfile.vapi: \$(builddir)/${derived}_vala.stamp\n" |
| 5817 | . "\t\@if test -f \$@; then :; else rm -f \$(builddir)/${derived}_vala.stamp; fi\n" |
| 5818 | . "\t\@if test -f \$@; then :; else \\\n" |
| 5819 | . "\t \$(MAKE) \$(AM_MAKEFLAGS) \$(builddir)/${derived}_vala.stamp; \\\n" |
| 5820 | . "\tfi\n"; |
| 5821 | |
| 5822 | # valac is not used when building from dist tarballs |
| 5823 | # distribute the generated files |
| 5824 | my $vapi = "$headerfile.vapi"; |
| 5825 | push_dist_common ($vapi); |
| 5826 | $clean_files{$headerfile.'.vapi'} = MAINTAINER_CLEAN; |
| 5827 | } |
| 5828 | $lastflag = $flag; |
| 5829 | } |
| 5830 | } |
| 5831 | |
| 5832 | my $compile = $self->compile; |
| 5833 | |
| 5834 | # Rewrite each occurrence of 'AM_VALAFLAGS' in the compile |
| 5835 | # rule into '${derived}_VALAFLAGS' if it exists. |
| 5836 | my $val = "${derived}_VALAFLAGS"; |
| 5837 | $compile =~ s/\(AM_VALAFLAGS\)/\($val\)/ |
| 5838 | if set_seen ($val); |
| 5839 | |
| 5840 | # VALAFLAGS is a user variable (per GNU Standards), |
| 5841 | # it should not be overridden in the Makefile... |
| 5842 | check_user_variables 'VALAFLAGS'; |
| 5843 | |
| 5844 | my $dirname = dirname ($name); |
| 5845 | |
| 5846 | # Only generate C code, do not run C compiler |
| 5847 | $compile .= " -C"; |
| 5848 | |
| 5849 | my $verbose = verbose_flag ('VALAC'); |
| 5850 | my $silent = silent_flag (); |
| 5851 | my $stampfile = "\$(builddir)/${derived}_vala.stamp"; |
| 5852 | |
| 5853 | $output_rules .= |
| 5854 | "\$(builddir)/${derived}_vala.stamp: @vala_sources\n". |
| 5855 | # Since the C files generated from the vala sources depend on the |
| 5856 | # ${derived}_vala.stamp file, we must ensure its timestamp is older than |
| 5857 | # those of the C files generated by the valac invocation below (this is |
| 5858 | # especially important on systems with sub-second timestamp resolution). |
| 5859 | # Thus we need to create the stamp file *before* invoking valac, and to |
| 5860 | # move it to its final location only after valac has been invoked. |
| 5861 | "\t${silent}rm -f \$\@ && echo stamp > \$\@-t\n". |
| 5862 | "\t${verbose}$compile \$^\n". |
| 5863 | "\t${silent}mv -f \$\@-t \$\@\n"; |
| 5864 | |
| 5865 | push_dist_common ($stampfile); |
| 5866 | |
| 5867 | $clean_files{$stampfile} = MAINTAINER_CLEAN; |
| 5868 | } |
| 5869 | |
| 5870 | # Add output rules to invoke valac and create stamp file as a witness |
| 5871 | # to handle multiple outputs. This function is called after all source |
| 5872 | # file processing is done. |
| 5873 | sub lang_vala_finish () |
| 5874 | { |
| 5875 | my ($self) = @_; |
| 5876 | |
| 5877 | foreach my $prog (sort keys %known_programs) |
| 5878 | { |
| 5879 | lang_vala_finish_target ($self, $prog); |
| 5880 | } |
| 5881 | |
| 5882 | while (my ($name) = each %known_libraries) |
| 5883 | { |
| 5884 | lang_vala_finish_target ($self, $name); |
| 5885 | } |
| 5886 | } |
| 5887 | |
| 5888 | # The built .c files should be cleaned only on maintainer-clean |
| 5889 | # as the .c files are distributed. This function is called for each |
| 5890 | # .vala source file. |
| 5891 | sub lang_vala_target_hook |
| 5892 | { |
| 5893 | my ($self, $aggregate, $output, $input, %transform) = @_; |
| 5894 | |
| 5895 | $clean_files{$output} = MAINTAINER_CLEAN; |
| 5896 | } |
| 5897 | |
| 5898 | # This is a yacc helper which is called whenever we have decided to |
| 5899 | # compile a yacc file. |
| 5900 | sub lang_yacc_target_hook |
| 5901 | { |
| 5902 | my ($self, $aggregate, $output, $input, %transform) = @_; |
| 5903 | |
| 5904 | # If some relevant *YFLAGS variable contains the '-d' flag, we'll |
| 5905 | # have to to generate special code. |
| 5906 | my $yflags_contains_minus_d = 0; |
| 5907 | |
| 5908 | foreach my $pfx ("", "${aggregate}_") |
| 5909 | { |
| 5910 | my $yflagsvar = var ("${pfx}YFLAGS"); |
| 5911 | next unless $yflagsvar; |
| 5912 | # We cannot work reliably with conditionally-defined YFLAGS. |
| 5913 | if ($yflagsvar->has_conditional_contents) |
| 5914 | { |
| 5915 | msg_var ('unsupported', $yflagsvar, |
| 5916 | "'${pfx}YFLAGS' cannot have conditional contents"); |
| 5917 | } |
| 5918 | else |
| 5919 | { |
| 5920 | $yflags_contains_minus_d = 1 |
| 5921 | if grep (/^-d$/, $yflagsvar->value_as_list_recursive); |
| 5922 | } |
| 5923 | } |
| 5924 | |
| 5925 | if ($yflags_contains_minus_d) |
| 5926 | { |
| 5927 | # Found a '-d' that applies to the compilation of this file. |
| 5928 | # Add a dependency for the generated header file, and arrange |
| 5929 | # for that file to be included in the distribution. |
| 5930 | |
| 5931 | # The extension of the output file (e.g., '.c' or '.cxx'). |
| 5932 | # We'll need it to compute the name of the generated header file. |
| 5933 | (my $output_ext = basename ($output)) =~ s/.*(\.[^.]+)$/$1/; |
| 5934 | |
| 5935 | # We know that a yacc input should be turned into either a C or |
| 5936 | # C++ output file. We depend on this fact (here and in yacc.am), |
| 5937 | # so check that it really holds. |
| 5938 | my $lang = $languages{$extension_map{$output_ext}}; |
| 5939 | prog_error "invalid output name '$output' for yacc file '$input'" |
| 5940 | if (!$lang || ($lang->name ne 'c' && $lang->name ne 'cxx')); |
| 5941 | |
| 5942 | (my $header_ext = $output_ext) =~ s/c/h/g; |
| 5943 | # Quote $output_ext in the regexp, so that dots in it are taken |
| 5944 | # as literal dots, not as metacharacters. |
| 5945 | (my $header = $output) =~ s/\Q$output_ext\E$/$header_ext/; |
| 5946 | |
| 5947 | foreach my $cond (Automake::Rule::define (${header}, 'internal', |
| 5948 | RULE_AUTOMAKE, TRUE, |
| 5949 | INTERNAL)) |
| 5950 | { |
| 5951 | my $condstr = $cond->subst_string; |
| 5952 | $output_rules .= |
| 5953 | "$condstr${header}: $output\n" |
| 5954 | # Recover from removal of $header |
| 5955 | . "$condstr\t\@if test ! -f \$@; then rm -f $output; else :; fi\n" |
| 5956 | . "$condstr\t\@if test ! -f \$@; then \$(MAKE) \$(AM_MAKEFLAGS) $output; else :; fi\n"; |
| 5957 | } |
| 5958 | # Distribute the generated file, unless its .y source was |
| 5959 | # listed in a nodist_ variable. (handle_source_transform() |
| 5960 | # will set DIST_SOURCE.) |
| 5961 | push_dist_common ($header) |
| 5962 | if $transform{'DIST_SOURCE'}; |
| 5963 | |
| 5964 | # The GNU rules say that yacc/lex output files should be removed |
| 5965 | # by maintainer-clean. However, if the files are not distributed, |
| 5966 | # then we want to remove them with "make clean"; otherwise, |
| 5967 | # "make distcheck" will fail. |
| 5968 | $clean_files{$header} = $transform{'DIST_SOURCE'} ? MAINTAINER_CLEAN : CLEAN; |
| 5969 | } |
| 5970 | # See the comment above for $HEADER. |
| 5971 | $clean_files{$output} = $transform{'DIST_SOURCE'} ? MAINTAINER_CLEAN : CLEAN; |
| 5972 | } |
| 5973 | |
| 5974 | # This is a lex helper which is called whenever we have decided to |
| 5975 | # compile a lex file. |
| 5976 | sub lang_lex_target_hook |
| 5977 | { |
| 5978 | my ($self, $aggregate, $output, $input, %transform) = @_; |
| 5979 | # The GNU rules say that yacc/lex output files should be removed |
| 5980 | # by maintainer-clean. However, if the files are not distributed, |
| 5981 | # then we want to remove them with "make clean"; otherwise, |
| 5982 | # "make distcheck" will fail. |
| 5983 | $clean_files{$output} = $transform{'DIST_SOURCE'} ? MAINTAINER_CLEAN : CLEAN; |
| 5984 | } |
| 5985 | |
| 5986 | # This is a helper for both lex and yacc. |
| 5987 | sub yacc_lex_finish_helper () |
| 5988 | { |
| 5989 | return if defined $language_scratch{'lex-yacc-done'}; |
| 5990 | $language_scratch{'lex-yacc-done'} = 1; |
| 5991 | |
| 5992 | # FIXME: for now, no line number. |
| 5993 | require_conf_file ($configure_ac, FOREIGN, 'ylwrap'); |
| 5994 | define_variable ('YLWRAP', "$am_config_aux_dir/ylwrap", INTERNAL); |
| 5995 | } |
| 5996 | |
| 5997 | sub lang_yacc_finish () |
| 5998 | { |
| 5999 | return if defined $language_scratch{'yacc-done'}; |
| 6000 | $language_scratch{'yacc-done'} = 1; |
| 6001 | |
| 6002 | reject_var 'YACCFLAGS', "'YACCFLAGS' obsolete; use 'YFLAGS' instead"; |
| 6003 | |
| 6004 | yacc_lex_finish_helper; |
| 6005 | } |
| 6006 | |
| 6007 | |
| 6008 | sub lang_lex_finish () |
| 6009 | { |
| 6010 | return if defined $language_scratch{'lex-done'}; |
| 6011 | $language_scratch{'lex-done'} = 1; |
| 6012 | |
| 6013 | yacc_lex_finish_helper; |
| 6014 | } |
| 6015 | |
| 6016 | |
| 6017 | # Given a hash table of linker names, pick the name that has the most |
| 6018 | # precedence. This is lame, but something has to have global |
| 6019 | # knowledge in order to eliminate the conflict. Add more linkers as |
| 6020 | # required. |
| 6021 | sub resolve_linker |
| 6022 | { |
| 6023 | my (%linkers) = @_; |
| 6024 | |
| 6025 | foreach my $l (qw(GCJLINK OBJCXXLINK CXXLINK F77LINK FCLINK OBJCLINK UPCLINK)) |
| 6026 | { |
| 6027 | return $l if defined $linkers{$l}; |
| 6028 | } |
| 6029 | return 'LINK'; |
| 6030 | } |
| 6031 | |
| 6032 | # Called to indicate that an extension was used. |
| 6033 | sub saw_extension |
| 6034 | { |
| 6035 | my ($ext) = @_; |
| 6036 | $extension_seen{$ext} = 1; |
| 6037 | } |
| 6038 | |
| 6039 | # register_language (%ATTRIBUTE) |
| 6040 | # ------------------------------ |
| 6041 | # Register a single language. |
| 6042 | # Each %ATTRIBUTE is of the form ATTRIBUTE => VALUE. |
| 6043 | sub register_language |
| 6044 | { |
| 6045 | my (%option) = @_; |
| 6046 | |
| 6047 | # Set the defaults. |
| 6048 | $option{'autodep'} = 'no' |
| 6049 | unless defined $option{'autodep'}; |
| 6050 | $option{'linker'} = '' |
| 6051 | unless defined $option{'linker'}; |
| 6052 | $option{'flags'} = [] |
| 6053 | unless defined $option{'flags'}; |
| 6054 | $option{'output_extensions'} = sub { return ( '.$(OBJEXT)', '.lo' ) } |
| 6055 | unless defined $option{'output_extensions'}; |
| 6056 | $option{'nodist_specific'} = 0 |
| 6057 | unless defined $option{'nodist_specific'}; |
| 6058 | |
| 6059 | my $lang = new Automake::Language (%option); |
| 6060 | |
| 6061 | # Fill indexes. |
| 6062 | $extension_map{$_} = $lang->name foreach @{$lang->extensions}; |
| 6063 | $languages{$lang->name} = $lang; |
| 6064 | my $link = $lang->linker; |
| 6065 | if ($link) |
| 6066 | { |
| 6067 | if (exists $link_languages{$link}) |
| 6068 | { |
| 6069 | prog_error ("'$link' has different definitions in " |
| 6070 | . $lang->name . " and " . $link_languages{$link}->name) |
| 6071 | if $lang->link ne $link_languages{$link}->link; |
| 6072 | } |
| 6073 | else |
| 6074 | { |
| 6075 | $link_languages{$link} = $lang; |
| 6076 | } |
| 6077 | } |
| 6078 | |
| 6079 | # Update the pattern of known extensions. |
| 6080 | accept_extensions (@{$lang->extensions}); |
| 6081 | |
| 6082 | # Update the suffix rules map. |
| 6083 | foreach my $suffix (@{$lang->extensions}) |
| 6084 | { |
| 6085 | foreach my $dest ($lang->output_extensions->($suffix)) |
| 6086 | { |
| 6087 | register_suffix_rule (INTERNAL, $suffix, $dest); |
| 6088 | } |
| 6089 | } |
| 6090 | } |
| 6091 | |
| 6092 | # derive_suffix ($EXT, $OBJ) |
| 6093 | # -------------------------- |
| 6094 | # This function is used to find a path from a user-specified suffix $EXT |
| 6095 | # to $OBJ or to some other suffix we recognize internally, e.g. 'cc'. |
| 6096 | sub derive_suffix |
| 6097 | { |
| 6098 | my ($source_ext, $obj) = @_; |
| 6099 | |
| 6100 | while (!$extension_map{$source_ext} && $source_ext ne $obj) |
| 6101 | { |
| 6102 | my $new_source_ext = next_in_suffix_chain ($source_ext, $obj); |
| 6103 | last if not defined $new_source_ext; |
| 6104 | $source_ext = $new_source_ext; |
| 6105 | } |
| 6106 | |
| 6107 | return $source_ext; |
| 6108 | } |
| 6109 | |
| 6110 | |
| 6111 | # Pretty-print something and append to '$output_rules'. |
| 6112 | sub pretty_print_rule |
| 6113 | { |
| 6114 | $output_rules .= makefile_wrap (shift, shift, @_); |
| 6115 | } |
| 6116 | |
| 6117 | |
| 6118 | ################################################################ |
| 6119 | |
| 6120 | |
| 6121 | ## -------------------------------- ## |
| 6122 | ## Handling the conditional stack. ## |
| 6123 | ## -------------------------------- ## |
| 6124 | |
| 6125 | |
| 6126 | # $STRING |
| 6127 | # make_conditional_string ($NEGATE, $COND) |
| 6128 | # ---------------------------------------- |
| 6129 | sub make_conditional_string |
| 6130 | { |
| 6131 | my ($negate, $cond) = @_; |
| 6132 | $cond = "${cond}_TRUE" |
| 6133 | unless $cond =~ /^TRUE|FALSE$/; |
| 6134 | $cond = Automake::Condition::conditional_negate ($cond) |
| 6135 | if $negate; |
| 6136 | return $cond; |
| 6137 | } |
| 6138 | |
| 6139 | |
| 6140 | my %_am_macro_for_cond = |
| 6141 | ( |
| 6142 | AMDEP => "one of the compiler tests\n" |
| 6143 | . " AC_PROG_CC, AC_PROG_CXX, AC_PROG_OBJC, AC_PROG_OBJCXX,\n" |
| 6144 | . " AM_PROG_AS, AM_PROG_GCJ, AM_PROG_UPC", |
| 6145 | am__fastdepCC => 'AC_PROG_CC', |
| 6146 | am__fastdepCCAS => 'AM_PROG_AS', |
| 6147 | am__fastdepCXX => 'AC_PROG_CXX', |
| 6148 | am__fastdepGCJ => 'AM_PROG_GCJ', |
| 6149 | am__fastdepOBJC => 'AC_PROG_OBJC', |
| 6150 | am__fastdepOBJCXX => 'AC_PROG_OBJCXX', |
| 6151 | am__fastdepUPC => 'AM_PROG_UPC' |
| 6152 | ); |
| 6153 | |
| 6154 | # $COND |
| 6155 | # cond_stack_if ($NEGATE, $COND, $WHERE) |
| 6156 | # -------------------------------------- |
| 6157 | sub cond_stack_if |
| 6158 | { |
| 6159 | my ($negate, $cond, $where) = @_; |
| 6160 | |
| 6161 | if (! $configure_cond{$cond} && $cond !~ /^TRUE|FALSE$/) |
| 6162 | { |
| 6163 | my $text = "$cond does not appear in AM_CONDITIONAL"; |
| 6164 | my $scope = US_LOCAL; |
| 6165 | if (exists $_am_macro_for_cond{$cond}) |
| 6166 | { |
| 6167 | my $mac = $_am_macro_for_cond{$cond}; |
| 6168 | $text .= "\n The usual way to define '$cond' is to add "; |
| 6169 | $text .= ($mac =~ / /) ? $mac : "'$mac'"; |
| 6170 | $text .= "\n to '$configure_ac' and run 'aclocal' and 'autoconf' again"; |
| 6171 | # These warnings appear in Automake files (depend2.am), |
| 6172 | # so there is no need to display them more than once: |
| 6173 | $scope = US_GLOBAL; |
| 6174 | } |
| 6175 | error $where, $text, uniq_scope => $scope; |
| 6176 | } |
| 6177 | |
| 6178 | push (@cond_stack, make_conditional_string ($negate, $cond)); |
| 6179 | |
| 6180 | return new Automake::Condition (@cond_stack); |
| 6181 | } |
| 6182 | |
| 6183 | |
| 6184 | # $COND |
| 6185 | # cond_stack_else ($NEGATE, $COND, $WHERE) |
| 6186 | # ---------------------------------------- |
| 6187 | sub cond_stack_else |
| 6188 | { |
| 6189 | my ($negate, $cond, $where) = @_; |
| 6190 | |
| 6191 | if (! @cond_stack) |
| 6192 | { |
| 6193 | error $where, "else without if"; |
| 6194 | return FALSE; |
| 6195 | } |
| 6196 | |
| 6197 | $cond_stack[$#cond_stack] = |
| 6198 | Automake::Condition::conditional_negate ($cond_stack[$#cond_stack]); |
| 6199 | |
| 6200 | # If $COND is given, check against it. |
| 6201 | if (defined $cond) |
| 6202 | { |
| 6203 | $cond = make_conditional_string ($negate, $cond); |
| 6204 | |
| 6205 | error ($where, "else reminder ($negate$cond) incompatible with " |
| 6206 | . "current conditional: $cond_stack[$#cond_stack]") |
| 6207 | if $cond_stack[$#cond_stack] ne $cond; |
| 6208 | } |
| 6209 | |
| 6210 | return new Automake::Condition (@cond_stack); |
| 6211 | } |
| 6212 | |
| 6213 | |
| 6214 | # $COND |
| 6215 | # cond_stack_endif ($NEGATE, $COND, $WHERE) |
| 6216 | # ----------------------------------------- |
| 6217 | sub cond_stack_endif |
| 6218 | { |
| 6219 | my ($negate, $cond, $where) = @_; |
| 6220 | my $old_cond; |
| 6221 | |
| 6222 | if (! @cond_stack) |
| 6223 | { |
| 6224 | error $where, "endif without if"; |
| 6225 | return TRUE; |
| 6226 | } |
| 6227 | |
| 6228 | # If $COND is given, check against it. |
| 6229 | if (defined $cond) |
| 6230 | { |
| 6231 | $cond = make_conditional_string ($negate, $cond); |
| 6232 | |
| 6233 | error ($where, "endif reminder ($negate$cond) incompatible with " |
| 6234 | . "current conditional: $cond_stack[$#cond_stack]") |
| 6235 | if $cond_stack[$#cond_stack] ne $cond; |
| 6236 | } |
| 6237 | |
| 6238 | pop @cond_stack; |
| 6239 | |
| 6240 | return new Automake::Condition (@cond_stack); |
| 6241 | } |
| 6242 | |
| 6243 | |
| 6244 | |
| 6245 | |
| 6246 | |
| 6247 | ## ------------------------ ## |
| 6248 | ## Handling the variables. ## |
| 6249 | ## ------------------------ ## |
| 6250 | |
| 6251 | |
| 6252 | # define_pretty_variable ($VAR, $COND, $WHERE, @VALUE) |
| 6253 | # ---------------------------------------------------- |
| 6254 | # Like define_variable, but the value is a list, and the variable may |
| 6255 | # be defined conditionally. The second argument is the condition |
| 6256 | # under which the value should be defined; this should be the empty |
| 6257 | # string to define the variable unconditionally. The third argument |
| 6258 | # is a list holding the values to use for the variable. The value is |
| 6259 | # pretty printed in the output file. |
| 6260 | sub define_pretty_variable |
| 6261 | { |
| 6262 | my ($var, $cond, $where, @value) = @_; |
| 6263 | |
| 6264 | if (! vardef ($var, $cond)) |
| 6265 | { |
| 6266 | Automake::Variable::define ($var, VAR_AUTOMAKE, '', $cond, "@value", |
| 6267 | '', $where, VAR_PRETTY); |
| 6268 | rvar ($var)->rdef ($cond)->set_seen; |
| 6269 | } |
| 6270 | } |
| 6271 | |
| 6272 | |
| 6273 | # define_variable ($VAR, $VALUE, $WHERE) |
| 6274 | # -------------------------------------- |
| 6275 | # Define a new Automake Makefile variable VAR to VALUE, but only if |
| 6276 | # not already defined. |
| 6277 | sub define_variable |
| 6278 | { |
| 6279 | my ($var, $value, $where) = @_; |
| 6280 | define_pretty_variable ($var, TRUE, $where, $value); |
| 6281 | } |
| 6282 | |
| 6283 | |
| 6284 | # define_files_variable ($VAR, \@BASENAME, $EXTENSION, $WHERE) |
| 6285 | # ------------------------------------------------------------ |
| 6286 | # Define the $VAR which content is the list of file names composed of |
| 6287 | # a @BASENAME and the $EXTENSION. |
| 6288 | sub define_files_variable ($\@$$) |
| 6289 | { |
| 6290 | my ($var, $basename, $extension, $where) = @_; |
| 6291 | define_variable ($var, |
| 6292 | join (' ', map { "$_.$extension" } @$basename), |
| 6293 | $where); |
| 6294 | } |
| 6295 | |
| 6296 | |
| 6297 | # Like define_variable, but define a variable to be the configure |
| 6298 | # substitution by the same name. |
| 6299 | sub define_configure_variable |
| 6300 | { |
| 6301 | my ($var) = @_; |
| 6302 | # Some variables we do not want to output. For instance it |
| 6303 | # would be a bad idea to output `U = @U@` when `@U@` can be |
| 6304 | # substituted as `\`. |
| 6305 | my $pretty = exists $ignored_configure_vars{$var} ? VAR_SILENT : VAR_ASIS; |
| 6306 | Automake::Variable::define ($var, VAR_CONFIGURE, '', TRUE, subst ($var), |
| 6307 | '', $configure_vars{$var}, $pretty); |
| 6308 | } |
| 6309 | |
| 6310 | |
| 6311 | # define_compiler_variable ($LANG) |
| 6312 | # -------------------------------- |
| 6313 | # Define a compiler variable. We also handle defining the 'LT' |
| 6314 | # version of the command when using libtool. |
| 6315 | sub define_compiler_variable |
| 6316 | { |
| 6317 | my ($lang) = @_; |
| 6318 | |
| 6319 | my ($var, $value) = ($lang->compiler, $lang->compile); |
| 6320 | my $libtool_tag = ''; |
| 6321 | $libtool_tag = '--tag=' . $lang->libtool_tag . ' ' |
| 6322 | if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag}; |
| 6323 | define_variable ($var, $value, INTERNAL); |
| 6324 | if (var ('LIBTOOL')) |
| 6325 | { |
| 6326 | my $verbose = define_verbose_libtool (); |
| 6327 | define_variable ("LT$var", |
| 6328 | "\$(LIBTOOL) $verbose $libtool_tag\$(AM_LIBTOOLFLAGS)" |
| 6329 | . " \$(LIBTOOLFLAGS) --mode=compile $value", |
| 6330 | INTERNAL); |
| 6331 | } |
| 6332 | define_verbose_tagvar ($lang->ccer || 'GEN'); |
| 6333 | } |
| 6334 | |
| 6335 | |
| 6336 | sub define_linker_variable |
| 6337 | { |
| 6338 | my ($lang) = @_; |
| 6339 | |
| 6340 | my $libtool_tag = ''; |
| 6341 | $libtool_tag = '--tag=' . $lang->libtool_tag . ' ' |
| 6342 | if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag}; |
| 6343 | # CCLD = $(CC). |
| 6344 | define_variable ($lang->lder, $lang->ld, INTERNAL); |
| 6345 | # CCLINK = $(CCLD) blah blah... |
| 6346 | my $link = ''; |
| 6347 | if (var ('LIBTOOL')) |
| 6348 | { |
| 6349 | my $verbose = define_verbose_libtool (); |
| 6350 | $link = "\$(LIBTOOL) $verbose $libtool_tag\$(AM_LIBTOOLFLAGS) " |
| 6351 | . "\$(LIBTOOLFLAGS) --mode=link "; |
| 6352 | } |
| 6353 | define_variable ($lang->linker, $link . $lang->link, INTERNAL); |
| 6354 | define_variable ($lang->compiler, $lang, INTERNAL); |
| 6355 | define_verbose_tagvar ($lang->lder || 'GEN'); |
| 6356 | } |
| 6357 | |
| 6358 | sub define_per_target_linker_variable |
| 6359 | { |
| 6360 | my ($linker, $target) = @_; |
| 6361 | |
| 6362 | # If the user wrote a custom link command, we don't define ours. |
| 6363 | my $custom_link = "${target}_LINK"; |
| 6364 | if (set_seen ($custom_link)) |
| 6365 | { |
| 6366 | my $verbose = $custom_link if var (verbose_var ($custom_link)); |
| 6367 | return ($custom_link, $verbose); |
| 6368 | } |
| 6369 | |
| 6370 | my $xlink = $linker ? $linker : 'LINK'; |
| 6371 | |
| 6372 | my $lang = $link_languages{$xlink}; |
| 6373 | prog_error "Unknown language for linker variable '$xlink'" |
| 6374 | unless $lang; |
| 6375 | |
| 6376 | my $link_command = $lang->link; |
| 6377 | if (var 'LIBTOOL') |
| 6378 | { |
| 6379 | my $libtool_tag = ''; |
| 6380 | $libtool_tag = '--tag=' . $lang->libtool_tag . ' ' |
| 6381 | if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag}; |
| 6382 | |
| 6383 | my $verbose = define_verbose_libtool (); |
| 6384 | $link_command = |
| 6385 | "\$(LIBTOOL) $verbose $libtool_tag\$(AM_LIBTOOLFLAGS) \$(LIBTOOLFLAGS) " |
| 6386 | . "--mode=link " . $link_command; |
| 6387 | } |
| 6388 | |
| 6389 | # Rewrite each occurrence of 'AM_$flag' in the link |
| 6390 | # command into '${derived}_$flag' if it exists. |
| 6391 | my $orig_command = $link_command; |
| 6392 | my @flags = (@{$lang->flags}, 'LDFLAGS'); |
| 6393 | push @flags, 'LIBTOOLFLAGS' if var 'LIBTOOL'; |
| 6394 | for my $flag (@flags) |
| 6395 | { |
| 6396 | my $val = "${target}_$flag"; |
| 6397 | $link_command =~ s/\(AM_$flag\)/\($val\)/ |
| 6398 | if set_seen ($val); |
| 6399 | } |
| 6400 | |
| 6401 | # If the computed command is the same as the generic command, use |
| 6402 | # the command linker variable. |
| 6403 | return ($lang->linker, $lang->lder) |
| 6404 | if $link_command eq $orig_command; |
| 6405 | |
| 6406 | define_variable ("${target}_LINK", $link_command, INTERNAL); |
| 6407 | return ("${target}_LINK", $lang->lder); |
| 6408 | } |
| 6409 | |
| 6410 | ################################################################ |
| 6411 | |
| 6412 | # check_trailing_slash ($WHERE, $LINE) |
| 6413 | # ------------------------------------ |
| 6414 | # Return 1 iff $LINE ends with a slash. |
| 6415 | # Might modify $LINE. |
| 6416 | sub check_trailing_slash ($\$) |
| 6417 | { |
| 6418 | my ($where, $line) = @_; |
| 6419 | |
| 6420 | # Ignore '##' lines. |
| 6421 | return 0 if $$line =~ /$IGNORE_PATTERN/o; |
| 6422 | |
| 6423 | # Catch and fix a common error. |
| 6424 | msg "syntax", $where, "whitespace following trailing backslash" |
| 6425 | if $$line =~ s/\\\s+\n$/\\\n/; |
| 6426 | |
| 6427 | return $$line =~ /\\$/; |
| 6428 | } |
| 6429 | |
| 6430 | |
| 6431 | # read_am_file ($AMFILE, $WHERE, $RELDIR) |
| 6432 | # --------------------------------------- |
| 6433 | # Read $AMFILE file name which is located in $RELDIR, and set up |
| 6434 | # global variables resetted by '&generate_makefile'. Simultaneously |
| 6435 | # copy lines from $AMFILE into '$output_trailer', or define variables |
| 6436 | # as appropriate. |
| 6437 | # |
| 6438 | # NOTE: We put rules in the trailer section. We want user rules to |
| 6439 | # come after our generated stuff. |
| 6440 | sub read_am_file |
| 6441 | { |
| 6442 | my ($amfile, $where, $reldir) = @_; |
| 6443 | my $canon_reldir = &canonicalize ($reldir); |
| 6444 | |
| 6445 | my $am_file = new Automake::XFile ("< $amfile"); |
| 6446 | verb "reading $amfile"; |
| 6447 | |
| 6448 | # Keep track of the youngest output dependency. |
| 6449 | my $mtime = mtime $amfile; |
| 6450 | $output_deps_greatest_timestamp = $mtime |
| 6451 | if $mtime > $output_deps_greatest_timestamp; |
| 6452 | |
| 6453 | my $spacing = ''; |
| 6454 | my $comment = ''; |
| 6455 | my $blank = 0; |
| 6456 | my $saw_bk = 0; |
| 6457 | my $var_look = VAR_ASIS; |
| 6458 | |
| 6459 | use constant IN_VAR_DEF => 0; |
| 6460 | use constant IN_RULE_DEF => 1; |
| 6461 | use constant IN_COMMENT => 2; |
| 6462 | my $prev_state = IN_RULE_DEF; |
| 6463 | |
| 6464 | while ($_ = $am_file->getline) |
| 6465 | { |
| 6466 | $where->set ("$amfile:$."); |
| 6467 | if (/$IGNORE_PATTERN/o) |
| 6468 | { |
| 6469 | # Merely delete comments beginning with two hashes. |
| 6470 | } |
| 6471 | elsif (/$WHITE_PATTERN/o) |
| 6472 | { |
| 6473 | error $where, "blank line following trailing backslash" |
| 6474 | if $saw_bk; |
| 6475 | # Stick a single white line before the incoming macro or rule. |
| 6476 | $spacing = "\n"; |
| 6477 | $blank = 1; |
| 6478 | # Flush all comments seen so far. |
| 6479 | if ($comment ne '') |
| 6480 | { |
| 6481 | $output_vars .= $comment; |
| 6482 | $comment = ''; |
| 6483 | } |
| 6484 | } |
| 6485 | elsif (/$COMMENT_PATTERN/o) |
| 6486 | { |
| 6487 | # Stick comments before the incoming macro or rule. Make |
| 6488 | # sure a blank line precedes the first block of comments. |
| 6489 | $spacing = "\n" unless $blank; |
| 6490 | $blank = 1; |
| 6491 | $comment .= $spacing . $_; |
| 6492 | $spacing = ''; |
| 6493 | $prev_state = IN_COMMENT; |
| 6494 | } |
| 6495 | else |
| 6496 | { |
| 6497 | last; |
| 6498 | } |
| 6499 | $saw_bk = check_trailing_slash ($where, $_); |
| 6500 | } |
| 6501 | |
| 6502 | # We save the conditional stack on entry, and then check to make |
| 6503 | # sure it is the same on exit. This lets us conditionally include |
| 6504 | # other files. |
| 6505 | my @saved_cond_stack = @cond_stack; |
| 6506 | my $cond = new Automake::Condition (@cond_stack); |
| 6507 | |
| 6508 | my $last_var_name = ''; |
| 6509 | my $last_var_type = ''; |
| 6510 | my $last_var_value = ''; |
| 6511 | my $last_where; |
| 6512 | # FIXME: shouldn't use $_ in this loop; it is too big. |
| 6513 | while ($_) |
| 6514 | { |
| 6515 | $where->set ("$amfile:$."); |
| 6516 | |
| 6517 | # Make sure the line is \n-terminated. |
| 6518 | chomp; |
| 6519 | $_ .= "\n"; |
| 6520 | |
| 6521 | # Don't look at MAINTAINER_MODE_TRUE here. That shouldn't be |
| 6522 | # used by users. @MAINT@ is an anachronism now. |
| 6523 | $_ =~ s/\@MAINT\@//g |
| 6524 | unless $seen_maint_mode; |
| 6525 | |
| 6526 | my $new_saw_bk = check_trailing_slash ($where, $_); |
| 6527 | |
| 6528 | if ($reldir eq '.') |
| 6529 | { |
| 6530 | # If present, eat the following '_' or '/', converting |
| 6531 | # "%reldir%/foo" and "%canon_reldir%_foo" into plain "foo" |
| 6532 | # when $reldir is '.'. |
| 6533 | $_ =~ s,%(D|reldir)%/,,g; |
| 6534 | $_ =~ s,%(C|canon_reldir)%_,,g; |
| 6535 | } |
| 6536 | $_ =~ s/%(D|reldir)%/${reldir}/g; |
| 6537 | $_ =~ s/%(C|canon_reldir)%/${canon_reldir}/g; |
| 6538 | |
| 6539 | if (/$IGNORE_PATTERN/o) |
| 6540 | { |
| 6541 | # Merely delete comments beginning with two hashes. |
| 6542 | |
| 6543 | # Keep any backslash from the previous line. |
| 6544 | $new_saw_bk = $saw_bk; |
| 6545 | } |
| 6546 | elsif (/$WHITE_PATTERN/o) |
| 6547 | { |
| 6548 | # Stick a single white line before the incoming macro or rule. |
| 6549 | $spacing = "\n"; |
| 6550 | error $where, "blank line following trailing backslash" |
| 6551 | if $saw_bk; |
| 6552 | } |
| 6553 | elsif (/$COMMENT_PATTERN/o) |
| 6554 | { |
| 6555 | error $where, "comment following trailing backslash" |
| 6556 | if $saw_bk && $prev_state != IN_COMMENT; |
| 6557 | |
| 6558 | # Stick comments before the incoming macro or rule. |
| 6559 | $comment .= $spacing . $_; |
| 6560 | $spacing = ''; |
| 6561 | $prev_state = IN_COMMENT; |
| 6562 | } |
| 6563 | elsif ($saw_bk) |
| 6564 | { |
| 6565 | if ($prev_state == IN_RULE_DEF) |
| 6566 | { |
| 6567 | my $cond = new Automake::Condition @cond_stack; |
| 6568 | $output_trailer .= $cond->subst_string; |
| 6569 | $output_trailer .= $_; |
| 6570 | } |
| 6571 | elsif ($prev_state == IN_COMMENT) |
| 6572 | { |
| 6573 | # If the line doesn't start with a '#', add it. |
| 6574 | # We do this because a continued comment like |
| 6575 | # # A = foo \ |
| 6576 | # bar \ |
| 6577 | # baz |
| 6578 | # is not portable. BSD make doesn't honor |
| 6579 | # escaped newlines in comments. |
| 6580 | s/^#?/#/; |
| 6581 | $comment .= $spacing . $_; |
| 6582 | } |
| 6583 | else # $prev_state == IN_VAR_DEF |
| 6584 | { |
| 6585 | $last_var_value .= ' ' |
| 6586 | unless $last_var_value =~ /\s$/; |
| 6587 | $last_var_value .= $_; |
| 6588 | |
| 6589 | if (!/\\$/) |
| 6590 | { |
| 6591 | Automake::Variable::define ($last_var_name, VAR_MAKEFILE, |
| 6592 | $last_var_type, $cond, |
| 6593 | $last_var_value, $comment, |
| 6594 | $last_where, VAR_ASIS) |
| 6595 | if $cond != FALSE; |
| 6596 | $comment = $spacing = ''; |
| 6597 | } |
| 6598 | } |
| 6599 | } |
| 6600 | |
| 6601 | elsif (/$IF_PATTERN/o) |
| 6602 | { |
| 6603 | $cond = cond_stack_if ($1, $2, $where); |
| 6604 | } |
| 6605 | elsif (/$ELSE_PATTERN/o) |
| 6606 | { |
| 6607 | $cond = cond_stack_else ($1, $2, $where); |
| 6608 | } |
| 6609 | elsif (/$ENDIF_PATTERN/o) |
| 6610 | { |
| 6611 | $cond = cond_stack_endif ($1, $2, $where); |
| 6612 | } |
| 6613 | |
| 6614 | elsif (/$RULE_PATTERN/o) |
| 6615 | { |
| 6616 | # Found a rule. |
| 6617 | $prev_state = IN_RULE_DEF; |
| 6618 | |
| 6619 | # For now we have to output all definitions of user rules |
| 6620 | # and can't diagnose duplicates (see the comment in |
| 6621 | # Automake::Rule::define). So we go on and ignore the return value. |
| 6622 | Automake::Rule::define ($1, $amfile, RULE_USER, $cond, $where); |
| 6623 | |
| 6624 | check_variable_expansions ($_, $where); |
| 6625 | |
| 6626 | $output_trailer .= $comment . $spacing; |
| 6627 | my $cond = new Automake::Condition @cond_stack; |
| 6628 | $output_trailer .= $cond->subst_string; |
| 6629 | $output_trailer .= $_; |
| 6630 | $comment = $spacing = ''; |
| 6631 | } |
| 6632 | elsif (/$ASSIGNMENT_PATTERN/o) |
| 6633 | { |
| 6634 | # Found a macro definition. |
| 6635 | $prev_state = IN_VAR_DEF; |
| 6636 | $last_var_name = $1; |
| 6637 | $last_var_type = $2; |
| 6638 | $last_var_value = $3; |
| 6639 | $last_where = $where->clone; |
| 6640 | if ($3 ne '' && substr ($3, -1) eq "\\") |
| 6641 | { |
| 6642 | # We preserve the '\' because otherwise the long lines |
| 6643 | # that are generated will be truncated by broken |
| 6644 | # 'sed's. |
| 6645 | $last_var_value = $3 . "\n"; |
| 6646 | } |
| 6647 | # Normally we try to output variable definitions in the |
| 6648 | # same format they were input. However, POSIX compliant |
| 6649 | # systems are not required to support lines longer than |
| 6650 | # 2048 bytes (most notably, some sed implementation are |
| 6651 | # limited to 4000 bytes, and sed is used by config.status |
| 6652 | # to rewrite Makefile.in into Makefile). Moreover nobody |
| 6653 | # would really write such long lines by hand since it is |
| 6654 | # hardly maintainable. So if a line is longer that 1000 |
| 6655 | # bytes (an arbitrary limit), assume it has been |
| 6656 | # automatically generated by some tools, and flatten the |
| 6657 | # variable definition. Otherwise, keep the variable as it |
| 6658 | # as been input. |
| 6659 | $var_look = VAR_PRETTY if length ($last_var_value) >= 1000; |
| 6660 | |
| 6661 | if (!/\\$/) |
| 6662 | { |
| 6663 | Automake::Variable::define ($last_var_name, VAR_MAKEFILE, |
| 6664 | $last_var_type, $cond, |
| 6665 | $last_var_value, $comment, |
| 6666 | $last_where, $var_look) |
| 6667 | if $cond != FALSE; |
| 6668 | $comment = $spacing = ''; |
| 6669 | $var_look = VAR_ASIS; |
| 6670 | } |
| 6671 | } |
| 6672 | elsif (/$INCLUDE_PATTERN/o) |
| 6673 | { |
| 6674 | my $path = $1; |
| 6675 | |
| 6676 | if ($path =~ s/^\$\(top_srcdir\)\///) |
| 6677 | { |
| 6678 | push (@include_stack, "\$\(top_srcdir\)/$path"); |
| 6679 | # Distribute any included file. |
| 6680 | |
| 6681 | # Always use the $(top_srcdir) prefix in DIST_COMMON, |
| 6682 | # otherwise OSF make will implicitly copy the included |
| 6683 | # file in the build tree during "make distdir" to satisfy |
| 6684 | # the dependency. |
| 6685 | # (subdir-am-cond.sh and subdir-ac-cond.sh will fail) |
| 6686 | push_dist_common ("\$\(top_srcdir\)/$path"); |
| 6687 | } |
| 6688 | else |
| 6689 | { |
| 6690 | $path =~ s/\$\(srcdir\)\///; |
| 6691 | push (@include_stack, "\$\(srcdir\)/$path"); |
| 6692 | # Always use the $(srcdir) prefix in DIST_COMMON, |
| 6693 | # otherwise OSF make will implicitly copy the included |
| 6694 | # file in the build tree during "make distdir" to satisfy |
| 6695 | # the dependency. |
| 6696 | # (subdir-am-cond.sh and subdir-ac-cond.sh will fail) |
| 6697 | push_dist_common ("\$\(srcdir\)/$path"); |
| 6698 | $path = $relative_dir . "/" . $path if $relative_dir ne '.'; |
| 6699 | } |
| 6700 | my $new_reldir = File::Spec->abs2rel ($path, $relative_dir); |
| 6701 | $new_reldir = '.' if $new_reldir !~ s,/[^/]*$,,; |
| 6702 | $where->push_context ("'$path' included from here"); |
| 6703 | read_am_file ($path, $where, $new_reldir); |
| 6704 | $where->pop_context; |
| 6705 | } |
| 6706 | else |
| 6707 | { |
| 6708 | # This isn't an error; it is probably a continued rule. |
| 6709 | # In fact, this is what we assume. |
| 6710 | $prev_state = IN_RULE_DEF; |
| 6711 | check_variable_expansions ($_, $where); |
| 6712 | $output_trailer .= $comment . $spacing; |
| 6713 | my $cond = new Automake::Condition @cond_stack; |
| 6714 | $output_trailer .= $cond->subst_string; |
| 6715 | $output_trailer .= $_; |
| 6716 | $comment = $spacing = ''; |
| 6717 | error $where, "'#' comment at start of rule is unportable" |
| 6718 | if $_ =~ /^\t\s*\#/; |
| 6719 | } |
| 6720 | |
| 6721 | $saw_bk = $new_saw_bk; |
| 6722 | $_ = $am_file->getline; |
| 6723 | } |
| 6724 | |
| 6725 | $output_trailer .= $comment; |
| 6726 | |
| 6727 | error ($where, "trailing backslash on last line") |
| 6728 | if $saw_bk; |
| 6729 | |
| 6730 | error ($where, (@cond_stack ? "unterminated conditionals: @cond_stack" |
| 6731 | : "too many conditionals closed in include file")) |
| 6732 | if "@saved_cond_stack" ne "@cond_stack"; |
| 6733 | } |
| 6734 | |
| 6735 | |
| 6736 | # A helper for read_main_am_file which initializes configure variables |
| 6737 | # and variables from header-vars.am. |
| 6738 | sub define_standard_variables () |
| 6739 | { |
| 6740 | my $saved_output_vars = $output_vars; |
| 6741 | my ($comments, undef, $rules) = |
| 6742 | file_contents_internal (1, "$libdir/am/header-vars.am", |
| 6743 | new Automake::Location); |
| 6744 | |
| 6745 | foreach my $var (sort keys %configure_vars) |
| 6746 | { |
| 6747 | define_configure_variable ($var); |
| 6748 | } |
| 6749 | |
| 6750 | $output_vars .= $comments . $rules; |
| 6751 | } |
| 6752 | |
| 6753 | |
| 6754 | # read_main_am_file ($MAKEFILE_AM, $MAKEFILE_IN) |
| 6755 | # ---------------------------------------------- |
| 6756 | sub read_main_am_file |
| 6757 | { |
| 6758 | my ($amfile, $infile) = @_; |
| 6759 | |
| 6760 | # This supports the strange variable tricks we are about to play. |
| 6761 | prog_error ("variable defined before read_main_am_file\n" . variables_dump ()) |
| 6762 | if (scalar (variables) > 0); |
| 6763 | |
| 6764 | # Generate copyright header for generated Makefile.in. |
| 6765 | # We do discard the output of predefined variables, handled below. |
| 6766 | $output_vars = ("# " . basename ($infile) . " generated by automake " |
| 6767 | . $VERSION . " from " . basename ($amfile) . ".\n"); |
| 6768 | $output_vars .= '# ' . subst ('configure_input') . "\n"; |
| 6769 | $output_vars .= $gen_copyright; |
| 6770 | |
| 6771 | # We want to predefine as many variables as possible. This lets |
| 6772 | # the user set them with '+=' in Makefile.am. |
| 6773 | define_standard_variables; |
| 6774 | |
| 6775 | # Read user file, which might override some of our values. |
| 6776 | read_am_file ($amfile, new Automake::Location, '.'); |
| 6777 | } |
| 6778 | |
| 6779 | |
| 6780 | |
| 6781 | ################################################################ |
| 6782 | |
| 6783 | # $STRING |
| 6784 | # flatten ($ORIGINAL_STRING) |
| 6785 | # -------------------------- |
| 6786 | sub flatten |
| 6787 | { |
| 6788 | $_ = shift; |
| 6789 | |
| 6790 | s/\\\n//somg; |
| 6791 | s/\s+/ /g; |
| 6792 | s/^ //; |
| 6793 | s/ $//; |
| 6794 | |
| 6795 | return $_; |
| 6796 | } |
| 6797 | |
| 6798 | |
| 6799 | # transform_token ($TOKEN, \%PAIRS, $KEY) |
| 6800 | # --------------------------------------- |
| 6801 | # Return the value associated to $KEY in %PAIRS, as used on $TOKEN |
| 6802 | # (which should be ?KEY? or any of the special %% requests).. |
| 6803 | sub transform_token ($\%$) |
| 6804 | { |
| 6805 | my ($token, $transform, $key) = @_; |
| 6806 | my $res = $transform->{$key}; |
| 6807 | prog_error "Unknown key '$key' in '$token'" unless defined $res; |
| 6808 | return $res; |
| 6809 | } |
| 6810 | |
| 6811 | |
| 6812 | # transform ($TOKEN, \%PAIRS) |
| 6813 | # --------------------------- |
| 6814 | # If ($TOKEN, $VAL) is in %PAIRS: |
| 6815 | # - replaces %KEY% with $VAL, |
| 6816 | # - enables/disables ?KEY? and ?!KEY?, |
| 6817 | # - replaces %?KEY% with TRUE or FALSE. |
| 6818 | sub transform ($\%) |
| 6819 | { |
| 6820 | my ($token, $transform) = @_; |
| 6821 | |
| 6822 | # %KEY%. |
| 6823 | # Must be before the following pattern to exclude the case |
| 6824 | # when there is neither IFTRUE nor IFFALSE. |
| 6825 | if ($token =~ /^%([\w\-]+)%$/) |
| 6826 | { |
| 6827 | return transform_token ($token, %$transform, $1); |
| 6828 | } |
| 6829 | # %?KEY%. |
| 6830 | elsif ($token =~ /^%\?([\w\-]+)%$/) |
| 6831 | { |
| 6832 | return transform_token ($token, %$transform, $1) ? 'TRUE' : 'FALSE'; |
| 6833 | } |
| 6834 | # ?KEY? and ?!KEY?. |
| 6835 | elsif ($token =~ /^ \? (!?) ([\w\-]+) \? $/x) |
| 6836 | { |
| 6837 | my $neg = ($1 eq '!') ? 1 : 0; |
| 6838 | my $val = transform_token ($token, %$transform, $2); |
| 6839 | return (!!$val == $neg) ? '##%' : ''; |
| 6840 | } |
| 6841 | else |
| 6842 | { |
| 6843 | prog_error "Unknown request format: $token"; |
| 6844 | } |
| 6845 | } |
| 6846 | |
| 6847 | # $TEXT |
| 6848 | # preprocess_file ($MAKEFILE, [%TRANSFORM]) |
| 6849 | # ----------------------------------------- |
| 6850 | # Load a $MAKEFILE, apply the %TRANSFORM, and return the result. |
| 6851 | # No extra parsing or post-processing is done (i.e., recognition of |
| 6852 | # rules declaration or of make variables definitions). |
| 6853 | sub preprocess_file |
| 6854 | { |
| 6855 | my ($file, %transform) = @_; |
| 6856 | |
| 6857 | # Complete %transform with global options. |
| 6858 | # Note that %transform goes last, so it overrides global options. |
| 6859 | %transform = ( 'MAINTAINER-MODE' |
| 6860 | => $seen_maint_mode ? subst ('MAINTAINER_MODE_TRUE') : '', |
| 6861 | |
| 6862 | 'XZ' => !! option 'dist-xz', |
| 6863 | 'LZIP' => !! option 'dist-lzip', |
| 6864 | 'BZIP2' => !! option 'dist-bzip2', |
| 6865 | 'COMPRESS' => !! option 'dist-tarZ', |
| 6866 | 'GZIP' => ! option 'no-dist-gzip', |
| 6867 | 'SHAR' => !! option 'dist-shar', |
| 6868 | 'ZIP' => !! option 'dist-zip', |
| 6869 | 'ZSTD' => !! option 'dist-zstd', |
| 6870 | 'DIST_BUILT_SOURCES' => !! option 'dist-built-sources', |
| 6871 | |
| 6872 | 'INSTALL-INFO' => ! option 'no-installinfo', |
| 6873 | 'INSTALL-MAN' => ! option 'no-installman', |
| 6874 | 'CK-NEWS' => !! option 'check-news', |
| 6875 | |
| 6876 | 'SUBDIRS' => !! var ('SUBDIRS'), |
| 6877 | 'TOPDIR_P' => $relative_dir eq '.', |
| 6878 | |
| 6879 | 'BUILD' => ($seen_canonical >= AC_CANONICAL_BUILD), |
| 6880 | 'HOST' => ($seen_canonical >= AC_CANONICAL_HOST), |
| 6881 | 'TARGET' => ($seen_canonical >= AC_CANONICAL_TARGET), |
| 6882 | |
| 6883 | 'LIBTOOL' => !! var ('LIBTOOL'), |
| 6884 | 'NONLIBTOOL' => 1, |
| 6885 | %transform); |
| 6886 | |
| 6887 | if (! defined ($_ = $am_file_cache{$file})) |
| 6888 | { |
| 6889 | verb "reading $file"; |
| 6890 | # Swallow the whole file. |
| 6891 | my $fc_file = new Automake::XFile "< $file"; |
| 6892 | my $saved_dollar_slash = $/; |
| 6893 | undef $/; |
| 6894 | $_ = $fc_file->getline; |
| 6895 | $/ = $saved_dollar_slash; |
| 6896 | $fc_file->close; |
| 6897 | # Remove ##-comments. |
| 6898 | # Besides we don't need more than two consecutive new-lines. |
| 6899 | s/(?:$IGNORE_PATTERN|(?<=\n\n)\n+)//gom; |
| 6900 | # Remember the contents of the just-read file. |
| 6901 | $am_file_cache{$file} = $_; |
| 6902 | } |
| 6903 | |
| 6904 | # Substitute Automake template tokens. |
| 6905 | s/(?: % \?? [\w\-]+ % |
| 6906 | | \? !? [\w\-]+ \? |
| 6907 | )/transform($&, %transform)/gex; |
| 6908 | # transform() may have added some ##%-comments to strip. |
| 6909 | # (we use '##%' instead of '##' so we can distinguish ##%##%##% from |
| 6910 | # ####### and do not remove the latter.) |
| 6911 | s/^[ \t]*(?:##%)+.*\n//gm; |
| 6912 | |
| 6913 | return $_; |
| 6914 | } |
| 6915 | |
| 6916 | |
| 6917 | # @PARAGRAPHS |
| 6918 | # make_paragraphs ($MAKEFILE, [%TRANSFORM]) |
| 6919 | # ----------------------------------------- |
| 6920 | # Load a $MAKEFILE, apply the %TRANSFORM, and return it as a list of |
| 6921 | # paragraphs. |
| 6922 | sub make_paragraphs |
| 6923 | { |
| 6924 | my ($file, %transform) = @_; |
| 6925 | $transform{FIRST} = !$transformed_files{$file}; |
| 6926 | $transformed_files{$file} = 1; |
| 6927 | |
| 6928 | my @lines = split /(?<!\\)\n/, preprocess_file ($file, %transform); |
| 6929 | my @res; |
| 6930 | |
| 6931 | while (defined ($_ = shift @lines)) |
| 6932 | { |
| 6933 | my $paragraph = $_; |
| 6934 | # If we are a rule, eat as long as we start with a tab. |
| 6935 | if (/$RULE_PATTERN/smo) |
| 6936 | { |
| 6937 | while (defined ($_ = shift @lines) && $_ =~ /^\t/) |
| 6938 | { |
| 6939 | $paragraph .= "\n$_"; |
| 6940 | } |
| 6941 | unshift (@lines, $_); |
| 6942 | } |
| 6943 | |
| 6944 | # If we are a comments, eat as much comments as you can. |
| 6945 | elsif (/$COMMENT_PATTERN/smo) |
| 6946 | { |
| 6947 | while (defined ($_ = shift @lines) |
| 6948 | && $_ =~ /$COMMENT_PATTERN/smo) |
| 6949 | { |
| 6950 | $paragraph .= "\n$_"; |
| 6951 | } |
| 6952 | unshift (@lines, $_); |
| 6953 | } |
| 6954 | |
| 6955 | push @res, $paragraph; |
| 6956 | } |
| 6957 | |
| 6958 | return @res; |
| 6959 | } |
| 6960 | |
| 6961 | |
| 6962 | |
| 6963 | # ($COMMENT, $VARIABLES, $RULES) |
| 6964 | # file_contents_internal ($IS_AM, $FILE, $WHERE, [%TRANSFORM]) |
| 6965 | # ------------------------------------------------------------ |
| 6966 | # Return contents of a file from $libdir/am, automatically skipping |
| 6967 | # macros or rules which are already known. $IS_AM iff the caller is |
| 6968 | # reading an Automake file (as opposed to the user's Makefile.am). |
| 6969 | sub file_contents_internal |
| 6970 | { |
| 6971 | my ($is_am, $file, $where, %transform) = @_; |
| 6972 | |
| 6973 | $where->set ($file); |
| 6974 | |
| 6975 | my $result_vars = ''; |
| 6976 | my $result_rules = ''; |
| 6977 | my $comment = ''; |
| 6978 | my $spacing = ''; |
| 6979 | |
| 6980 | # The following flags are used to track rules spanning across |
| 6981 | # multiple paragraphs. |
| 6982 | my $is_rule = 0; # 1 if we are processing a rule. |
| 6983 | my $discard_rule = 0; # 1 if the current rule should not be output. |
| 6984 | |
| 6985 | # We save the conditional stack on entry, and then check to make |
| 6986 | # sure it is the same on exit. This lets us conditionally include |
| 6987 | # other files. |
| 6988 | my @saved_cond_stack = @cond_stack; |
| 6989 | my $cond = new Automake::Condition (@cond_stack); |
| 6990 | |
| 6991 | foreach (make_paragraphs ($file, %transform)) |
| 6992 | { |
| 6993 | # FIXME: no line number available. |
| 6994 | $where->set ($file); |
| 6995 | |
| 6996 | # Sanity checks. |
| 6997 | error $where, "blank line following trailing backslash:\n$_" |
| 6998 | if /\\$/; |
| 6999 | error $where, "comment following trailing backslash:\n$_" |
| 7000 | if /\\#/; |
| 7001 | |
| 7002 | if (/^$/) |
| 7003 | { |
| 7004 | $is_rule = 0; |
| 7005 | # Stick empty line before the incoming macro or rule. |
| 7006 | $spacing = "\n"; |
| 7007 | } |
| 7008 | elsif (/$COMMENT_PATTERN/mso) |
| 7009 | { |
| 7010 | $is_rule = 0; |
| 7011 | # Stick comments before the incoming macro or rule. |
| 7012 | $comment = "$_\n"; |
| 7013 | } |
| 7014 | |
| 7015 | # Handle inclusion of other files. |
| 7016 | elsif (/$INCLUDE_PATTERN/o) |
| 7017 | { |
| 7018 | if ($cond != FALSE) |
| 7019 | { |
| 7020 | my $file = ($is_am ? "$libdir/am/" : '') . $1; |
| 7021 | $where->push_context ("'$file' included from here"); |
| 7022 | # N-ary '.=' fails. |
| 7023 | my ($com, $vars, $rules) |
| 7024 | = file_contents_internal ($is_am, $file, $where, %transform); |
| 7025 | $where->pop_context; |
| 7026 | $comment .= $com; |
| 7027 | $result_vars .= $vars; |
| 7028 | $result_rules .= $rules; |
| 7029 | } |
| 7030 | } |
| 7031 | |
| 7032 | # Handling the conditionals. |
| 7033 | elsif (/$IF_PATTERN/o) |
| 7034 | { |
| 7035 | $cond = cond_stack_if ($1, $2, $file); |
| 7036 | } |
| 7037 | elsif (/$ELSE_PATTERN/o) |
| 7038 | { |
| 7039 | $cond = cond_stack_else ($1, $2, $file); |
| 7040 | } |
| 7041 | elsif (/$ENDIF_PATTERN/o) |
| 7042 | { |
| 7043 | $cond = cond_stack_endif ($1, $2, $file); |
| 7044 | } |
| 7045 | |
| 7046 | # Handling rules. |
| 7047 | elsif (/$RULE_PATTERN/mso) |
| 7048 | { |
| 7049 | $is_rule = 1; |
| 7050 | $discard_rule = 0; |
| 7051 | # Separate relationship from optional actions: the first |
| 7052 | # `new-line tab" not preceded by backslash (continuation |
| 7053 | # line). |
| 7054 | my $paragraph = $_; |
| 7055 | /^(.*?)(?:(?<!\\)\n(\t.*))?$/s; |
| 7056 | my ($relationship, $actions) = ($1, $2 || ''); |
| 7057 | |
| 7058 | # Separate targets from dependencies: the first colon. |
| 7059 | $relationship =~ /^([^:]+\S+) *: *(.*)$/som; |
| 7060 | my ($targets, $dependencies) = ($1, $2); |
| 7061 | # Remove the escaped new lines. |
| 7062 | # I don't know why, but I have to use a tmp $flat_deps. |
| 7063 | my $flat_deps = flatten ($dependencies); |
| 7064 | my @deps = split (' ', $flat_deps); |
| 7065 | |
| 7066 | foreach (split (' ', $targets)) |
| 7067 | { |
| 7068 | # FIXME: 1. We are not robust to people defining several targets |
| 7069 | # at once, only some of them being in %dependencies. The |
| 7070 | # actions from the targets in %dependencies are usually generated |
| 7071 | # from the content of %actions, but if some targets in $targets |
| 7072 | # are not in %dependencies the ELSE branch will output |
| 7073 | # a rule for all $targets (i.e. the targets which are both |
| 7074 | # in %dependencies and $targets will have two rules). |
| 7075 | |
| 7076 | # FIXME: 2. The logic here is not able to output a |
| 7077 | # multi-paragraph rule several time (e.g. for each condition |
| 7078 | # it is defined for) because it only knows the first paragraph. |
| 7079 | |
| 7080 | # FIXME: 3. We are not robust to people defining a subset |
| 7081 | # of a previously defined "multiple-target" rule. E.g. |
| 7082 | # 'foo:' after 'foo bar:'. |
| 7083 | |
| 7084 | # Output only if not in FALSE. |
| 7085 | if (defined $dependencies{$_} && $cond != FALSE) |
| 7086 | { |
| 7087 | depend ($_, @deps); |
| 7088 | register_action ($_, $actions); |
| 7089 | } |
| 7090 | else |
| 7091 | { |
| 7092 | # Free-lance dependency. Output the rule for all the |
| 7093 | # targets instead of one by one. |
| 7094 | my @undefined_conds = |
| 7095 | Automake::Rule::define ($targets, $file, |
| 7096 | $is_am ? RULE_AUTOMAKE : RULE_USER, |
| 7097 | $cond, $where); |
| 7098 | for my $undefined_cond (@undefined_conds) |
| 7099 | { |
| 7100 | my $condparagraph = $paragraph; |
| 7101 | $condparagraph =~ s/^/$undefined_cond->subst_string/gme; |
| 7102 | $result_rules .= "$spacing$comment$condparagraph\n"; |
| 7103 | } |
| 7104 | if (scalar @undefined_conds == 0) |
| 7105 | { |
| 7106 | # Remember to discard next paragraphs |
| 7107 | # if they belong to this rule. |
| 7108 | # (but see also FIXME: #2 above.) |
| 7109 | $discard_rule = 1; |
| 7110 | } |
| 7111 | $comment = $spacing = ''; |
| 7112 | last; |
| 7113 | } |
| 7114 | } |
| 7115 | } |
| 7116 | |
| 7117 | elsif (/$ASSIGNMENT_PATTERN/mso) |
| 7118 | { |
| 7119 | my ($var, $type, $val) = ($1, $2, $3); |
| 7120 | error $where, "variable '$var' with trailing backslash" |
| 7121 | if /\\$/; |
| 7122 | |
| 7123 | $is_rule = 0; |
| 7124 | |
| 7125 | Automake::Variable::define ($var, |
| 7126 | $is_am ? VAR_AUTOMAKE : VAR_MAKEFILE, |
| 7127 | $type, $cond, $val, $comment, $where, |
| 7128 | VAR_ASIS) |
| 7129 | if $cond != FALSE; |
| 7130 | |
| 7131 | $comment = $spacing = ''; |
| 7132 | } |
| 7133 | else |
| 7134 | { |
| 7135 | # This isn't an error; it is probably some tokens which |
| 7136 | # configure is supposed to replace, such as '@SET-MAKE@', |
| 7137 | # or some part of a rule cut by an if/endif. |
| 7138 | if (! $cond->false && ! ($is_rule && $discard_rule)) |
| 7139 | { |
| 7140 | s/^/$cond->subst_string/gme; |
| 7141 | $result_rules .= "$spacing$comment$_\n"; |
| 7142 | } |
| 7143 | $comment = $spacing = ''; |
| 7144 | } |
| 7145 | } |
| 7146 | |
| 7147 | error ($where, @cond_stack ? |
| 7148 | "unterminated conditionals: @cond_stack" : |
| 7149 | "too many conditionals closed in include file") |
| 7150 | if "@saved_cond_stack" ne "@cond_stack"; |
| 7151 | |
| 7152 | return ($comment, $result_vars, $result_rules); |
| 7153 | } |
| 7154 | |
| 7155 | |
| 7156 | # $CONTENTS |
| 7157 | # file_contents ($BASENAME, $WHERE, [%TRANSFORM]) |
| 7158 | # ----------------------------------------------- |
| 7159 | # Return contents of a file from $libdir/am, automatically skipping |
| 7160 | # macros or rules which are already known. |
| 7161 | sub file_contents |
| 7162 | { |
| 7163 | my ($basename, $where, %transform) = @_; |
| 7164 | my ($comments, $variables, $rules) = |
| 7165 | file_contents_internal (1, "$libdir/am/$basename.am", $where, |
| 7166 | %transform); |
| 7167 | return "$comments$variables$rules"; |
| 7168 | } |
| 7169 | |
| 7170 | |
| 7171 | # @PREFIX |
| 7172 | # am_primary_prefixes ($PRIMARY, $CAN_DIST, @PREFIXES) |
| 7173 | # ---------------------------------------------------- |
| 7174 | # Find all variable prefixes that are used for install directories. A |
| 7175 | # prefix 'zar' qualifies iff: |
| 7176 | # |
| 7177 | # * 'zardir' is a variable. |
| 7178 | # * 'zar_PRIMARY' is a variable. |
| 7179 | # |
| 7180 | # As a side effect, it looks for misspellings. It is an error to have |
| 7181 | # a variable ending in a "reserved" suffix whose prefix is unknown, e.g. |
| 7182 | # "bni_PROGRAMS". However, unusual prefixes are allowed if a variable |
| 7183 | # of the same name (with "dir" appended) exists. For instance, if the |
| 7184 | # variable "zardir" is defined, then "zar_PROGRAMS" becomes valid. |
| 7185 | # This is to provide a little extra flexibility in those cases which |
| 7186 | # need it. |
| 7187 | sub am_primary_prefixes |
| 7188 | { |
| 7189 | my ($primary, $can_dist, @prefixes) = @_; |
| 7190 | |
| 7191 | local $_; |
| 7192 | my %valid = map { $_ => 0 } @prefixes; |
| 7193 | $valid{'EXTRA'} = 0; |
| 7194 | foreach my $var (variables $primary) |
| 7195 | { |
| 7196 | # Automake is allowed to define variables that look like primaries |
| 7197 | # but which aren't. E.g. INSTALL_sh_DATA. |
| 7198 | # Autoconf can also define variables like INSTALL_DATA, so |
| 7199 | # ignore all configure variables (at least those which are not |
| 7200 | # redefined in Makefile.am). |
| 7201 | # FIXME: We should make sure that these variables are not |
| 7202 | # conditionally defined (or else adjust the condition below). |
| 7203 | my $def = $var->def (TRUE); |
| 7204 | next if $def && $def->owner != VAR_MAKEFILE; |
| 7205 | |
| 7206 | my $varname = $var->name; |
| 7207 | |
| 7208 | if ($varname =~ /^(nobase_)?(dist_|nodist_)?(.*)_[[:alnum:]]+$/) |
| 7209 | { |
| 7210 | my ($base, $dist, $X) = ($1 || '', $2 || '', $3 || ''); |
| 7211 | if ($dist ne '' && ! $can_dist) |
| 7212 | { |
| 7213 | err_var ($var, |
| 7214 | "invalid variable '$varname': 'dist' is forbidden"); |
| 7215 | } |
| 7216 | # Standard directories must be explicitly allowed. |
| 7217 | elsif (! defined $valid{$X} && exists $standard_prefix{$X}) |
| 7218 | { |
| 7219 | err_var ($var, |
| 7220 | "'${X}dir' is not a legitimate directory " . |
| 7221 | "for '$primary'"); |
| 7222 | } |
| 7223 | # A not explicitly valid directory is allowed if Xdir is defined. |
| 7224 | elsif (! defined $valid{$X} && |
| 7225 | $var->requires_variables ("'$varname' is used", "${X}dir")) |
| 7226 | { |
| 7227 | # Nothing to do. Any error message has been output |
| 7228 | # by $var->requires_variables. |
| 7229 | } |
| 7230 | else |
| 7231 | { |
| 7232 | # Ensure all extended prefixes are actually used. |
| 7233 | $valid{"$base$dist$X"} = 1; |
| 7234 | } |
| 7235 | } |
| 7236 | else |
| 7237 | { |
| 7238 | prog_error "unexpected variable name: $varname"; |
| 7239 | } |
| 7240 | } |
| 7241 | |
| 7242 | # Return only those which are actually defined. |
| 7243 | return sort grep { var ($_ . '_' . $primary) } keys %valid; |
| 7244 | } |
| 7245 | |
| 7246 | |
| 7247 | # am_install_var (-OPTION..., file, HOW, where...) |
| 7248 | # ------------------------------------------------ |
| 7249 | # |
| 7250 | # Handle 'where_HOW' variable magic. Does all lookups, generates |
| 7251 | # install code, and possibly generates code to define the primary |
| 7252 | # variable. The first argument is the name of the .am file to munge, |
| 7253 | # the second argument is the primary variable (e.g. HEADERS), and all |
| 7254 | # subsequent arguments are possible installation locations. |
| 7255 | # |
| 7256 | # Returns list of [$location, $value] pairs, where |
| 7257 | # $value's are the values in all where_HOW variable, and $location |
| 7258 | # there associated location (the place here their parent variables were |
| 7259 | # defined). |
| 7260 | # |
| 7261 | # FIXME: this should be rewritten to be cleaner. It should be broken |
| 7262 | # up into multiple functions. |
| 7263 | # |
| 7264 | sub am_install_var |
| 7265 | { |
| 7266 | my (@args) = @_; |
| 7267 | |
| 7268 | my $do_require = 1; |
| 7269 | my $can_dist = 0; |
| 7270 | my $default_dist = 0; |
| 7271 | while (@args) |
| 7272 | { |
| 7273 | if ($args[0] eq '-noextra') |
| 7274 | { |
| 7275 | $do_require = 0; |
| 7276 | } |
| 7277 | elsif ($args[0] eq '-candist') |
| 7278 | { |
| 7279 | $can_dist = 1; |
| 7280 | } |
| 7281 | elsif ($args[0] eq '-defaultdist') |
| 7282 | { |
| 7283 | $default_dist = 1; |
| 7284 | $can_dist = 1; |
| 7285 | } |
| 7286 | elsif ($args[0] !~ /^-/) |
| 7287 | { |
| 7288 | last; |
| 7289 | } |
| 7290 | shift (@args); |
| 7291 | } |
| 7292 | |
| 7293 | my ($file, $primary, @prefix) = @args; |
| 7294 | |
| 7295 | # Now that configure substitutions are allowed in where_HOW |
| 7296 | # variables, it is an error to actually define the primary. We |
| 7297 | # allow 'JAVA', as it is customarily used to mean the Java |
| 7298 | # interpreter. This is but one of several Java hacks. Similarly, |
| 7299 | # 'PYTHON' is customarily used to mean the Python interpreter. |
| 7300 | reject_var $primary, "'$primary' is an anachronism" |
| 7301 | unless $primary eq 'JAVA' || $primary eq 'PYTHON'; |
| 7302 | |
| 7303 | # Get the prefixes which are valid and actually used. |
| 7304 | @prefix = am_primary_prefixes ($primary, $can_dist, @prefix); |
| 7305 | |
| 7306 | # If a primary includes a configure substitution, then the EXTRA_ |
| 7307 | # form is required. Otherwise we can't properly do our job. |
| 7308 | my $require_extra; |
| 7309 | |
| 7310 | my @used = (); |
| 7311 | my @result = (); |
| 7312 | |
| 7313 | foreach my $X (@prefix) |
| 7314 | { |
| 7315 | my $nodir_name = $X; |
| 7316 | my $one_name = $X . '_' . $primary; |
| 7317 | my $one_var = var $one_name; |
| 7318 | |
| 7319 | my $strip_subdir = 1; |
| 7320 | # If subdir prefix should be preserved, do so. |
| 7321 | if ($nodir_name =~ /^nobase_/) |
| 7322 | { |
| 7323 | $strip_subdir = 0; |
| 7324 | $nodir_name =~ s/^nobase_//; |
| 7325 | } |
| 7326 | |
| 7327 | # If files should be distributed, do so. |
| 7328 | my $dist_p = 0; |
| 7329 | if ($can_dist) |
| 7330 | { |
| 7331 | $dist_p = (($default_dist && $nodir_name !~ /^nodist_/) |
| 7332 | || (! $default_dist && $nodir_name =~ /^dist_/)); |
| 7333 | $nodir_name =~ s/^(dist|nodist)_//; |
| 7334 | } |
| 7335 | |
| 7336 | |
| 7337 | # Use the location of the currently processed variable. |
| 7338 | # We are not processing a particular condition, so pick the first |
| 7339 | # available. |
| 7340 | my $tmpcond = $one_var->conditions->one_cond; |
| 7341 | my $where = $one_var->rdef ($tmpcond)->location->clone; |
| 7342 | |
| 7343 | # Append actual contents of where_PRIMARY variable to |
| 7344 | # @result, skipping @substitutions@. |
| 7345 | foreach my $locvals ($one_var->value_as_list_recursive (location => 1)) |
| 7346 | { |
| 7347 | my ($loc, $value) = @$locvals; |
| 7348 | # Skip configure substitutions. |
| 7349 | if ($value =~ /^\@.*\@$/) |
| 7350 | { |
| 7351 | if ($nodir_name eq 'EXTRA') |
| 7352 | { |
| 7353 | error ($where, |
| 7354 | "'$one_name' contains configure substitution, " |
| 7355 | . "but shouldn't"); |
| 7356 | } |
| 7357 | # Check here to make sure variables defined in |
| 7358 | # configure.ac do not imply that EXTRA_PRIMARY |
| 7359 | # must be defined. |
| 7360 | elsif (! defined $configure_vars{$one_name}) |
| 7361 | { |
| 7362 | $require_extra = $one_name |
| 7363 | if $do_require; |
| 7364 | } |
| 7365 | } |
| 7366 | else |
| 7367 | { |
| 7368 | # Strip any $(EXEEXT) suffix the user might have added, |
| 7369 | # or this will confuse handle_source_transform() and |
| 7370 | # check_canonical_spelling(). |
| 7371 | # We'll add $(EXEEXT) back later anyway. |
| 7372 | # Do it here rather than in handle_programs so the |
| 7373 | # uniquifying at the end of this function works. |
| 7374 | ${$locvals}[1] =~ s/\$\(EXEEXT\)$// |
| 7375 | if $primary eq 'PROGRAMS'; |
| 7376 | |
| 7377 | push (@result, $locvals); |
| 7378 | } |
| 7379 | } |
| 7380 | # A blatant hack: we rewrite each _PROGRAMS primary to include |
| 7381 | # EXEEXT. |
| 7382 | append_exeext { 1 } $one_name |
| 7383 | if $primary eq 'PROGRAMS'; |
| 7384 | # "EXTRA" shouldn't be used when generating clean targets, |
| 7385 | # all, or install targets. We used to warn if EXTRA_FOO was |
| 7386 | # defined uselessly, but this was annoying. |
| 7387 | next |
| 7388 | if $nodir_name eq 'EXTRA'; |
| 7389 | |
| 7390 | if ($nodir_name eq 'check') |
| 7391 | { |
| 7392 | push (@check, '$(' . $one_name . ')'); |
| 7393 | } |
| 7394 | else |
| 7395 | { |
| 7396 | push (@used, '$(' . $one_name . ')'); |
| 7397 | } |
| 7398 | |
| 7399 | # Is this to be installed? |
| 7400 | my $install_p = $nodir_name ne 'noinst' && $nodir_name ne 'check'; |
| 7401 | |
| 7402 | # If so, with install-exec? (or install-data?). |
| 7403 | my $exec_p = ($nodir_name =~ /$EXEC_DIR_PATTERN/o); |
| 7404 | |
| 7405 | my $check_options_p = $install_p && !! option 'std-options'; |
| 7406 | |
| 7407 | # Use the location of the currently processed variable as context. |
| 7408 | $where->push_context ("while processing '$one_name'"); |
| 7409 | |
| 7410 | # The variable containing all files to distribute. |
| 7411 | my $distvar = "\$($one_name)"; |
| 7412 | $distvar = shadow_unconditionally ($one_name, $where) |
| 7413 | if ($dist_p && $one_var->has_conditional_contents); |
| 7414 | |
| 7415 | # Singular form of $PRIMARY. |
| 7416 | (my $one_primary = $primary) =~ s/S$//; |
| 7417 | $output_rules .= file_contents ($file, $where, |
| 7418 | PRIMARY => $primary, |
| 7419 | ONE_PRIMARY => $one_primary, |
| 7420 | DIR => $X, |
| 7421 | NDIR => $nodir_name, |
| 7422 | BASE => $strip_subdir, |
| 7423 | EXEC => $exec_p, |
| 7424 | INSTALL => $install_p, |
| 7425 | DIST => $dist_p, |
| 7426 | DISTVAR => $distvar, |
| 7427 | 'CK-OPTS' => $check_options_p); |
| 7428 | } |
| 7429 | |
| 7430 | # The JAVA variable is used as the name of the Java interpreter. |
| 7431 | # The PYTHON variable is used as the name of the Python interpreter. |
| 7432 | if (@used && $primary ne 'JAVA' && $primary ne 'PYTHON') |
| 7433 | { |
| 7434 | # Define it. |
| 7435 | define_pretty_variable ($primary, TRUE, INTERNAL, @used); |
| 7436 | $output_vars .= "\n"; |
| 7437 | } |
| 7438 | |
| 7439 | err_var ($require_extra, |
| 7440 | "'$require_extra' contains configure substitution,\n" |
| 7441 | . "but 'EXTRA_$primary' not defined") |
| 7442 | if ($require_extra && ! var ('EXTRA_' . $primary)); |
| 7443 | |
| 7444 | # Push here because PRIMARY might be configure time determined. |
| 7445 | push (@all, '$(' . $primary . ')') |
| 7446 | if @used && $primary ne 'JAVA' && $primary ne 'PYTHON'; |
| 7447 | |
| 7448 | # Make the result unique. This lets the user use conditionals in |
| 7449 | # a natural way, but still lets us program lazily -- we don't have |
| 7450 | # to worry about handling a particular object more than once. |
| 7451 | # We will keep only one location per object. |
| 7452 | my %result = (); |
| 7453 | for my $pair (@result) |
| 7454 | { |
| 7455 | my ($loc, $val) = @$pair; |
| 7456 | $result{$val} = $loc; |
| 7457 | } |
| 7458 | my @l = sort keys %result; |
| 7459 | return map { [$result{$_}->clone, $_] } @l; |
| 7460 | } |
| 7461 | |
| 7462 | |
| 7463 | ################################################################ |
| 7464 | |
| 7465 | # Each key in this hash is the name of a directory holding a |
| 7466 | # Makefile.in. These variables are local to 'is_make_dir'. |
| 7467 | my %make_dirs = (); |
| 7468 | my $make_dirs_set = 0; |
| 7469 | |
| 7470 | # is_make_dir ($DIRECTORY) |
| 7471 | # ------------------------ |
| 7472 | sub is_make_dir |
| 7473 | { |
| 7474 | my ($dir) = @_; |
| 7475 | if (! $make_dirs_set) |
| 7476 | { |
| 7477 | foreach my $iter (@configure_input_files) |
| 7478 | { |
| 7479 | $make_dirs{dirname ($iter)} = 1; |
| 7480 | } |
| 7481 | # We also want to notice Makefile.in's. |
| 7482 | foreach my $iter (@other_input_files) |
| 7483 | { |
| 7484 | if ($iter =~ /Makefile\.in$/) |
| 7485 | { |
| 7486 | $make_dirs{dirname ($iter)} = 1; |
| 7487 | } |
| 7488 | } |
| 7489 | $make_dirs_set = 1; |
| 7490 | } |
| 7491 | return defined $make_dirs{$dir}; |
| 7492 | } |
| 7493 | |
| 7494 | ################################################################ |
| 7495 | |
| 7496 | # Find the aux dir. This should match the algorithm used by |
| 7497 | # ./configure. (See the Autoconf documentation for for |
| 7498 | # AC_CONFIG_AUX_DIR.) |
| 7499 | sub locate_aux_dir () |
| 7500 | { |
| 7501 | if (! $config_aux_dir_set_in_configure_ac) |
| 7502 | { |
| 7503 | # The default auxiliary directory is the first |
| 7504 | # of ., .., or ../.. that contains install-sh. |
| 7505 | # Assume . if install-sh doesn't exist yet. |
| 7506 | for my $dir (qw (. .. ../..)) |
| 7507 | { |
| 7508 | if (-f "$dir/install-sh") |
| 7509 | { |
| 7510 | $config_aux_dir = $dir; |
| 7511 | last; |
| 7512 | } |
| 7513 | } |
| 7514 | $config_aux_dir = '.' unless $config_aux_dir; |
| 7515 | } |
| 7516 | # Avoid unsightly '/.'s. |
| 7517 | $am_config_aux_dir = |
| 7518 | '$(top_srcdir)' . ($config_aux_dir eq '.' ? "" : "/$config_aux_dir"); |
| 7519 | $am_config_aux_dir =~ s,/*$,,; |
| 7520 | } |
| 7521 | |
| 7522 | |
| 7523 | # push_required_file ($DIR, $FILE, $FULLFILE) |
| 7524 | # ------------------------------------------- |
| 7525 | # Push the given file onto DIST_COMMON. |
| 7526 | sub push_required_file |
| 7527 | { |
| 7528 | my ($dir, $file, $fullfile) = @_; |
| 7529 | |
| 7530 | # If the file to be distributed is in the same directory of the |
| 7531 | # currently processed Makefile.am, then we want to distribute it |
| 7532 | # from this same Makefile.am. |
| 7533 | if ($dir eq $relative_dir) |
| 7534 | { |
| 7535 | push_dist_common ($file); |
| 7536 | } |
| 7537 | # This is needed to allow a construct in a non-top-level Makefile.am |
| 7538 | # to require a file in the build-aux directory (see at least the test |
| 7539 | # script 'test-driver-is-distributed.sh'). This is related to the |
| 7540 | # automake bug#9546. Note that the use of $config_aux_dir instead |
| 7541 | # of $am_config_aux_dir here is deliberate and necessary. |
| 7542 | elsif ($dir eq $config_aux_dir) |
| 7543 | { |
| 7544 | push_dist_common ("$am_config_aux_dir/$file"); |
| 7545 | } |
| 7546 | # FIXME: another spacial case, for AC_LIBOBJ/AC_LIBSOURCE support. |
| 7547 | # We probably need some refactoring of this function and its callers, |
| 7548 | # to have a more explicit and systematic handling of all the special |
| 7549 | # cases; but, since there are only two of them, this is low-priority |
| 7550 | # ATM. |
| 7551 | elsif ($config_libobj_dir && $dir eq $config_libobj_dir) |
| 7552 | { |
| 7553 | # Avoid unsightly '/.'s. |
| 7554 | my $am_config_libobj_dir = |
| 7555 | '$(top_srcdir)' . |
| 7556 | ($config_libobj_dir eq '.' ? "" : "/$config_libobj_dir"); |
| 7557 | $am_config_libobj_dir =~ s|/*$||; |
| 7558 | push_dist_common ("$am_config_libobj_dir/$file"); |
| 7559 | } |
| 7560 | elsif ($relative_dir eq '.' && ! is_make_dir ($dir)) |
| 7561 | { |
| 7562 | # If we are doing the topmost directory, and the file is in a |
| 7563 | # subdir which does not have a Makefile, then we distribute it |
| 7564 | # here. |
| 7565 | |
| 7566 | # If a required file is above the source tree, it is important |
| 7567 | # to prefix it with '$(srcdir)' so that no VPATH search is |
| 7568 | # performed. Otherwise problems occur with Make implementations |
| 7569 | # that rewrite and simplify rules whose dependencies are found in a |
| 7570 | # VPATH location. Here is an example with OSF1/Tru64 Make. |
| 7571 | # |
| 7572 | # % cat Makefile |
| 7573 | # VPATH = sub |
| 7574 | # distdir: ../a |
| 7575 | # echo ../a |
| 7576 | # % ls |
| 7577 | # Makefile a |
| 7578 | # % make |
| 7579 | # echo a |
| 7580 | # a |
| 7581 | # |
| 7582 | # Dependency '../a' was found in 'sub/../a', but this make |
| 7583 | # implementation simplified it as 'a'. (Note that the sub/ |
| 7584 | # directory does not even exist.) |
| 7585 | # |
| 7586 | # This kind of VPATH rewriting seems hard to cancel. The |
| 7587 | # distdir.am hack against VPATH rewriting works only when no |
| 7588 | # simplification is done, i.e., for dependencies which are in |
| 7589 | # subdirectories, not in enclosing directories. Hence, in |
| 7590 | # the latter case we use a full path to make sure no VPATH |
| 7591 | # search occurs. |
| 7592 | $fullfile = '$(srcdir)/' . $fullfile |
| 7593 | if $dir =~ m,^\.\.(?:$|/),; |
| 7594 | |
| 7595 | push_dist_common ($fullfile); |
| 7596 | } |
| 7597 | else |
| 7598 | { |
| 7599 | prog_error "a Makefile in relative directory $relative_dir " . |
| 7600 | "can't add files in directory $dir to DIST_COMMON"; |
| 7601 | } |
| 7602 | } |
| 7603 | |
| 7604 | |
| 7605 | # If a file name appears as a key in this hash, then it has already |
| 7606 | # been checked for. This allows us not to report the same error more |
| 7607 | # than once. |
| 7608 | my %required_file_not_found = (); |
| 7609 | |
| 7610 | # required_file_check_or_copy ($WHERE, $DIRECTORY, $FILE) |
| 7611 | # ------------------------------------------------------- |
| 7612 | # Verify that the file must exist in $DIRECTORY, or install it. |
| 7613 | sub required_file_check_or_copy |
| 7614 | { |
| 7615 | my ($where, $dir, $file) = @_; |
| 7616 | |
| 7617 | my $fullfile = "$dir/$file"; |
| 7618 | my $found_it = 0; |
| 7619 | my $dangling_sym = 0; |
| 7620 | |
| 7621 | if (-l $fullfile && ! -f $fullfile) |
| 7622 | { |
| 7623 | $dangling_sym = 1; |
| 7624 | } |
| 7625 | elsif (dir_has_case_matching_file ($dir, $file)) |
| 7626 | { |
| 7627 | $found_it = 1; |
| 7628 | } |
| 7629 | |
| 7630 | # '--force-missing' only has an effect if '--add-missing' is |
| 7631 | # specified. |
| 7632 | return |
| 7633 | if $found_it && (! $add_missing || ! $force_missing); |
| 7634 | |
| 7635 | # If we've already looked for it, we're done. You might wonder why we |
| 7636 | # don't do this before searching for the file. If we do that, then |
| 7637 | # something like AC_OUTPUT([subdir/foo foo]) will fail to put 'foo.in' |
| 7638 | # into $(DIST_COMMON). |
| 7639 | if (! $found_it) |
| 7640 | { |
| 7641 | return if defined $required_file_not_found{$fullfile}; |
| 7642 | $required_file_not_found{$fullfile} = 1; |
| 7643 | } |
| 7644 | if ($dangling_sym && $add_missing) |
| 7645 | { |
| 7646 | unlink ($fullfile); |
| 7647 | } |
| 7648 | |
| 7649 | my $trailer = ''; |
| 7650 | my $trailer2 = ''; |
| 7651 | my $suppress = 0; |
| 7652 | |
| 7653 | # Only install missing files according to our desired |
| 7654 | # strictness level. |
| 7655 | my $message = "required file '$fullfile' not found"; |
| 7656 | if ($add_missing) |
| 7657 | { |
| 7658 | if (-f "$libdir/$file") |
| 7659 | { |
| 7660 | $suppress = 1; |
| 7661 | |
| 7662 | # Install the missing file. Symlink if we |
| 7663 | # can, copy if we must. Note: delete the file |
| 7664 | # first, in case it is a dangling symlink. |
| 7665 | $message = "installing '$fullfile'"; |
| 7666 | |
| 7667 | # The license file should not be volatile. |
| 7668 | if ($file eq "COPYING") |
| 7669 | { |
| 7670 | $message .= " using GNU General Public License v3 file"; |
| 7671 | $trailer2 = "\n Consider adding the COPYING file" |
| 7672 | . " to the version control system" |
| 7673 | . "\n for your code, to avoid questions" |
| 7674 | . " about which license your project uses"; |
| 7675 | } |
| 7676 | |
| 7677 | # Windows Perl will hang if we try to delete a |
| 7678 | # file that doesn't exist. |
| 7679 | unlink ($fullfile) if -f $fullfile; |
| 7680 | if ($symlink_exists && ! $copy_missing) |
| 7681 | { |
| 7682 | if (! symlink ("$libdir/$file", $fullfile) |
| 7683 | || ! -e $fullfile) |
| 7684 | { |
| 7685 | $suppress = 0; |
| 7686 | $trailer = "; error while making link: $!"; |
| 7687 | } |
| 7688 | } |
| 7689 | elsif (system ('cp', "$libdir/$file", $fullfile)) |
| 7690 | { |
| 7691 | $suppress = 0; |
| 7692 | $trailer = "\n error while copying"; |
| 7693 | } |
| 7694 | set_dir_cache_file ($dir, $file); |
| 7695 | } |
| 7696 | } |
| 7697 | else |
| 7698 | { |
| 7699 | $trailer = "\n 'automake --add-missing' can install '$file'" |
| 7700 | if -f "$libdir/$file"; |
| 7701 | } |
| 7702 | |
| 7703 | # If --force-missing was specified, and we have |
| 7704 | # actually found the file, then do nothing. |
| 7705 | return |
| 7706 | if $found_it && $force_missing; |
| 7707 | |
| 7708 | # If we couldn't install the file, but it is a target in |
| 7709 | # the Makefile, don't print anything. This allows files |
| 7710 | # like README, AUTHORS, or THANKS to be generated. |
| 7711 | return |
| 7712 | if !$suppress && rule $file; |
| 7713 | |
| 7714 | msg ($suppress ? 'note' : 'error', $where, "$message$trailer$trailer2"); |
| 7715 | } |
| 7716 | |
| 7717 | |
| 7718 | # require_file_internal ($WHERE, $MYSTRICT, $DIRECTORY, $QUEUE, @FILES) |
| 7719 | # --------------------------------------------------------------------- |
| 7720 | # Verify that the file must exist in $DIRECTORY, or install it. |
| 7721 | # $MYSTRICT is the strictness level at which this file becomes required. |
| 7722 | # Worker threads may queue up the action to be serialized by the master, |
| 7723 | # if $QUEUE is true |
| 7724 | sub require_file_internal |
| 7725 | { |
| 7726 | my ($where, $mystrict, $dir, $queue, @files) = @_; |
| 7727 | |
| 7728 | return |
| 7729 | unless $strictness >= $mystrict; |
| 7730 | |
| 7731 | foreach my $file (@files) |
| 7732 | { |
| 7733 | push_required_file ($dir, $file, "$dir/$file"); |
| 7734 | if ($queue) |
| 7735 | { |
| 7736 | queue_required_file_check_or_copy ($required_conf_file_queue, |
| 7737 | QUEUE_CONF_FILE, $relative_dir, |
| 7738 | $where, $mystrict, @files); |
| 7739 | } |
| 7740 | else |
| 7741 | { |
| 7742 | required_file_check_or_copy ($where, $dir, $file); |
| 7743 | } |
| 7744 | } |
| 7745 | } |
| 7746 | |
| 7747 | # require_file ($WHERE, $MYSTRICT, @FILES) |
| 7748 | # ---------------------------------------- |
| 7749 | sub require_file |
| 7750 | { |
| 7751 | my ($where, $mystrict, @files) = @_; |
| 7752 | require_file_internal ($where, $mystrict, $relative_dir, 0, @files); |
| 7753 | } |
| 7754 | |
| 7755 | # require_file_with_macro ($COND, $MACRO, $MYSTRICT, @FILES) |
| 7756 | # ---------------------------------------------------------- |
| 7757 | sub require_file_with_macro |
| 7758 | { |
| 7759 | my ($cond, $macro, $mystrict, @files) = @_; |
| 7760 | $macro = rvar ($macro) unless ref $macro; |
| 7761 | require_file ($macro->rdef ($cond)->location, $mystrict, @files); |
| 7762 | } |
| 7763 | |
| 7764 | # require_libsource_with_macro ($COND, $MACRO, $MYSTRICT, @FILES) |
| 7765 | # --------------------------------------------------------------- |
| 7766 | # Require an AC_LIBSOURCEd file. If AC_CONFIG_LIBOBJ_DIR was called, it |
| 7767 | # must be in that directory. Otherwise expect it in the current directory. |
| 7768 | sub require_libsource_with_macro |
| 7769 | { |
| 7770 | my ($cond, $macro, $mystrict, @files) = @_; |
| 7771 | $macro = rvar ($macro) unless ref $macro; |
| 7772 | if ($config_libobj_dir) |
| 7773 | { |
| 7774 | require_file_internal ($macro->rdef ($cond)->location, $mystrict, |
| 7775 | $config_libobj_dir, 0, @files); |
| 7776 | } |
| 7777 | else |
| 7778 | { |
| 7779 | require_file ($macro->rdef ($cond)->location, $mystrict, @files); |
| 7780 | } |
| 7781 | } |
| 7782 | |
| 7783 | # queue_required_file_check_or_copy ($QUEUE, $KEY, $DIR, $WHERE, |
| 7784 | # $MYSTRICT, @FILES) |
| 7785 | # -------------------------------------------------------------- |
| 7786 | sub queue_required_file_check_or_copy |
| 7787 | { |
| 7788 | my ($queue, $key, $dir, $where, $mystrict, @files) = @_; |
| 7789 | my @serial_loc; |
| 7790 | if (ref $where) |
| 7791 | { |
| 7792 | @serial_loc = (QUEUE_LOCATION, $where->serialize ()); |
| 7793 | } |
| 7794 | else |
| 7795 | { |
| 7796 | @serial_loc = (QUEUE_STRING, $where); |
| 7797 | } |
| 7798 | $queue->enqueue ($key, $dir, @serial_loc, $mystrict, 0 + @files, @files); |
| 7799 | } |
| 7800 | |
| 7801 | # require_queued_file_check_or_copy ($QUEUE) |
| 7802 | # ------------------------------------------ |
| 7803 | sub require_queued_file_check_or_copy |
| 7804 | { |
| 7805 | my ($queue) = @_; |
| 7806 | my $where; |
| 7807 | my $dir = $queue->dequeue (); |
| 7808 | my $loc_key = $queue->dequeue (); |
| 7809 | if ($loc_key eq QUEUE_LOCATION) |
| 7810 | { |
| 7811 | $where = Automake::Location::deserialize ($queue); |
| 7812 | } |
| 7813 | elsif ($loc_key eq QUEUE_STRING) |
| 7814 | { |
| 7815 | $where = $queue->dequeue (); |
| 7816 | } |
| 7817 | else |
| 7818 | { |
| 7819 | prog_error "unexpected key $loc_key"; |
| 7820 | } |
| 7821 | my $mystrict = $queue->dequeue (); |
| 7822 | my $nfiles = $queue->dequeue (); |
| 7823 | my @files; |
| 7824 | push @files, $queue->dequeue () |
| 7825 | foreach (1 .. $nfiles); |
| 7826 | return |
| 7827 | unless $strictness >= $mystrict; |
| 7828 | foreach my $file (@files) |
| 7829 | { |
| 7830 | required_file_check_or_copy ($where, $config_aux_dir, $file); |
| 7831 | } |
| 7832 | } |
| 7833 | |
| 7834 | # require_conf_file ($WHERE, $MYSTRICT, @FILES) |
| 7835 | # --------------------------------------------- |
| 7836 | # Looks in configuration path, as specified by AC_CONFIG_AUX_DIR. |
| 7837 | sub require_conf_file |
| 7838 | { |
| 7839 | my ($where, $mystrict, @files) = @_; |
| 7840 | my $queue = defined $required_conf_file_queue ? 1 : 0; |
| 7841 | require_file_internal ($where, $mystrict, $config_aux_dir, |
| 7842 | $queue, @files); |
| 7843 | } |
| 7844 | |
| 7845 | |
| 7846 | # require_conf_file_with_macro ($COND, $MACRO, $MYSTRICT, @FILES) |
| 7847 | # --------------------------------------------------------------- |
| 7848 | sub require_conf_file_with_macro |
| 7849 | { |
| 7850 | my ($cond, $macro, $mystrict, @files) = @_; |
| 7851 | require_conf_file (rvar ($macro)->rdef ($cond)->location, |
| 7852 | $mystrict, @files); |
| 7853 | } |
| 7854 | |
| 7855 | ################################################################ |
| 7856 | |
| 7857 | # require_build_directory ($DIRECTORY) |
| 7858 | # ------------------------------------ |
| 7859 | # Emit rules to create $DIRECTORY if needed, and return |
| 7860 | # the file that any target requiring this directory should be made |
| 7861 | # dependent upon. |
| 7862 | # We don't want to emit the rule twice, and want to reuse it |
| 7863 | # for directories with equivalent names (e.g., 'foo/bar' and './foo//bar'). |
| 7864 | sub require_build_directory |
| 7865 | { |
| 7866 | my $directory = shift; |
| 7867 | |
| 7868 | return $directory_map{$directory} if exists $directory_map{$directory}; |
| 7869 | |
| 7870 | my $cdir = File::Spec->canonpath ($directory); |
| 7871 | |
| 7872 | if (exists $directory_map{$cdir}) |
| 7873 | { |
| 7874 | my $stamp = $directory_map{$cdir}; |
| 7875 | $directory_map{$directory} = $stamp; |
| 7876 | return $stamp; |
| 7877 | } |
| 7878 | |
| 7879 | my $dirstamp = "$cdir/\$(am__dirstamp)"; |
| 7880 | |
| 7881 | $directory_map{$directory} = $dirstamp; |
| 7882 | $directory_map{$cdir} = $dirstamp; |
| 7883 | |
| 7884 | # Set a variable for the dirstamp basename. |
| 7885 | define_pretty_variable ('am__dirstamp', TRUE, INTERNAL, |
| 7886 | '$(am__leading_dot)dirstamp'); |
| 7887 | |
| 7888 | # Directory must be removed by 'make distclean'. |
| 7889 | $clean_files{$dirstamp} = DIST_CLEAN; |
| 7890 | |
| 7891 | $output_rules .= ("$dirstamp:\n" |
| 7892 | . "\t\@\$(MKDIR_P) $directory\n" |
| 7893 | . "\t\@: > $dirstamp\n"); |
| 7894 | |
| 7895 | return $dirstamp; |
| 7896 | } |
| 7897 | |
| 7898 | # require_build_directory_maybe ($FILE) |
| 7899 | # ------------------------------------- |
| 7900 | # If $FILE lies in a subdirectory, emit a rule to create this |
| 7901 | # directory and return the file that $FILE should be made |
| 7902 | # dependent upon. Otherwise, just return the empty string. |
| 7903 | sub require_build_directory_maybe |
| 7904 | { |
| 7905 | my $file = shift; |
| 7906 | my $directory = dirname ($file); |
| 7907 | |
| 7908 | if ($directory ne '.') |
| 7909 | { |
| 7910 | return require_build_directory ($directory); |
| 7911 | } |
| 7912 | else |
| 7913 | { |
| 7914 | return ''; |
| 7915 | } |
| 7916 | } |
| 7917 | |
| 7918 | ################################################################ |
| 7919 | |
| 7920 | # Push a list of files onto '@dist_common'. |
| 7921 | sub push_dist_common |
| 7922 | { |
| 7923 | prog_error "push_dist_common run after handle_dist" |
| 7924 | if $handle_dist_run; |
| 7925 | push @dist_common, @_; |
| 7926 | } |
| 7927 | |
| 7928 | |
| 7929 | ################################################################ |
| 7930 | |
| 7931 | # generate_makefile ($MAKEFILE_AM, $MAKEFILE_IN) |
| 7932 | # ---------------------------------------------- |
| 7933 | # Generate a Makefile.in given the name of the corresponding Makefile and |
| 7934 | # the name of the file output by config.status. |
| 7935 | sub generate_makefile |
| 7936 | { |
| 7937 | my ($makefile_am, $makefile_in) = @_; |
| 7938 | |
| 7939 | # Reset all the Makefile.am related variables. |
| 7940 | initialize_per_input; |
| 7941 | |
| 7942 | # AUTOMAKE_OPTIONS can contains -W flags to disable or enable |
| 7943 | # warnings for this file. So hold any warning issued before |
| 7944 | # we have processed AUTOMAKE_OPTIONS. |
| 7945 | buffer_messages ('warning'); |
| 7946 | |
| 7947 | # $OUTPUT is encoded. If it contains a ":" then the first element |
| 7948 | # is the real output file, and all remaining elements are input |
| 7949 | # files. We don't scan or otherwise deal with these input files, |
| 7950 | # other than to mark them as dependencies. See the subroutine |
| 7951 | # 'scan_autoconf_files' for details. |
| 7952 | my ($makefile, @inputs) = split (/:/, $output_files{$makefile_in}); |
| 7953 | |
| 7954 | $relative_dir = dirname ($makefile); |
| 7955 | |
| 7956 | read_main_am_file ($makefile_am, $makefile_in); |
| 7957 | if (not handle_options) |
| 7958 | { |
| 7959 | # Process buffered warnings. |
| 7960 | flush_messages; |
| 7961 | # Fatal error. Just return, so we can continue with next file. |
| 7962 | return; |
| 7963 | } |
| 7964 | # Process buffered warnings. |
| 7965 | flush_messages; |
| 7966 | |
| 7967 | # There are a few install-related variables that you should not define. |
| 7968 | foreach my $var ('PRE_INSTALL', 'POST_INSTALL', 'NORMAL_INSTALL') |
| 7969 | { |
| 7970 | my $v = var $var; |
| 7971 | if ($v) |
| 7972 | { |
| 7973 | my $def = $v->def (TRUE); |
| 7974 | prog_error "$var not defined in condition TRUE" |
| 7975 | unless $def; |
| 7976 | reject_var $var, "'$var' should not be defined" |
| 7977 | if $def->owner != VAR_AUTOMAKE; |
| 7978 | } |
| 7979 | } |
| 7980 | |
| 7981 | # Catch some obsolete variables. |
| 7982 | msg_var ('obsolete', 'INCLUDES', |
| 7983 | "'INCLUDES' is the old name for 'AM_CPPFLAGS' (or '*_CPPFLAGS')") |
| 7984 | if var ('INCLUDES'); |
| 7985 | |
| 7986 | # Must do this after reading .am file. |
| 7987 | define_variable ('subdir', $relative_dir, INTERNAL); |
| 7988 | |
| 7989 | # If DIST_SUBDIRS is defined, make sure SUBDIRS is, so that |
| 7990 | # recursive rules are enabled. |
| 7991 | define_pretty_variable ('SUBDIRS', TRUE, INTERNAL, '') |
| 7992 | if var 'DIST_SUBDIRS' && ! var 'SUBDIRS'; |
| 7993 | |
| 7994 | # Check first, because we might modify some state. |
| 7995 | check_gnu_standards; |
| 7996 | check_gnits_standards; |
| 7997 | |
| 7998 | handle_configure ($makefile_am, $makefile_in, $makefile, @inputs); |
| 7999 | handle_gettext; |
| 8000 | |
| 8001 | handle_targets; |
| 8002 | handle_libraries; |
| 8003 | handle_ltlibraries; |
| 8004 | handle_programs; |
| 8005 | handle_scripts; |
| 8006 | |
| 8007 | handle_silent; |
| 8008 | |
| 8009 | # These must be run after all the sources are scanned. They use |
| 8010 | # variables defined by handle_libraries(), handle_ltlibraries(), |
| 8011 | # or handle_programs(). |
| 8012 | handle_compile; |
| 8013 | handle_languages; |
| 8014 | handle_libtool; |
| 8015 | |
| 8016 | # Variables used by distdir.am and tags.am. |
| 8017 | define_pretty_variable ('SOURCES', TRUE, INTERNAL, @sources); |
| 8018 | if (! option 'no-dist') |
| 8019 | { |
| 8020 | define_pretty_variable ('DIST_SOURCES', TRUE, INTERNAL, @dist_sources); |
| 8021 | } |
| 8022 | |
| 8023 | handle_texinfo; |
| 8024 | handle_emacs_lisp; |
| 8025 | handle_python; |
| 8026 | handle_java; |
| 8027 | handle_man_pages; |
| 8028 | handle_data; |
| 8029 | handle_headers; |
| 8030 | handle_subdirs; |
| 8031 | handle_user_recursion; |
| 8032 | handle_tags; |
| 8033 | handle_minor_options; |
| 8034 | # Must come after handle_programs so that %known_programs is up-to-date. |
| 8035 | handle_tests; |
| 8036 | |
| 8037 | # This must come after most other rules. |
| 8038 | handle_dist; |
| 8039 | |
| 8040 | handle_footer; |
| 8041 | do_check_merge_target; |
| 8042 | handle_all ($makefile); |
| 8043 | |
| 8044 | # FIXME: Gross! |
| 8045 | my $have_lt1 = !!var("lib_LTLIBRARIES"); |
| 8046 | my $have_lt2 = !!var("nobase_lib_LTLIBRARIES"); |
| 8047 | for my $var (variables("PROGRAMS"), variables("LTLIBRARIES")) |
| 8048 | { |
| 8049 | if ($var->name eq "lib_LTLIBRARIES" |
| 8050 | || $var->name eq "nobase_lib_LTLIBRARIES" |
| 8051 | || substr($var->name, 0, 7) eq "noinst_") |
| 8052 | { |
| 8053 | next; |
| 8054 | } |
| 8055 | my $shortname = $var->name; |
| 8056 | $shortname =~ tr{_}{}d; |
| 8057 | if ($have_lt1) |
| 8058 | { |
| 8059 | $output_rules .= "install-$shortname: install-libLTLIBRARIES\n\n"; |
| 8060 | } |
| 8061 | if ($have_lt2) |
| 8062 | { |
| 8063 | $output_rules .= "install-$shortname: install-nobase_libLTLIBRARIES\n\n"; |
| 8064 | } |
| 8065 | } |
| 8066 | |
| 8067 | handle_install; |
| 8068 | handle_clean ($makefile); |
| 8069 | handle_factored_dependencies; |
| 8070 | |
| 8071 | # Comes last, because all the above procedures may have |
| 8072 | # defined or overridden variables. |
| 8073 | $output_vars .= output_variables; |
| 8074 | |
| 8075 | check_typos; |
| 8076 | |
| 8077 | if ($exit_code != 0) |
| 8078 | { |
| 8079 | verb "not writing $makefile_in because of earlier errors"; |
| 8080 | return; |
| 8081 | } |
| 8082 | |
| 8083 | my $am_relative_dir = dirname ($makefile_am); |
| 8084 | mkdir ($am_relative_dir, 0755) if ! -d $am_relative_dir; |
| 8085 | |
| 8086 | # We make sure that 'all:' is the first target. |
| 8087 | my $output = |
| 8088 | "$output_vars$output_all$output_header$output_rules$output_trailer"; |
| 8089 | |
| 8090 | # Decide whether we must update the output file or not. |
| 8091 | # We have to update in the following situations. |
| 8092 | # * $force_generation is set. |
| 8093 | # * any of the output dependencies is younger than the output |
| 8094 | # * the contents of the output is different (this can happen |
| 8095 | # if the project has been populated with a file listed in |
| 8096 | # @common_files since the last run). |
| 8097 | # Output's dependencies are split in two sets: |
| 8098 | # * dependencies which are also configure dependencies |
| 8099 | # These do not change between each Makefile.am |
| 8100 | # * other dependencies, specific to the Makefile.am being processed |
| 8101 | # (such as the Makefile.am itself, or any Makefile fragment |
| 8102 | # it includes). |
| 8103 | my $timestamp = mtime $makefile_in; |
| 8104 | if (! $force_generation |
| 8105 | && $configure_deps_greatest_timestamp < $timestamp |
| 8106 | && $output_deps_greatest_timestamp < $timestamp |
| 8107 | && $output eq contents ($makefile_in)) |
| 8108 | { |
| 8109 | verb "$makefile_in unchanged"; |
| 8110 | # No need to update. |
| 8111 | return; |
| 8112 | } |
| 8113 | |
| 8114 | if (-e $makefile_in) |
| 8115 | { |
| 8116 | unlink ($makefile_in) |
| 8117 | or fatal "cannot remove $makefile_in: $!"; |
| 8118 | } |
| 8119 | |
| 8120 | my $gm_file = new Automake::XFile "> $makefile_in"; |
| 8121 | verb "creating $makefile_in"; |
| 8122 | print $gm_file $output; |
| 8123 | } |
| 8124 | |
| 8125 | |
| 8126 | ################################################################ |
| 8127 | |
| 8128 | |
| 8129 | # Helper function for usage(). |
| 8130 | sub print_autodist_files |
| 8131 | { |
| 8132 | my @lcomm = uniq (sort @_); |
| 8133 | |
| 8134 | my @four; |
| 8135 | format USAGE_FORMAT = |
| 8136 | @<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<< |
| 8137 | $four[0], $four[1], $four[2], $four[3] |
| 8138 | . |
| 8139 | local $~ = "USAGE_FORMAT"; |
| 8140 | |
| 8141 | my $cols = 4; |
| 8142 | my $rows = int(@lcomm / $cols); |
| 8143 | my $rest = @lcomm % $cols; |
| 8144 | |
| 8145 | if ($rest) |
| 8146 | { |
| 8147 | $rows++; |
| 8148 | } |
| 8149 | else |
| 8150 | { |
| 8151 | $rest = $cols; |
| 8152 | } |
| 8153 | |
| 8154 | for (my $y = 0; $y < $rows; $y++) |
| 8155 | { |
| 8156 | @four = ("", "", "", ""); |
| 8157 | for (my $x = 0; $x < $cols; $x++) |
| 8158 | { |
| 8159 | last if $y + 1 == $rows && $x == $rest; |
| 8160 | |
| 8161 | my $idx = (($x > $rest) |
| 8162 | ? ($rows * $rest + ($rows - 1) * ($x - $rest)) |
| 8163 | : ($rows * $x)); |
| 8164 | |
| 8165 | $idx += $y; |
| 8166 | $four[$x] = $lcomm[$idx]; |
| 8167 | } |
| 8168 | write; |
| 8169 | } |
| 8170 | } |
| 8171 | |
| 8172 | |
| 8173 | sub usage () |
| 8174 | { |
| 8175 | print "Usage: $0 [OPTION]... [Makefile]... |
| 8176 | |
| 8177 | Generate Makefile.in for configure from Makefile.am. |
| 8178 | |
| 8179 | Operation modes: |
| 8180 | --help print this help, then exit |
| 8181 | --version print version number, then exit |
| 8182 | -v, --verbose verbosely list files processed |
| 8183 | --no-force only update Makefile.in's that are out of date |
| 8184 | -W, --warnings=CATEGORY report the warnings falling in CATEGORY |
| 8185 | |
| 8186 | Dependency tracking: |
| 8187 | -i, --ignore-deps disable dependency tracking code |
| 8188 | --include-deps enable dependency tracking code |
| 8189 | |
| 8190 | Flavors: |
| 8191 | --foreign set strictness to foreign |
| 8192 | --gnits set strictness to gnits |
| 8193 | --gnu set strictness to gnu |
| 8194 | |
| 8195 | Library files: |
| 8196 | -a, --add-missing add missing standard files to package |
| 8197 | --libdir=DIR set directory storing library files |
| 8198 | --print-libdir print directory storing library files |
| 8199 | -c, --copy with -a, copy missing files (default is symlink) |
| 8200 | -f, --force-missing force update of standard files |
| 8201 | |
| 8202 | "; |
| 8203 | print Automake::ChannelDefs::usage (), "\n"; |
| 8204 | |
| 8205 | print "\nFiles automatically distributed if found " . |
| 8206 | "(always):\n"; |
| 8207 | print_autodist_files @common_files; |
| 8208 | print "\nFiles automatically distributed if found " . |
| 8209 | "(as .md if needed):\n"; |
| 8210 | print_autodist_files (map { "${_}[.md]" } @toplevelmd_ok); |
| 8211 | print "\nFiles automatically distributed if found " . |
| 8212 | "(under certain conditions):\n"; |
| 8213 | print_autodist_files @common_sometimes, 'README-alpha[.md]'; |
| 8214 | |
| 8215 | print ' |
| 8216 | Report bugs to <bug-automake@gnu.org>. |
| 8217 | GNU Automake home page: <https://www.gnu.org/software/automake/>. |
| 8218 | General help using GNU software: <https://www.gnu.org/gethelp/>. |
| 8219 | '; |
| 8220 | |
| 8221 | # --help always returns 0 per GNU standards. |
| 8222 | exit 0; |
| 8223 | } |
| 8224 | |
| 8225 | |
| 8226 | sub version () |
| 8227 | { |
| 8228 | print <<EOF; |
| 8229 | automake (GNU $PACKAGE) $VERSION |
| 8230 | Copyright (C) $RELEASE_YEAR Free Software Foundation, Inc. |
| 8231 | License GPLv2+: GNU GPL version 2 or later <https://gnu.org/licenses/gpl-2.0.html> |
| 8232 | This is free software: you are free to change and redistribute it. |
| 8233 | There is NO WARRANTY, to the extent permitted by law. |
| 8234 | |
| 8235 | Written by Tom Tromey <tromey\@redhat.com> |
| 8236 | and Alexandre Duret-Lutz <adl\@gnu.org>. |
| 8237 | EOF |
| 8238 | # --version always returns 0 per GNU standards. |
| 8239 | exit 0; |
| 8240 | } |
| 8241 | |
| 8242 | ################################################################ |
| 8243 | |
| 8244 | # Parse command line. |
| 8245 | sub parse_arguments () |
| 8246 | { |
| 8247 | my $strict = 'gnu'; |
| 8248 | my $ignore_deps = 0; |
| 8249 | my @warnings = (); |
| 8250 | |
| 8251 | my %cli_options = |
| 8252 | ( |
| 8253 | 'version' => \&version, |
| 8254 | 'help' => \&usage, |
| 8255 | 'libdir=s' => \$libdir, |
| 8256 | 'print-libdir' => sub { print "$libdir\n"; exit 0; }, |
| 8257 | 'gnu' => sub { $strict = 'gnu'; }, |
| 8258 | 'gnits' => sub { $strict = 'gnits'; }, |
| 8259 | 'foreign' => sub { $strict = 'foreign'; }, |
| 8260 | 'include-deps' => sub { $ignore_deps = 0; }, |
| 8261 | 'i|ignore-deps' => sub { $ignore_deps = 1; }, |
| 8262 | 'no-force' => sub { $force_generation = 0; }, |
| 8263 | 'f|force-missing' => \$force_missing, |
| 8264 | 'a|add-missing' => \$add_missing, |
| 8265 | 'c|copy' => \$copy_missing, |
| 8266 | 'v|verbose' => sub { setup_channel 'verb', silent => 0; }, |
| 8267 | 'W|warnings=s' => \@warnings, |
| 8268 | ); |
| 8269 | |
| 8270 | use Automake::Getopt (); |
| 8271 | Automake::Getopt::parse_options %cli_options; |
| 8272 | |
| 8273 | set_strictness ($strict); |
| 8274 | my $cli_where = new Automake::Location; |
| 8275 | set_global_option ('no-dependencies', $cli_where) if $ignore_deps; |
| 8276 | parse_warnings @warnings; |
| 8277 | |
| 8278 | return unless @ARGV; |
| 8279 | |
| 8280 | my $errspec = 0; |
| 8281 | foreach my $arg (@ARGV) |
| 8282 | { |
| 8283 | fatal ("empty argument\nTry '$0 --help' for more information") |
| 8284 | if ($arg eq ''); |
| 8285 | |
| 8286 | # Handle $local:$input syntax. |
| 8287 | my ($local, @rest) = split (/:/, $arg); |
| 8288 | @rest = ("$local.in",) unless @rest; |
| 8289 | my $input = locate_am @rest; |
| 8290 | if ($input) |
| 8291 | { |
| 8292 | push @input_files, $input; |
| 8293 | $output_files{$input} = join (':', ($local, @rest)); |
| 8294 | } |
| 8295 | else |
| 8296 | { |
| 8297 | error "no Automake input file found for '$arg'"; |
| 8298 | $errspec = 1; |
| 8299 | } |
| 8300 | } |
| 8301 | fatal "no input file found among supplied arguments" |
| 8302 | if $errspec && ! @input_files; |
| 8303 | } |
| 8304 | |
| 8305 | |
| 8306 | # handle_makefile ($MAKEFILE) |
| 8307 | # --------------------------- |
| 8308 | sub handle_makefile |
| 8309 | { |
| 8310 | my ($file) = @_; |
| 8311 | ($am_file = $file) =~ s/\.in$//; |
| 8312 | if (! -f ($am_file . '.am')) |
| 8313 | { |
| 8314 | error "'$am_file.am' does not exist"; |
| 8315 | } |
| 8316 | else |
| 8317 | { |
| 8318 | # Any warning setting now local to this Makefile.am. |
| 8319 | dup_channel_setup; |
| 8320 | |
| 8321 | generate_makefile ($am_file . '.am', $file); |
| 8322 | |
| 8323 | # Back out any warning setting. |
| 8324 | drop_channel_setup; |
| 8325 | } |
| 8326 | } |
| 8327 | |
| 8328 | # Deal with all makefiles, without threads. |
| 8329 | sub handle_makefiles_serial () |
| 8330 | { |
| 8331 | foreach my $file (@input_files) |
| 8332 | { |
| 8333 | handle_makefile ($file); |
| 8334 | } |
| 8335 | } |
| 8336 | |
| 8337 | # Logic for deciding how many worker threads to use. |
| 8338 | sub get_number_of_threads () |
| 8339 | { |
| 8340 | my $nthreads = $ENV{'AUTOMAKE_JOBS'} || 0; |
| 8341 | |
| 8342 | $nthreads = 0 |
| 8343 | unless $nthreads =~ /^[0-9]+$/; |
| 8344 | |
| 8345 | # It doesn't make sense to use more threads than makefiles, |
| 8346 | my $max_threads = @input_files; |
| 8347 | |
| 8348 | if ($nthreads > $max_threads) |
| 8349 | { |
| 8350 | $nthreads = $max_threads; |
| 8351 | } |
| 8352 | return $nthreads; |
| 8353 | } |
| 8354 | |
| 8355 | # handle_makefiles_threaded ($NTHREADS) |
| 8356 | # ------------------------------------- |
| 8357 | # Deal with all makefiles, using threads. The general strategy is to |
| 8358 | # spawn NTHREADS worker threads, dispatch makefiles to them, and let the |
| 8359 | # worker threads push back everything that needs serialization: |
| 8360 | # * warning and (normal) error messages, for stable stderr output |
| 8361 | # order and content (avoiding duplicates, for example), |
| 8362 | # * races when installing aux files (and respective messages), |
| 8363 | # * races when collecting aux files for distribution. |
| 8364 | # |
| 8365 | # The latter requires that the makefile that deals with the aux dir |
| 8366 | # files be handled last, done by the master thread. |
| 8367 | sub handle_makefiles_threaded |
| 8368 | { |
| 8369 | my ($nthreads) = @_; |
| 8370 | |
| 8371 | # The file queue distributes all makefiles, the message queues |
| 8372 | # collect all serializations needed for respective files. |
| 8373 | my $file_queue = Thread::Queue->new; |
| 8374 | my %msg_queues; |
| 8375 | foreach my $file (@input_files) |
| 8376 | { |
| 8377 | $msg_queues{$file} = Thread::Queue->new; |
| 8378 | } |
| 8379 | |
| 8380 | verb "spawning $nthreads worker threads"; |
| 8381 | my @threads = (1 .. $nthreads); |
| 8382 | foreach my $t (@threads) |
| 8383 | { |
| 8384 | $t = threads->new (sub |
| 8385 | { |
| 8386 | while (my $file = $file_queue->dequeue) |
| 8387 | { |
| 8388 | verb "handling $file"; |
| 8389 | my $queue = $msg_queues{$file}; |
| 8390 | setup_channel_queue ($queue, QUEUE_MESSAGE); |
| 8391 | $required_conf_file_queue = $queue; |
| 8392 | handle_makefile ($file); |
| 8393 | $queue->enqueue (undef); |
| 8394 | setup_channel_queue (undef, undef); |
| 8395 | $required_conf_file_queue = undef; |
| 8396 | } |
| 8397 | return $exit_code; |
| 8398 | }); |
| 8399 | } |
| 8400 | |
| 8401 | # Queue all makefiles. |
| 8402 | verb "queuing " . @input_files . " input files"; |
| 8403 | $file_queue->enqueue (@input_files, (undef) x @threads); |
| 8404 | |
| 8405 | # Collect and process serializations. |
| 8406 | foreach my $file (@input_files) |
| 8407 | { |
| 8408 | verb "dequeuing messages for " . $file; |
| 8409 | reset_local_duplicates (); |
| 8410 | my $queue = $msg_queues{$file}; |
| 8411 | while (my $key = $queue->dequeue) |
| 8412 | { |
| 8413 | if ($key eq QUEUE_MESSAGE) |
| 8414 | { |
| 8415 | pop_channel_queue ($queue); |
| 8416 | } |
| 8417 | elsif ($key eq QUEUE_CONF_FILE) |
| 8418 | { |
| 8419 | require_queued_file_check_or_copy ($queue); |
| 8420 | } |
| 8421 | else |
| 8422 | { |
| 8423 | prog_error "unexpected key $key"; |
| 8424 | } |
| 8425 | } |
| 8426 | } |
| 8427 | |
| 8428 | foreach my $t (@threads) |
| 8429 | { |
| 8430 | my @exit_thread = $t->join; |
| 8431 | $exit_code = $exit_thread[0] |
| 8432 | if ($exit_thread[0] > $exit_code); |
| 8433 | } |
| 8434 | } |
| 8435 | |
| 8436 | ################################################################ |
| 8437 | |
| 8438 | # Parse the WARNINGS environment variable. |
| 8439 | parse_WARNINGS; |
| 8440 | |
| 8441 | # Parse command line. |
| 8442 | parse_arguments; |
| 8443 | |
| 8444 | $configure_ac = require_configure_ac; |
| 8445 | |
| 8446 | # Do configure.ac scan only once. |
| 8447 | scan_autoconf_files; |
| 8448 | |
| 8449 | if (! @input_files) |
| 8450 | { |
| 8451 | my $msg = ''; |
| 8452 | $msg = "\nDid you forget AC_CONFIG_FILES([Makefile]) in $configure_ac?" |
| 8453 | if -f 'Makefile.am'; |
| 8454 | fatal ("no 'Makefile.am' found for any configure output$msg"); |
| 8455 | } |
| 8456 | |
| 8457 | my $nthreads = get_number_of_threads (); |
| 8458 | |
| 8459 | if ($perl_threads && $nthreads >= 1) |
| 8460 | { |
| 8461 | handle_makefiles_threaded ($nthreads); |
| 8462 | } |
| 8463 | else |
| 8464 | { |
| 8465 | handle_makefiles_serial (); |
| 8466 | } |
| 8467 | |
| 8468 | exit $exit_code; |