summaryrefslogtreecommitdiff
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
...
* Create src/mkcustom.h which is included by config.hPaul Smith2023-01-086-39/+77
| | | | | | | | | | | | | | | | Put declarations for missing functions which we create in src/misc.c into a file which is included by config.h via AH_BOTTOM(). This ensures those prototypes are available, even in files added to lib/... from gnulib. * src/mkcustom.h: Add a new file with function declarations. * configure.ac: Include src/mkcustom.h in config.h with AH_BOTTOM() * Makefile.am: Add the header to the SRCS list. * src/makeint.h: Remove content that we added to src/mkcustom.h. * src/config.ami: Add #include "mkcustom.h" to specialized config.h. * src/config.h-vms: Ditto. * src/config.h.W32: Ditto. * src/configh.dos: Ditto.
* Include <strings.h> globallyPaul Smith2023-01-083-8/+4
| | | | | | | | | | Various code uses str{,n}casecmp() so include <strings.h>, if it exists, everywhere. * configure.ac: Check for <strings.h> explicitly. * src/makeint.h: Include it if HAVE_STRINGS_H, for str{,n}casecmp(). * src/job.c: Remove include of <strings.h>. * src/main.c: Ditto.
* [SV 63609] Avoid buffer overrun in --warn-undefined-variablesPaul Smith2023-01-031-8/+22
| | | | | | | | | Reported by Dmitry Goncharov <dgoncharov@users.sf.net> * src/variable.c (struct defined_vars): Create a struct that holds the name and length of each variable name. (warn_undefined): Check the lengths before comparing the contents. * tests/scripts/options/warn-undefined-variables: Add a test.
* [SV 14927] Allow parallel builds for archivesPaul Smith2023-01-031-4/+14
| | | | | | | | | | | | | | Compare the timestamp of the object file (if it exists) with the archived object and if the object file is newer, ensure it's updated in the archive. * NEWS: Announce the new capability. * doc/make.texi (Dangers When Using Archives): Explain how to enable parallel builds with archives. * src/remake.c (f_mtime): For archive element files check the mod time of the object file (if it exists) against the archive object (if it exists). * tests/scripts/features/archives: Add tests for this capability.
* [SV 61463] Don't export inherited private variablesPaul Smith2023-01-021-4/+11
| | | | | | | | | | | If a parent target has an exported variable that is private, don't export it in child targets. * NEWS: Mention this change. * src/variable.c (target_environment): Ignore private inherited variables. * tests/thelp.pl: Add a new "env" operation to show env.var. values. * tests/scripts/variables/private: Verify this new behavior.
* Update ancient glob/fnmatch implementationsPaul Smith2023-01-021-5/+5
| | | | | | | | | | | | | | | | | | | | | | | | I looked again at trying to use the latest gnulib implemenentations of GNU glob and fnmatch, and the effort required to extract them from gnulib and make them portable to systems which don't support configure is simply far too daunting for me. However it's clear that the previous implementations are growing too long on the tooth to continue to be used without some maintenance, so perform some upkeep on them. - Remove support for pre-ANSI function definitions. - Remove the obsolete "register" keyword. - Assume standard ISO C90/C99 header file support. - Assume standard ISO C "void" and "const" support. - Avoid symbols prefixed with "__" as they're reserved. * maintMakefile: Add a rule to verify lib has the latest content. * src/dir.c: Use void* not __ptr_t which was removed. * gl/lib/glob.c: See above. * gl/lib/fnmatch.in.h: See above. * gl/lib/glob.in.h: See above. * gl/lib/fnmatch.c: See above. Remove __strchrnul(): it is not checked anywhere and is only used in one place anyway.
* Don't free uninitialized hash_tablePaul Smith2023-01-011-42/+40
| | | | | | * src/dir.c (clear_directory_contents): We use ht_vec to mark when we have initialized the hash_table: don't free if it's NULL. (everywhere): Use NULL instead of 0 when working with pointers.
* Convert references from "GNU make" to "GNU Make"Paul Smith2023-01-0116-30/+30
|
* Update the copyright year on all filesPaul Smith2023-01-0171-72/+72
|
* Apply spelling fixes discovered by CodespellPaul Smith2022-12-315-5/+5
| | | | | | | | | | | | | | | | | | * maintMakefile: Apply spelling fixes. * src/file.c: Ditto. * src/misc.c: Ditto. * src/remake.c: Ditto. * src/vmsjobs.c: Ditto. * src/w32/pathstuff.c: Ditto. * tests/test_driver.pl: Ditto. * tests/run_make_tests.com: Ditto * tests/scripts/features/implicit_search: Ditto * tests/scripts/features/output-sync: Ditto * tests/scripts/features/patternrules: Ditto * tests/scripts/features/se_explicit: Ditto * tests/scripts/features/statipattrules: Ditto * tests/scripts/functions/foreach: Ditto * tests/scripts/variables/MAKEFLAGS: Ditto
* [SV 63439, SV 63452] Don't warn on undefined internal variablesPaul Smith2022-12-244-42/+32
| | | | | | | | | | | | | | | | | Don't generate undefined variable warnings for variables that are internal / special to make and where the empty string is valid. Rather than defining them to empty, which could introduce unwanted behavior, keep a list of variable names which we should never warn about. * src/variable.h (warn_undefined): Convert the macro to a function. * src/variable.c (defined_vars): Always "defined" variable names. (warn_undefined): Implement as a function and check against the defined_vars before generating a warning. * src/read.c (read_all_makefiles): No need to reset warning flag. * src/vpath.c (build_vpath_lists): Ditto. * tests/scripts/options/warn-undefined-variables: Expand all the pre-defined variables to ensure warnings are not generated.
* [SV 63552] Change directories before constructing include pathsPaul Smith2022-12-243-12/+22
| | | | | | | | | | | | | | * src/makeint.h (reset_makeflags): New function to handle changing MAKEFLAGS from within makefiles. Remove decode_env_switches(). * src/variable.c (set_special_var): Call reset_makeflags() instead of various internal methods. * src/main.c (decode_env_switches): Only internal now so make static. (decode_switches): Don't invoke construct_include_path() yet. (reset_makeflags): Decode env switches and construct include paths. (main): Construct include paths after we process -C options. * tests/scripts/options/dash-C: Rewrite to use new test constructs. Add a test using both -C and -I together. Add a test for multiple -C options.
* [WINDOWS32] Remove CRNL from FormatMessage() result stringPaul Smith2022-12-193-39/+39
| | | | | | | | | | | | | Sometimes the error message is expected to contain a newline, other times it is not. Also the result of FormatMessage() sometimes ends in CRNL already: when printed via fprintf() the final newline is converted to CRNL, giving an output of CRCRNL which causes tests to fail to match. Remove any CR/NL chars from the result string. * src/job.c (reap_children): Add \n to the error message fprintf. (exec_command): Ditto. * src/w32/subproc/w32err.c (map_windows32_error_to_string): Remove any trailing CR or NL from the string before returning.
* [SV 63537] Pass enabled-by-default switches to submakeDmitry Goncharov2022-12-181-44/+50
| | | | | | | | | | | Certain switches, such as -S or --no-silent, turn on behavior that is enabled by default. When a switch is specified via the command line, makefile, or env, ensure the switch is added to MAKEFLAGS. * src/main.c (struct command_switch): Add bit "specified". (switches): Initialize command_switch->specified. (decode_switches): Set command_switch->specified. (define_makeflags): Check command_switch->specified.
* [SV 63537] Remember the origin of command line optionsDmitry Goncharov2022-12-181-66/+101
| | | | | | | | | | | | | | | | | Certain options can be flipped on and off: -k/-S, -s/--no-silent, and -w/--no-print-directory. Ensure they behave as follows: 1. A switch can be enabled or disabled on the command line. 2. A switch can be enabled or disabled in env. 3. A switch can be enabled or disabled in makefile. 4. Command line beats env and makefile. 5. Env beats makefile. * src/main.c: Add variables to hold the origin of relevant options. (struct command_switch): Add origin field. (switches): Set a pointer to hold the origin of relevant options. (decode_switches): For any switch that can be specified in makefile or env, honor the switch only if cs->origin is not set or the specified origin beats cs->origin. Set cs->origin when relevant.
* [SV 63537] Fix setting -w in makefilesDmitry Goncharov2022-12-183-15/+22
| | | | | | | | * src/makeint.h: Replace print_directory flag with should_print_dir(). * src/main.c (main): Remove print_directory flag and related code. (should_print_dir): Create. * src/output.c (output_dump): Use should_print_dir(). (output_start): Ditto.
* [SV 63484] Force included makefiles to be explicitDmitry Goncharov2022-12-181-0/+1
| | | | | | | | | Ensure included makefiles are not treated as intermediate, even if they are created by an implicit rule. Reported by Patrick Oppenlander <patrick.oppenlander@gmail.com>. * src/read.c (eval_makefile): Mark makefiles as explicit. * tests/scripts/features/include: Add a test.
* [SV 63516] [DOS] Support include files with drivespecsPaul Smith2022-12-183-4/+20
| | | | | | | | | * src/makeint.h (HAVE_DRIVESPEC): Create a macro to check. * src/main.c (.FEATURES): Add "dospaths" as a feature. * src/read.c (eval_makefile) [DOS]: If the included makefile name starts with a drivespec, don't search the include directories. * doc/make.texi (Include): Document this behavior. * tests/scripts/features/include: Add a test.
* * src/job.c (new_job): [SV 63510] Trace phony prerequisite rebuildsPaul Smith2022-12-181-6/+45
|
* [SV 63417] Ensure global .NOTINTERMEDIATE disables all intermediatesDmitry Goncharov2022-11-285-9/+12
| | | | | | | | | | | | | | | | | 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.
* [SV 63347] Always add command line variable assignments to MAKEFLAGSDmitry Goncharov2022-11-283-75/+93
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This commit introduces two visible changes: 1. Keep command line variable assignments in MAKEFLAGS at all times, even while parsing makefiles. 2. Define makeflags immediately when a makefile modifies MAKEFLAGS. The new MAKEFLAGS and MAKEOVERRIDES initialization procedure: 1. decode_switches (argc, argv, o_command) is called to parse command line variable assignments. 2. Command line variable assignments go through quote_for_env. Initialize -*-command-variables-*- to the quoted values. 3. MAKEOVERRIDES is initialized to refer to -*-command-variables-*- with origin o_env to keep the definitions in the database intact. 4. define_makeflags() is called which adds MAKEOVERRIDES to MAKEFLAGS. 5. Makefiles are parsed. If a makefile modifies MAKEFLAGS, the new value of MAKEFLAGS is defined right away. 6. Env switches are decoded again as o_env. The definitions set by decode_switches at step 1 stay intact, as o_command beats o_env. We must preserve the original intact definitions in order to detect failure cases; for example: $ cat makefile all:; $(hello) $ make hello='$(world' makefile:1: *** unterminated variable reference. Stop. * src/makeint.h: Declare enum variable_origin, struct variable and define_makeflags(). Add parameter origin to decode_env_switches(). * src/main.c (define_makeflags): Remove "all". If a variable is assigned on the command line then append MAKEOVERRIDES to MAKEFLAGS. (decode_env_switches): Replace parameter env with origin. (decode_switches): Replace parameter env with origin. Treat origin == o_command as env == 0. (handle_non_switch_argument): Replace parameter env with origin. Treat origin == o_command as env == 0. (main): Call decode_switches() with origin==o_command before parsing makefiles. Call decode_switches() with origin==o_env after parsing makefiles. * src/variable.c (set_special_var): Define makeflags at parse time, each time a makefile modifies MAKEFLAGS. (do_variable_definition): Strip command line variable assignments from MAKEFLAGS before appending extra flags. set_special_var() adds them back. * tests/scripts/variables/MAKEFLAGS: Add tests.
* * src/main.c (main): [SV 63373] Don't use macros with memcmp()Paul Smith2022-11-161-1/+1
| | | | Reported by djm <mccannd@uk.ibm.com>
* Add specific hints for errors due to invalid conditionalsPaul Smith2022-11-151-7/+16
| | | | | | | | * src/read.c (eval): If "missing separator" appears to be due to missing space after ifeq/ifneq, give a hint about the error. * tests/scripts/misc/failure: Check for these types of failures. * tests/scripts/variables/special: Move error checking unrelated to special variables, to misc/failure.
* [SV 63333] Be more lenient when failing to create temporary filesDmitry Goncharov2022-11-134-20/+57
| | | | | | | | | | | | | | | | | | | | | | If make cannot create a temporary lock file for output sync, continue without output sync enabled rather than dying. However, if make cannot store a makefile from stdin to a temporary file that is still a fatal error. * misc.c (get_tmppath): Keep running on failure to generate a temporary file name. (get_tmpfd): Keep running on failure to get a temporary file. (get_tmpfile): Keep running on failure to open a temporary file. Ensure memory is freed if we return an error. * posixos.c (os_anontmp): Keep running on failure to open an anonymous temporary file. * output.c (setup_tmpfile): Print an error on failure to create an output sync lock file. * main.c (main): Die on failure to store makefile from stdin to a temporary file. * tests/scripts/features/output-sync: Add tests. * tests/scripts/features/temp_stdin: Ditto.
* Keep going if we can't connect to the jobserverPaul Smith2022-11-132-13/+20
| | | | | | | | * src/posixos.c (jobserver_parse_auth): Don't invoke fatal() if we can't connect to an existing jobserver: just keep going without it. * src/w32/w32os.c (jobserver_parse_auth): Ditto. * tests/scripts/features/jobserver: Add a test for invalid FIFO auth files.
* * src/dir.c (dir_contents_file_exists_p): Show dir name in error.Paul Smith2022-11-131-29/+26
| | | | | | | | If we fail to read a directory show the directory name in the error message. Pass struct directory instead of directory_contents to allow that. (dir_file_exists_p): Change dir_contents_file_exists_p caller. (open_dirstrem): Ditto.
* * src/main.c (main): [SV 63307] Handle SIGPIPE as a fatal signalPaul Smith2022-11-131-5/+3
| | | | Always ignoring SIGPIPE is visible to child processes.
* [SV 63315] Allocate function names when defining functionsPaul Smith2022-11-131-1/+1
| | | | | | * src/function.c (define_new_function): Don't keep a pointer to the user-provided name of a user-defined function: if the .so is unloaded it will point to garbage. Add the name to the strcache instead.
* * src/hash.c (jhash_string): Help the compiler optimize the hashJustine Tunney2022-11-131-7/+13
| | | | | | Invoke memcpy() with a constant length, where possible. Copyright-paperwork-exempt: yes
* * src/config.h.W32 [TCC]: Only redefine strtoll if not definedPaul Smith2022-11-121-3/+7
|
* * src/config.h.W32: Fix last change.Eli Zaretskii2022-11-091-4/+4
|
* Fix build with Tiny CEli Zaretskii2022-11-051-0/+4
| | | | | | * src/config.h.W32 (strtoll, strtoull) [__TINYC__]: Redirect to _strtoi64 and _strtoui64, respectively. Reported by Christian Jullien <eligis@orange.fr>.
* Fix issues found by ASAN and CoverityPaul Smith2022-10-316-14/+40
| | | | | | | | | | | | | | | * tests/test_driver.pl: Preserve the LSAN_OPTIONS variable. * tests/scripts/targets/ONESHELL: Don't set a local variable. * tests/scripts/functions/let: Test empty let variable. * src/posixos.c (osync_parse_mutex): Free existing osync_tmpfile. * src/misc.c (get_tmpfd): Set umask() before invoking mkstemp(). * src/ar.c (ar_parse_name): Check invalid name (shouldn't happen). * src/function.c (define_new_function): Free previous function entry when replacing it with a new one. * src/job.c (child_execute_job): Initialize pid for safety. (construct_command_argv_internal): In oneshell mode ensure that the returned argv has the right format (0th element is a pointer to the entire buffer).
* Avoid C99 constructsPaul Smith2022-10-292-19/+22
| | | | | | | | | | Although gnulib requires C99, most of the code does compile with a C90 compiler (perhaps with a lot of warnings). Reinstate our C90 configuration test, and clean up a few C99 things that crept in. * src/job.c (construct_command_argv_internal): Don't use loop-local variables or C++ comments. * src/read.c (eval_makefile): Don't use loop-local variables.
* * src/posixos.c (os_anontmp): [SV 63287] Only fail O_TMPFILE oncePaul Smith2022-10-291-5/+11
| | | | Reported by Dmitry Goncharov <dgoncharov@users.sf.net>.
* * src/job.c: [SV 63185] Don't use ifdef with HAVE_DECL_* macrosPaul Smith2022-10-271-2/+1
|
* [SV 63260] Don't recurse forever if setup_tmpfile() failsPaul Smith2022-10-241-10/+24
| | | | | | | | | | | | | If we fail during setup_tmpfile() we'll try to write an error, which will invoke setup_tmpfile() again, etc. Avoid infinite recursion. Original patch by Dmitry Goncharov <dgoncharov@users.sf.net> * src/output.c (setup_tmpfile): Remember we're in this function and return immediately if we enter it during recursion. (message): Remember the starting location and use that instead of fmtbuf.buffer. (error): Ditto. (fatal): Ditto.
* * src/output.c (_outputs): Don't use invalid output sync FDsPaul Smith2022-10-241-11/+15
| | | | Just write to stdout/stderr in this situation.
* * src/misc.c (get_tmpdir): Report errors if tmpdirs are invalidPaul Smith2022-10-242-7/+33
| | | | * src/main.c (main): Set up initial temporary directories.
* * src/posixos.c (os_anontmp): If O_TMPFILE fails try dup() method.Dmitry Goncharov2022-10-231-8/+13
|
* * src/rule.c (get_rule_defn): Don't use STRING_SIZE_TUPLE in mempcpyPaul Smith2022-10-232-2/+4
| | | | If mempcpy() is a macro then STRING_SIZE_TUPLE won't compile.
* Provide a maintainer-only debug methodPaul Smith2022-10-232-0/+20
| | | | | | | | | | | Generating debug logs to stdout or stderr makes it impossible to run tests etc. so create a dumb DBG facility to log to a temp file. This exists only in maintainer mode and the DBG macro gives a compile error if it's used in non-maintainer mode. * src/makeint.h (DBG): Call dbg() in maintainer mode, else error. (dbg): Define it in maintainer mode. * src/misc.c (dbg): Open a log file for append, write, then close.
* Set PATH_MAX on systems without a default valuePaul Smith2022-10-226-14/+16
| | | | | | | | | | | | | | | | Some systems (HURD) use fully-dynamic pathnames, with no limit. We can't support this without significant effort so for now set PATH_MAX to a large value. * src/makeint.h: Set PATH_MAX to 4096 if not set and MAXPATHLEN is also not set. Remove MAXPATHLEN setting: we won't use it. * src/misc.c (get_path_max): If we can't get the path max via pathconf() use the default PATH_MAX. * src/dir.c (find_directory) [W32]: Use MAX_PATH not MAXPATHLEN. (local_stat) [W32]: Ditto. * src/job.c (create_batch_file) [W32]: Ditto. * src/remake.c (name_mtime) [W32]: Ditto. * src/w32/w32os.c (os_anontmp) [W32]: Ditto.
* [SV 63098] Enhance detection of missing peer also-make targetsPaul Smith2022-10-221-32/+37
| | | | | | | | | | | | The previous attempt to detect missing peer targets for implicit rules had some holes. Move the detection to notice_finished_file(). * src/remake.c (check_also_make): If we don't have the current mtime for the file, obtain it. (update_goal_chain): Don't call check_also_make() here. (check_dep): Ditto. (notice_finished_file): If we finished running an implicit rule that has also_make targets, invoke check_also_make().
* [SV 63236] Fix getloadavg related error message on AIXDmitry Goncharov2022-10-221-0/+1
| | | | | | | On AIX getloadavg keeps errno intact when it fails, resulting in a bogus error message from make. * src/job.c (load_too_high): Reset errno before calling getloadavg.
* [SV 63248] Ignore SIGPIPEDmitry Goncharov2022-10-222-0/+6
| | | | | | | | | | | | | Don't terminate when make's output is redirected to a pipe and the reader exits early; e.g.: $ echo 'all:; sleep 2' | make -f- -j2 -O |: This lets us unlink temporary files, and tell the user that make was not able to write its output. Reported by Frank Heckenbach <f.heckenbach@fh-soft.de>. * src/main.c (main): Ignore SIGPIPE. * src/posixos.c (osync_clear): Fix a memory leak.
* Update URLs to use https rather than httpPaul Smith2022-10-1874-74/+74
| | | | | * (all): Change http:// to https:// * README.W32: Remove invalid link to mingw.org.
* Rework temp file handling to avoid GNU libc warningsPaul Smith2022-10-186-66/+111
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Original patch provided by Paul Eggert <eggert@cs.ucla.edu>. GNU libc will generate a link-time warning if we use mktemp() even though we are using it safely (we only use it with mkfifo()). Avoid this and clean up some handling. First, check all calls related to temporary files and exit with a fatal error and a useful message if we can't obtain them. In some situations it might be possible to continue with reduced capability but it's not worth the effort. On POSIX systems we can create anonymous temp files using O_TMPFILE if it's supported, else if we're using the default location and we have dup(2), we can use standard tmpfile() and get an FD from it. If we need a named temp file and FILE* and we have mkstemp() we can use that, else if we have fdopen() we can get a temp FD and open it. If none of those are available all we can do is generate a temp name then open it with fopen() which is not secure. * src/makeint.h (get_tmpdir): Declare it for use elsewhere. * src/misc.c (get_tmpdir): Make it public not static. (get_tmptemplate): Simplify the implementation. (get_tmppath): Only define this if we have to have it to avoid warnings from GNU libc. (get_tmpfd): Generate fatal errors on error. (get_tmpfile): Ditto. Open files in "wb+" mode to match tmpfile(). Require a filename pointer (all callers want it). * src/os.h (os_anontmp): Implement for posixos.c as well. * src/posix.c (jobserver_setup): Don't use mktemp to avoid GNU libc errors. Instead construct the FIFO name based on the PID. (osync_setup): get_tmpfd() can't fail so don't check it. (os_anontmp): If the system supports O_TMPFILE use it. If not, and we want to create the temporary file in the default directory, we can use tmpfile() then use dup() to copy the file descriptor. * src/main.c (main): get_tmpfile() can't fail. * src/vmsjobs.c (child_execute_job): get_tmpfile() can't fail.
* Add ISDIRSEP() helper macro and use itPaul Smith2022-10-189-63/+39
| | | | | | | | | | | | | | | | | | | | | | | | Create a ISDIRSEP() macro to check for directory separator chars using the stopchar_map, and replace inline checks and explicit STOP_SET calls with this macro. * src/makeint.h (ISDIRSEP): Create the macro using MAP_DIRSEP. * src/dir.c (find_directory): Replace inline checks with ISDIRSEP. (file_exists_p): Ditto. (file_impossible): Ditto. (file_impossible_p): Ditto. (local_stat): Ditto. * src/file.c (lookup_file): Ditto. * src/function.c (abspath): Ditto. * src/job.c (_is_unixy_shell): Ditto. (is_bourne_compatible_shell): Ditto. (construct_command_argv): Ditto. * src/main.c (find_and_set_default_shell): Ditto. (main): Ditto. * src/read.c (eval): Ditto. (parse_file_seq): Ditto. * src/remake.c (name_mtime): Ditto. * src/vpath.c (construct_vpath_list): Ditto.
* Add preprocessor macros for different platformsPaul Smith2022-10-186-3/+14
| | | | | | | | | | | | | * configure.ac: MK_CONFIGURE shows config.h was generated by configure. * src/config.ami: Define MK_AMIGAOS. * src/config.h-vms: Define MK_VMS. * src/configh.dos: Define MK_DJGPP. * src/config.h.W32: Define MK_W32 and WINDOWS32. * src/build_w32.bat: Let WINDOWS32 be defined by config.h. Remove unused setting of WIN32. * src/job.c: Clean up use of WIN32. * src/main.c: Ditto. * tests/scripts/features/default_names: Ditto.