summaryrefslogtreecommitdiff
path: root/src/implicit.c
Commit message (Collapse)AuthorAgeFilesLines
* Clean up expand.cPaul Smith2023-03-261-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | Clarify the naming and documentation on functions in src/expand.c: - variable_expand -> expand_string - variable_expand_string -> expand_string_buf - variable_expand_for_file -> expand_string_for_file - allocated_variable_expand -> allocated_expand_string - allocated_variable_expand_for_file -> allocated_expand_string_for_file Change all callers to use the new names. * src/variable.h: Rename the functions and macros. * src/expand.c: Ditto. * src/file.c: Use the new function names. * src/function.c: Ditto. * src/implicit.c: Ditto. * src/job.c: Ditto. * src/loadapi.c: Ditto. * src/main.c: Ditto. * src/read.c: Ditto. * src/remake.c: Ditto. * src/variable.c: Ditto. * src/vpath.c: Ditto. * src/w32/subproc/sub_proc.c: Ditto.
* Rename VMS macro to MK_OS_VMSPaul Smith2023-01-151-2/+2
| | | | | | * src/makeint.h: Set MK_OS_VMS to 1 if we're on VMS. * src/*: Convert all #if references to VMS, to use MK_OS_VMS. * gl/lib/*: Ditto.
* Clean up depth handling in debug outputPaul Smith2023-02-191-1/+5
| | | | | | | | | | | | | | The indentation shown in debug output was misleading. Increment the depth when we are working on a prerequisite, not for the current target. * src/remake.c (check_dep): Increment depth only on recursion. (update_file_1): Ditto. Don't show "Finished..." if prereqs are still running. * src/implicit.c (pattern_search): Increment depth for the entire search. * tests/scripts/features/output-sync: Support debug output when run by hand.
* Update the copyright year on all filesPaul Smith2023-01-011-1/+1
|
* [SV 63417] Ensure global .NOTINTERMEDIATE disables all intermediatesDmitry Goncharov2022-11-281-3/+3
| | | | | | | | | | | | | | | | | Fix .NOTINTERMEDIATE without prerequisites to disable intermediate status for all targets. * src/makeint.h: Declare extern no_intermediates. * src/main.c: Add global definition of no_intermediates. * src/file.c: Remove static no_intermediates to use global variable. (remove_intermediates): Check no_intermediates. * src/implicit.c (pattern_search): For a file found by implicit search set file->notintermediate if no_intermediates is set. * src/remake.c (update_file_1): Don't set file->secondary for a pre-existing file if no_intermediates is set. The check for no_intermediates here is redundant, but won't hurt: keep it in case things change so that it matters. * tests/scripts/targets/NOTINTERMEDIATE: Fix a test.
* Update URLs to use https rather than httpPaul Smith2022-10-181-1/+1
| | | | | * (all): Change http:// to https:// * README.W32: Remove invalid link to mingw.org.
* Avoid compilation warningsEli Zaretskii2022-09-241-0/+2
| | | | | | * src/implicit.c: (pattern_search): * src/main.c: (main): Avoid compilation warnings for variables only used when compiling a debug version with assertions.
* [SV 12078, SV 62809] Rebuild grouped targets if any is missingPaul Smith2022-09-201-3/+3
| | | | | | | | | | | | | | | | | | | If any of a set of grouped targets is missing or out of date, even if make is not trying to build that target, rebuild them all. Ensure this is true for explicit grouped targets as well as pattern rule grouped targets. Original patch by Jonathan Gravel <jo@stashed.dev> * src/remake.c (update_file_1): After matching any pattern rules, go through the also_make targets and set noexist as needed. Also compute the oldest this_mtime. * tests/scripts/features/grouped_targets: Add regression tests. * tests/scripts/features/patternrules: Ditto. * tests/features/vpath: Rewrite to use modern run_make_test(). Add a test that we check for VPATH before implicit rule search. Move the tests in vpath2 and vpath3 into this suite. * tests/features/vpathplus: Rewrite to use modern run_make_test().
* [SV 13862] Implement the .WAIT special targetPaul Smith2022-09-121-2/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The next version of the POSIX standard defines parallel execution and requires the .WAIT special target as is implemented in some other versions of make. This implementation behaves similarly to others in that it does not create a relationship between targets in the dependency graph, so that the same two targets may be run in parallel if they appear as prerequisites elsewhere without .WAIT between them. Now that we support .WAIT it's trivial to also support prerequisites of the .NOTPARALLEL special target, which forces the prerequisites of those targets to be run serially (as if .WAIT was specified between each one). * NEWS: Announce the new .WAIT and .NOTPARALLEL support. * doc/make.texi (Parallel Disable): A new section to discuss ways in which parallel execution can be controlled. Modify cross-refs to refer to this section. * src/dep.h (struct dep): Add a new wait_here boolean. (parse_file_seq): Add PARSEFS_WAIT to check for .WAIT dependencies. * src/file.c (split_prereqs): Use PARSEFS_WAIT. (snap_deps): If .NOTPARALLEL has prerequisites, set .WAIT between each of _their_ prerequisites. (print_prereqs): Add back in .WAIT when printing prerequisites. * src/implicit.c (struct patdeps): Preserve wait_here. (pattern_search): Ditto. Use PARSEFS_WAIT when parsing prereqs for pattern rule expansion. * src/read.c (check_specials): Don't give up early: remembering to update these options is not worth the rare speedup. (check_special_file): If .WAIT is given as a target show an error-- once--if it has prereqs or commands. (record_files): Call check_special_file on each target. (parse_file_seq): If PARSEFS_WAIT is given, look for .WAIT prereqs. If we see one assume that we are building a struct dep chain and set the wait_here option while not putting it into the list. * src/remake.c (update_file_1): If wait_here is set and we are still running, then stop trying to build this target's prerequisites. * src/rule.c (get_rule_defn): Add .WAIT to the prerequisite list. * src/shuffle.c (shuffle_deps): Don't shuffle the prerequisite list if .WAIT appears anywhere in it. * tests/scripts/targets/WAIT: Add a test suite for this feature.
* Take advantage of mempcpy() and stpcpy()Paul Smith2022-07-301-19/+9
| | | | | | | | | | | | | | | | | | | | | | | * src/makeint.h (stpcpy): Add missing declaration. * src/amiga.c (MyExecute): Avoid extra strlen using stpcpy. * src/function.c (func_shell_base): Ditto. (func_error): Use memcpy() not strcpy() when we know the length. * src/job.c (construct_command_argv_internal): Use stpcpy(). * src/main.c (main): Ditto. (define_makeflags): Ditto. * src/variable.c (print_target_variables): Use memcpy() when we know the length. * src/commands.c (set_file_variables): Use mempcpy(). * src/expand.c (variable_buffer_output): Ditto. * src/file.c (expand_deps): Ditto. * src/function.c (abspath): Ditto. (handle_function): Ditto. * src/implicit.c (pattern_search): Ditto. * src/job.c (construct_command_argv_internal): Use mempcpy() and don't add multiple spaces when there are no shell flags. * src/main.c (decode_env_switches): Use mempcpy() to simplify. (define_makeflags): Ditto. * src/variable.c (selective_vpath_search): Ditto.
* [SV 62100] Add '--shuffle' option supportSergei Trofimovich2022-06-041-0/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Introduce non-deterministic ordering into goal and prerequisite traversal to help tease out inconsistent failures that may happen when running in parallel build mode. Introduce second order into each dependency chain: 1. Existing order is syntactic order reachable via 'dep->next' 2. New order is shuffled order stored as 'dep->shuf' in each 'dep' When updating goals and prerequisites and '--shuffle' is provided, use the shuffled order to walk the graph. When automatic variable are set always use the syntactic order of parameters. * Makefile.am: Add new src/shuffle.c and src/shuffle.h file. * build_w32.bat: Ditto. * builddos.bat: Ditto. * makefile.com: Ditto. * po/POTFILES.in: Ditto. * doc/make.texi: Add documentation for --shuffle. * doc/make.1: Ditto. * src/dep.h (DEP): Add the shuf pointer. * src/filedef.h (struct file): Add was_shuffled flag. * src/main.c: (shuffle_mode): Global flag for the shuffle mode. (usage): Add the --shuffle option. (switches): Ditto. (main): Set shuffle_mode based on the command line parameter. Reshuffle prerequisites if requested. * src/remake.c (update_goal_chain): Walk the shuffled list if enabled. (update_file_1): Ditto. * src/shuffle.h: Provide an interface for shuffling prerequisites. * src/shuffle.c: Implement option parsing and prerequisite shuffling. * tests/scripts/options/shuffle: Test shuffle option and modes.
* [SV 62206] Fix %-substitution in second expansion of pattern rulesDmitry Goncharov2022-04-241-19/+51
| | | | | | | | | | | | | | | | | | | | | | | | During second expansion of pattern rules only the first pattern in each "group" was being substituted. E.g. in this makefile: .SECONDEXPANSION: all: hello.x %.x: $$(wordlist 1, 99, %.1 %.%.2) ; $(info $@ from $^) hello.1 hello.\%.2 \%.1 \%.\%.2: ; the output would build "hello.1" and "%.%.2" because each function is considered a single "word" and only the first pattern is replaced. Fix the expansion so each whitespace-separated string is considered a word and the first pattern is replaced, giving "hello.1" and "hello.%.2". * src/rule.c (snap_implicit_rules): Keep enough space to replace % with $(*F) if necessary. * src/implicit.c (pattern_search): During second expansion break each get_next_word result into individual words and replace the first % in each with $* or $(*F) as needed. * tests/scripts/features/patternrules: Add tests for variations.
* [SV 62324] Simplify set_file_variables by passing in the stemDmitry Goncharov2022-04-241-10/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | Previously we always used the file->stem value as our stem in set_file_variables(); when that wasn't correct we had to temporarily set that value while the function was called, then reset it afterward. This led to issues (for example when we assumed the stem was a cached string but it wasn't). Avoid this by passing in the stem as an argument so that different values can be provided. Add tests to verify this. * src/commands.c (set_file_variables): Take second parameter stem to relieve the callers of set_file_variables() from setting/restoring file->stem. * src/commands.h (set_file_variables): Ditto. (execute_file_commands): Pass file->stem to set_file_variables(). * src/file.c (expand_deps): Pass d->stem to set_file_variables() and remove set and restore of file->stem. * src/implicit.c (pattern_search): Pass stem to set_file_variables() and remove set and restore of file->stem. * tests/scripts/features/se_explicit: Add new tests. * tests/scripts/features/se_implicit: Ditto. * tests/scripts/features/se_statpat: Ditto. * tests/scripts/variables/automatic: Ditto.
* * <all>: Update copyright notices.Paul Smith2022-02-101-1/+1
|
* [SV 48643] Make prereqs mentioned in unrelated rules explicitDmitry Goncharov2022-02-061-0/+3
| | | | | * src/implicit.c (pattern_search): Set is_explicit when a prereq is mentioned in an unrelated rule.
* * src/implicit.c (pattern_search): [SV 61864] Fix debug output.Dmitry Goncharov2022-02-061-1/+1
|
* * src/implicit.c (pattern_search): Use const ptrs when possible.Paul Smith2022-02-061-10/+12
| | | | Change suggested by Joe Filion <joefilion4@gmail.com>
* [SV 61226] Revert changes to detect missing included filesPaul Smith2022-01-171-1/+1
| | | | | | | | | | | | | | | | | The fix for SV 60595 introduced a backward-incompatibility: rules that purported to rebuild included files, but didn't actually do so, were treated as errors whereas before they were ignored. This breaks a common idiom in makefiles where an empty recipe is created for an included makefile so make doesn't complain if it doesn't exist. Unfortunately this means make cannot diagnose some types of errors. Extra tests supplied by Dmitry Goncharov <dgoncharov@users.sf.net>. * doc/make.texi (Including Other Makefiles): Clarify this behavior. * src/main.c (main): Don't run the new check-for-errors behavior. * tests/scripts/features/reinvoke: Reset tests of the "old" behavior and add new tests for this situation.
* Do not force targets to be SECONDARYPaul Smith2021-12-291-8/+3
| | | | | | | | | | | | | In SV 43677 we forced targets to be secondary if we found an intermediate file that was listed as a prerequisite of another target. This overrides .INTERMEDIATE settings, so doesn't work. Now that we have an is_explicit flag in targets, use that instead. * src/implicit.c (pattern_search): Remove setting of secondary. Preserve the value of the is_explicit flag when creating a new file target, and consider it when setting the intermediate flag. * tests/scripts/features/patternrules: Add a test w/out INTERMEDIATE * tests/scripts/targets/INTERMEDIATE: Add a test with INTERMEDIATE
* [SV 48643] Preserve target-specific variables on intermediate filesDmitry Goncharov2021-12-291-1/+5
| | | | | | | | | | | | Target-specific variables used to define the target as "ought to exist" so they could never be intermediate. Now they can be, so merge the target-specific variables from the intermediate target so they're not lost. * src/implicit.c (pattern_search): Use merge_variable_set_lists to merge target-specific variables. * tests/scripts/features/implicit_search: Add tests of target- specific variable assignments and implicit rules.
* * src/implicit.c (pattern_search): Fix text for easier translation.Paul Smith2021-11-271-2/+3
|
* [SV 48643] Enhance "ought to exist" definitionDmitry Goncharov2021-11-271-27/+78
| | | | | | | | | | | | | | | | | | | | | | The traditional definition of "ought to exist" in the user's manual can lead to make choosing a poor series of chained implicit rules. Modify that rule so that we first attempt to resolve implicit rules by considering targets which are only (a) targets or (b) explicit prerequisites of the current target. For backward-compatibility, if we don't find a solution using that algorithm use the previous definition where "ought to exist" means "mentioned as a prerequisite of any target". * src/implicit.c (pattern_search): An extra argument controls whether to perform the backward-compatible rule search or not. If a prereq is a target, or if it's a prerequisite of THIS target, then choose it. If we get to the end and haven't found a match, but we have found a potential compatibility rule, then retry with compat rules enabled. If we're searching with compat rules enabled and we find a file mentioned as a prerequisite of ANY target, then use it. * tests/features/implicit_search: Provide a large suite of tests for different steps of implicit rule search.
* [SV 61042] Enhance logging of implicit rule searchDmitry Goncharov2021-10-181-39/+67
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Logging of implicit rule search gives limited information as to why a given implicit rule was rejected, and if no implicit rule is found we get the confusing "No rule to make target" result when the real issue is that some prerequisite of some implicit rule could not be built. Enhance logging around implicit rule search as follows: 1. The messages which refer to a rule print a description (the targets and prerequisites) of the rule. 2. A new message tells when a rule is rejected, along with the reason. 3. The 'Looking for an implicit rule...' message is printed for every prerequisite, not just the top-level target. 4. "Trying harder" message is printed, when intermediate prerequisites are going to be searched. 5. The 'No rule found...' and 'Found implicit rule...' messages are printed for every prerequisite, not just the top-level target. 6. "Ought to exist...", "Found..." or "Not found..." message is printed for each prerequisite. * src/rule.h (struct rule): Remember the definition of the rule. * src/rule.c (get_rule_defn): Compute the definition of a rule. (install_pattern_rule): Initialize the definition to empty. (create_pattern_rule): Ditto. (freerule): Free the definition. (print_rule): Use the definition when printing rules. * src/remake.c (update_file_1): Push debug output down into try_implicit_rule(). * src/implicit.c (try_implicit_rule): Add debugging (pattern_search): Show the rule definition in various debug output. Add new debug messages for implicit rule search. Additional changes by Paul Smith <psmith@gnu.org>: Since we usually don't need the rule definition, defer computing it until we do. * bootstrap.conf: Include the mempcpy Gnulib module. * src/makeint.h (mempcpy): Declare mempcpy if not available. * src/misc.c (mempcpy): Define mempcpy if not available. * src/config.h-vms.template: Don't set HAVE_MEMPCPY. * src/config.h.W32.template: Ditto. * src/rule.h (get_rule_defn): Return the definition of a rule. * src/rule.c (get_rule_defn): If we don't have a definition compute it; either way return it. * src/implicit.c (pattern_search): Rework the handling of explicit prerequisites to pattern rules to be more clear. There is no change in behavior.
* [SV 60435] Ensure intermediate grouped files are removedDmitry Goncharov2021-09-071-2/+9
| | | | | | | | | | | | | | | | | | | | | | | | If multiple intermediate files are built together be sure all of them are removed after make is finished. Continue to ensure that targets that exist before make starts are not removed even if they appear to be intermediate. Add a number of tests to pattern rules to verify this behavior. * src/filedef.h (struct file): Add a new is_explicit bitfield. * src/file.c (rehash_file): Merge the is_explicit bit. (enter_prereqs): Set is_explicit if the file is explicitly mentioned. * src/implicit.c (pattern_search): Set intermediate on the file if it's not explicit. (record_files): Set is_explicit if a file is mentioned as a target. * src/remake.c (update_file_1): Set secondary on files that already exist so they won't be removed. * tests/scripts/features/double_colon: Add a test for double-colon pattern rules. * tests/scripts/features/patternrules: Update KGO for tests where more files are removed. Add new tests to verify handling removal of intermediate files in the context of grouped pattern targets.
* [SV 60297] Add .NOTINTERMEDIATE special targetDmitry Goncharov2021-07-251-6/+17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Support a new special target, .NOTINTERMEDIATE. Any file or pattern prerequisite of this target will never be considered intermediate. This differs from .SECONDARY in that .SECONDARY files won't be deleted but they will still not be built if they are missing. .NOTINTERMEDIATE files are treated the same way as a target which is explicitly mentioned in the makefile. This is mostly useful with patterns; obviously mentioning a target explicitly here is enough in and of itself to make something not intermediate. Some adjustments made by psmith@gnu.org * NEWS: Announce the new feature. * doc/make.texi (Special Targets): Document .NOTINTERMEDIATE. (Chained Rules): Describe how to use .NOTINTERMEDIATE. * src/main.c (main): Add "notintermediate" to the .FEATURES variable. * src/filedef.h (struct file): Add "notintermediate" flag. * src/file.c (no_intermediates): Mark global .NOTINTERMEDIATE. (snap_file): Support .NOTINTERMEDIATE special target. Throw an error if the same target is marked both .NOTINTERMEDIATE and .SECONDARY or .INTERMEDIATE. (rehash_file): Merge intermediate, notintermediate, secondary flags. (remove_intermediates): Check notintermediate flag before removing. (print_file): * src/implicit.c (pattern_search): Set notintermediate based on the pattern. * tests/scripts/targets/NOTINTERMEDIATE: Add a new test suite.
* [SV 60188] Explicit prereqs cannot be intermediate filesDmitry Goncharov2021-03-151-3/+14
| | | | | | | | | | | | | | | | | | If a prereq of a pattern is an explicit target, it should not be considered an intermediate file. (Minor tweaks by Paul Smith <psmith@gnu.org>) * src/dep.h (struct nameseq): Add is_explicit flag. * src/implicit.c (struct patdeps): Ditto. (pattern_search): Set the is_explicit flag appropriately for each prerequisite, based on whether it contained a pattern or not. Update the help output to note implicit vs. explicit prereqs. * tests/scripts/features/double_colon: Add tests. * tests/scripts/features/grouped_targets: Ditto. * tests/scripts/features/patternrules: Ditto. * tests/scripts/features/se_implicit: Ditto. * tests/scripts/features/statipattrules: Ditto.
* Update copyright statements for 2020Paul Smith2020-01-031-1/+1
|
* Support the .EXTRA_PREREQS special variablePaul Smith2020-01-031-0/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | Initial implementation by Christof Warlich <cwarlich@gmx.de> * NEWS: Announce the new feature. * doc/make.texi (Other Special Variables): Document .EXTRA_PREREQS. * src/dep.h (struct dep): New flag to note extra prereq deps. * src/filedef.h (expand_extra_prereqs): Declare a function to expand the value of .EXTRA_PREREQS. * src/file.c (expand_extra_prereqs): Given a struct variable lookup of .EXTRA_PREREQS, convert it into a list of deps and for each one make sure it has a struct file and has the new flag set. (snap_file): A new function invoked by hash_map that will perform per-file operations: set up second expansion, intermediate, and also .EXTRA_PREREQS. Manage circular dependencies by ignoring them. (snap_deps): Defer per-file operations until the end. Look up the global .EXTRA_PREREQS and pass it along to snap_file for each file. * src/implicit.c (struct patdeps): Remember the extra prereqs flag. (pattern_search): Transfer extra prereqs flag settings into the matched pattern rule. * src/rule.h (snap_implicit_rules): Rename count_implicit_rules to snap_implicit_rules since we now do more than count. * src/rule.c (snap_implicit_rules): As we walk through all the pattern rules, add in any global .EXTRA_PREREQS to the dep list. Ensure we take them into account for the max number of prereqs and name length. * src/main.c (main): Add extra-prereqs to .FEATURES. Call the renamed snap_implicit_rules. * tests/scripts/variables/EXTRA_PREREQS: Add tests.
* [SV 56655] Allow pattern expansion to contain spacesPaul Smith2019-12-261-1/+1
| | | | | | | | | * src/dep.h: Add a new flag PARSEFS_ONEWORD * src/read.c (parse_file_seq): If PARSEFS_ONEWORD is given, treat the entire incoming string as a single pattern. * src/implicit.c (pattern_search): Pass PARSEFS_ONEWORD when parsing patterns for wildcards. * tests/scripts/features/patternrules: Add a new test.
* [SV 54161] Fix second expansion of $* for pathsJouke Witteveen2019-12-181-17/+39
| | | | | | | | | | | | If the stem matches a path containing a directory not just a filename, make sure the second expansion of $* in the prerequisites matches $* in the recipe. This requires using $(*F) when replacing % in the first expansion to preserve the simple filename. * src/implicit.c (pattern_search): If lastslash is set prepend the directory onto the stem. Then use $(*F) when expanding %. * tests/scripts/features/se_implicit: Add a test case
* * src/implicit.c (pattern_search): Set lastslash correctlyJouke Witteveen2019-12-171-5/+3
| | | | | | If filename contained multiple slashes lastslash is wrongly set to 0. * configure.ac: Check for the GNU memrchr() extension function. * src/misc.c (memrchr): Supply memrchr() if not available.
* * src/implicit.c (pattern-search): Remove unneeded 'dir' variableJouke Witteveen2019-12-171-12/+6
|
* Update copyright statements for 2019Paul Smith2019-05-191-1/+1
|
* Resolve most of the Windows Visual Studio warnings.Paul Smith2018-07-021-14/+14
| | | | | * Convert integer types to size_t where necessary. * Align other integral types to avoid casts and type warnings.
* * all: Update Copyright statements for 2018Paul Smith2018-07-011-1/+1
|
* Rework directory structure to use GNU-recommended "src" directory.Paul Smith2017-11-191-0/+999
Move the source code (other than glob) into the "src" subdirectory. Update all scripting and recommendations to support this change. * *.c, *.h, w32/*: Move to src/ * configure.ac, Makefile.am, maintMakefile: Locate new source files. * Basic.mk.template, mk/*: Update for new source file locations. * NEWS, README.DOS.template: Update for new locations. * build.template, build_w32.bat, builddos.bat: Ditto. * po/POTFILES.in: Ditto * tests/run_make_tests.pl, tests/scripts/features/load*: Ditto. * make.1: Move to doc. * mk/VMS.mk: Add support for building on VMS (hopefully). * makefile.vms, prepare_w32.bat: Remove. * SCOPTIONS: Update to define HAVE_CONFIG_H