mm-mtree.sh revision 196434
1196434Sdougb#!/bin/sh
2196434Sdougb
3196434Sdougb# mergemaster mtree database generator
4196434Sdougb
5196434Sdougb# This script is intended to be used as part of the release building
6196434Sdougb# process to generate the /var/db/mergemaster.mtree file relevant to
7196434Sdougb# the source tree used to create the release so that users can make
8196434Sdougb# use of mergemaster's -U option to update their files after csup'ing
9196434Sdougb# to -stable.
10196434Sdougb
11196434Sdougb# Copyright 2009 Douglas Barton
12196434Sdougb# dougb@FreeBSD.org
13196434Sdougb
14196434Sdougb# $FreeBSD: head/release/scripts/mm-mtree.sh 196434 2009-08-23 05:42:50Z dougb $
15196434Sdougb
16196434SdougbPATH=/bin:/usr/bin:/usr/sbin
17196434Sdougb
18196434Sdougbdisplay_usage () {
19196434Sdougb  VERSION_NUMBER=`grep "[$]FreeBSD:" $0 | cut -d ' ' -f 4`
20196434Sdougb  echo "${0##*/} version ${VERSION_NUMBER}"
21196434Sdougb  echo "Usage: ${0##*/} [-m /path] [-t /path] [-A arch] [-F <make args>] [-D /path]"
22196434Sdougb  echo "Options:"
23196434Sdougb  echo "  -m /path/directory  Specify location of source to do the make in"
24196434Sdougb  echo "  -t /path/directory  Specify temp root directory"
25196434Sdougb  echo "  -A architecture  Alternative architecture name to pass to make"
26196434Sdougb  echo "  -F <arguments for make> Specify what to put on the make command line"
27196434Sdougb  echo '  -D /path/directory  Specify the destination directory to install files to'
28196434Sdougb  echo ''
29196434Sdougb}
30196434Sdougb
31196434Sdougb# Set the default path for the temporary root environment
32196434Sdougb#
33196434SdougbTEMPROOT='/var/tmp/temproot'
34196434Sdougb
35196434Sdougb# Assign the location of the mtree database
36196434Sdougb#
37196434SdougbMTREEDB=${MTREEDB:-/var/db}
38196434SdougbMTREEFILE="${MTREEDB}/mergemaster.mtree"
39196434Sdougb
40196434Sdougb# Check the command line options
41196434Sdougb#
42196434Sdougbwhile getopts "m:t:A:F:D:h" COMMAND_LINE_ARGUMENT ; do
43196434Sdougb  case "${COMMAND_LINE_ARGUMENT}" in
44196434Sdougb  m)
45196434Sdougb    SOURCEDIR=${OPTARG}
46196434Sdougb    ;;
47196434Sdougb  t)
48196434Sdougb    TEMPROOT=${OPTARG}
49196434Sdougb    ;;
50196434Sdougb  A)
51196434Sdougb    ARCHSTRING='TARGET_ARCH='${OPTARG}
52196434Sdougb    ;;
53196434Sdougb  F)
54196434Sdougb    MM_MAKE_ARGS="${OPTARG}"
55196434Sdougb    ;;
56196434Sdougb  D)
57196434Sdougb    DESTDIR=${OPTARG}
58196434Sdougb    ;;
59196434Sdougb  h)
60196434Sdougb    display_usage
61196434Sdougb    exit 0
62196434Sdougb    ;;
63196434Sdougb  *)
64196434Sdougb    echo ''
65196434Sdougb    display_usage
66196434Sdougb    exit 1
67196434Sdougb    ;;
68196434Sdougb  esac
69196434Sdougbdone
70196434Sdougb
71196434Sdougb# Assign the source directory
72196434Sdougb#
73196434SdougbSOURCEDIR=${SOURCEDIR:-/usr/src}
74196434Sdougbif [ ! -f ${SOURCEDIR}/Makefile.inc1 -a \
75196434Sdougb   -f ${SOURCEDIR}/../Makefile.inc1 ]; then
76196434Sdougb  echo " *** The source directory you specified (${SOURCEDIR})"
77196434Sdougb  echo "     will be reset to ${SOURCEDIR}/.."
78196434Sdougb  echo ''
79196434Sdougb  sleep 3
80196434Sdougb  SOURCEDIR=${SOURCEDIR}/..
81196434Sdougbfi
82196434Sdougb
83196434Sdougb# Setup make to use system files from SOURCEDIR
84196434SdougbMM_MAKE="make ${ARCHSTRING} ${MM_MAKE_ARGS} -m ${SOURCEDIR}/share/mk"
85196434Sdougb
86196434Sdougbdelete_temproot () {
87196434Sdougb  rm -rf "${TEMPROOT}" 2>/dev/null
88196434Sdougb  chflags -R 0 "${TEMPROOT}" 2>/dev/null
89196434Sdougb  rm -rf "${TEMPROOT}" || exit 1
90196434Sdougb}
91196434Sdougb
92196434Sdougb[ -d "${TEMPROOT}" ] && delete_temproot
93196434Sdougb
94196434Sdougbecho "*** Creating the temporary root environment in ${TEMPROOT}"
95196434Sdougb
96196434Sdougbif mkdir -p "${TEMPROOT}"; then
97196434Sdougb  echo " *** ${TEMPROOT} ready for use"
98196434Sdougbfi
99196434Sdougb
100196434Sdougbif [ ! -d "${TEMPROOT}" ]; then
101196434Sdougb  echo ''
102196434Sdougb  echo "  *** FATAL ERROR: Cannot create ${TEMPROOT}"
103196434Sdougb  echo ''
104196434Sdougb  exit 1
105196434Sdougbfi
106196434Sdougb
107196434Sdougbecho " *** Creating and populating directory structure in ${TEMPROOT}"
108196434Sdougbecho ''
109196434Sdougb
110196434Sdougb{ cd ${SOURCEDIR} || { echo "*** Cannot cd to ${SOURCEDIR}" ; exit 1;}
111196434Sdougb  case "${DESTDIR}" in
112196434Sdougb  '') ;;
113196434Sdougb  *)
114196434Sdougb    ${MM_MAKE} DESTDIR=${DESTDIR} distrib-dirs
115196434Sdougb    ;;
116196434Sdougb  esac
117196434Sdougb  od=${TEMPROOT}/usr/obj
118196434Sdougb  ${MM_MAKE} DESTDIR=${TEMPROOT} distrib-dirs &&
119196434Sdougb  MAKEOBJDIRPREFIX=$od ${MM_MAKE} _obj SUBDIR_OVERRIDE=etc &&
120196434Sdougb  MAKEOBJDIRPREFIX=$od ${MM_MAKE} everything SUBDIR_OVERRIDE=etc &&
121196434Sdougb  MAKEOBJDIRPREFIX=$od ${MM_MAKE} DESTDIR=${TEMPROOT} distribution;} ||
122196434Sdougb  { echo '';
123196434Sdougb    echo "  *** FATAL ERROR: Cannot 'cd' to ${SOURCEDIR} and install files to";
124196434Sdougb    echo "      the temproot environment";
125196434Sdougb    echo '';
126196434Sdougb    exit 1;}
127196434Sdougb
128196434Sdougb# We really don't want to have to deal with files like login.conf.db, pwd.db,
129196434Sdougb# or spwd.db.  Instead, we want to compare the text versions, and run *_mkdb.
130196434Sdougb# Prompt the user to do so below, as needed.
131196434Sdougb#
132196434Sdougbrm -f ${TEMPROOT}/etc/*.db ${TEMPROOT}/etc/passwd
133196434Sdougb
134196434Sdougb# We only need to compare things like freebsd.cf once
135196434Sdougbfind ${TEMPROOT}/usr/obj -type f -delete 2>/dev/null
136196434Sdougb
137196434Sdougb# Delete stuff we do not need to keep the mtree database small,
138196434Sdougb# and to make the actual comparison faster.
139196434Sdougbfind ${TEMPROOT}/usr -type l -delete 2>/dev/null
140196434Sdougbfind ${TEMPROOT} -type f -size 0 -delete 2>/dev/null
141196434Sdougbfind -d ${TEMPROOT} -type d -empty -delete 2>/dev/null
142196434Sdougb
143196434Sdougb# Build the mtree database in a temporary location.
144196434SdougbMTREENEW=`mktemp -t mergemaster.mtree`
145196434Sdougbmtree -ci -p ${TEMPROOT} -k size,md5digest > ${MTREENEW} 2>/dev/null
146196434Sdougb
147196434Sdougbif [ -s "${MTREENEW}" ]; then
148196434Sdougb  echo "*** Saving mtree database for future upgrades"
149196434Sdougb  test -e "${DESTDIR}${MTREEFILE}" && unlink ${DESTDIR}${MTREEFILE}
150196434Sdougb  mv ${MTREENEW} ${DESTDIR}${MTREEFILE}
151196434Sdougbfi
152196434Sdougb
153196434Sdougbdelete_temproot
154196434Sdougb
155196434Sdougbexit 0
156