vbuilder.sh.in 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914
  1. #!/bin/bash
  2. # -*- coding: utf-8-unix -*-
  3. Usage_C(){
  4. cat<<EOF
  5. Usage: $(basename $0) {--version [version]} {--arch [arch]} {--category [categories]} {--dist-upgrade} {--target [target]} {--with-compat32} {--sign} {--no-install} {--bootstrap-dir [directory]} {--cache-dir [directory]} {--built-rpms-dir [directory]} {clean|build|build-rpm [src.rpm]|install-rpm [arch.rpm|package]|remove-rpm [package]|show-info}
  6. Options:
  7. --version: set [version] (default: ${DEFAULT_VERSION})
  8. --arch: set [arch] (default: $(uname -i))
  9. --category: set [categories] (default: ${CATEGORIES})
  10. --dist-upgrade: make VineSeed bootstrap via ${STABLE_VERSION}
  11. --unionfs: cover a bootstrap with unionfs
  12. --target: build rpms with [target]
  13. --with-compat32: build rpms with compat32 on boostrap
  14. --sign: sign built rpms
  15. --no-install: build only a source rpm - do NOT install a built rpm
  16. --bootstrap-dir: set a bootstrap directory (default: ${VBOOTSTRAP_DIR})
  17. --cache-dir: set a directory to cache rpms (default: ${CACHE_DIR})
  18. --built-rpms-dir: set a directory to store built rpms in chroot (default: ${BUILT_RPMS_DIR})
  19. Actions:
  20. clean: clean the boostrap of [version]
  21. build: build a boostrap of [version]
  22. build-rpm: build [src.rpm] on a boostrap
  23. install-rpm: install [arch.rpm|package] on a boostrap
  24. remove-rpm: remove [package] on a boostrap
  25. show-info: show basic informations and logs in chroot
  26. For example,
  27. * make a clean/plain build environment on the current archtecture:
  28. $(basename $0) clean build
  29. * build rpms from the specified source rpm:
  30. $(basename $0) build-rpm [src.rpm]
  31. * make a plain build environment for Vine Linux 4.2:
  32. $(basename $0) --version 4.2 clean build
  33. * make a i386 chroot on x86_64:
  34. $(basename $0) --arch i386 clean build
  35. * build a kernel package with target i686:
  36. $(basename $0) --target i686 build-rpm [kernel src.rpm]
  37. * build a compat32 package:
  38. $(basename $0) --arch i386 --with-compat32 build-rpm [src.rpm]
  39. $(/usr/sbin/vbootstrap | sed -e s/^Usage:.*// -e s/^E:.*//)
  40. EOF
  41. }
  42. Usage_ja(){
  43. Usage_C
  44. }
  45. Msg_MissingParameter_C(){
  46. local para=$1
  47. cat<<EOF
  48. E: Missing some parameters after ${para}
  49. EOF
  50. }
  51. Msg_MissingParameter_ja(){
  52. local para=$1
  53. cat<<EOF
  54. E: ${para} 以後のいくつかの引数に間違いがあります
  55. EOF
  56. }
  57. Msg_NoSuchCategoryExists_C(){
  58. local para=$1
  59. cat<<EOF
  60. E: No such category exists: $para
  61. EOF
  62. }
  63. Msg_NoSuchCategoryExists_ja(){
  64. local para=$1
  65. cat<<EOF
  66. E: そのようなカテゴリは存在しません: $para
  67. EOF
  68. }
  69. Msg_GiveMoreOptions_C(){
  70. cat<<EOF
  71. E: You can give no more options after actions
  72. EOF
  73. }
  74. Msg_GiveNoMoreOptions_ja(){
  75. cat<<EOF
  76. E: 動作の以後にオプションを与えられません
  77. EOF
  78. }
  79. Msg_GiveAtLeastOneAction_C(){
  80. cat<<EOF
  81. E: You must give at least one action
  82. EOF
  83. }
  84. Msg_GiveAtLeastOneAction_ja(){
  85. cat<<EOF
  86. E: 少なくとも1つの動作を与えなければなりません
  87. EOF
  88. }
  89. Msg_NoSupportVARCH_C(){
  90. cat<<EOF
  91. E: arch ${VARCH} is NOT supported on $(uname -i)
  92. EOF
  93. }
  94. Msg_NoSupportVARCH_ja(){
  95. cat<<EOF
  96. E: ${VARCH} アーキテクチャは $(uname -i) 上で非サポートです
  97. EOF
  98. }
  99. Msg_NoSupportVERSION_C(){
  100. cat<<EOF
  101. E: ${VERSION} is NOT supported
  102. EOF
  103. }
  104. Msg_NoSupportVERSION_ja(){
  105. cat<<EOF
  106. E: バージョン ${VERSION} は非サポートです
  107. EOF
  108. }
  109. Msg_NoSupportDistUpgradeVERSION_C(){
  110. cat<<EOF
  111. E: version ${VERSION} does not support --dist-upgrade option
  112. EOF
  113. }
  114. Msg_NoSupportDistUpgradeVERSION_ja(){
  115. cat<<EOF
  116. E: バージョン ${VERSION} では --dist-upgrade オプションはサポートされていません
  117. EOF
  118. }
  119. Msg_NoSupportTARGET_C(){
  120. cat<<EOF
  121. E: rpm build target ${TARGET} is NOT supported
  122. EOF
  123. }
  124. Msg_NoSupportTARGET_ja(){
  125. cat<<EOF
  126. E: rpm ビルドターゲット ${TARGET} はサポートされていません
  127. EOF
  128. }
  129. Msg_NotPackageName_C(){
  130. local RPM_PKG=$1
  131. cat<<EOF
  132. E: $RPM_PKG is not a package name
  133. EOF
  134. }
  135. Msg_NotPackageName_ja(){
  136. local RPM_PKG=$1
  137. cat<<EOF
  138. E: $RPM_PKG はパッケージ名でありません
  139. EOF
  140. }
  141. Msg_NotSourceRPM_C(){
  142. local RPM_PKG=$1
  143. cat<<EOF
  144. E: $RPM_PKG is not a source RPM package
  145. EOF
  146. }
  147. Msg_NotSourceRPM_ja(){
  148. local RPM_PKG=$1
  149. cat<<EOF
  150. E: $RPM_PKG はソース RPM パッケージでありません
  151. EOF
  152. }
  153. Msg_SUDO_USERisEmpty_C(){
  154. cat<<EOF
  155. W: \$SUDO_USER is empty
  156. EOF
  157. }
  158. Msg_SUDO_USERisEmpty_ja(){
  159. cat<<EOF
  160. W: \$SUDO_USER が空です
  161. EOF
  162. }
  163. ##############################################################################
  164. check-parameter(){
  165. [ -z "$*" ] && Usage_$LOCALE && return 1
  166. while [ ! -z "$*" ]; do
  167. case $1 in
  168. --help|help)
  169. Usage_$LOCALE
  170. return 1
  171. ;;
  172. --version|--arch|--category|--target|--bootstrap-dir|--cache-dir|--built-rpms-dir)
  173. [ $with_actions -eq 1 ] && \
  174. Msg_GiveNoMoreOptions_$LOCALE && return 1
  175. shift
  176. check-next-parameter $1 || return 1
  177. ;;
  178. --dist-upgrade|--unionfs|--with-compat32|--sign|--no-install)
  179. [ $with_actions -eq 1 ] && \
  180. Msg_GiveNoMoreOptions_$LOCALE && return 1
  181. ;;
  182. --build-rpm|build-rpm|--install-rpm|install-rpm|--remove-rpm|remove-rpm)
  183. with_actions=1
  184. shift
  185. check-next-parameter $1 || return 1
  186. ;;
  187. --build|build|--clean|clean|--show-info|show-info)
  188. with_actions=1
  189. ;;
  190. *)
  191. Msg_MissingParameter_$LOCALE $1
  192. return 1
  193. ;;
  194. esac
  195. shift
  196. done
  197. [ $with_actions -eq 0 ] && Msg_GiveAtLeastOneAction_$LOCALE && return 1
  198. return 0
  199. }
  200. check-next-parameter(){
  201. local arg=$1
  202. [ -z "${arg}" ] && Msg_MissingParameter_$LOCALE ${arg} && return 1
  203. [ $(echo ${arg} | grep '^-') ] && \
  204. Msg_MissingParameter_$LOCALE ${arg} && return 1
  205. return 0
  206. }
  207. setup-vbuilder(){
  208. ## load default settings
  209. VBUILDER_CONF=/etc/vbootstrap/vbuilder.conf
  210. if [ -r $VBUILDER_CONF ]; then
  211. . $VBUILDER_CONF
  212. [ $? -eq 1 ] && return 1
  213. fi
  214. [ -z "${DEFAULT_VERSION}" ] && \
  215. DEFAULT_VERSION=@@VBUILDER_DEFAULT_VERSION@@
  216. [ -z "${CATEGORIES}" ] && \
  217. CATEGORIES=@@VBUILDER_CATEGORIES@@
  218. [ -z "${VBOOTSTRAP_DIR}" ] && \
  219. VBOOTSTRAP_DIR=@@VBUILDER_VBOOTSTRAP_DIR@@
  220. [ -z "${CACHE_DIR}" ] && \
  221. CACHE_DIR=@@VBUILDER_CACHE_DIR@@
  222. [ -z "${BUILT_RPMS_DIR}" ] && \
  223. BUILT_RPMS_DIR=@@VBUILDER_BUILT_RPMS_DIR@@
  224. ## set default version for vbootstrap
  225. VERSION=$DEFAULT_VERSION
  226. ## set current stable relase version
  227. STABLE_VERSION=@@VBUILDER_STABLE_VERSION@@
  228. ## set locale
  229. case $LANG in
  230. ja*) LOCALE=ja ;;
  231. *) LOCALE=C ;;
  232. esac
  233. ## set boolian
  234. with_setup_vbootstrap=0
  235. with_dist_upgrade=0
  236. with_unionfs=0
  237. with_sign=0
  238. with_no_install=0
  239. with_actions=0
  240. with_category_main=0
  241. with_category_plus=0
  242. with_category_nonfree=0
  243. with_category_test=0
  244. with_category_proposed_updates=0
  245. with_category_security=0
  246. return 0
  247. }
  248. setup-vbootstrap(){
  249. if [ ${with_setup_vbootstrap} -eq 0 ]; then
  250. with_setup_vbootstrap=1
  251. ## check some directories
  252. ## Note: create $BUILT_RPMS_DIR in RPM_Build()
  253. [ -d $VBOOTSTRAP_DIR ] || mkdir -p $VBOOTSTRAP_DIR
  254. [ -d $CACHE_DIR ] || mkdir -p $CACHE_DIR
  255. ## check a chroot archtecture
  256. if [ -z ${VARCH} ]; then
  257. VARCH=$(uname -i)
  258. else
  259. case "${VARCH}" in
  260. i386|i686|x86_64)
  261. [ "$(uname -i)" = "ppc" ] && \
  262. Msg_NoSupportVARCH_$LOCALE && return 1
  263. ;;
  264. ppc)
  265. [ "$(uname -i)" = "i386" -o "$(uname -i)" = "i686" -o "$(uname -i)" = "x86_64" ] && \
  266. Msg_NoSupportVARCH_$LOCALE && return 1
  267. ;;
  268. esac
  269. fi
  270. ##!! 4.2 is NO support on VARCH=x86_64
  271. if [ "${VERSION}" = "4.2" -a "${VARCH}" = "x86_64" ]; then
  272. Msg_NoSupportVERSION_${LOCALE} && return 1
  273. fi
  274. ## support i386 chroot on x86_64 below:
  275. [ "${VARCH}" != "$(uname -i)" ] && VERSION=${VERSION}_${VARCH}
  276. ## check support ${VERSION}
  277. if [ -z "$(/usr/sbin/vbootstrap | sed -e s/^Usage:.*// -e s/^E:.*// | grep -m 1 ${VERSION})" ]; then
  278. Msg_NoSupportVERSION_$LOCALE && return 1
  279. fi
  280. ## check ${VERSION} equals VineSeed*, when with_dist_upgrade=1
  281. if [ $with_dist_upgrade -eq 1 ]; then
  282. if [ "$(echo ${VERSION} | sed -e "s/\(VineSeed\).*/\1/")" != "VineSeed" ]; then
  283. Msg_NoSupportDistUpgradeVERSION_$LOCALE && return 1
  284. fi
  285. fi
  286. ## set ${MAJOR_VERSION}
  287. MAJOR_VERSION=$(echo ${VERSION} | sed -e "s/_i[0-9]86//")
  288. ## check apt categories
  289. ## "main" category is unconditionally permited
  290. with_category_main=1
  291. for cat in $(echo ${CATEGORIES} | sed -e "s/,/ /"g); do
  292. case $cat in
  293. main)
  294. with_category_main=1
  295. ;;
  296. plus)
  297. with_category_plus=1
  298. ;;
  299. nonfree)
  300. with_category_nonfree=1
  301. ;;
  302. test)
  303. ## "test" category only exists in VineSeed
  304. [ "${MAJOR_VERSION}" = "VineSeed" ] || \
  305. Msg_NoSuchCategoryExists_$LOCALE ${cat} && return 1
  306. with_category_test=1
  307. ;;
  308. proposed-updates)
  309. ##!! "proposed-updates" category does not exist in 4.2
  310. [ "${MAJOR_VERSION}" = "4.2" ] && \
  311. Msg_NoSuchCategoryExists_$LOCALE ${cat} && return 1
  312. with_category_proposed_updates=1
  313. ;;
  314. security)
  315. ## "security" category does not exist in VineSeed
  316. [ "${MAJOR_VERSION}" = "VineSeed" ] && \
  317. Msg_NoSuchCategoryExists_$LOCALE ${cat} && return 1
  318. with_category_security=1
  319. ;;
  320. *)
  321. Msg_NoSuchCategoryExists_$LOCALE ${cat} && return 1
  322. ;;
  323. esac
  324. done
  325. ## check build target option ${TARGET}
  326. if [ ! -z "${TARGET}" ]; then
  327. RPM_TARGET_LIST="$(cat /usr/lib/rpm/rpmrc | grep arch_canon: | sed -e "s/arch_canon:[[:blank:]]*\(.*\):.*/\1/")"
  328. if [ -z "$(echo $RPM_TARGET_LIST | grep $TARGET)" ]; then
  329. Msg_NoSupportTARGET_$LOCALE && return 1
  330. fi
  331. fi
  332. ## set ${RPM_PKG_ARCH_LIST}
  333. RPM_PKG_ARCH_LIST="RPMS/i386 RPMS/i686 RPMS/x86_64 RPMS/ppc RPMS/noarch SRPMS"
  334. [ -z "${TARGET}" ] || \
  335. RPM_PKG_ARCH_LIST="RPMS/${TARGET} ${RPM_PKG_ARCH_LIST}"
  336. fi
  337. ## set global variables
  338. BUILD_ROOT=${VBOOTSTRAP_DIR}/${VERSION}
  339. BUILD_USER=vbuilder
  340. BUILD_DIR=/home/${BUILD_USER}/rpm
  341. UNIONFS_DIR=${VBOOTSTRAP_DIR}/unionfs/${VERSION}
  342. ARCHIVES_DIR=${BUILD_ROOT}/var/cache/apt/archives
  343. EXTERNAL_ARCHIVES_DIR=${CACHE_DIR}/${VERSION}/apt/archives
  344. VBUILDER_LOG=${BUILD_ROOT}/var/log/vbuilder.log
  345. __chroot_sh="/usr/sbin/chroot ${BUILD_ROOT} /bin/sh -c"
  346. mkdir -p $VBOOTSTRAP_DIR
  347. return 0
  348. }
  349. setup-vbootstrap-rpm(){
  350. setup-vbootstrap || return 1
  351. ## check ${BUILD_ROOT}
  352. [ -d ${BUILD_ROOT} ] || Build
  353. DIST_RELEASE=$(cat ${BUILD_ROOT}/etc/vine-release | cut -f3 -d" " | cut -f1 -d.)
  354. if [ -f $RPM_PKG ]; then
  355. BASE_RPM_PKG=$(basename $RPM_PKG)
  356. cp -f $RPM_PKG $BUILD_ROOT${BUILD_DIR}
  357. else
  358. BASE_RPM_PKG=$RPM_PKG
  359. fi
  360. return 0
  361. }
  362. ## recover apt-get data on host/chroot
  363. apt-get-update(){
  364. case $1 in
  365. --host)
  366. echo -n "apt-get update on host ... "
  367. apt-get -qq update > /dev/null 2>&1
  368. echo "done."
  369. ;;
  370. --chroot)
  371. echo -n "apt-get update on chroot ... "
  372. $__chroot_sh 'apt-get -qq update' > /dev/null 2>&1
  373. echo "done."
  374. ;;
  375. *)
  376. echo apt-get-update: unknown option $1
  377. exit 1
  378. ;;
  379. esac
  380. }
  381. ## mount-chroot {|--umount} [file system|name]
  382. ## support file systems: /home /tmp /sys /proc /dev/shm /dev/pts /dev
  383. ## support name: vfs archives_dir
  384. ## NOTE: /tmp needs for applications which use X
  385. ## vfs is virtual file systems
  386. ## archives_dir uses to mount ${EXTERNAL_ARCHIVES_DIR} to ${ARCHIVES_DIR}
  387. ## unionfs_dir covers ${BUILD_ROOT} with unionfs
  388. mount-chroot(){
  389. if [ "$1" = "--umount" ]; then
  390. mount-chroot-umount $2 || return 1
  391. else
  392. mount-chroot-mount $1 || return 1
  393. fi
  394. return 0
  395. }
  396. ## mount-chroot-umount [file system|name]
  397. mount-chroot-umount(){
  398. local fs=$1
  399. case $fs in
  400. /home|/tmp|/sys|/proc|/dev/shm|/dev/pts|/dev)
  401. [ -d ${BUILD_ROOT}${fs} ] || return 1
  402. [ -z "$(mount | grep ${BUILD_ROOT}${fs})" ] || \
  403. umount ${BUILD_ROOT}${fs}
  404. ;;
  405. vfs)
  406. # for dir in /sys /proc /dev/shm /dev/pts /dev; do
  407. # mount-chroot-umount ${dir} || return 1
  408. # done
  409. [ -d ${BUILD_ROOT}/proc ] || return 1
  410. [ -z "$(mount | grep ${BUILD_ROOT}/proc)" ] || \
  411. umount ${BUILD_ROOT}/proc
  412. ;;
  413. archives_dir)
  414. [ -d ${ARCHIVES_DIR} ] || return 1
  415. [ -z "$(mount | grep ${ARCHIVES_DIR})" ] || \
  416. umount ${ARCHIVES_DIR}
  417. ;;
  418. unionfs_dir)
  419. [ -d ${BUILD_ROOT} ] || return 1
  420. [ -z "$(mount | grep ${BUILD_ROOT} | grep unionfs)" ] || \
  421. umount ${BUILD_ROOT}
  422. if [ ! -z "$(mount | grep ${BUILD_ROOT} | grep unionfs)" ]; then
  423. echo "Retry lazy unmount ... "
  424. umount -l ${BUILD_ROOT}
  425. echo "done."
  426. fi
  427. ;;
  428. *)
  429. echo mount-chroot-umount: unknown file system $fs
  430. exit 1
  431. ;;
  432. esac
  433. return 0
  434. }
  435. ## mount-chroot-mount [file system|name]
  436. mount-chroot-mount(){
  437. local fs=$1
  438. local mnt_opts=""
  439. case $fs in
  440. /home)
  441. mnt_opts="-o rbind"
  442. ;;
  443. *)
  444. mnt_opts="--bind"
  445. ;;
  446. esac
  447. case $fs in
  448. /home|/tmp|/sys|/proc|/dev/shm|/dev/pts|/dev)
  449. [ -d ${BUILD_ROOT}${fs} ] || mkdir -p ${BUILD_ROOT}${fs}
  450. [ -z "$(mount | grep ${BUILD_ROOT}${fs})" ] && \
  451. mount ${mnt_opts} ${fs} ${BUILD_ROOT}${fs}
  452. ;;
  453. vfs)
  454. # for dir in /dev /dev/pts /dev/shm /proc /sys; do
  455. # mount-chroot-mount ${dir} || return 1
  456. # done
  457. mount-chroot-mount /proc || return 1
  458. ;;
  459. archives_dir)
  460. [ -d ${EXTERNAL_ARCHIVES_DIR} ] || mkdir -p ${EXTERNAL_ARCHIVES_DIR}
  461. [ -d ${ARCHIVES_DIR} ] || mkdir -p ${ARCHIVES_DIR}
  462. [ -z "$(mount | grep ${ARCHIVES_DIR})" ] && \
  463. mount ${mnt_opts} ${EXTERNAL_ARCHIVES_DIR} ${ARCHIVES_DIR}
  464. [ -d ${ARCHIVES_DIR}/partial ] || mkdir -p ${ARCHIVES_DIR}/partial
  465. ;;
  466. unionfs_dir)
  467. if [ $with_unionfs -eq 1 ]; then
  468. [ -d ${UNIONFS_DIR} ] || mkdir -p ${UNIONFS_DIR}
  469. [ -z "$(mount | grep ${BUILD_ROOT})" ] && \
  470. mount -t unionfs -o dirs=${UNIONFS_DIR}=rw:${BUILD_ROOT}=ro unionfs ${BUILD_ROOT}
  471. unionctl ${BUILD_ROOT} --list
  472. fi
  473. ;;
  474. *)
  475. echo mount-chroot-mount: unknown file system $fs
  476. exit 1
  477. ;;
  478. esac
  479. return 0
  480. }
  481. write-vbuilder-log(){
  482. HRULE="======================================================================"
  483. [ -d ${BUILD_ROOT} ] || return 1
  484. if [ ! -f $VBUILDER_LOG ]; then
  485. cat<<EOF > $VBUILDER_LOG
  486. ${HRULE}
  487. VBUILDER REPORT
  488. DATE: $(LANG=C date)
  489. HOSTNAME: $(hostname)
  490. OS: $(echo $($__chroot_sh "cat /etc/vine-release"))
  491. %_arch: $(echo $($__chroot_sh "rpm --eval %_arch"))
  492. --version: ${VERSION}
  493. $(echo $([ -z "${VARCH}" ] || echo "--arch: ${VARCH}"))
  494. $(echo $([ -z "${CATEGORIES}" ] || echo "--category: ${CATEGORIES}"))
  495. $(echo $([ $with_dist_upgrade -eq 1 ] && echo "--dist-upgrade"))
  496. $(echo $([ $with_unionfs -eq 1 ] && echo "--unionfs"))
  497. $(echo $([ -z "${TARGET}" ] || echo "--target: ${TARGET}"))
  498. --bootstrap-dir: ${VBOOTSTRAP_DIR}
  499. --cache-dir: ${CACHE_DIR}
  500. --built-rpms-dir: ${BUILT_RPMS_DIR}
  501. ${HRULE}
  502. [$VBUILDER_CONF]
  503. $(cat $VBUILDER_CONF)
  504. [History]
  505. EOF
  506. else
  507. cat<<EOF >> $VBUILDER_LOG
  508. $*
  509. EOF
  510. fi
  511. return 0
  512. }
  513. ##############################################################################
  514. Clean(){
  515. setup-vbootstrap || return 1
  516. # # output end-of-line in $VBUILDER_LOG
  517. # [ -f $VBUILDER_LOG ] && write-vbuilder-log ${HRULE}
  518. # Show-Info
  519. # mount-chroot --umount /home
  520. # mount-chroot --umount /tmp
  521. mount-chroot --umount vfs
  522. mount-chroot --umount archives_dir
  523. mount-chroot --umount unionfs_dir
  524. apt-get-update --host
  525. if [ $with_unionfs -eq 1 ]; then
  526. if [ -d ${UNIONFS_DIR} ]; then
  527. echo -n "Cleaning build root \"${UNIONFS_DIR}\" via unionfs ... "
  528. rm -rf ${UNIONFS_DIR}
  529. echo "done."
  530. fi
  531. else
  532. if [ -d ${BUILD_ROOT} ]; then
  533. echo -n "Cleaning build root \"${BUILD_ROOT}\" ... "
  534. rm -rf ${BUILD_ROOT}
  535. echo "done."
  536. fi
  537. fi
  538. echo "Cleanup a build farm for ${VERSION} done."
  539. return 0
  540. }
  541. Build(){
  542. setup-vbootstrap || return 1
  543. if [ $with_dist_upgrade -eq 1 ]; then
  544. ## make bootstrap of ${STABLE_VERSION}
  545. /usr/sbin/vbootstrap \
  546. $(echo ${VERSION} | sed -e "s/VineSeed/${STABLE_VERSION}/") \
  547. ${BUILD_ROOT}
  548. ## aim apt-line to VineSeed
  549. sed -i "s/apt ${STABLE_VERSION}/apt VineSeed/g" \
  550. ${BUILD_ROOT}/etc/apt/sources.list.d/main.list
  551. else
  552. /usr/sbin/vbootstrap ${VERSION} ${BUILD_ROOT}
  553. fi
  554. mount-chroot archives_dir
  555. mount-chroot vfs
  556. # mount-chroot /tmp
  557. # mount-chroot /home
  558. $__chroot_sh 'apt-get -qq update && apt-get -qq -y dist-upgrade'
  559. ##!! 4.2 has no apt-sourceslist-{plus,nonfree,proposed-updates} packages
  560. case ${MAJOR_VERSION} in
  561. 4.2)
  562. $__chroot_sh "sed -i -e 's/main plus updates nonfree *$/$(echo ${CATEGORIES} | sed -e "s/,/ /"g) updates/g' /etc/apt/sources.list"
  563. # [ $with_category_security -eq 1 ] && \
  564. # echo
  565. ;;
  566. @@VBUILDER_STABLE_VERSION@@)
  567. [ $with_category_plus -eq 1 ] && \
  568. $__chroot_sh 'apt-get -qq update && apt-get -qq -y install apt-sourceslist-plus'
  569. [ $with_category_nonfree -eq 1 ] && \
  570. $__chroot_sh 'apt-get -qq update && apt-get -qq -y install apt-sourceslist-nonfree'
  571. [ $with_category_proposed_updates -eq 1 ] && \
  572. $__chroot_sh 'apt-get -qq update && apt-get -qq -y install apt-sourceslist-proposed-updates'
  573. # [ $with_category_security -eq 1 ] && \
  574. # echo
  575. ;;
  576. VineSeed)
  577. [ $with_category_plus -eq 1 ] && \
  578. $__chroot_sh 'apt-get -qq update && apt-get -qq -y install apt-sourceslist-plus'
  579. [ $with_category_nonfree -eq 1 ] && \
  580. $__chroot_sh 'apt-get -qq update && apt-get -qq -y install apt-sourceslist-nonfree'
  581. [ $with_category_test -eq 1 ] && \
  582. $__chroot_sh 'apt-get -qq update && apt-get -qq -y install apt-sourceslist-test'
  583. ;;
  584. esac
  585. [ $with_dist_upgrade -eq 1 ] && \
  586. $__chroot_sh 'apt-get -qq update && apt-get -qq -y dist-upgrade'
  587. $__chroot_sh 'apt-get -qq -y install build-essential'
  588. [ $with_category_nonfree -eq 1 ] && \
  589. $__chroot_sh 'apt-get -qq -y install self-build-setup'
  590. $__chroot_sh 'apt-get -qq -y install etcskel shadow-utils'
  591. $__chroot_sh 'cd /dev && /sbin/MAKEDEV console'
  592. $__chroot_sh 'cd /dev && /sbin/MAKEDEV null'
  593. $__chroot_sh 'cd /dev && /sbin/MAKEDEV zero'
  594. $__chroot_sh 'cd /dev && /sbin/MAKEDEV random'
  595. $__chroot_sh 'cd /dev && /sbin/MAKEDEV urandom'
  596. $__chroot_sh '/usr/sbin/pwconv'
  597. $__chroot_sh "/usr/sbin/useradd ${BUILD_USER}"
  598. ##!! for rpm-4.8.0 or higher
  599. ##!! (See http://trac.vinelinux.org/wiki/Vine6/AboutUpdateToolchain)
  600. if [ "$(echo ${VERSION} | sed -e "s/\(VineSeed\).*/\1/")" = "VineSeed" ]; then
  601. $__chroot_sh "sed -i -e 's/^%_topdir/#%_topdir/' /home/${BUILD_USER}/.rpmmacros"
  602. fi
  603. ## output basic informations in chroot
  604. write-vbuilder-log
  605. write-vbuilder-log "build"
  606. # mount-chroot --umount /home
  607. # mount-chroot --umount /tmp
  608. mount-chroot --umount vfs
  609. mount-chroot --umount archives_dir
  610. apt-get-update --host
  611. echo "Making a build farm for ${VERSION} done."
  612. return 0
  613. }
  614. Show-Info(){
  615. setup-vbootstrap || return 1
  616. [ -f $VBUILDER_LOG ] && cat $VBUILDER_LOG
  617. return 0
  618. }
  619. RPM_Remove(){
  620. setup-vbootstrap-rpm || return 1
  621. mount-chroot unionfs_dir
  622. mount-chroot archives_dir
  623. mount-chroot vfs
  624. apt-get-update --chroot
  625. [ -f $RPM_PKG ] && Msg_NotPackageName_$LOCALE $RPM_PKG && return 1
  626. $__chroot_sh "apt-get -y remove $BASE_RPM_PKG"
  627. write-vbuilder-log "remove-rpm $RPM_PKG"
  628. mount-chroot --umount vfs
  629. mount-chroot --umount archives_dir
  630. mount-chroot --umount unionfs_dir
  631. apt-get-update --host
  632. return 0
  633. }
  634. RPM_Install(){
  635. setup-vbootstrap-rpm || return 1
  636. mount-chroot unionfs_dir
  637. mount-chroot archives_dir
  638. mount-chroot vfs
  639. apt-get-update --chroot
  640. $__chroot_sh "cd ${BUILD_DIR} && apt-get -y install $BASE_RPM_PKG"
  641. write-vbuilder-log "install-rpm $RPM_PKG"
  642. mount-chroot --umount vfs
  643. mount-chroot --umount archives_dir
  644. mount-chroot --umount unionfs_dir
  645. apt-get-update --host
  646. return 0
  647. }
  648. RPM_Build(){
  649. setup-vbootstrap-rpm || return 1
  650. mount-chroot unionfs_dir
  651. mount-chroot archives_dir
  652. mount-chroot vfs
  653. apt-get-update --chroot
  654. [ ! -f $RPM_PKG ] && Msg_NotSourceRPM_$LOCALE $RPM_PKG && return 1
  655. RPM_PKG_USER=$(stat -c %U $RPM_PKG)
  656. RPM_PKG_GROUP=$(stat -c %G $RPM_PKG)
  657. [ ! -z "${SUDO_UID}" ] && RPM_PKG_USER=${SUDO_UID}
  658. [ ! -z "${SUDO_GID}" ] && RPM_PKG_GROUP=${SUDO_GID}
  659. local __install="install -p -v -o ${RPM_PKG_USER} -g ${RPM_PKG_GROUP}"
  660. ## make src.rpm for $VERSION
  661. $__chroot_sh "cd ${BUILD_DIR} && su ${BUILD_USER} -c 'rpm -ivh $BASE_RPM_PKG'"
  662. $__chroot_sh "cd ${BUILD_DIR} && su ${BUILD_USER} -c 'rpmbuild -bs --nodeps --clean --rmsource --rmspec ${BUILD_DIR}/SPECS/*.spec'"
  663. ## change ${DIST_RELEASE}
  664. BASE_RPM_PKG=$(echo $BASE_RPM_PKG | sed -e "s/vl\([0-9]*\)\./vl${DIST_RELEASE}\./")
  665. ## rebuild $BASE_RPM_PKG on ${DIST_RELEASE}
  666. $__chroot_sh "cd ${BUILD_DIR}/SRPMS && apt-get -o APT::Install::Virtual=true -y build-dep $BASE_RPM_PKG"
  667. $__chroot_sh "cd ${BUILD_DIR}/SRPMS && su ${BUILD_USER} -c 'rpmbuild --rebuild $RPM_OPTS $BASE_RPM_PKG'"
  668. [ $with_no_install -eq 0 ] && \
  669. $__chroot_sh "cd ${BUILD_DIR} && apt-get -y install $(find $BUILD_ROOT${BUILD_DIR}/RPMS -type f -regex '.*\.rpm' | sed -e s@${BUILD_ROOT}@@g -e 's|.*\/compat32-.*||g' -e 's|.*\/.*\.src\.rpm||g' -e 's/$/ \\/g')"
  670. ## copy built rpms to ${HOME}/rpm/ for each archtectures
  671. echo "Copying built rpms to ${BUILT_RPMS_DIR} for each archtectures ... "
  672. for i in $RPM_PKG_ARCH_LIST; do \
  673. if [ -d $BUILD_ROOT${BUILD_DIR}/${i} ]; then
  674. if [ ! -d ${BUILT_RPMS_DIR}/${MAJOR_VERSION}/${i} ]; then
  675. $__install -d ${BUILT_RPMS_DIR}/${MAJOR_VERSION}/${i}/
  676. chown -R ${RPM_PKG_USER}:${RPM_PKG_GROUP} ${BUILT_RPMS_DIR}
  677. fi
  678. find $BUILD_ROOT${BUILD_DIR}/${i} -type f -regex '.*\.rpm' \
  679. -exec $__install -m0644 {} ${BUILT_RPMS_DIR}/${MAJOR_VERSION}/${i}/ \;
  680. fi
  681. done
  682. write-vbuilder-log "build-rpm $RPM_PKG"
  683. mount-chroot --umount vfs
  684. mount-chroot --umount archives_dir
  685. mount-chroot --umount unionfs_dir
  686. apt-get-update --host
  687. echo "done."
  688. return 0
  689. }
  690. RPM_Sign(){
  691. [ $with_sign -eq 1 ] || return 1
  692. [ -z "${SUDO_USER}" ] && Msg_SUDO_USERisEmpty_$LOCALE && return 1
  693. su ${SUDO_USER} -c "rpm --addsign $(for i in $RPM_PKG_ARCH_LIST; do find $BUILD_ROOT${BUILD_DIR}/${i} -type f -regex '.*\.rpm' 2>/dev/null; done | sed -e s,$BUILD_ROOT${BUILD_DIR},${BUILT_RPMS_DIR}/${MAJOR_VERSION},g -e 's/$/ \\/g')"
  694. return 0
  695. }
  696. ##############################################################################
  697. setup-vbuilder || exit 1
  698. check-parameter $* || exit 1
  699. while [ $# -gt 0 ]; do
  700. tmpARG=$1
  701. case $tmpARG in
  702. --version|--arch|--category|--target|--bootstrap-dir|--cache-dir|--built-rpms-dir)
  703. shift
  704. ;;
  705. --dist-upgrade|--unionfs|--with-compat32|--sign|--no-install)
  706. ;;
  707. --build-rpm|build-rpm|--install-rpm|install-rpm|--remove-rpm|remove-rpm)
  708. shift
  709. ;;
  710. --build|build|--clean|clean|--show-info|show-info)
  711. ;;
  712. *)
  713. echo unknown option $1
  714. exit 1
  715. ;;
  716. esac
  717. case $tmpARG in
  718. --version)
  719. VERSION=$1
  720. ;;
  721. --arch)
  722. VARCH=$1
  723. ;;
  724. --category)
  725. CATEGORIES=$1
  726. ;;
  727. --dist-upgrade)
  728. with_dist_upgrade=1
  729. ;;
  730. --unionfs)
  731. with_unionfs=1
  732. ;;
  733. --target)
  734. TARGET=$1
  735. RPM_OPTS="${RPM_OPTS} --target $TARGET"
  736. ;;
  737. --with-compat32)
  738. RPM_OPTS="${RPM_OPTS} --with compat32"
  739. ;;
  740. --sign)
  741. with_sign=1
  742. ;;
  743. --no-install)
  744. with_no_install=1
  745. ;;
  746. --bootstrap-dir)
  747. VBOOTSTRAP_DIR=$1
  748. ;;
  749. --cache-dir)
  750. CACHE_DIR=$1
  751. ;;
  752. --built-rpms-dir)
  753. BUILT_RPMS_DIR=$1
  754. ;;
  755. --build-rpm|build-rpm)
  756. RPM_PKG=$1
  757. RPM_Build || exit 1
  758. ;;
  759. --install-rpm|install-rpm)
  760. RPM_PKG=$1
  761. RPM_Install || exit 1
  762. ;;
  763. --remove-rpm|remove-rpm)
  764. RPM_PKG=$1
  765. RPM_Remove || exit 1
  766. ;;
  767. --show-info|show-info)
  768. Show-Info || exit 1
  769. ;;
  770. --build|build)
  771. Build || exit 1
  772. ;;
  773. --clean|clean)
  774. Clean || exit 1
  775. ;;
  776. esac
  777. shift
  778. done
  779. RPM_Sign
  780. exit