[U-Boot] Question about board-specific Makefile actions

Masahiro Yamada yamada.masahiro at socionext.com
Fri Mar 13 05:20:25 CET 2015


Hi James,



2015-03-13 3:35 GMT+09:00 James Chargin <jimccrown at gmail.com>:
> I could still use some help with this from someone who really knows how the
> make system works.
>
> Tom and Simon provided hints that were helpful, as I note below.
>
>
> On 03/09/2015 08:34 AM, James Chargin wrote:
>>
>> So, is no one willing to offer a hint?
>>
>> Thanks,
>> Jim
>>
>> On 03/03/2015 01:39 PM, James Chargin wrote:
>>>
>>> I have a custom board in a git workspace for U-Boot 2014.07. I've copied
>>> most of this from the .../board/ti/beagle. My board directory Makefile
>>> looks like
>>>
>>> 8<---
>>> obj-y := board.o
>>> 8<---
>>>
>>> I'd like to add a few files to this directory that are processed during
>>> "make all" and have any newly derived files deleted during "make clean".
>>>
>>> I've experimented with various Makefile contents but I can't get the new
>>> files processed or any newly derived files deleted. U-Boot's makefile
>>> system is quite large for my experience level and it seems I don't have
>>> enough understanding.
>>>
>>> A new file might contain some hush commands that are to be executed from
>>> the U-Boot command line. I'd like to use "source" to process these
>>> commands. The "source" command requires that its argument be an image (I
>>> get this into memory via TFTP), so I'd like "make all" to transform the
>>> text file containing the hush commands into the image file. I'd also
>>> like "make clean" to delete the derived image file.
>>>
>>> So, if my hush commands are in a text file called test.txt, I'd like
>>> "make all" to apply mkimage so that a test.img is generated. I'd also
>>> like "make clean" to delete test.img.
>>>
>>> I tried various changes to my Makefile, but the most likely seeming
>>> changes are
>>>
>>> 8<---
>>> IMG  = test.img
>>>
>>> obj-y    := board.o
>>> board.o : $(IMG)
>>>
>>> %.img : %.txt
>>>      $(srctree)/tools/mkimage -T script -n $* -C none -d $< $@
>>>
>>> CLEAN_FILES += $(IMG)
>>> CLEAN_DIRS  += .
>>> 8<---


I assume you put these lines into your own board/my_board/Makefile.

You cannot use CLEAN_FILES, CLEAN_DIRS in sub-directory Makefiles.
They are only available at the top-level Makefile.

Instead, "clean-files" is available in sub Makefiles.
but, it is redundant if you are willing to add it to extra-y
because files in $(extra-y) are automatically cleaned up.



>>> This doesn't work, nor has any other approach I've taken. mkimage is
>>> never run for "make all" and test.img doesn't get deleted if I create a
>>> fake one and run "make clean"
>>>
>>> Could someone offer a solution, either directly, or by pointing at an
>>> existing board that does something similar?
>
>
> On 03/09/2015 08:54 AM, Tom Rini wrote:
>>
>>
>> Off the top of my head, try throwing test.img into obj-y ?
>>
>
> Adding text.img to obj-y did cause the .img file to get generated, but it
> also added text.img to the list of files supplied to ld, causing the final
> u-boot link to fail

Right.
As you have already noticed, you should use extra-y for your purpose.



>
> On 03/09/2015 11:49 AM, Simon Glass wrote:
>
>> Also you may want to add a command like cmd_img_txt (see Makefile.lib
>> for examples). Did you need to add anything to ALL-y?
>
>
> Your mention of Makefile.lib prompted my to look there for other targets I
> might use. I discovered extra-y and adding
>
> extra-y := test.img

Yes, this is correct.



> to my board's Makefile caused the correct operations.
>
> As you suggest, I added cmd_my_mkimage, which while not actually needed, is
> a very nice way to have a non-verbose progress report in the make output.
>
>> Another option is to put this outside the U-Boot build system, and
>> just run mkimage later.
>
>
> I really want these steps to be part of the normal board make. Requiring a
> separate manual build step will inevitably result in that separate step
> being forgotten (most probably by me).
>
>
> Is there any documentation you could point me at that might explain the way
> these Makefiles interact?

As Simon suggested, Documentation/kbuild/makefiles.txt of Linux Kernel
is the best one.


> I know most of this was derived from somewhere
> else (Linux kernel?) as part of the move to KConfig. But I have no

To be precise, you should say Kbuild, not Kconfig.
Kbuild and Kconfig should be considered separately.

 Kbuild - build system
 Kconfig - configuration system

They both originate in Linux Kernel.

U-Boot switched to Kbuild at 2014.04-rc1, and to Kconfig at 2014.10-rc1.

You mentioned you are using u-boot v2014.07.
So, you are building U-Boot with Kbuild,
but using the old, conventional configuration system (mkconfig + boards.cfg).

Your questions in this thread are all about Kbuild.




> experience with the kernel build system and following make's debug output is
> difficult, at best. Some overview of how makes are done would be quite
> helpful to me and maybe to other non-U-Boot-developers.
>
>
> Remaining problems:
>
> 1) I can't figure out how to clean my newly created derived .img file. I've
> tried each of the following four lines (one at a time), but none worked
> CLEAN_FILES += board/aja/helo/helo_setupdeveloper.img
> CLEAN_FILES += test.img
> CLEAN_FILES := test.img

CLEAN_FILES is only available at the top-level Makefile.

Add
CLEAN_FILES += board/my_board/test.img
to the top-level Makefile, and it should work.


> clean-files += test.img
> clean-files := test.img

These are correct in sub-directory Makefiles in general,
but unfortunately, "make clean" does not descend into board/ directory
for some reason.

So, they do not work in board/*/Makefile




> 2) More generally, I'd like to be able to add some arbitrary make steps that
> are peculiar to my boards Makefile, but I can't figure this out either, so
> far.
>
> I've tried adding my_all to extra-y and then adding steps for my_all,
> similar to the following.
>
> 8<---
> extra-y := test.img my_all
>
> .PHONY my_all
> my_all : test1.txt
>         # some arbitrary commands to be executed if test1.txt isn't present
>         cp -f test.txt test1.txt
> 8<---
>
> In this case, make reports an error
>
> make[1]: *** No rule to make target `board/my_board/my_all', needed by
> `__build'.  Stop.
> make: *** [board/my_board] Error 2
>
> Any help would be appreciated.
>


If you want to generate board/my_board/test1.txt from board/my_board/test.txt,
the board/my_board/Makefile should look like this:

8<----

extra-y := test1.txt

$(obj)/test1.txt: $(src)/test.txt
         cp -f $< $@
8<----



If you like the log to look more nicely,
you can write like below:

8<----
extra-y := test1.txt

quiet_cmd_copy = COPY    $@
      cmd_copy = cp -f $< $@

$(obj)/test1.txt: $(src)/test.txt
         $(call cmd,copy)
8<-----



Add the following to the top-level Makefile
8<----
CLEAN_FILES += board/my_board/test1.txt
8<----




I do not think you need to use PHONY target, but
if you really want use it, you can do like this.

8<----

__build: my_all

PHONY += my_all

my_all:
        echo "Hello, World"
8<----



-- 
Best Regards
Masahiro Yamada


More information about the U-Boot mailing list