summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/prelink/prelink_git.bb
blob: 0f6d16e00561784d4b0575b43d3ff500b0f1ea9a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
SECTION = "devel"
# Need binutils for libiberty.a
# Would need transfig-native for documentation if it wasn't disabled
DEPENDS = "elfutils binutils"
SUMMARY = "An ELF prelinking utility"
HOMEPAGE = "http://git.yoctoproject.org/cgit.cgi/prelink-cross/about/"
DESCRIPTION = "The prelink package contains a utility which modifies ELF shared libraries \
and executables, so that far fewer relocations need to be resolved at \
runtime and thus programs come up faster."
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://COPYING;md5=c93c0550bd3173f4504b2cbd8991e50b"
SRCREV = "05aeafd053e56356ec8c62f4bb8f7b95bae192f3"
PV = "1.0+git${SRCPV}"

#
# The cron script attempts to re-prelink the system daily -- on
# systems where users are adding applications, this might be reasonable
# but for embedded, we should be re-running prelink -a after an update.
#
# Default is prelinking is enabled.
#
SUMMARY_${PN}-cron = "Cron scripts to control automatic prelinking"
DESCRIPTION_${PN}-cron = "Cron scripts to control automatic prelinking.  \
See: ${sysconfdir}/cron.daily/prelink for configuration information."

FILES_${PN}-cron = "${sysconfdir}/cron.daily ${sysconfdir}/default"

PACKAGES =+ "${PN}-cron"

SRC_URI = "git://git.yoctoproject.org/prelink-cross.git;branch=cross_prelink \
           file://prelink.conf \
           file://prelink.cron.daily \
           file://prelink.default \
	   file://macros.prelink"
UPSTREAM_CHECK_COMMITS = "1"

TARGET_OS_ORIG := "${TARGET_OS}"
OVERRIDES_append = ":${TARGET_OS_ORIG}"

S = "${WORKDIR}/git"

inherit autotools 

BBCLASSEXTEND = "native"

EXTRA_OECONF = "--disable-selinux --with-pkgversion=${PV}-${PR} \
	--with-bugurl=http://bugzilla.yoctoproject.org/"


#
# For target prelink we need to ensure paths match the lib path layout
# including for any configured multilibs
#
python do_linkerpaths () {
    values = all_multilib_tune_list(["TUNE_ARCH", "baselib", "ABIEXTENSION"], d)

    arches = values["TUNE_ARCH"]
    baselibs = values["baselib"]
    abis = values["ABIEXTENSION"]

    def replace_lines(f, search, replacement, d, firstonly = False, secondonly = False):
        f = d.expand(f)
        if search == replacement:
            return
        bb.debug(2, "Replacing %s with %s in %s" % (search, replacement, f))
        with open(f, "r") as data:
            lines = data.readlines()
        with open(f, "w") as data:
            for line in lines:
                if not secondonly and not firstonly:
                    line = line.replace(search, replacement)
                elif secondonly and search in line:
                    secondonly = False
                elif firstonly and search and search in line:
                    line = line.replace(search, replacement)
                    search = None
                data.write(line)

    def replace_lines_rtld(f, search, replacement, section, d):
        f = d.expand(f)
        bb.debug(2, "Replacing %s with %s in %s" % (search, replacement, f))
        with open(f, "r") as data:
            lines = data.readlines()
        found = False
        found2 = False
        with open(f, "w") as data:
            for line in lines:
                if section in line:
                    if section == "else" and "if" in line:
                        found = False
                    else:
                        found = True
                if found and "dst_LIB =" in line:
                    found2 = True
                elif "}" in line:
                    found = False
                    found2 = False
                if found2:
                    line = line.replace(search, replacement)
                data.write(line)

    for i, arch in enumerate(arches):
        tune_baselib = baselibs[i]
        abi = abis[i]

        bits = 32
        if arch == "powerpc":
            replace_lines("${S}/src/arch-ppc.c", "/lib/ld.so.1", "/" + tune_baselib + "/ld.so.1", d)
        elif arch == "powerpc64":
            replace_lines("${S}/src/arch-ppc64.c", "/lib64/ld64.so.1", "/" + tune_baselib + "/ld64.so.1", d)
            bits = 64
        elif arch == "x86_64":
            if abi == "x32":
                replace_lines("${S}/src/arch-x86_64.c", "/libx32/ld-linux-x32.so.2", "/" + tune_baselib + "/ld-linux-x32.so.2", d)
            else:
                replace_lines("${S}/src/arch-x86_64.c", "/lib64/ld-linux-x86-64.so.2", "/" + tune_baselib + "/ld-linux-x86-64.so.2", d)
            bits = 64
        elif arch == "arm":
            replace_lines("${S}/src/arch-arm.c", "/lib/ld-linux.so.3", "/" + tune_baselib + "/ld-linux.so.3", d)
            replace_lines("${S}/src/arch-arm.c", "/lib/ld-linux-armhf.so.3", "/" + tune_baselib + "/ld-linux-armhf.so.3", d)
        elif arch == "mips" or arch == "mipsel":
            replace_lines("${S}/src/arch-mips.c", "/lib/ld.so.1", "/" + tune_baselib + "/ld.so.1", d, firstonly=True)
            replace_lines("${S}/src/arch-mips.c", "/lib32/ld.so.1", "/" + tune_baselib + "/ld.so.1", d)
        elif arch == "mips64" or arch == "mips64el":
            replace_lines("${S}/src/arch-mips.c", "/lib/ld.so.1", "/" + tune_baselib + "/ld.so.1", d, secondonly=True)
            replace_lines("${S}/src/arch-mips.c", "/lib64/ld.so.1", "/" + tune_baselib + "/ld.so.1", d)
            bits = 64
        elif arch.endswith("86"):
            replace_lines("${S}/src/arch-i386.c", "/lib/ld-linux.so.2", "/" + tune_baselib + "/ld-linux.so.2", d)
        if bits == 32 and tune_baselib != "lib":
            replace_lines_rtld("${S}/src/rtld/rtld.c", "lib", tune_baselib, "else", d)
        if bits == 64 and tune_baselib != "lib64":
            replace_lines_rtld("${S}/src/rtld/rtld.c", "lib64", tune_baselib, "use_64bit", d)
}

python () {
    overrides = d.getVar("OVERRIDES").split(":")
    if "class-target" in overrides:
        bb.build.addtask('do_linkerpaths', 'do_configure', 'do_patch', d)
}

do_configure_prepend () {
        # Disable documentation!
        echo "all:" > ${S}/doc/Makefile.am
}

do_install_append () {
	install -d ${D}${sysconfdir}/cron.daily ${D}${sysconfdir}/default ${D}${sysconfdir}/rpm
	install -m 0644 ${WORKDIR}/prelink.conf ${D}${sysconfdir}/prelink.conf
	install -m 0644 ${WORKDIR}/prelink.cron.daily ${D}${sysconfdir}/cron.daily/prelink
	install -m 0644 ${WORKDIR}/prelink.default ${D}${sysconfdir}/default/prelink
	install -m 0644 ${WORKDIR}/macros.prelink ${D}${sysconfdir}/rpm/macros.prelink
}

# If we ae doing a cross install, we want to avoid prelinking.
# Prelinking during a cross install should be handled by the image-prelink
# bbclass.  If the user desires this to run on the target at first boot
# they will need to create a custom boot script.
pkg_postinst_prelink() {
#!/bin/sh

if [ "x$D" != "x" ]; then
  exit 0
fi

prelink -a
}

pkg_prerm_prelink() {
#!/bin/sh

if [ "x$D" != "x" ]; then
  exit 1
fi

prelink -au
}