aboutsummaryrefslogtreecommitdiffstats
path: root/meta-oe/recipes-core/llvm/llvm2.inc
blob: 5ae993afd1856c1bdd116b565d87f0f7886e69bc (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
179
180
181
182
183
184
185
186
187
188
189
DEPENDS = "llvm${LLVM_RELEASE}-native llvm-common"
DEPENDS_virtclass-native = "llvm-common-native cmake-native"

SRC_URI = "http://llvm.org/releases/${PV}/llvm-${PV}.tgz"
S = "${WORKDIR}/llvm-${PV}"

LIC_FILES_CHKSUM = "file://LICENSE.TXT;md5=0ac5f799a2d89477c75b0a378b221855"

inherit cmake

# Defines the LLVM supported arches. By now we always build either for ${BUILD}
# (native) or ${TARGET}. In the future it may make sense to enable all backends
# for the non-native build. The decision which backends are used is made by
# the 3rd party program or library that uses llvm anyway.
LLVM_ARCH = "${@get_llvm_arch(d)}"

# This is used for generating the install directory for the llvm libraries,
# binaries and headers. It makes side by side installation of those possible.
LLVM_RELEASE = "${PV}"

BBCLASSEXTEND = "native"

LLVM_BUILD_DIR = "${B}/build"
LLVM_INSTALL_DIR = "${B}/llvm-install"

# llvm *must* be built out of tree
OECMAKE_SOURCEPATH = ".."
OECMAKE_BUILDPATH = "build"

# other architectures require X86 available,
LLVM_EXTRA_ARCH = "X86;"
LLVM_EXTRA_ARCH_x86 = ""
LLVM_EXTRA_ARCH_x86-64 = ""

EXTRA_OECMAKE = "\
    -DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/${LLVM_DIR}/tblgen \
    -DLLVM_TARGETS_TO_BUILD="${LLVM_EXTRA_ARCH}${LLVM_ARCH}" \
    -DCMAKE_LINKER:FILEPATH=${LD} \
    -DCMAKE_AR:FILEPATH=${AR} \
    -DCMAKE_OBJCOPY:FILEPATH=${OBJCOPY} \
    -DCMAKE_OBJDUMP:FILEPATH=${OBJDUMP} \
    -DCMAKE_RANLIB:FILEPATH=${RANLIB} \
    -DCMAKE_STRIP:FILEPATH=${STRIP} \
    -DNM_PATH:FILEPATH=${NM} \
    -DLLVM_ENABLE_PIC:BOOL=ON \
    -DLLVM_TARGET_ARCH:STRING=${LLVM_ARCH} \
    -DLLVM_ENABLE_ASSERTIONS:BOOL=ON \
    -DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo \
    -DBUILD_SHARED_LIBS:BOOL=ON \
    -DCMAKE_SKIP_BUILD_RPATH:BOOL=ON \
"

# We need to reset this to avoid breakage as we build out of tree
TOOLCHAIN_OPTIONS = ""

PACKAGES_DYNAMIC = "llvm-*"

# the difference to the non-native build is that we do not need
# to declare the location of the tblgen executable.
EXTRA_OECMAKE_virtclass-native = "\
    -DLLVM_TARGETS_TO_BUILD=${LLVM_ARCH} \
    -DCMAKE_LINKER:FILEPATH=${LD} \
    -DCMAKE_AR:FILEPATH=${AR} \
    -DCMAKE_OBJCOPY:FILEPATH=${OBJCOPY} \
    -DCMAKE_OBJDUMP:FILEPATH=${OBJDUMP} \
    -DCMAKE_RANLIB:FILEPATH=${RANLIB} \
    -DCMAKE_STRIP:FILEPATH=${STRIP} \
    -DNM_PATH:FILEPATH=${NM} \
"

PACKAGES_virtclass-native = ""

PACKAGES_DYNAMIC_virtclass-native = ""

python populate_packages_prepend () {
    libllvm_libdir = bb.data.expand('${libdir}/${LLVM_DIR}', d)
    do_split_packages(d, libllvm_libdir, '^lib(.*)\.so$', 'libllvm-%s', 'Split package for %s', allow_dirs=True)
}

FILES_${PN} = ""
ALLOW_EMPTY_${PN} = "1"

base_do_compile_prepend() {
    # Avoid *** No rule to make target `native/bin/tblgen', needed by `include/llvm/Intrinsics.gen.tmp'
    oe_runmake tblgen
}

do_install() {
    # Install into a private directory to be able to reorganize the files.
    cd ${LLVM_BUILD_DIR}
    oe_runmake DESTDIR=${LLVM_INSTALL_DIR} install

    # Create our custom target directories
    install -d ${D}${bindir}/${LLVM_DIR}
    install -d ${D}${includedir}/${LLVM_DIR}
    install -d ${D}${libdir}/${LLVM_DIR}

    # Move headers into their own directory
    cp -R ${LLVM_INSTALL_DIR}/${prefix}/include/llvm \
    ${D}${includedir}/${LLVM_DIR}/
    cp -R ${LLVM_INSTALL_DIR}/${prefix}/include/llvm-c \
    ${D}${includedir}/${LLVM_DIR}/

    find ${LLVM_INSTALL_DIR}/${prefix}/lib -name "*" -maxdepth 1 -exec \
    install {} ${D}${libdir}/${LLVM_DIR} \;

    # I dont know another way out. Binaries are installed into a special subdir
    find ${LLVM_INSTALL_DIR}/${prefix}/bin -name "*" -maxdepth 1 -exec \
    install {} ${D}${bindir}/${LLVM_DIR} \;

    # LLVM does not install this by default.
    install bin/tblgen ${D}${bindir}/${LLVM_DIR}
}

SYSROOT_PREPROCESS_FUNCS_append_class-target = " llvm_sysroot_preprocess"

llvm_sysroot_preprocess() {
    cd ${LLVM_BUILD_DIR}

    # Fix the paths in the config script to make it find the binaries and
    # library files. Doing so allows 3rd party configure scripts working
    # unmodified.
    sed -e's!my.*ABS_RUN_DIR =.*!my $ABS_RUN_DIR = "${STAGING_DIR_TARGET}";!' \
        -e's!my.*INCLUDEDIR =.*!my $INCLUDEDIR = "${STAGING_INCDIR}/${LLVM_DIR}";!' \
        -e's!my.*LIBDIR.*!my $LIBDIR = "${STAGING_LIBDIR}/${LLVM_DIR}";!' \
        -e's!my.*BINDIR.*!my $BINDIR = "${STAGING_BINDIR}/${LLVM_DIR}";!' \
        bin/llvm-config > bin/llvm-config${LLVM_RELEASE}

        install -d ${SYSROOT_DESTDIR}${bindir_crossscripts}
        install -m 0755 bin/llvm-config${LLVM_RELEASE} ${SYSROOT_DESTDIR}${bindir_crossscripts}
}

do_install_virtclass-native() {
    # Install into a private directory to be able to reorganize the files.
    cd ${LLVM_BUILD_DIR}
    oe_runmake DESTDIR=${LLVM_INSTALL_DIR} install

    # Create our custom target directories
    install -d ${D}${bindir}/${LLVM_DIR}
    install -d ${D}${includedir}/${LLVM_DIR}
    install -d ${D}${libdir}/${LLVM_DIR}

    # Move headers into their own directory
    cp -R ${LLVM_INSTALL_DIR}/${prefix}/include/llvm \
          ${D}${includedir}/${LLVM_DIR}/
    cp -R ${LLVM_INSTALL_DIR}/${prefix}/include/llvm-c \
          ${D}${includedir}/${LLVM_DIR}/

    find ${LLVM_INSTALL_DIR}/${prefix}/lib -name "*" -maxdepth 1 -exec \
        install {} ${D}${libdir}/${LLVM_DIR} \;

    # I dont know another way out. Binaries are installed into a special subdir
    find ${LLVM_INSTALL_DIR}/${prefix}/bin -name "*" -maxdepth 1 -exec \
        install {} ${D}${bindir}/${LLVM_DIR} \;

    # LLVM does not install this by default.
    install bin/tblgen ${D}${bindir}/${LLVM_DIR}

    # Fix the paths in the config script to make it find the binaries and
    # library files. Doing so allows 3rd party configure scripts working
    # unmodified.
    sed -e's!my.*ABS_RUN_DIR =.*!my $ABS_RUN_DIR = "${STAGING_DIR_TARGET}";!' \
        -e's!my.*INCLUDEDIR =.*!my $INCLUDEDIR = "${STAGING_INCDIR}/${LLVM_DIR}";!' \
        -e's!my.*LIBDIR.*!my $LIBDIR = "${STAGING_LIBDIR}/${LLVM_DIR}";!' \
        -e's!my.*BINDIR.*!my $BINDIR = "${STAGING_BINDIR}/${LLVM_DIR}";!' \
        bin/llvm-config > bin/llvm-config${LLVM_RELEASE}

    install -d ${D}${bindir}
    install -m 0755 bin/llvm-config${LLVM_RELEASE} ${D}${bindir}
}

# Retrieve the target in a way that is compatible to the arch
# value in llvm (>= 2.5)
def get_llvm_arch(d):
    import bb;

    arch = bb.data.getVar('TARGET_ARCH', d, 1)
    if arch == "x86_64" or arch == "i486" or arch == "i586" or arch == "i686":
        arch = "X86"
    elif arch == "arm":
        arch = "ARM"
    elif arch == "mipsel" or arch == "mips":
        arch = "mips"
    elif arch == "powerpc" or arch == "powerpc64":
        arch = "PowerPC"
    else:
        bb.warn("%s does not support %s yet" % (bb.data.getVar('PN', d, 1), arch) );

    return arch