Merge branch 'master' of git://git.denx.de/u-boot-arm
[kernel/u-boot.git] / helper.mk
1 #
2 # Copyright (C) 2012 Marek Vasut <marex@denx.de>
3 #
4 # See file CREDITS for list of people who contributed to this
5 # project.
6 #
7 # This program is free software; you can redistribute it and/or
8 # modify it under the terms of the GNU General Public License as
9 # published by the Free Software Foundation; either version 2 of
10 # the License, or (at your option) any later version.
11 #
12 #########################################################################
13
14 ##
15 # make_u_boot_list - Generate contents of u_boot_list section
16 # 1:            The name of the resulting file (usually u-boot.lst)
17 # 2:            Files to analyze for possible u_boot_list entries
18 #
19 # This function generates the contents of the u_boot_list section,
20 # including all the border symbols for it's subsections. The operation
21 # of this function is as follows, numbering goes per lines:
22 #
23 # 1) Dump the ELF header sections from all files supplied via $(2)
24 # 2) Filter out all other stuff that does not belong into .u_boot_list
25 #    section.
26 # 3) Fix up the lines so that the resulting output is is in format
27 #    ".u_boot_list.*".
28 # 4) Remove the last .something$, since that only contains the name
29 #    of the variable to be put into a subsection. This name is irelevant
30 #    for generation of border symbols, thus of no interest, remove it.
31 # 5) Take each line and for every dot "." in that line, print the whole
32 #    line until that dot "." . This is important so that we have all
33 #    parent border symbols generated as well.
34 # 6) Load every line and firstly append "\a" at the end and print the
35 #    line. Next, append "@" at the end and print the line. Finally,
36 #    append "~" at the end of line. This will make sense in conjunction
37 #    with 6) and 7).
38 # 7) Sort the lines. It is imperative to use LC_COLLATE=C here because
39 #    with this, the "\a" symbol is first and "~" symbol is last. Any
40 #    other symbols fall inbetween. Symbols like "@", which marks the
41 #    end of current line (representing current section) and ".", which
42 #    means the line continues and thus represents subsection.
43 # 8) With such ordering, all lines ending with "\a" will float at the
44 #    begining of all lines with the same prefix. Thus it is easy to
45 #    replace "\a" with __start and make it the __start border symbol.
46 #    Very similarly for "~", which will be always at the bottom and so
47 #    can be replaced by "__end" and made into the __end border symbol.
48 #    Finally, every line ending with "@" symbol will be transformed
49 #    into " *(SORT(${line}*)); " format, which in the linker parlance
50 #    will allow it to trap all symbols relevant to the subsection.
51 #
52 define make_u_boot_list
53 $(1): $(2)
54         $(OBJDUMP) -h $(2) | \
55         sed -n -e '/.*\.u_boot_list[^ ]\+/ ! {d;n}' \
56                 -e 's/.*\(\.u_boot_list[^ ]\+\).*$$$$/\1/' \
57                 -e 's/\.[^\.]\+$$$$//' \
58                 -e ':s /^.\+$$$$/ { p;s/^\(.*\)\.[^\.]*$$$$/\1/;b s }' | \
59         sed -n -e 'h;s/$$$$/\a/p;g;s/$$$$/@/p;g;s/$$$$/~/p;' | \
60         LC_COLLATE=C sort -u | \
61         sed -n -e '/\a$$$$/ { s/\./_/g;s/\a$$$$/__start = .;/p; }'\
62                 -e '/~$$$$/ { s/\./_/g;s/~$$$$/__end = .;/p; }'\
63                 -e '/@$$$$/ { s/\(.*\)@$$$$/*(SORT(\1.*));/p }' > $(1)
64 endef