aboutsummaryrefslogtreecommitdiff
path: root/miscutils/make.c (follow)
Commit message (Collapse)AuthorAgeFilesLines
...
* make: permit Unix-style paths when setting MAKERon Yorston2023-10-061-1/+4
| | | | | | | | | | | | | | | | | | | The 'make' applet follows POSIX requirements when setting the MAKE variable. However, it doesn't allow for the case where argv[0] is of a form like '/bin/make' but no corresponding executable exists. This can happen in busybox-w32 when '/bin/make' is interpreted as a reference to the 'make' applet. In this case set the MAKE variable to argv[0] and avoid issuing a warning. Setting MAKE to something that isn't a real executable is fine so long as it's only used by busybox-w32 applets. If it's used by external applications they may get confused. Adds 16-32 bytes. (GitHub issue #354)
* make: return non-zero exit status when a command failsRon Yorston2023-09-121-10/+35
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When a build command returned a non-zero exit status 'make' reported a warning and returned an exit code of zero. This was due to the misuse of the status returned by system(3). As the man page says: the return value is a "wait status" that can be examined using the macros described in waitpid(2). (i.e., WIFEXITED(), WEXITSTATUS(), and so on). Use the error() function to correctly report the problem on stderr and return an exit status of 2. Some additional changes in the same area: - When a target is removed report the diagnostic on stderr, as required by POSIX. - When a build command receives a signal GNU make removes the target. bmake doesn't and it isn't required by POSIX. Implement this as an extension. - Expand the error message when a build command fails so it includes the exit status or signal number, as obtained from the value returned by system(3). - Alter the WIN32 implementation of system(3) to handle exit codes which represent termination as if by a signal. Adds 200-240 bytes. (GitHub issue #354)
* make: avoid more warningsRon Yorston2023-09-121-1/+2
| | | | | | | | | | | | | | | | The tracking of progress introduced in commit fb4be267c (make: fixes to warning messages) failed to account for runs with the '-t' or '-n' options. Without this the following makefile: dummy_target: dummy_rule dummy_rule: @: issues the warning 'make: nothing to be done for dummy_target' when run with '-t' or '-n' and no 'dummy_rule' file present. (GitHub issue #354)
* make: fixes to warning messagesRon Yorston2023-08-251-28/+28
| | | | | | | | | | | | | | | | | According to POSIX only fatal diagnostic messages should be written to stderr. Arrange for warning() to write to stdout. pdpmake was rather too prolific in generating 'nothing to be done for XXX' messages. GNU make only issues the equivalent message for top-level targets and only if nothing at all was (or would have been) done. bmake doesn't seem to have such a message. Follow the practice of GNU make. This requires more intensive tracking of the actions taken while the make is in progress. Costs 16 bytes. (GitHub issue #354)
* make: fix .DEFAULT for prerequisiteRon Yorston2023-08-241-1/+0
| | | | | | | | | | Commit 4b65e7d9 (Fixes to inference rules) set the N_TARGET flag for prerequisites being built recursively. That wasn't necessary for the issue at hand and it lead to other problems. Undo that part of commit 4b65e7d9. (GitHub issue #354)
* make: fix POSIX buildRon Yorston2023-08-241-0/+15
| | | | | | | | If upstream BusyBox had a 'make' applet a native build with it enabled should match the corresponding build from the busybox-w32 source. Make it so.
* make: allow targets of the form c:/pathRon Yorston2023-08-231-2/+35
| | | | | | | | | | | | | | | | | Parsing of target rules was too simplistic to allow targets of the form c:/path. Allow such targets as a non-POSIX extension. Also add a 'windows' pragma to allow such targets in POSIX mode. This additionally requires the use of the 'target_name' pragma to permit slashes in target names. This change *doesn't* allow targets of the form c:path, but it's probably not wise to use them anyway. Costs 40-80 bytes. (GitHub issue #353)
* make: code shrinkRon Yorston2023-06-081-1/+1
| | | | Saves 8 bytes in the 32-bit build.
* make: special treatment of archive membersRon Yorston2023-05-011-4/+25
| | | | | | | | | | | | | | | The standard says: If a target or prerequisite contains parentheses, it shall be treated as a member of an archive library. For the lib(member.o) expression lib refers to the name of the archive library and member.o to the member name. 'lib(member.o)' is referred to as an 'expression' rather than a name; 'lib' and 'member.o' are called names. Allow for this in is_valid_name() by splitting such expressions into separate archive/member names and checking these individually.
* win32: export xappendword()Ron Yorston2023-04-231-13/+0
| | | | | | | Export the function xappendword() from make. Use it in drop and watch. Saves 8-80 bytes, an unusually large disparity.
* make: code shrinkRon Yorston2023-03-161-2/+2
| | | | | | Use alloc_ext_space() instead of a hand-coded equivalent. Saves 16-32 bytes.
* make: strip leading whitespace in shell assignmentRon Yorston2023-02-011-11/+28
| | | | | | | | | | | | Assignment of shell output to a macro ('!=') was originally a non-POSIX extension. It later became a POSIX 202X feature. However, the implementation failed to include the additional POSIX requirement that leading whitespace is removed from the shell output. Neither GNU make nor bmake strip leading whitespace. Implement this behaviour as a non-POSIX extension.
* make: allow building as pdpmake onlyRon Yorston2023-01-241-0/+1
| | | | | | | | | Commit f261d2d27 (make: make + sh configuration) added 'pdpmake' as an alias for 'make'. It should have been possible to include 'pdpmake' in a build without also including 'make'. Adjust the build configuration so this works as intended.
* make: add '-x' option to set pragmasRon Yorston2022-11-211-50/+92
| | | | | | Add a command line option to allow pragmas to be set. This is an alternative to the use of the .PRAGMA special target. The same pragmas are supported.
* make: add .PRAGMA special targetRon Yorston2022-11-181-38/+135
| | | | | | | | | | | | | | | | | | | | | | | | | | Add the special target .PRAGMA. This allows certain features of the POSIX standard to be disabled when POSIX mode is being enforced. This is done by setting prerequisites of .PRAGMA, as follows: - macro names containing '-' are permitted with the 'macro_name' prerequisite; - target names containing '-' or '/' are permitted with the 'target_name' prerequisite; - the '#' character isn't treated as the start of a comment in a command line with the 'command_comment' prerequisite; - an empty suffix is permitted in a macro expansion of the form $(VAR:=.c) with the 'empty_suffix' prerequisite. Additionally the 'posix_202x' prerequisite enforces the future POSIX standard instead of the current one. In this case the 'macro_name' and 'target_name' pragmas aren't required as the future standard will allow the additional characters. .PRAGMA without any prerequisites restores the default behaviour.
* make: changes to suffix substitution in macro expansionRon Yorston2022-11-161-9/+18
| | | | | | | | | | | | | | The POSIX standard defines suffix substitution in macro expansion as taking the form: $(string1 [: subst1 =[ subst2 ]]) Since 'subst1' isn't bracketed a value must be supplied. Enforce this in POSIX mode. As a non-POSIX extension an empty 'subst1' is permitted with 'subst2' being added to all words unconditionally. If both 'subst1' and 'subst2' are empty the words are returned unchanged.
* make: show location of errors during buildRon Yorston2022-11-161-15/+41
| | | | | | | | | | | | | | | | | | | | | | Error messages only displayed the location of an error while the makefile was being parsed. Store the location (makefile name and line number) of each command line. This allows location information to be displayed in errors encountered while targets are being built. Take this Makefile, for example: target: @echo $(hello Previously this would display: make: unterminated variable '$(hello' Now it shows: make: (Makefile:2): unterminated variable '$(hello'
* make: fix typo in help textRon Yorston2022-11-141-2/+2
|
* make: use correct test for valid macro nameRon Yorston2022-11-131-1/+1
| | | | | The test for valid macro names in POSIX mode was incorrect: it shouldn't have allowed '-'.
* make: make + sh configurationRon Yorston2022-11-101-1/+8
| | | | | | Add a configuration that just includes make and a shell. Add 'pdpmake' as an alias for 'make'.
* make: fix typo in inference rule handlingRon Yorston2022-11-041-1/+1
| | | | | | | A typo in the previous commit caused dyndep() to process inference rules incorrectly. This didn't affect the results of the test suite when extensions were allowed but it caused the test 'Inference rule with explicit rule for prerequisite' to fail in POSIX mode.
* make: fixes to inference rulesRon Yorston2022-11-031-18/+21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Austin Group defect report 875 clarifies some aspects of inference rules. The crux of the issue is related to chained inference rules so it doesn't affect POSIX mode. The test makefile looks like this: .SUFFIXES: .a .b .c .a.c: @echo .a.c .b.c: @echo .b.c test.c: test.b test.a: test.b: The correct output is deemed to be '.a.c'. Additional complications are: - whether or not the prerequisite files are present; - the use of the suffixes '.a' and '.c' may result in the builtin inference rule '.c.a' being considered. In favourable circumstances pdpmake managed to give the correct result, in unfavourable it reported circular dependencies or segfaulted. Changes to fix these issues are: - When prerequisites are being recursively built the standard says: 'Upon recursion, each prerequisite shall become a target itself.' Follow this requirement. - At the end of make() the target being built should have its time (as represented by n_tim in struct name) updated when any action has been taken. - When dyndep() is looking for prerequisites it should: * skip candidates that are in the process of being built; * consider whether an explicit candidate is a target, not whether it has any commands associated with it. pdpmake now behaves similarly to GNU make when presented with makefiles like the above. bmake gives the incorrect output '.b.c'.
* make: comments in macro expansions and command linesRon Yorston2022-11-011-3/+16
| | | | | | | | | | | | | | The POSIX specification says: There are three kinds of comments: blank lines, empty lines, and a <number-sign> ('#') and all following characters up to the first unescaped <newline> character. Most implementations don't treat '#' in a macro expansion or a command line as the start of a comment. POSIX doesn't mention either of these exceptions. Permit the exceptions as a non-POSIX extension.
* make: different treatment for escaped NL in macro in commandRon Yorston2022-10-301-6/+24
| | | | | | | Austin Group defect report 1549 has been accepted. It requires that an escaped newline inside a macro expansion in a command is replaced by a space. Other escaped newlines in commands are left in place, as before.
* make: add a comment, no functional changeRon Yorston2022-10-211-3/+8
|
* make: $+ should support D/F modifiersRon Yorston2022-10-201-0/+1
| | | | | The code to handle the modifiers for 'directory part' and 'filename part' has been updated to support the $+ internal macro.
* make: .NOTPARALLEL and .WAIT are special targetsRon Yorston2022-10-191-0/+4
| | | | | | | | | | | | | Austin Group defect report 1437 has been accepted. It describes the special targets .NOTPARALLEL and .WAIT which are used to influence the behaviour of parallel builds. Since parallel builds aren't implemented in here they actually don't 't have much effect. - For completeness they're flagged as special targets. - .WAIT should be allowed as a prerequisite.
* make: shell assignment is a POSIX 202X featureRon Yorston2022-10-181-5/+4
| | | | | | | | Austin Group defect report 337 has been accepted, thus making macro assignment from the output of a shell command (!=) a POSIX 202X feature. This was previously implemented as a non-POSIX extension.
* make: support $+ and $^ as POSIX 202X featuresRon Yorston2022-10-181-14/+19
| | | | | | | | | | | | | | | | | | Austin Group defect reports 514 and 1520 have both been accepted. Together these introduce the internal macros $+ and $^: - $+ lists all prerequisites, with duplicates retained; - $^ lists all prerequisites, with duplicates removed. $^ had already been implemented as a non-POSIX extension, it now becomes a POSIX 202X extension. $+ has been added as a POSIX 202X extension. Neither of the above defect reports mentions how $? should handle duplicate prerequisites. In POSIX mode duplicates are retained. Removal of duplicates is implemented as a non-POSIX extension to match existing practice in other versions of make.
* make: fix incorrect handling of escaped newlineRon Yorston2022-08-281-5/+4
| | | | | | Fix a bug in process_command() where an escaped newline followed by a character other than tab resulted in premature termination of the command.
* make: new appletRon Yorston2022-08-011-0/+2621
This is an experimental implementation of make for busybox-w32, based on my public domain POSIX make: https://frippery.org/make/ (GitHub issue #44)