[Buildroot] [PATCH] Makefile: fix build when $(O) ends in _defconfig
Peter Korsgaard
peter at korsgaard.com
Wed Feb 22 16:31:46 UTC 2023
>>>>> "Sebastian" == Sebastian WEYER <sebastian.weyer at smile.fr> writes:
> Hi all,
> On 22/01/2023 10:09, Yann E. MORIN wrote:
>> Commit e6195c53041f (Makefile: fix use of many br2-external trees) fixed
>> a slowdown with many br2-external trees. In doing so, it changed the
>> type of the %_defconfig rule: the stem is no longer present in the
>> prerequisites, so it changes from a pattern rule to an implicit pattern
>> rule [0].
>>
>> It is not unusual to name the build directory after the defconfig that
>> is being built, so we may end up with a build directory named
>> meh_defconfig. Before e6195c53041f, the pattern rule would not match
>> [1], but now it does, which causes somewhat-cryptic build failures:
>>
>> Makefile:1015: *** "Can't find /some/path/meh_defconfig". Stop.
>>
>> The issue is that we have this set of rules and assignments (elided and
>> reordered for legibility):
>>
>> all: world
>> world: target-post-image
>> target-post-image: staging-finalize
>> staging-finalize: $(STAGING_DIR_SYMLINK)
>> $(STAGING_DIR_SYMLINK): | $(BASE_DIR)
>> BASE_DIR := $(CANONICAL_O)
>> CANONICAL_O := $(shell mkdir -p $(O) >/dev/null 2>&1)$(realpath $(O))
>>
>> So, there is a rule that (eventually) has a dependency on $(O), but we
>> have no rule that provides it explicitly, so the %_defconfig rule kicks
>> in, with the stem as "/some/path/meh". When the loop searches all the
>> ".../configs/" directories for a file named ".../configs/%_defconfig",
>> it actually lookes for a file named ".../configs//some/path/meh_defconfig"
>> and that indeed never matches anything.
>>
>> The solution is to provide an actual rule for $(BASE_DIR), so that the
>> implicit rule does not kick in.
>>
>> [0] Terminology and behaviour in make is hard, so the terms we used here
>> may be wrong or incorrectly used, and/or the explanations for the
>> behavious be wrong or incomplete... Still, the reasoning stands, and
>> the root cause is the removal of the stem in the RHS of the rule
>> (adding one back does fix the issue).
>>
>> [1] not sure how the prerequisite was solved before e6195c53041f,
>> though...
>>
>> Fixes: e6195c53041f
>>
>> Reported-by: Romain Naour <romain.naour at gmail.com>
>> Signed-off-by: Yann E. MORIN <yann.morin.1998 at free.fr>
>> Cc: Nevo Hed <nhed+buildroot at starry.com>
>> Cc: Peter Korsgaard <peter at korsgaard.com>
>> ---
>> Makefile | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/Makefile b/Makefile
>> index 8517d563d5..f39af5eae9 100644
>> --- a/Makefile
>> +++ b/Makefile
>> @@ -1042,7 +1042,7 @@ savedefconfig: $(BUILD_DIR)/buildroot-config/conf outputmakefile
>>
>> # staging and target directories do NOT list these as
>> # dependencies anywhere else
>> -$(BUILD_DIR) $(BASE_TARGET_DIR) $(HOST_DIR) $(BINARIES_DIR) $(LEGAL_INFO_DIR) $(REDIST_SOURCES_DIR_TARGET) $(REDIST_SOURCES_DIR_HOST) $(PER_PACKAGE_DIR):
>> +$(BASE_DIR) $(BUILD_DIR) $(BASE_TARGET_DIR) $(HOST_DIR) $(BINARIES_DIR) $(LEGAL_INFO_DIR) $(REDIST_SOURCES_DIR_TARGET) $(REDIST_SOURCES_DIR_HOST) $(PER_PACKAGE_DIR):
>> @mkdir -p $@
>>
>> # outputmakefile generates a Makefile in the output directory, if using a
> I first verified that the build fails when the output folder's name ends in
> "_defconfig" with "make O=./test/second_defconfig qemu_aarch64_virt_defconfig"
> followed by "make O=./test/second_defconfig".
> I then applied the patch and redid "make O=./test/second_defconfig" and verified
> that the build succeeded.
> Tested-by: Sebastian Weyer <sebastian.weyer at smile.fr>
Committed to 2022.11.x and 2022.02.x, thanks.
--
Bye, Peter Korsgaard
More information about the buildroot
mailing list