aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2024-07-12 15:08:48 +0100
committerRon Yorston <rmy@pobox.com>2024-07-12 15:08:48 +0100
commit684dabdb8452b3d33d5d6265f3d7ef32c10f5307 (patch)
tree19cea9545ff938d8162a61290b87f98825b44a4b
parent2dc17b7c80c803119dd2214bce4406b252ae2e9f (diff)
downloadbusybox-w32-684dabdb8452b3d33d5d6265f3d7ef32c10f5307.tar.gz
busybox-w32-684dabdb8452b3d33d5d6265f3d7ef32c10f5307.tar.bz2
busybox-w32-684dabdb8452b3d33d5d6265f3d7ef32c10f5307.zip
make: allow pragmas to apply recursively
Pragmas set when pdpmake is run are exported to the environment variable PDPMAKE_PRAGMAS as a space-separated list of pragma names. This environment variable is read when pdpmake starts and any pragmas it contains are applied. Thus pragmas are passed to recursive invocations of pdpmake. PDPMAKE_PRAGMAS can also be set by the user. Adds 240-288 bytes.
-rw-r--r--miscutils/make.c69
1 files changed, 55 insertions, 14 deletions
diff --git a/miscutils/make.c b/miscutils/make.c
index 07e83166b..c65d32e78 100644
--- a/miscutils/make.c
+++ b/miscutils/make.c
@@ -637,23 +637,23 @@ inc_ref(void *vp)
637} 637}
638 638
639#if ENABLE_FEATURE_MAKE_POSIX 639#if ENABLE_FEATURE_MAKE_POSIX
640// Order must match constants above.
641// POSIX levels must be last and in increasing order
642static const char *p_name =
643 "macro_name\0"
644 "target_name\0"
645 "command_comment\0"
646 "empty_suffix\0"
647#if ENABLE_PLATFORM_MINGW32
648 "windows\0"
649#endif
650 "posix_2017\0"
651 "posix_2024\0"
652 "posix_202x\0";
653
640static void 654static void
641set_pragma(const char *name) 655set_pragma(const char *name)
642{ 656{
643 // Order must match constants above.
644 // POSIX levels must be last and in increasing order
645 static const char *p_name =
646 "macro_name\0"
647 "target_name\0"
648 "command_comment\0"
649 "empty_suffix\0"
650#if ENABLE_PLATFORM_MINGW32
651 "windows\0"
652#endif
653 "posix_2017\0"
654 "posix_2024\0"
655 "posix_202x\0"
656 ;
657 int idx = index_in_strings(p_name, name); 657 int idx = index_in_strings(p_name, name);
658 658
659 if (idx != -1) { 659 if (idx != -1) {
@@ -673,6 +673,27 @@ set_pragma(const char *name)
673 } 673 }
674 warning("invalid pragma '%s'", name); 674 warning("invalid pragma '%s'", name);
675} 675}
676
677static void
678pragmas_to_env(void)
679{
680 int i;
681 char *val = NULL;
682
683 for (i = 0; i < BIT_POSIX_2017; ++i) {
684 if ((pragma & (1 << i)))
685 val = xappendword(val, nth_string(p_name, i));
686 }
687
688 if (posix_level != DEFAULT_POSIX_LEVEL)
689 val = xappendword(val,
690 nth_string(p_name, BIT_POSIX_2017 + posix_level));
691
692 if (val) {
693 setenv("PDPMAKE_PRAGMAS", val, 1);
694 free(val);
695 }
696}
676#endif 697#endif
677 698
678/* 699/*
@@ -734,6 +755,7 @@ addrule(struct name *np, struct depend *dp, struct cmd *cp, int flag)
734 for (; dp; dp = dp->d_next) { 755 for (; dp; dp = dp->d_next) {
735 set_pragma(dp->d_name->n_name); 756 set_pragma(dp->d_name->n_name);
736 } 757 }
758 pragmas_to_env();
737 } 759 }
738#endif 760#endif
739} 761}
@@ -1982,6 +2004,23 @@ wildcard(char *p, glob_t *gd)
1982 return 1; 2004 return 1;
1983} 2005}
1984 2006
2007#if ENABLE_FEATURE_MAKE_POSIX
2008static void
2009pragmas_from_env(void)
2010{
2011 char *p, *q, *var;
2012 const char *env = getenv("PDPMAKE_PRAGMAS");
2013
2014 if (env == NULL)
2015 return;
2016
2017 q = var = xstrdup(env);
2018 while ((p = gettok(&q)) != NULL)
2019 set_pragma(p);
2020 free(var);
2021}
2022#endif
2023
1985/* 2024/*
1986 * Parse input from the makefile and construct a tree structure of it. 2025 * Parse input from the makefile and construct a tree structure of it.
1987 */ 2026 */
@@ -3084,6 +3123,7 @@ int make_main(int argc UNUSED_PARAM, char **argv)
3084 posix = getenv("PDPMAKE_POSIXLY_CORRECT") != NULL; 3123 posix = getenv("PDPMAKE_POSIXLY_CORRECT") != NULL;
3085 } 3124 }
3086 posix_level = DEFAULT_POSIX_LEVEL; 3125 posix_level = DEFAULT_POSIX_LEVEL;
3126 pragmas_from_env();
3087#endif 3127#endif
3088 3128
3089 if (!POSIX_2017) { 3129 if (!POSIX_2017) {
@@ -3137,6 +3177,7 @@ int make_main(int argc UNUSED_PARAM, char **argv)
3137#if ENABLE_FEATURE_MAKE_POSIX 3177#if ENABLE_FEATURE_MAKE_POSIX
3138 while ((prag = llist_pop(&pragmas))) 3178 while ((prag = llist_pop(&pragmas)))
3139 set_pragma(prag); 3179 set_pragma(prag);
3180 pragmas_to_env();
3140#endif 3181#endif
3141 3182
3142#if !ENABLE_PLATFORM_MINGW32 3183#if !ENABLE_PLATFORM_MINGW32