2 # Populated ${STAGING} using packages
4 # To use it add that line to conf/local.conf:
6 # INHERIT += "packaged-staging"
8 # You also need ipkg-cl and ipkg-make-index installed on your host
9 # put stage-manager and ipkg-build from org.openembedded.packaged-staging/contrib/ in your $PATH
12 # * does not distinguish between -native, -cross and other packages
15 # * also build a feed for native and cross packages
16 # * make package detection a bit smarter (search for compatible archs)
17 # * make do_clean clean staging as well
20 # This class will have two modes of operation:
21 # PSTAGE_MODE = 'repopulate': repopulated staging from scratch for each packages
22 # PSTAGE_MODE = 'append': append each package to staging (current behaviour)
26 DEPLOY_DIR_PSTAGE = "${DEPLOY_DIR}/pstage"
28 PSTAGE_BUILD_CMD = "${IPKGBUILDCMD}"
29 PSTAGE_INSTALL_CMD = "ipkg-cl install -force-depends -f ${DEPLOY_DIR_PSTAGE}/ipkg.conf -o "
30 PSTAGE_UPDATE_CMD = "ipkg-cl update -f ${DEPLOY_DIR_PSTAGE}/ipkg.conf -o "
31 PSTAGE_LIST_CMD = "ipkg-cl list_installed -f ${DEPLOY_DIR_PSTAGE}/ipkg.conf -o "
32 PSTAGE_PKGNAME = "staging-${PN}_${PV}-${PR}_${PACKAGE_ARCH}.ipk"
33 PCROSS_PKGNAME = "cross-${PN}_${PV}-${PR}_${BUILD_ARCH}.ipk"
35 SPAWNFILE = "${STAGING_DIR}/pkgmaps/${P}-${PR}.spawn"
38 PSTAGE_TMPDIR_STAGE = ${TMPDIR}/tmp-staging
39 PSTAGE_TMPDIR_CROSS = ${TMPDIR}/tmp-cross
41 STAGING_BASEDIR = "${STAGING_LIBDIR}/.."
43 PACKAGEFUNCS += "do_write_ipk_list"
45 python do_write_ipk_list () {
47 ipkdir = bb.data.getVar('DEPLOY_DIR_IPK', d, 1)
48 stagingdir = bb.data.getVar('STAGING_DIR', d, 1)
49 tmpdir = bb.data.getVar('TMPDIR', d, 1)
50 p = bb.data.getVar('P', d, 1)
51 pr = bb.data.getVar('PR', d, 1)
53 packages = bb.data.getVar('PACKAGES', d, 1)
55 bb.debug(1, "PACKAGES not defined, nothing to package")
59 bb.debug(1, "No packages; nothing to do")
62 # Generate ipk.conf if it or the stamp doesnt exist
63 listfile = os.path.join(stagingdir,"pkgmaps","%s-%s.spawn" % ( p , pr ))
64 os.system('mkdir -p ' + stagingdir + '/pkgmaps')
65 if not os.access(listfile, os.R_OK):
66 os.system('rm -f ' + listfile)
67 f = open(listfile,"w")
68 for spawn in packages.split():
69 #check if the packagename has changed due to debian shlib renaming
70 localdata = bb.data.createCopy(d)
71 pkgname = bb.data.getVar('PKG_%s' % spawn, localdata, 1)
74 f.write("%s\n" % pkgname)
80 """clear the build and temp directories"""
81 stagepkg = bb.data.expand("${DEPLOY_DIR_PSTAGE}/${PSTAGE_PKGNAME}", d)
82 if stagepkg == '//': raise bb.build.FuncFailed("wrong DATADIR")
83 bb.note("removing " + stagepkg)
84 os.system('rm -rf ' + stagepkg)
90 stage-manager -p ${STAGING_DIR} -c ${DEPLOY_DIR_PSTAGE}/staging-stamp-cache -u
92 stage-manager -p ${CROSS_DIR} -c ${DEPLOY_DIR_PSTAGE}/cross-stamp-cache -u
94 if [ ! -e ${STAGING_BASEDIR} ]; then
95 mkdir -p ${STAGING_BASEDIR}
98 if [ ! -e ${DEPLOY_DIR_PSTAGE} ]; then
99 mkdir -p ${DEPLOY_DIR_PSTAGE}
102 if [ -e ${STAGING_BASEDIR}/usr ]; then
103 oenote "${STAGING_BASEDIR}/usr already present, leaving it alone"
105 oenote "${STAGING_BASEDIR}/usr not present, symlinking it"
106 ln -s ${STAGING_BASEDIR}/ ${STAGING_BASEDIR}/usr
109 #assemble appropriate ipkg.conf
110 if [ -e ${DEPLOY_DIR_PSTAGE}/ipkg.conf ]; then
111 rm ${DEPLOY_DIR_PSTAGE}/ipkg.conf
114 ipkgarchs="${BUILD_ARCH} all any noarch ${TARGET_ARCH} ${IPKG_ARCHS} ${IPKG_EXTRA_ARCHS} ${MACHINE}"
116 for arch in $ipkgarchs; do
117 echo "arch $arch $priority" >> ${DEPLOY_DIR_PSTAGE}/ipkg.conf
118 priority=$(expr $priority + 5)
120 echo "src oe file:${DEPLOY_DIR_IPK}" >> ${DEPLOY_DIR_PSTAGE}/ipkg.conf
122 cd ${DEPLOY_DIR_IPK} && rm *${BUILD_ARCH}.ipk -f ; ipkg-make-index -p Packages . ; cd ${OLD_PWD}
123 ${PSTAGE_UPDATE_CMD} ${STAGING_BASEDIR}
125 #check for generated packages
126 if [ -e ${SPAWNFILE} ]; then
127 oenote "List of spawned packages found: ${P}.spawn"
128 for spawn in `cat ${SPAWNFILE} | grep -v locale | grep -v dbg | grep -v gconv | grep -v charmap` ; do \
129 if [ -e ${DEPLOY_DIR_IPK}/${spawn}_* ]; then
130 ${PSTAGE_INSTALL_CMD} ${STAGING_BASEDIR} ${spawn}
131 # clean up .la files to avoid having references to the builddirs in the binaries
132 for lafile in ${STAGING_LIBDIR}/*.la ; do \
133 sed -i s:installed=yes:installed=no:g ${lafile} || true
136 #fix up linker script to poin to staging
137 if [ -e ${STAGING_LIBDIR}/libc.so ]; then
138 sed -i s:\ /lib:\ ${STAGING_LIBDIR}:g ${STAGING_LIBDIR}/libc.so
139 sed -i s:\ /usr/lib:\ ${STAGING_LIBDIR}:g ${STAGING_LIBDIR}/libc.so
142 oenote "${spawn} not found, probably empty package"
147 oenote "Spawn file not found!"
150 if [ -e ${DEPLOY_DIR_PSTAGE}/${PCROSS_PKGNAME} ]; then
151 oenote "Cross stuff already packaged, using that instead"
152 ${PSTAGE_INSTALL_CMD} ${CROSS_DIR} ${DEPLOY_DIR_PSTAGE}/${PCROSS_PKGNAME}
155 if [ -e ${DEPLOY_DIR_PSTAGE}/${PSTAGE_PKGNAME} ]; then
156 oenote "Staging stuff already packaged, using that instead"
157 ${PSTAGE_INSTALL_CMD} ${STAGING_DIR} ${DEPLOY_DIR_PSTAGE}/${PSTAGE_PKGNAME}
162 mkdir -p ${STAGING_BINDIR}
163 mkdir -p ${STAGING_LIBDIR}
164 mkdir -p ${STAGING_INCDIR}
165 mkdir -p ${STAGING_DATADIR}/aclocal
170 mkdir -p ${DEPLOY_DIR_PSTAGE}
172 # list the packages currently installed in staging
173 ${PSTAGE_LIST_CMD} ${STAGING_DIR} | awk '{print $1}' > ${DEPLOY_DIR_PSTAGE}/installed-staging_list
174 ${PSTAGE_LIST_CMD} ${CROSS_DIR} | awk '{print $1}' > ${DEPLOY_DIR_PSTAGE}/installed-cross_list
177 rm -rf ${PSTAGE_TMPDIR_STAGE}
178 stage-manager -p ${STAGING_DIR} -c ${DEPLOY_DIR_PSTAGE}/staging-stamp-cache -u -d ${PSTAGE_TMPDIR_STAGE}
182 if [ $rc == 5 ]; then
184 #make a package for staging
185 mkdir -p ${PSTAGE_TMPDIR_STAGE}/CONTROL
187 echo "Package: staging-${PN}" > ${PSTAGE_TMPDIR_STAGE}/CONTROL/control
188 echo "Version: ${PV}-${PR}" >> ${PSTAGE_TMPDIR_STAGE}/CONTROL/control
189 echo "Description: ${DESCRIPTION}" >> ${PSTAGE_TMPDIR_STAGE}/CONTROL/control
190 echo "Section: ${SECTION}" >> ${PSTAGE_TMPDIR_STAGE}/CONTROL/control
191 echo "Priority: Optional" >> ${PSTAGE_TMPDIR_STAGE}/CONTROL/control
192 echo "Maintainer: ${MAINTAINER}" >> ${PSTAGE_TMPDIR_STAGE}/CONTROL/control
193 echo "Architecture: ${PACKAGE_ARCH}" >> ${PSTAGE_TMPDIR_STAGE}/CONTROL/control
194 echo "Source: ${SRC_URI}" >> ${PSTAGE_TMPDIR_STAGE}/CONTROL/control
196 ${PSTAGE_BUILD_CMD} ${PSTAGE_TMPDIR_STAGE} ${DEPLOY_DIR_PSTAGE}
198 ${PSTAGE_INSTALL_CMD} ${STAGING_DIR} ${DEPLOY_DIR_PSTAGE}/${PSTAGE_PKGNAME}
202 rm -rf ${PSTAGE_TMPDIR_CROSS}
203 stage-manager -p ${CROSS_DIR} -c ${DEPLOY_DIR_PSTAGE}/cross-stamp-cache -u -d ${PSTAGE_TMPDIR_CROSS}
207 if [ $rc == 5 ]; then
209 #make a package for cross
210 mkdir -p ${PSTAGE_TMPDIR_CROSS}/CONTROL
212 echo "Package: cross-${PN}" > ${PSTAGE_TMPDIR_CROSS}/CONTROL/control
213 echo "Version: ${PV}-${PR}" >> ${PSTAGE_TMPDIR_CROSS}/CONTROL/control
214 echo "Description: ${DESCRIPTION}" >> ${PSTAGE_TMPDIR_CROSS}/CONTROL/control
215 echo "Section: ${SECTION}" >> ${PSTAGE_TMPDIR_CROSS}/CONTROL/control
216 echo "Priority: Optional" >> ${PSTAGE_TMPDIR_CROSS}/CONTROL/control
217 echo "Maintainer: ${MAINTAINER}" >> ${PSTAGE_TMPDIR_CROSS}/CONTROL/control
218 echo "Architecture: ${BUILD_ARCH}" >> ${PSTAGE_TMPDIR_CROSS}/CONTROL/control
219 echo "Source: ${SRC_URI}" >> ${PSTAGE_TMPDIR_CROSS}/CONTROL/control
221 ${PSTAGE_BUILD_CMD} ${PSTAGE_TMPDIR_CROSS} ${DEPLOY_DIR_PSTAGE}
223 ${PSTAGE_INSTALL_CMD} ${CROSS_DIR} ${DEPLOY_DIR_PSTAGE}/${PCROSS_PKGNAME}