diff options
author | Ron Yorston <rmy@pobox.com> | 2022-11-18 14:02:02 +0000 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2022-11-18 14:02:02 +0000 |
commit | d1b4abe91a139e4a86278f7ec6ed7cd862805b1c (patch) | |
tree | 7dcabe8c8b24f1f2978956f39b196d15dd6d5110 | |
parent | 13b71ecafba53ebe8e4f88f9af70170b032ba408 (diff) | |
download | busybox-w32-d1b4abe91a139e4a86278f7ec6ed7cd862805b1c.tar.gz busybox-w32-d1b4abe91a139e4a86278f7ec6ed7cd862805b1c.tar.bz2 busybox-w32-d1b4abe91a139e4a86278f7ec6ed7cd862805b1c.zip |
make: add .PRAGMA special target
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.
-rw-r--r-- | miscutils/make.c | 173 |
1 files changed, 135 insertions, 38 deletions
diff --git a/miscutils/make.c b/miscutils/make.c index 941aa49e3..856ecbff0 100644 --- a/miscutils/make.c +++ b/miscutils/make.c | |||
@@ -23,12 +23,12 @@ | |||
23 | //config: default n | 23 | //config: default n |
24 | //config: depends on MAKE || PDPMAKE | 24 | //config: depends on MAKE || PDPMAKE |
25 | //config: help | 25 | //config: help |
26 | //config: Allow strict enforcement of POSIX 2017 at runtime by: | 26 | //config: Allow strict enforcement of POSIX compliance at runtime by: |
27 | //config: - .POSIX special target in makefile | 27 | //config: - .POSIX special target in makefile |
28 | //config: - '--posix' command line option | 28 | //config: - '--posix' command line option |
29 | //config: - PDPMAKE_POSIXLY_CORRECT environment variable | 29 | //config: - PDPMAKE_POSIXLY_CORRECT environment variable |
30 | //config: Enable this if you want to check whether your makefiles are | 30 | //config: Enable this if you want to check whether your makefiles are |
31 | //config: POSIX compliant. This adds about 500 bytes. | 31 | //config: POSIX compliant. This adds about 1.6 kb. |
32 | 32 | ||
33 | //applet:IF_MAKE(APPLET(make, BB_DIR_USR_BIN, BB_SUID_DROP)) | 33 | //applet:IF_MAKE(APPLET(make, BB_DIR_USR_BIN, BB_SUID_DROP)) |
34 | //applet:IF_PDPMAKE(APPLET_ODDNAME(pdpmake, make, BB_DIR_USR_BIN, BB_SUID_DROP, make)) | 34 | //applet:IF_PDPMAKE(APPLET_ODDNAME(pdpmake, make, BB_DIR_USR_BIN, BB_SUID_DROP, make)) |
@@ -66,6 +66,8 @@ | |||
66 | #include "common_bufsiz.h" | 66 | #include "common_bufsiz.h" |
67 | #include <glob.h> | 67 | #include <glob.h> |
68 | 68 | ||
69 | #define POSIX_2017 (posix && !(pragma & P_POSIX_202X)) | ||
70 | |||
69 | #define OPTSTR1 "eij:+knqrsSt" | 71 | #define OPTSTR1 "eij:+knqrsSt" |
70 | #define OPTSTR2 "pf:*C:*" | 72 | #define OPTSTR2 "pf:*C:*" |
71 | 73 | ||
@@ -167,6 +169,13 @@ struct macro { | |||
167 | #define M_IMMEDIATE 8 // immediate-expansion macro is being defined | 169 | #define M_IMMEDIATE 8 // immediate-expansion macro is being defined |
168 | #define M_VALID 16 // assert macro name is valid | 170 | #define M_VALID 16 // assert macro name is valid |
169 | 171 | ||
172 | // Constants for PRAGMA. Order must match strings in addrule(). | ||
173 | #define P_MACRO_NAME 0x01 | ||
174 | #define P_TARGET_NAME 0x02 | ||
175 | #define P_COMMAND_COMMENT 0x04 | ||
176 | #define P_EMPTY_SUFFIX 0x08 | ||
177 | #define P_POSIX_202X 0x10 | ||
178 | |||
170 | #define HTABSIZE 39 | 179 | #define HTABSIZE 39 |
171 | 180 | ||
172 | struct globals { | 181 | struct globals { |
@@ -190,6 +199,9 @@ struct globals { | |||
190 | bool seen_first; | 199 | bool seen_first; |
191 | #endif | 200 | #endif |
192 | int numjobs; | 201 | int numjobs; |
202 | #if ENABLE_FEATURE_MAKE_POSIX | ||
203 | unsigned char pragma; | ||
204 | #endif | ||
193 | } FIX_ALIASING; | 205 | } FIX_ALIASING; |
194 | 206 | ||
195 | #define G (*(struct globals*)bb_common_bufsiz1) | 207 | #define G (*(struct globals*)bb_common_bufsiz1) |
@@ -218,6 +230,11 @@ struct globals { | |||
218 | #define posix 0 | 230 | #define posix 0 |
219 | #endif | 231 | #endif |
220 | #define numjobs (G.numjobs) | 232 | #define numjobs (G.numjobs) |
233 | #if ENABLE_FEATURE_MAKE_POSIX | ||
234 | #define pragma (G.pragma) | ||
235 | #else | ||
236 | #define pragma 0 | ||
237 | #endif | ||
221 | 238 | ||
222 | static int make(struct name *np, int level); | 239 | static int make(struct name *np, int level); |
223 | 240 | ||
@@ -377,12 +394,29 @@ is_valid_target(const char *name) | |||
377 | { | 394 | { |
378 | const char *s; | 395 | const char *s; |
379 | for (s = name; *s; ++s) { | 396 | for (s = name; *s; ++s) { |
380 | if (posix && !ispname(*s)) | 397 | if (posix && |
398 | ((pragma & P_TARGET_NAME) || !POSIX_2017 ? | ||
399 | !(isfname(*s) || *s == '/') : !ispname(*s))) | ||
381 | return FALSE; | 400 | return FALSE; |
382 | } | 401 | } |
383 | return TRUE; | 402 | return TRUE; |
384 | } | 403 | } |
385 | 404 | ||
405 | #if ENABLE_FEATURE_MAKE_POSIX | ||
406 | static int | ||
407 | potentially_valid_target(const char *name) | ||
408 | { | ||
409 | int ret = FALSE; | ||
410 | |||
411 | if (!(pragma & P_TARGET_NAME)) { | ||
412 | pragma |= P_TARGET_NAME; | ||
413 | ret = is_valid_target(name); | ||
414 | pragma &= ~P_TARGET_NAME; | ||
415 | } | ||
416 | return ret; | ||
417 | } | ||
418 | #endif | ||
419 | |||
386 | /* | 420 | /* |
387 | * Intern a name. Return a pointer to the name struct | 421 | * Intern a name. Return a pointer to the name struct |
388 | */ | 422 | */ |
@@ -395,7 +429,13 @@ newname(const char *name) | |||
395 | unsigned int bucket; | 429 | unsigned int bucket; |
396 | 430 | ||
397 | if (!is_valid_target(name)) | 431 | if (!is_valid_target(name)) |
398 | error("invalid target name '%s'", name); | 432 | #if ENABLE_FEATURE_MAKE_POSIX |
433 | error("invalid target name '%s'%s", name, | ||
434 | potentially_valid_target(name) ? | ||
435 | ". Allow with .PRAGMA: target_name" : ""); | ||
436 | #else | ||
437 | error("invalid target name '%s'"); | ||
438 | #endif | ||
399 | 439 | ||
400 | bucket = getbucket(name); | 440 | bucket = getbucket(name); |
401 | np = xzalloc(sizeof(struct name)); | 441 | np = xzalloc(sizeof(struct name)); |
@@ -496,6 +536,10 @@ addrule(struct name *np, struct depend *dp, struct cmd *cp, int flag) | |||
496 | if ((np->n_flag & N_SPECIAL) && !dp && !cp) { | 536 | if ((np->n_flag & N_SPECIAL) && !dp && !cp) { |
497 | if (strcmp(np->n_name, ".PHONY") == 0) | 537 | if (strcmp(np->n_name, ".PHONY") == 0) |
498 | return; | 538 | return; |
539 | #if ENABLE_FEATURE_MAKE_POSIX | ||
540 | if (strcmp(np->n_name, ".PRAGMA") == 0) | ||
541 | pragma = 0; | ||
542 | #endif | ||
499 | freerules(np->n_rule); | 543 | freerules(np->n_rule); |
500 | np->n_rule = NULL; | 544 | np->n_rule = NULL; |
501 | return; | 545 | return; |
@@ -523,6 +567,26 @@ addrule(struct name *np, struct depend *dp, struct cmd *cp, int flag) | |||
523 | np->n_flag |= N_TARGET; | 567 | np->n_flag |= N_TARGET; |
524 | if (flag) | 568 | if (flag) |
525 | np->n_flag |= N_DOUBLE; | 569 | np->n_flag |= N_DOUBLE; |
570 | #if ENABLE_FEATURE_MAKE_POSIX | ||
571 | if (strcmp(np->n_name, ".PRAGMA") == 0) { | ||
572 | // Order must match constants above | ||
573 | static const char *p_name = | ||
574 | "macro_name\0" | ||
575 | "target_name\0" | ||
576 | "command_comment\0" | ||
577 | "empty_suffix\0" | ||
578 | "posix_202x\0" | ||
579 | ; | ||
580 | |||
581 | for (; dp; dp = dp->d_next) { | ||
582 | int idx = index_in_strings(p_name, dp->d_name->n_name); | ||
583 | if (idx != -1) | ||
584 | pragma |= 1 << idx; | ||
585 | else | ||
586 | warning("invalid .PRAGMA %s", dp->d_name->n_name); | ||
587 | } | ||
588 | } | ||
589 | #endif | ||
526 | } | 590 | } |
527 | 591 | ||
528 | /* | 592 | /* |
@@ -542,7 +606,9 @@ is_valid_macro(const char *name) | |||
542 | for (s = name; *s; ++s) { | 606 | for (s = name; *s; ++s) { |
543 | // In POSIX mode only a limited set of characters are guaranteed | 607 | // In POSIX mode only a limited set of characters are guaranteed |
544 | // to be allowed in macro names. | 608 | // to be allowed in macro names. |
545 | if (posix && !ispname(*s)) | 609 | if (posix && |
610 | ((pragma & P_MACRO_NAME) || !POSIX_2017 ? | ||
611 | !isfname(*s) : !ispname(*s))) | ||
546 | return FALSE; | 612 | return FALSE; |
547 | // As an extension allow anything that can get through the | 613 | // As an extension allow anything that can get through the |
548 | // input parser, apart from the following. | 614 | // input parser, apart from the following. |
@@ -552,6 +618,21 @@ is_valid_macro(const char *name) | |||
552 | return TRUE; | 618 | return TRUE; |
553 | } | 619 | } |
554 | 620 | ||
621 | #if ENABLE_FEATURE_MAKE_POSIX | ||
622 | static int | ||
623 | potentially_valid_macro(const char *name) | ||
624 | { | ||
625 | int ret = FALSE; | ||
626 | |||
627 | if (!(pragma & P_MACRO_NAME)) { | ||
628 | pragma |= P_MACRO_NAME; | ||
629 | ret = is_valid_macro(name); | ||
630 | pragma &= ~P_MACRO_NAME; | ||
631 | } | ||
632 | return ret; | ||
633 | } | ||
634 | #endif | ||
635 | |||
555 | static void | 636 | static void |
556 | setmacro(const char *name, const char *val, int level) | 637 | setmacro(const char *name, const char *val, int level) |
557 | { | 638 | { |
@@ -573,7 +654,13 @@ setmacro(const char *name, const char *val, int level) | |||
573 | unsigned int bucket; | 654 | unsigned int bucket; |
574 | 655 | ||
575 | if (!valid && !is_valid_macro(name)) | 656 | if (!valid && !is_valid_macro(name)) |
657 | #if ENABLE_FEATURE_MAKE_POSIX | ||
658 | error("invalid macro name '%s'%s", name, | ||
659 | potentially_valid_macro(name) ? | ||
660 | ". Allow with .PRAGMA: macro_name" : ""); | ||
661 | #else | ||
576 | error("invalid macro name '%s'", name); | 662 | error("invalid macro name '%s'", name); |
663 | #endif | ||
577 | 664 | ||
578 | bucket = getbucket(name); | 665 | bucket = getbucket(name); |
579 | mp = xzalloc(sizeof(struct macro)); | 666 | mp = xzalloc(sizeof(struct macro)); |
@@ -1058,15 +1145,17 @@ expand_macros(const char *str, int except_dollar) | |||
1058 | if ((replace = find_char(expfind, '='))) { | 1145 | if ((replace = find_char(expfind, '='))) { |
1059 | *replace++ = '\0'; | 1146 | *replace++ = '\0'; |
1060 | lenf = strlen(expfind); | 1147 | lenf = strlen(expfind); |
1061 | if (!posix && (find_suff = strchr(expfind, '%'))) { | 1148 | if (!POSIX_2017 && (find_suff = strchr(expfind, '%'))) { |
1062 | find_pref = expfind; | 1149 | find_pref = expfind; |
1063 | repl_pref = replace; | 1150 | repl_pref = replace; |
1064 | *find_suff++ = '\0'; | 1151 | *find_suff++ = '\0'; |
1065 | if ((repl_suff = strchr(replace, '%'))) | 1152 | if ((repl_suff = strchr(replace, '%'))) |
1066 | *repl_suff++ = '\0'; | 1153 | *repl_suff++ = '\0'; |
1067 | } else { | 1154 | } else { |
1068 | if (posix && lenf == 0) | 1155 | if (posix && !(pragma & P_EMPTY_SUFFIX) && lenf == 0) |
1069 | error("empty suffix"); | 1156 | error("empty suffix%s", |
1157 | !ENABLE_FEATURE_MAKE_POSIX ? "" : | ||
1158 | ". Allow with .PRAGMA: empty_suffix"); | ||
1070 | find_suff = expfind; | 1159 | find_suff = expfind; |
1071 | repl_suff = replace; | 1160 | repl_suff = replace; |
1072 | lenr = strlen(repl_suff); | 1161 | lenr = strlen(repl_suff); |
@@ -1076,7 +1165,7 @@ expand_macros(const char *str, int except_dollar) | |||
1076 | 1165 | ||
1077 | p = q = name; | 1166 | p = q = name; |
1078 | // If not in POSIX mode expand macros in the name. | 1167 | // If not in POSIX mode expand macros in the name. |
1079 | if (!posix) { | 1168 | if (!POSIX_2017) { |
1080 | char *expname = expand_macros(name, FALSE); | 1169 | char *expname = expand_macros(name, FALSE); |
1081 | free(name); | 1170 | free(name); |
1082 | name = expname; | 1171 | name = expname; |
@@ -1092,7 +1181,7 @@ expand_macros(const char *str, int except_dollar) | |||
1092 | switch (name[0]) { | 1181 | switch (name[0]) { |
1093 | case '^': | 1182 | case '^': |
1094 | case '+': | 1183 | case '+': |
1095 | if (posix) | 1184 | if (POSIX_2017) |
1096 | break; | 1185 | break; |
1097 | // fall through | 1186 | // fall through |
1098 | case '@': case '%': case '?': case '<': case '*': | 1187 | case '@': case '%': case '?': case '<': case '*': |
@@ -1395,25 +1484,27 @@ target_type(char *s) | |||
1395 | { | 1484 | { |
1396 | char *sfx; | 1485 | char *sfx; |
1397 | int ret; | 1486 | int ret; |
1398 | static const char *s_name[] = { | 1487 | static const char *s_name = |
1399 | ".DEFAULT", | 1488 | ".DEFAULT\0" |
1400 | ".POSIX", | 1489 | ".POSIX\0" |
1401 | ".IGNORE", | 1490 | ".IGNORE\0" |
1402 | ".PRECIOUS", | 1491 | ".PRECIOUS\0" |
1403 | ".SILENT", | 1492 | ".SILENT\0" |
1404 | ".SUFFIXES", | 1493 | ".SUFFIXES\0" |
1405 | ".PHONY", | 1494 | ".PHONY\0" |
1406 | ".NOTPARALLEL", | 1495 | ".NOTPARALLEL\0" |
1407 | ".WAIT", | 1496 | ".WAIT\0" |
1408 | }; | 1497 | #if ENABLE_FEATURE_MAKE_POSIX |
1498 | ".PRAGMA\0" | ||
1499 | #endif | ||
1500 | ; | ||
1409 | 1501 | ||
1410 | if (*s != '.') | 1502 | if (*s != '.') |
1411 | return T_NORMAL; | 1503 | return T_NORMAL; |
1412 | 1504 | ||
1413 | // Check for one of the known special targets | 1505 | // Check for one of the known special targets |
1414 | for (ret = 0; ret < ARRAY_SIZE(s_name); ret++) | 1506 | if (index_in_strings(s_name, s) >= 0) |
1415 | if (strcmp(s_name[ret], s) == 0) | 1507 | return T_SPECIAL; |
1416 | return T_SPECIAL; | ||
1417 | 1508 | ||
1418 | // Check for an inference rule | 1509 | // Check for an inference rule |
1419 | ret = T_NORMAL; | 1510 | ret = T_NORMAL; |
@@ -1448,11 +1539,13 @@ process_command(char *s) | |||
1448 | int len; | 1539 | int len; |
1449 | char *outside; | 1540 | char *outside; |
1450 | 1541 | ||
1451 | if (posix) { | 1542 | if (!(pragma & P_COMMAND_COMMENT) && posix) { |
1452 | // POSIX strips comments from command lines | 1543 | // POSIX strips comments from command lines |
1453 | t = strchr(s, '#'); | 1544 | t = strchr(s, '#'); |
1454 | if (t) | 1545 | if (t) { |
1455 | *t = '\0'; | 1546 | *t = '\0'; |
1547 | warning("comment in command. Allow with .PRAGMA: command_comment"); | ||
1548 | } | ||
1456 | } | 1549 | } |
1457 | 1550 | ||
1458 | len = strlen(s) + 1; | 1551 | len = strlen(s) + 1; |
@@ -1464,7 +1557,7 @@ process_command(char *s) | |||
1464 | // Process escaped newlines. Stop at first non-escaped newline. | 1557 | // Process escaped newlines. Stop at first non-escaped newline. |
1465 | for (t = u = s; *u && *u != '\n'; ) { | 1558 | for (t = u = s; *u && *u != '\n'; ) { |
1466 | if (u[0] == '\\' && u[1] == '\n') { | 1559 | if (u[0] == '\\' && u[1] == '\n') { |
1467 | if (posix || outside[u - s]) { | 1560 | if (POSIX_2017 || outside[u - s]) { |
1468 | // Outside macro: remove tab following escaped newline. | 1561 | // Outside macro: remove tab following escaped newline. |
1469 | *t++ = *u++; | 1562 | *t++ = *u++; |
1470 | *t++ = *u++; | 1563 | *t++ = *u++; |
@@ -1624,7 +1717,7 @@ input(FILE *fd, int ilevel) | |||
1624 | str = process_line(str1); | 1717 | str = process_line(str1); |
1625 | 1718 | ||
1626 | // Check for an include line | 1719 | // Check for an include line |
1627 | minus = !posix && *str == '-'; | 1720 | minus = !POSIX_2017 && *str == '-'; |
1628 | p = str + minus; | 1721 | p = str + minus; |
1629 | if (strncmp(p, "include", 7) == 0 && isblank(p[7])) { | 1722 | if (strncmp(p, "include", 7) == 0 && isblank(p[7])) { |
1630 | const char *old_makefile = makefile; | 1723 | const char *old_makefile = makefile; |
@@ -1637,7 +1730,7 @@ input(FILE *fd, int ilevel) | |||
1637 | while ((p = gettok(&q)) != NULL) { | 1730 | while ((p = gettok(&q)) != NULL) { |
1638 | FILE *ifd; | 1731 | FILE *ifd; |
1639 | 1732 | ||
1640 | if (!posix) { | 1733 | if (!POSIX_2017) { |
1641 | // Try to create include file or bring it up-to-date | 1734 | // Try to create include file or bring it up-to-date |
1642 | opts |= OPT_include; | 1735 | opts |= OPT_include; |
1643 | make(newname(p), 1); | 1736 | make(newname(p), 1); |
@@ -1651,10 +1744,10 @@ input(FILE *fd, int ilevel) | |||
1651 | input(ifd, ilevel + 1); | 1744 | input(ifd, ilevel + 1); |
1652 | fclose(ifd); | 1745 | fclose(ifd); |
1653 | } | 1746 | } |
1654 | if (posix) | 1747 | if (POSIX_2017) |
1655 | break; | 1748 | break; |
1656 | } | 1749 | } |
1657 | if (posix) { | 1750 | if (POSIX_2017) { |
1658 | // In POSIX 2017 zero or more than one include file is | 1751 | // In POSIX 2017 zero or more than one include file is |
1659 | // unspecified behaviour. | 1752 | // unspecified behaviour. |
1660 | if (p == NULL || gettok(&q)) { | 1753 | if (p == NULL || gettok(&q)) { |
@@ -1678,7 +1771,7 @@ input(FILE *fd, int ilevel) | |||
1678 | switch (q[-1]) { | 1771 | switch (q[-1]) { |
1679 | case ':': | 1772 | case ':': |
1680 | // '::=' and ':::=' are from POSIX 202X. | 1773 | // '::=' and ':::=' are from POSIX 202X. |
1681 | if (!posix && q - 2 > str && q[-2] == ':') { | 1774 | if (!POSIX_2017 && q - 2 > str && q[-2] == ':') { |
1682 | if (q - 3 > str && q[-3] == ':') { | 1775 | if (q - 3 > str && q[-3] == ':') { |
1683 | eq = 'B'; // BSD-style ':=' | 1776 | eq = 'B'; // BSD-style ':=' |
1684 | q[-3] = '\0'; | 1777 | q[-3] = '\0'; |
@@ -1689,12 +1782,16 @@ input(FILE *fd, int ilevel) | |||
1689 | break; | 1782 | break; |
1690 | } | 1783 | } |
1691 | // ':=' is a non-POSIX extension. | 1784 | // ':=' is a non-POSIX extension. |
1785 | if (posix) | ||
1786 | break; | ||
1787 | goto set_eq; | ||
1692 | case '+': | 1788 | case '+': |
1693 | case '?': | 1789 | case '?': |
1694 | case '!': | 1790 | case '!': |
1695 | // '+=', '?=' and '!=' are from POSIX 202X. | 1791 | // '+=', '?=' and '!=' are from POSIX 202X. |
1696 | if (posix) | 1792 | if (POSIX_2017) |
1697 | break; | 1793 | break; |
1794 | set_eq: | ||
1698 | eq = q[-1]; | 1795 | eq = q[-1]; |
1699 | q[-1] = '\0'; | 1796 | q[-1] = '\0'; |
1700 | break; | 1797 | break; |
@@ -1817,7 +1914,7 @@ input(FILE *fd, int ilevel) | |||
1817 | files = gd.gl_pathv; | 1914 | files = gd.gl_pathv; |
1818 | } | 1915 | } |
1819 | for (i = 0; i < nfile; ++i) { | 1916 | for (i = 0; i < nfile; ++i) { |
1820 | if (!posix && strcmp(files[i], ".WAIT") == 0) | 1917 | if (!POSIX_2017 && strcmp(files[i], ".WAIT") == 0) |
1821 | continue; | 1918 | continue; |
1822 | np = newname(files[i]); | 1919 | np = newname(files[i]); |
1823 | newdep(&dp, np); | 1920 | newdep(&dp, np); |
@@ -2018,7 +2115,7 @@ make1(struct name *np, struct cmd *cp, char *oodate, char *allsrc, | |||
2018 | 2115 | ||
2019 | name = splitlib(np->n_name, &member); | 2116 | name = splitlib(np->n_name, &member); |
2020 | setmacro("?", oodate, 0 | M_VALID); | 2117 | setmacro("?", oodate, 0 | M_VALID); |
2021 | if (!posix) { | 2118 | if (!POSIX_2017) { |
2022 | setmacro("+", allsrc, 0 | M_VALID); | 2119 | setmacro("+", allsrc, 0 | M_VALID); |
2023 | setmacro("^", dedup, 0 | M_VALID); | 2120 | setmacro("^", dedup, 0 | M_VALID); |
2024 | } | 2121 | } |
@@ -2414,7 +2511,7 @@ process_macros(char **argv, int level) | |||
2414 | int immediate = 0; | 2511 | int immediate = 0; |
2415 | 2512 | ||
2416 | if (p - 2 > *argv && p[-1] == ':' && p[-2] == ':') { | 2513 | if (p - 2 > *argv && p[-1] == ':' && p[-2] == ':') { |
2417 | if (posix) | 2514 | if (POSIX_2017) |
2418 | error("invalid macro assignment"); | 2515 | error("invalid macro assignment"); |
2419 | immediate = M_IMMEDIATE; | 2516 | immediate = M_IMMEDIATE; |
2420 | p[-2] = '\0'; | 2517 | p[-2] = '\0'; |
@@ -2577,7 +2674,7 @@ int make_main(int argc UNUSED_PARAM, char **argv) | |||
2577 | } | 2674 | } |
2578 | #endif | 2675 | #endif |
2579 | 2676 | ||
2580 | if (!posix) { | 2677 | if (!POSIX_2017) { |
2581 | path = argv[0]; | 2678 | path = argv[0]; |
2582 | #if ENABLE_PLATFORM_MINGW32 | 2679 | #if ENABLE_PLATFORM_MINGW32 |
2583 | if (has_path(argv[0])) { | 2680 | if (has_path(argv[0])) { |
@@ -2686,7 +2783,7 @@ int make_main(int argc UNUSED_PARAM, char **argv) | |||
2686 | mark_special(".SILENT", OPT_s, N_SILENT); | 2783 | mark_special(".SILENT", OPT_s, N_SILENT); |
2687 | mark_special(".IGNORE", OPT_i, N_IGNORE); | 2784 | mark_special(".IGNORE", OPT_i, N_IGNORE); |
2688 | mark_special(".PRECIOUS", OPT_precious, N_PRECIOUS); | 2785 | mark_special(".PRECIOUS", OPT_precious, N_PRECIOUS); |
2689 | if (!posix) | 2786 | if (!POSIX_2017) |
2690 | mark_special(".PHONY", OPT_phony, N_PHONY); | 2787 | mark_special(".PHONY", OPT_phony, N_PHONY); |
2691 | 2788 | ||
2692 | estat = 0; | 2789 | estat = 0; |