[Midnightbsd-cvs] mports [17428] trunk/Mk/components/destdir.mk: add destdir handling

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Sat Sep 20 11:58:03 EDT 2014


Revision: 17428
          http://svnweb.midnightbsd.org/mports/?rev=17428
Author:   laffer1
Date:     2014-09-20 11:58:02 -0400 (Sat, 20 Sep 2014)
Log Message:
-----------
add destdir handling

Added Paths:
-----------
    trunk/Mk/components/destdir.mk

Added: trunk/Mk/components/destdir.mk
===================================================================
--- trunk/Mk/components/destdir.mk	                        (rev 0)
+++ trunk/Mk/components/destdir.mk	2014-09-20 15:58:02 UTC (rev 17428)
@@ -0,0 +1,222 @@
+#-*- tab-width: 4; -*-
+# ex:ts=4
+#
+# bsd.destdir.mk - Support for chrooted installation
+#
+# Created by: Gabor Kovesdan <gabor at FreeBSD.org>
+#
+# $MidnightBSD$
+# $FreeBSD: head/Mk/bsd.destdir.mk 340713 2014-01-22 15:12:27Z mat $
+#
+
+DESTDIR_Include_MAINTAINER=	ports at MidnightBSD.org
+
+#
+# The target order is always: pre-chroot do-chroot post-chroot
+#
+# pre-chroot
+#			- You can use this for special preparation work, that
+#			  want to do before chrooting into the destination
+#			  environment and doing the real build.  At default
+#			  this target is empty.
+#
+# do-chroot
+#			- This is the main target for doing the chrooted
+#			  operations.  It mounts the ports tree and devfs into
+#			  the destination environment and starts make(1)
+#			  by calling chroot(1).
+#
+# post-chroot
+#			- This target runs chrooted just after chroot(1) was
+#			  called.  You can use this for special preparation
+#			  work for the chrooted build if necessary.  At
+#			  default, this target is empty.
+#
+# DESTDIR_ENV_LIST
+#			- Contains names of the variables in host environ(7),
+#			  which should be imported into the chrooted environ
+#			  along with their values.
+#			  Default: empty.
+#
+# DESTDIR_MOUNT_LIST
+#			- Contains the directories to mount into the
+#			  destination.  This is to make PORTSDIR, DISTDIR, etc.
+#			  available in the destination environment.  Three
+#			  forms of entries are allowed:
+#			  VAR
+#				- Mounts the path contained by VAR into
+#				  a temporary directory and sets VAR to that
+#				  directory in the destination environ(7).
+#			  VAR:HOST_PATH
+#				- Mounts HOST_PATH to a a temporary directory
+#				  and sets VAR to that directory in the
+#				  destination environ(7).
+#			  VAR:HOST_PATH:DEST_PATH
+#				- Mounts HOST_PATH to DEST_PATH and sets VAR
+#				  to DEST_PATH in the destination environ(7).
+#			  Default: PORTSDIR DISTDIR
+#
+# You can use something like this in host /etc/make.conf to
+# customize per-chroot environment:
+#	.if ${DESTDIR}=/foo/bar
+#	PREFIX=/opt
+#	CFLAGS=-O3 -pipe
+#	DESTDIR_ENV_LIST=PREFIX CFLAGS
+#	.endif
+#
+
+.if !defined(_DESTDIRMKINCLUDED)
+
+_DESTDIRMKINCLUDED=	yes
+
+.if defined(WITH_DESTDIR_DEBUG)
+DEBUG_MSG=	${ECHO_MSG} "DEBUG:"
+.else
+DEBUG_MSG=	${TRUE}
+.endif
+
+DESTDIR_ENV_LIST?=
+DESTDIR_ENV=	CHROOTED=yes PATH=${PATH} TERM=${TERM}
+.for _var in ${DESTDIR_ENV_LIST:NDESTDIR:NCHROOTED:NPORTSDIR}
+DESTDIR_ENV+=	${_var}="${${_var}}"
+.endfor
+
+# Processing DESTDIR_MOUNT_LIST into something more machine-readable
+# VAR:HOST_PATH:DEST_PATH
+# VAR -> VAR:${VAR}:TMP
+# VAR:HOST_PATH -> VAR:HOST_PATH:TMP
+DESTDIR_MOUNT_LIST?=	PORTSDIR DISTDIR
+_DESTDIR_MOUNT_LIST=
+.for _entry in ${DESTDIR_MOUNT_LIST}
+__entry=${_entry}
+.if ${__entry:M*\:*\:*}
+_DESTDIR_MOUNT_LIST+=	${_entry}
+.elif ${__entry:M*\:*}
+_DESTDIR_MOUNT_LIST+=	${_entry}:___temp___
+.else
+.if defined(${_entry}) && !empty(${_entry})
+_DESTDIR_MOUNT_LIST+=	${_entry}:${${_entry}}:___temp___
+.endif
+.endif
+.endfor
+
+.MAIN:	all
+.for _target in ${.TARGETS}
+${_target}: pre-chroot do-chroot
+	@${TRUE}
+.endfor
+
+.if !target(pre-chroot)
+pre-chroot:
+	@${TRUE}
+.endif
+
+.if !target(do-chroot)
+do-chroot:
+	@if [ ! -d ${DESTDIR} ]; then \
+		${ECHO_MSG} "===>  Directory ${DESTDIR} does not exist"; \
+		${ECHO_MSG} "===>  Please set DESTDIR to a valid jail environment."; \
+		exit 1; \
+	fi; \
+	_destdir=`${REALPATH} ${DESTDIR}`; \
+	_mounted_entries_list=""; \
+	_created_mountpoints_list=""; \
+	_var_path_list=""; \
+	${ECHO_MSG} "===>  Creating some important subdirectories"; \
+	for _dir in tmp dev; do \
+		[ -d $${_destdir}/$${_dir} ] || \
+			if ${MKDIR} $${_destdir}/$${_dir}; then \
+				${ECHO_MSG} "===> /$${_dir} subdirectory has been successfully created"; \
+				_created_mountpoints_list="$${_destdir}/$${_dir} $${_created_mountpoints_list}"; \
+			else \
+				${ECHO_MSG} "===> /$${_dir} subdirectory could not be created"; \
+				exit 2; \
+			fi; \
+	done; \
+	${DEBUG_MSG} "_DESTDIR_MOUNT_LIST=${_DESTDIR_MOUNT_LIST}"; \
+	for _entry in ${_DESTDIR_MOUNT_LIST}; do \
+		${DEBUG_MSG} "Processing $${_entry}"; \
+		_mount_var=$${_entry%%:*}; \
+		_tp=$${_entry#*:}; \
+		_host_path=`${REALPATH} $${_tp%:*}`; \
+		_dest_path=$${_entry##*:}; \
+		_full_dest_path=`${REALPATH} $${_destdir}/$${_dest_path}`; \
+		_entry_was_created=0; \
+		_entry_should_mount=0; \
+		${DEBUG_MSG} "$${_mount_var}:$${_host_path}:$${_full_dest_path}"; \
+		if [ "$${_dest_path}" = "___temp___" ]; then \
+			${DEBUG_MSG} "Creating temporary mount point"; \
+			if _full_dest_path=`${MKTEMP} -d $${_destdir}/tmp/mountpoint.XXXXXX`; then \
+				${DEBUG_MSG} "Temporary mount point $${_full_dest_path} created successfully"; \
+				_entry_was_created=1; \
+				_entry_should_mount=1; \
+				_dest_path=$${_full_dest_path#$${_destdir}}; \
+				_created_mountpoints_list="$${_full_dest_path} $${_created_mountpoints_list}"; \
+			else \
+				${ECHO_MSG} "===> Failed to create temporary mount point"; \
+				exit 9; \
+			fi; \
+		else \
+			${DEBUG_MSG} "Checking if already mounted"; \
+			if ${MOUNT}|${GREP} -qs "^$${_host_path} on $${_full_dest_path} ("; then \
+				${DEBUG_MSG} "$${_host_path} is already mounted on $${_full_dest_path}"; \
+				_var_path_list="$${_var_path_list} $${_mount_var}=$${_dest_path}"; \
+			else \
+				${DEBUG_MSG} "$${_host_path} is not mounted on $${_full_dest_path}"; \
+				_entry_should_mount=1; \
+			fi; \
+		fi; \
+		[ -d $${_full_dest_path} ] || \
+			if ${MKDIR} $${_full_dest_path}; then \
+				${DEBUG_MSG} "Mount point $${_full_dest_path} created"; \
+				_entry_was_created=1; \
+				_created_mountpoints_list="$${_created_mountpoints_list} ${_full_dest_path}"; \
+			else \
+				${ECHO_MSG} "===> Mount point $${_full_dest_path} could not be created"; \
+				exit 7; \
+			fi; \
+		[ "$${_entry_should_mount}" = "0" ] || \
+			if ${MOUNT_NULLFS} $${_host_path} $${_full_dest_path}; then \
+				${DEBUG_MSG} "Directory $${_host_path} mounted"; \
+				_mounted_entries_list="$${_full_dest_path} $${_mounted_entries_list}"; \
+				_var_path_list="$${_var_path_list} $${_mount_var}=$${_dest_path}"; \
+			else \
+				${ECHO_MSG} "===> Dir $${_host_path} could not be mounted"; \
+				[ "$${_entry_was_created}" = "0" ] || \
+					${RMDIR} $${_full_dest_path} || ${TRUE}; \
+				exit 8; \
+			fi; \
+	done; \
+	${DEBUG_MSG} "Handling devfs separately"; \
+	_full_dest_path=$${_destdir}/dev; \
+	${MOUNT}|${GREP} -qs "^devfs on $${_full_dest_path} (" || \
+		if ${MOUNT_DEVFS} $${_full_dest_path}; then \
+			${DEBUG_MSG} "devfs mounted"; \
+			_mounted_entries_list="$${_full_dest_path} $${_mounted_entries_list}"; \
+		else \
+			${ECHO_MSG} "===> devfs could not be mounted"; \
+			[ -n "$${_created_mountpoints_list%%* $${_destdir}/dev *}" ] || \
+				${RMDIR} $${_destdir}/dev || ${TRUE}; \
+			exit 9; \
+		fi; \
+	_var_path_list="$${_var_path_list} DEVFS=/dev"; \
+	${DEBUG_MSG} "Things we mounted: $${_mounted_entries_list}"; \
+	${DEBUG_MSG} "Things we created: $${_created_mountpoints_list}"; \
+	${DEBUG_MSG} "_var_path_list: $${_var_path_list}"; \
+	${ECHO_MSG} "===>  Starting chrooted make in ${DESTDIR}..."; \
+	export $${_var_path_list}; \
+	${CHROOT} $${_destdir} ${SH} -c "\
+		cd $${PORTSDIR}${.CURDIR:S|^${PORTSDIR}||}; \
+		${SETENV} -i ${DESTDIR_ENV} $${_var_path_list} ${MAKE} ${.TARGETS}" && \
+		{ status=$$?; ${ECHO_MSG} "===>  Chrooted make in ${DESTDIR} succeeded"; } || \
+		{ status=$$?; ${ECHO_MSG} "===>  Chrooted make in ${DESTDIR} failed"; }; \
+		${ECHO_MSG} "===>  Cleaning up..."; \
+	for _entry in $${_mounted_entries_list}; do \
+		${UMOUNT} -f $${_entry} || ${TRUE}; \
+	done; \
+	for _entry in $${_created_mountpoints_list}; do \
+		${RMDIR} $${_entry} || ${TRUE}; \
+	done; \
+	exit $$status
+.endif	# !target(do-chroot)
+.endif	# !defined(_DESTDIRMKINCLUDED)


Property changes on: trunk/Mk/components/destdir.mk
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property


More information about the Midnightbsd-cvs mailing list