diff --git a/load.c b/load.c index 191ebd87..2beab83d 100644 --- a/load.c +++ b/load.c @@ -168,9 +168,8 @@ load_file (const gmk_floc *flocp, const char **ldname, int noerror) loaded = allocated_variable_expand ("$(.LOADED)"); fp = strstr (loaded, *ldname); r = fp && (fp==loaded || fp[-1]==' ') && (fp[nmlen]=='\0' || fp[nmlen]==' '); - free (loaded); if (r) - return 1; + goto exit; /* If we didn't find a symbol name yet, construct it from the ldname. */ if (! symname) @@ -214,8 +213,21 @@ load_file (const gmk_floc *flocp, const char **ldname, int noerror) /* If it succeeded, add the load file to the loaded variable. */ if (r > 0) - do_variable_definition (flocp, ".LOADED", *ldname, o_default, f_append, 0); + { + size_t loadlen = strlen (loaded); + char *newval = alloca (loadlen + strlen (*ldname) + 2); + /* Don't add a space if it's empty. */ + if (loadlen) + { + memcpy (newval, loaded, loadlen); + newval[loadlen++] = ' '; + } + strcpy (&newval[loadlen], *ldname); + do_variable_definition (flocp, ".LOADED", newval, o_default, f_simple, 0); + } + exit: + free (loaded); return r; } @@ -237,7 +249,7 @@ unload_file (const char *name) #else int -load_file (const gmk_floc *flocp, const char **ldname, int noerror) +load_file (const gmk_floc *flocp, const char **ldname UNUSED, int noerror) { if (! noerror) O (fatal, flocp, @@ -247,7 +259,7 @@ load_file (const gmk_floc *flocp, const char **ldname, int noerror) } void -unload_file (const char *name) +unload_file (const char *name UNUSED) { O (fatal, NILF, "INTERNAL: Cannot unload when load is not supported!"); } diff --git a/main.c b/main.c index f16c6b41..62ed7a8a 100644 --- a/main.c +++ b/main.c @@ -1316,6 +1316,7 @@ main (int argc, char **argv, char **envp) /* define_variable_cname (".TARGETS", "", o_default, 0)->special = 1; */ define_variable_cname (".RECIPEPREFIX", "", o_default, 0)->special = 1; define_variable_cname (".SHELLFLAGS", "-c", o_default, 0); + define_variable_cname (".LOADED", "", o_default, 0); /* Set up .FEATURES Use a separate variable because define_variable_cname() is a macro and diff --git a/tests/scripts/features/load b/tests/scripts/features/load index 1f8cdc22..2e9318d5 100644 --- a/tests/scripts/features/load +++ b/tests/scripts/features/load @@ -56,7 +56,7 @@ load testload.so POST := $(.LOADED) all: ; @echo pre=$(PRE) post=$(POST) $(TESTLOAD) !, - '', "pre= post=testload.so implicit\n"); + '--warn-undefined-variables', "pre= post=testload.so implicit\n"); # TEST 2 # Load using an explicit function