packaged-staging.bbclass: Add a class to put staging/ under package management
[vuplus_openembedded] / classes / packaged-staging.bbclass
1 #
2 # Populated ${STAGING} using packages
3 #
4 # To use it add that line to conf/local.conf:
5 #
6 # INHERIT += "packaged-staging"
7 #
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
10
11 # BUGS:
12 # * does not distinguish between -native, -cross and other packages
13
14 # TODO:
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
18
19 # Summary:
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)
23
24 inherit package
25
26 DEPLOY_DIR_PSTAGE       = "${DEPLOY_DIR}/pstage" 
27
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"
34
35 SPAWNFILE               = "${STAGING_DIR}/pkgmaps/${P}-${PR}.spawn"
36 SPAWNIPK                = ${spawn}
37
38 PSTAGE_TMPDIR_STAGE     = ${TMPDIR}/tmp-staging
39 PSTAGE_TMPDIR_CROSS     = ${TMPDIR}/tmp-cross
40
41 STAGING_BASEDIR         = "${STAGING_LIBDIR}/.."
42
43 PACKAGEFUNCS += "do_write_ipk_list"
44
45 python do_write_ipk_list () {
46         import os, sys
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)
52
53         packages = bb.data.getVar('PACKAGES', d, 1)
54         if not packages:
55                 bb.debug(1, "PACKAGES not defined, nothing to package")
56                 return
57
58         if packages == []:
59                 bb.debug(1, "No packages; nothing to do")
60                 return
61
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)
72                         if not pkgname:
73                                 pkgname = spawn
74                         f.write("%s\n" % pkgname)
75                 f.close()
76 }
77
78
79 do_clean_append() {
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)
85 }
86
87
88 do_stage_prepend() {
89
90         stage-manager -p ${STAGING_DIR} -c ${DEPLOY_DIR_PSTAGE}/staging-stamp-cache -u
91
92         stage-manager -p ${CROSS_DIR} -c ${DEPLOY_DIR_PSTAGE}/cross-stamp-cache -u
93
94         if [ ! -e ${STAGING_BASEDIR} ]; then
95                 mkdir -p ${STAGING_BASEDIR}
96         fi
97
98         if [ ! -e ${DEPLOY_DIR_PSTAGE} ]; then
99                 mkdir -p ${DEPLOY_DIR_PSTAGE}
100         fi
101
102         if [ -e ${STAGING_BASEDIR}/usr ]; then
103                 oenote "${STAGING_BASEDIR}/usr already present, leaving it alone"
104         else
105                 oenote "${STAGING_BASEDIR}/usr not present, symlinking it"
106                 ln -s ${STAGING_BASEDIR}/ ${STAGING_BASEDIR}/usr
107         fi
108
109         #assemble appropriate ipkg.conf
110         if [ -e ${DEPLOY_DIR_PSTAGE}/ipkg.conf ]; then
111                 rm ${DEPLOY_DIR_PSTAGE}/ipkg.conf
112         fi
113
114         ipkgarchs="${BUILD_ARCH} all any noarch ${TARGET_ARCH} ${IPKG_ARCHS} ${IPKG_EXTRA_ARCHS} ${MACHINE}"
115         priority=1
116         for arch in $ipkgarchs; do
117                 echo "arch $arch $priority" >> ${DEPLOY_DIR_PSTAGE}/ipkg.conf
118                 priority=$(expr $priority + 5)
119         done
120         echo "src oe file:${DEPLOY_DIR_IPK}" >> ${DEPLOY_DIR_PSTAGE}/ipkg.conf 
121         export OLD_PWD=`pwd`
122         cd ${DEPLOY_DIR_IPK} && rm *${BUILD_ARCH}.ipk -f ; ipkg-make-index -p Packages . ; cd ${OLD_PWD}
123         ${PSTAGE_UPDATE_CMD} ${STAGING_BASEDIR}
124
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
134                                 done
135
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
140                                 fi
141                         else
142                                 oenote "${spawn} not found, probably empty package"
143                         fi
144                 done
145                 exit 0
146         else
147                 oenote "Spawn file not found!"
148         fi
149
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}
153         fi
154
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}
158                 exit 0      
159         fi
160
161
162         mkdir -p ${STAGING_BINDIR}
163         mkdir -p ${STAGING_LIBDIR}
164         mkdir -p ${STAGING_INCDIR}
165         mkdir -p ${STAGING_DATADIR}/aclocal
166 }
167
168 do_stage_append() {
169
170         mkdir -p ${DEPLOY_DIR_PSTAGE}
171
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
175
176         set +e
177         rm -rf ${PSTAGE_TMPDIR_STAGE}
178         stage-manager -p ${STAGING_DIR} -c ${DEPLOY_DIR_PSTAGE}/staging-stamp-cache -u -d ${PSTAGE_TMPDIR_STAGE}
179         rc=$?
180         set -e
181
182         if [ $rc == 5 ]; then
183
184                 #make a package for staging
185                 mkdir -p ${PSTAGE_TMPDIR_STAGE}/CONTROL
186
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
195
196                 ${PSTAGE_BUILD_CMD} ${PSTAGE_TMPDIR_STAGE} ${DEPLOY_DIR_PSTAGE}
197
198                 ${PSTAGE_INSTALL_CMD} ${STAGING_DIR} ${DEPLOY_DIR_PSTAGE}/${PSTAGE_PKGNAME}
199         fi
200
201         set +e
202         rm -rf ${PSTAGE_TMPDIR_CROSS}
203         stage-manager -p ${CROSS_DIR} -c ${DEPLOY_DIR_PSTAGE}/cross-stamp-cache -u -d ${PSTAGE_TMPDIR_CROSS}
204         rc=$?
205         set -e
206
207         if [ $rc == 5 ]; then
208
209                 #make a package for cross
210                 mkdir -p ${PSTAGE_TMPDIR_CROSS}/CONTROL
211
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
220         
221                 ${PSTAGE_BUILD_CMD} ${PSTAGE_TMPDIR_CROSS} ${DEPLOY_DIR_PSTAGE}
222
223                 ${PSTAGE_INSTALL_CMD} ${CROSS_DIR} ${DEPLOY_DIR_PSTAGE}/${PCROSS_PKGNAME}
224         fi
225 }
226