[PATCH 1/2] Clean up: Makefile.in: Correct the prerequisites
Michael Witten
mfwitten at gmail.com
Thu Jul 13 10:33:55 AWST 2017
On Wed, 12 Jul 2017 17:34:49 -0000, Michael Witten wrote:
> On Tue, 11 Jul 2017 05:08:56 -0000, Michael Witten wrote:
>
>> diff --git a/libtommath/Makefile.in b/libtommath/Makefile.in
>> index dbcd2a0..c06187a 100644
>> --- a/libtommath/Makefile.in
>> +++ b/libtommath/Makefile.in
>> @@ -17,7 +17,7 @@ endif
>> ifneq ($V,1)
>> @echo " * ${CC} $@"
>> endif
>> - ${silent} ${CC} -c ${CFLAGS} $^ -o $@
>> + ${silent} ${CC} -c ${CFLAGS} $*.c -o $@
>>
>> #default files to install
>> ifndef LIBNAME
>
> The above change is not quite correct; primarily, it breaks
> out-of-tree builds (which are already broken, and will be fixed
> shortly in another patch that I'll be submitting).
>
> The patch above alters the recipe for all object files (the rule
> not shown is `%.o: %.c'); in the original, the automatic variable
> `$^' is replaced with all of the prerequisites for the target in
> question, but this didn't work, because another part of this patch
> tells `make' that some of the prerequisites are header files, and
> thus `$^' expands to include those header files as well, which the
> compiler doesn't appreciate.
>
> The solution provided here just uses the pattern-matching stem
> of the target, provided by the automatic variable `$*', in order
> to construct the relevant `*.c' file. Alas, during an out-of-tree
> build, the stem is not enough to construct the path to the source
> code that needs to be compiled.
>
> In order to benefit from the search-for-prerequisites performed by
> `make', it's necessary to use the `$^' automatic variable, so the
> real solution to all of the above is just to filter the expansion
> of `$^' so that only `*.c' prerequisites are placed on the command
> line.
>
> More concretely, the above patch *should* look like this:
>
> diff --git a/libtommath/Makefile.in b/libtommath/Makefile.in
> index dbcd2a0..c06187a 100644
> --- a/libtommath/Makefile.in
> +++ b/libtommath/Makefile.in
> @@ -17,7 +17,7 @@ endif
> ifneq ($V,1)
> @echo " * ${CC} $@"
> endif
> - ${silent} ${CC} -c ${CFLAGS} $^ -o $@
> + ${silent} ${CC} -c ${CFLAGS} $(filter %.c,$^) -o $@
>
> #default files to install
> ifndef LIBNAME
>
> As out-of-tree builds are already broken, there's little value in
> updating this particular patch; instead, the above improvement on
> this patch will be incorporated in a future patch that I'll submit
> soon for the purpose of fixing out-of-tree builds.
Good news, everyone!
It turns out that the GCC option `-c' can be combined with `-o' only
when there is one translation unit (that is, one `*.c' file) as input
on the command line.
Thus, using the `filter' function of GNU `make' is overkill here; it
would be enough to use `$<', which is described by:
info '(make)Automatic Variables'
with the following:
'$<'
The name of the first prerequisite. If the target got its recipe
from an implicit rule, this will be the first prerequisite added by
the implicit rule (*note Implicit Rules::).
An `implicit rule' is described here:
info '(make)Implicit Rules'
which states:
You can define your own implicit rules by writing "pattern rules".
Well, the above rule in question (`%.o: %.c') is a pattern rule,
which means it defines an implicit rule, which means that `$<'
should be the one, desired translation unit.
More concretely, the above patch *should* look like this:
diff --git a/libtommath/Makefile.in b/libtommath/Makefile.in
index dbcd2a0..c06187a 100644
--- a/libtommath/Makefile.in
+++ b/libtommath/Makefile.in
@@ -17,7 +17,7 @@ endif
ifneq ($V,1)
@echo " * ${CC} $@"
endif
- ${silent} ${CC} -c ${CFLAGS} $^ -o $@
+ ${silent} ${CC} -c ${CFLAGS} $< -o $@
#default files to install
ifndef LIBNAME
I'll incorporate this change as part of the final, consolidated
patch series.
Sincerely,
Michael Witten
More information about the Dropbear
mailing list