tech-pkg archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

configuration versioning: basic functionality needs testing



Hi, I'm writing again on the GSOC project aimed at implementing
configuration files versioning in pkgsrc.

I have scraped the pkg_add patch and now reading configuration options
from the user environment only. As of now these are:
NOCVS, to disable all functionality (active by default).
VCSDIR, the directory where the version control system repository
holding configuration files is kept. It defaults to VARBASE/confrepo if
unset.
VCSAUTOMERGE: set to "yes" in order to try automatically merging and
installing configuration files (this is not otherwise attempted).

CVS: the name of the version control solution chosen by the user.
It defaults to "RCS", the only system supported as of now.

I targeted the pkginstall framework hoping to have something ready to
use (and merge?), but the logic can be reimplemented in pkgtasks.

A new "+VERSIONING" script handles basic VCS interaction,
bsd.pkginstall.mk has been modified accordingly to create it and
substitute variables in it.

New tools are now defined under mk/tools: tty (unused), rcs, co, ci,
diff, merge.
tools part of "devel/rcs" are replaced with a for loop iterating over
the new variable _TOOLS.rcsutils in replace.mk, that also handles
"ident".

pkginstall/files has been modified:
when handling a configuration file, if NOVCS is unset, it always tries
to copy the newly provided example file to
VCSDIR/defaults/path/to/installed/file and then checks it in.

then, if the file is already installed, if the environment
variable VCSAUTOMERGE is explicitly set to "yes", it attempts
automatically merging changes going from the first provided revision to
the last example configuration file with the changes in the installed
configuration file.
I'm not really sure I'm doing this right, that's where I'd like most
help in testing things!

first, a backup of the installed configuration file is taken and added
to the repository.

a text index of configuration files already automatically merged in the
past is kept at
$VCSDIR/automergedfiles

if the file being handled is already listed, a copy is made to
$VCSDIR/automerged/path/to/installed/file and this revision checked-in
to the version control system.

otherwise, the file is assumed to be user-installed or user-edited, and
the same backup is done, at $VCSDIR/user/path/to/installed/file instead.

this is to enable a quick restore to the last revision edited by the
user in case something breaks.

the currenly installed file is copied from $file to
VCSDIR/defaults/path/to/installed/file.automerge

the initial revision of the provided example file is checked out from
VCSDIR/defaults/path/to/installed/file.


"merge file1 file2 file3" from "rcs" is run
with file.automerge as the first file, file2 the initial revision of
package-provided example configuration files, and file3 the last
revision of package-provided example configuration files ($f_eg).

does this make sense?

$file, otherwise the user is asked to manually review changes and
nothing gets done.

if the file was not automerged before (user-installed) and the
automerge completed successfully, the path to $file is added to
$VCSDIR/automergedfiles.

 
As already stated, I'm open to corrections, suggestions and ideas on
how to go on with the project, since objectives have changed trying
to align with pkgsrc needs (and I'd really like to have some
functionality usable by the community before experimenting with
configuration pulling, remote repositories, other VCSs and tools!)

a diff against pkgsrc-2018Q1 is attached, changes are also viewable at
https://github.com/kmotavalli/pkgsrc/compare/pkgsrc-2018Q1...kmotavalli:gsoc
and testable from
https://github.com/kmotavalli/pkgsrc/archive/v0.1.tar.gz

Keivan
diff --git a/mk/pkginstall/bsd.pkginstall.mk b/mk/pkginstall/bsd.pkginstall.mk
index 93b6230aab5..3c77dc424cb 100644
--- a/mk/pkginstall/bsd.pkginstall.mk
+++ b/mk/pkginstall/bsd.pkginstall.mk
@@ -96,6 +96,7 @@ DEINSTALL_TEMPLATES+=	${PKGDIR}/DEINSTALL
 _DEINSTALL_TMPL?=	${.CURDIR}/../../mk/pkginstall/deinstall
 _INSTALL_UNPACK_TMPL?=	# empty
 _INSTALL_TMPL?=		${.CURDIR}/../../mk/pkginstall/install
+_INSTALL_TMPL+=		${.CURDIR}/../../mk/pkginstall/versioning
 INSTALL_TEMPLATES?=	# empty
 .if exists(${PKGDIR}/INSTALL) && \
     empty(INSTALL_TEMPLATES:M${PKGDIR}/INSTALL)
@@ -493,6 +494,9 @@ _INSTALL_FILES_DATAFILE=	${_PKGINSTALL_DIR}/files-data
 _INSTALL_UNPACK_TMPL+=		${_INSTALL_FILES_FILE}
 _INSTALL_DATA_TMPL+=		${_INSTALL_FILES_DATAFILE}
 
+_INSTALL_VERSIONING_FILE=	${_PKGINSTALL_DIR}/versioning
+_INSTALL_UNPACK_TMPL+=		${_INSTALL_VERSIONING_FILE}
+
 # Only generate init scripts if we are using rc.d
 _INSTALL_RCD_SCRIPTS=	# empty
 
@@ -600,7 +604,11 @@ ${_INSTALL_FILES_FILE}: ../../mk/pkginstall/files
 		${RM} -f ${.TARGET};					\
 		${TOUCH} ${TOUCH_ARGS} ${.TARGET};			\
 	fi
-
+${_INSTALL_VERSIONING_FILE}: ../../mk/pkginstall/versioning
+	${RUN}${MKDIR} ${.TARGET:H}
+	${RUN}	\
+	${SED} ${FILES_SUBST_SED} ../../mk/pkginstall/versioning > ${.TARGET}
+	
 # OWN_DIRS contains a list of directories for this package that should be
 #       created and should attempt to be destroyed by the INSTALL/DEINSTALL
 #	scripts.  MAKE_DIRS is used the same way, but the package admin
@@ -1125,7 +1133,35 @@ FILES_SUBST+=		TR=${TR:Q}
 FILES_SUBST+=		TRUE=${TRUE:Q}
 FILES_SUBST+=		USERADD=${USERADD:Q}
 FILES_SUBST+=		XARGS=${XARGS:Q}
-
+FILES_SUBST+=           DIFF=${DIFF:Q}
+.if defined(TOOLS_PLATFORM.rcs)
+RCS=${TOOLS_PLATFORM.rcs}
+.else
+TOOLS_CREATE+=		rcs
+RCS=${TOOLS_PATH.rcs}
+.endif
+FILES_SUBST+=		RCS=${RCS:Q}
+. if defined(TOOLS_PLATFORM.ci)
+CI=${TOOLS_PLATFORM.ci}
+. else
+TOOLS_CREATE+=         	ci
+CI=${TOOLS_PATH.ci}
+.endif 
+FILES_SUBST+=		CI=${CI:Q}
+.if defined(TOOLS_PLATFORM.co)
+CO=${TOOLS_PLATFORM.co}
+.else
+TOOLS_CREATE+=		co
+CO=${TOOLS_PATH.co}
+.endif
+FILES_SUBST+=		CO=${CO:Q}
+.if defined(TOOLS_PLATFORM.merge)
+MERGE=${TOOLS_PLATFORM.merge}
+.else
+TOOLS_CREATE+=		merge
+MERGE=${TOOLS_PATH.merge}
+.endif
+FILES_SUBST+=		MERGE=${MERGE:Q}
 FILES_SUBST_SED=	${FILES_SUBST:S/=/@!/:S/$/!g/:S/^/ -e s!@/}
 
 PKG_REFCOUNT_DBDIR?=	${PKG_DBDIR}.refcount
diff --git a/mk/pkginstall/files b/mk/pkginstall/files
index edbb666f3c3..2d9d9555d11 100644
--- a/mk/pkginstall/files
+++ b/mk/pkginstall/files
@@ -65,6 +65,7 @@ SED="@SED@"
 SORT="@SORT@"
 TEST="@TEST@"
 TRUE="@TRUE@"
+DIFF="@DIFF@"
 
 SELF=$0
 ACTION=$1
@@ -102,7 +103,7 @@ PKG_METADATA_DIR="${2-${CURDIR}}"
 : ${PKG_DBDIR=${PKG_METADATA_DIR%/*}}
 : ${PKG_REFCOUNT_DBDIR=${PKG_DBDIR}.refcount}
 PKG_REFCOUNT_FILES_DBDIR="${PKG_REFCOUNT_DBDIR}/files"
-
+_VCSDIR="${VCSDIR:-@VARBASE@/confrepo}"
 exitcode=0
 case $ACTION in
 ADD)
@@ -146,8 +147,94 @@ ADD)
 		else
 			case "$f_flags:$_PKG_CONFIG:$_PKG_RCD_SCRIPTS" in
 			*f*:*:*|[!r]:yes:*|[!r][!r]:yes:*|[!r][!r][!r]:yes:*|*r*:yes:yes)
+				if ${TEST} "$_PKG_RCD_SCRIPTS" = "no" -a ! -n "$NOVCS"; then
+					if ${TEST} ! -d $_VCSDIR/defaults; then
+						${RM} -f "$_VCSDIR/defaults"
+						${MKDIR} -p "$_VCSDIR/defaults"
+					fi
+					if ${TEST} -w $_VCSDIR/defaults; then
+						${MKDIR} -p "$_VCSDIR/defaults/$file" 2>/dev/null
+						${RMDIR} "$_VCSDIR/defaults/$file" 2>/dev/null
+						${CP} -fp "$f_eg" "$_VCSDIR/defaults/$file"
+						${TEST} ! -x ./+VERSIONING ||
+							./+VERSIONING REGISTER "$_VCSDIR/defaults/$file" 
+							${ECHO} REGISTER $_VCSDIR/defaults/$file
+					else
+						${ECHO} "$_VCSDIR is not writable!"
+					fi	
+				fi
 				if ${TEST} -f "$file"; then
 					${ECHO} "${PKGNAME}: $file already exists"
+					if ${TEST} ! -n "$NOVCS" -a "$VCSAUTOMERGE" = "yes"; then
+						${ECHO} "${PKGNAME}: attempting to merge $file with new defaults!"
+						if ${TEST} -f "$_VCSDIR/automergedfiles" && ${TEST} $(${GREP} -c "$file" "$_VCSDIR/automergedfiles") -gt 0; then
+							${ECHO} "saving the currently installed revision to $_VCSDIR/automerged/$file"
+							${MKDIR} -p "$_VCSDIR/automerged/$file" 2>/dev/null
+							${RMDIR} "$_VCSDIR/automerged/$file" 2>/dev/null
+							${CP} -fp "$FILE" "$_VCSDIR/automerged/$file"
+							${TEST} ! -x ./+VERSIONING ||
+								./+VERSIONING REGISTER "$_VCSDIR/automerged/$file"
+							${TEST} ! -x ./+VERSIONING ||
+								./+VERSIONING CHECKOUT-FIRST "$_VCSDIR/defaults/$file"
+							${CP} -fp "$file" "$_VCSDIR/defaults/$file.automerge"
+							${TEST} ! -x ./+VERSIONING ||
+								./+VERSIONING MERGE "$f_eg" "$_VCSDIR/defaults/$file" 	
+							mergestatus=$?
+							case $mergestatus in
+							0)
+								${ECHO} "merged with no conflict. installing it to $file!"
+								${DIFF} -uq "$file" "$_VCSDIR/defaults/$file.automerge"
+								${CP} -fp "$_VCSDIR/defaults/$file.automerge" "$file"
+								${TEST} -x ./+VERSIONING ||
+									./+VERSIONING CHECKOUT "$_VCSDIR/defaults/$file"
+								${ECHO} "revert from the last revision of $_VCSDIR/automerged/$file if needed"
+								;;
+							1)
+								${ECHO} "some conflicts merging. manually review them in"
+								${ECHO} "$_VCSDIR/defaults/$file.automerge"
+								${ECHO} "then copy the result to $file"
+								;;
+							*)
+								${ECHO} "merge exited with errors. not changing anything"		
+								;;
+							esac
+						else
+							${ECHO} "saving the currently user-installed revision to $_VCSDIR/user/$file"
+							${MKDIR} -p "$_VCSDIR/user/$file" 2>/dev/null
+							${RMDIR} "$_VCSDIR/user/$file" 2>/dev/null
+							${CP} -fp "$file" "$_VCSDIR/user/$file"
+							${TEST} ! -x ./+VERSIONING ||
+								./+VERSIONING REGISTER "$_VCSDIR/user/$file"
+							${TEST} ! -x ./+VERSIONING ||
+								./+VERSIONING CHECKOUT-FIRST "$_VCSDIR/defaults/$file"
+							${CP} -fp "$file" "$_VCSDIR/defaults/$file.automerge"
+							${TEST} ! -x ./+VERSIONING ||
+								./+VERSIONING MERGE "$f_eg" "$_VCSDIR/defaults/$file"
+							mergestatus=$?
+							case $mergestatus in
+							0)
+								${ECHO} "merged with no conflicts. installing it to $file!"
+								${DIFF} -uq "$file" "$_VCSDIR/defaults/$file.automerge"
+								${CP} -fp "$_VCSDIR/defaults/$file.automerge" "$file"
+								if ${TEST} $? -eq 0; then
+									${ECHO} "$file" >> "$_VCSDIR/automergedfiles"
+								fi
+								${TEST} ! -x ./+VERSIONING ||
+									./+VERSIONING CHECKOUT "$_VCSDIR/defaults/$file"
+								${ECHO} "revert from the last revision of $_VCSDIR/user/$file if needed"
+								;;
+							1)
+								${ECHO} "some conflicts merging. manually review them in"
+								${ECHO} "$_VCSDIR/defaults/$file.automerge"
+								${ECHO} "then copy the result to $file"
+								;;
+							*)
+								${ECHO} "merge exited with errors. not changing anything"
+								;;
+							esac	
+						fi	
+					fi
+										
 				elif ${TEST} -f "$f_eg" -o -c "$f_eg"; then
 					${ECHO} "${PKGNAME}: copying $f_eg to $file"
 					${CP} $f_eg $file
diff --git a/mk/pkginstall/versioning b/mk/pkginstall/versioning
new file mode 100644
index 00000000000..6be62aac754
--- /dev/null
+++ b/mk/pkginstall/versioning
@@ -0,0 +1,96 @@
+case "${STAGE},$1" in
+UNPACK,|UNPACK,+VERSIONING)
+	${CAT} > ./+VERSIONING << 'EOF'
+#!@SH@
+#
+# +VERSIONING - interact with version control systems
+#
+# Usage: ./+VERSIONING REGISTER|CHECKOUT|CHECKOUT-FIRST [examplefile]
+#	 ./+VERSIONING MERGE [examplefile] [firstrevision]
+#
+AWK="@AWK@"
+CAT="@CAT@"
+CHGRP="@CHGRP@"
+CHMOD="@CHMOD@"
+CHOWN="@CHOWN@"
+ECHO="@ECHO@"
+GREP="@GREP@"
+LS="@LS@"
+MKDIR="@MKDIR@"
+MV="@MV@"
+PWD_CMD="@PWD_CMD@"
+RM="@RM@"
+RMDIR="@RMDIR@"
+SED="@SED@"
+SORT="@SORT@"
+TEST="@TEST@"
+TRUE="@TRUE@"
+RCS="@RCS@"
+CI="@CI@"
+CO="@CO@"
+MERGE="@MERGE@"
+
+SELF=$0
+ACTION=$1
+CFILE=$2
+FIRSTFILE=$3
+exitcode=0
+_CVS="${CVS:-rcs}"
+
+CURDIR=`${PWD_CMD}`
+
+case $ACTION in
+REGISTER)
+	case $_CVS in
+	"rcs")
+		${CI} -u "$CFILE"
+		exitcode=$?
+		;;
+	*)
+		${ECHO} "$_CVS: unsupported versioning system"
+		exitcode=2
+		;;
+	esac
+	;;
+CHECKOUT)
+	case $_CVS in
+	"rcs")
+		${CO} -f "$CFILE"
+		exitcode=$?
+		;;
+	*)
+		${ECHO} "$_CVS: unsupported versioning system"
+		exitcode=2
+		;;
+	esac
+	;;
+CHECKOUT-FIRST)
+	case $_CVS in
+	"rcs")
+		${CO} -r1 -f "$CFILE"
+		exitcode=$?
+		;;
+	*)
+		${ECHO} "$_CVS: unsupported versioning system"
+		exitcode=2
+		;;
+	esac
+	;;
+MERGE)
+	${MERGE} "$CFILE.automerge" "$FIRSTFILE" "$CFILE"
+	exitcode=$?
+	;;
+*)
+	${ECHO} "Usage: ./+VERSIONING REGISTER|CHECKOUT|CHECKOUT-FIRST [examplefile]"
+	${ECHO} "Usage: ./+VERSIONING MERGE [examplefile] [firstrevision]"
+	exitcode=3
+	;;
+esac
+exit $exitcode
+
+EOF
+	${SED} -n "/^\# VERSIONING: /p" ${SELF} >> ./+VERSIONING
+	${CHMOD} +x ./+VERSIONING
+	;;
+esac
+
diff --git a/mk/tools/defaults.mk b/mk/tools/defaults.mk
index 161e0a3ce19..41530bb6522 100644
--- a/mk/tools/defaults.mk
+++ b/mk/tools/defaults.mk
@@ -62,8 +62,10 @@ _TOOLS_VARNAME.cat=		CAT
 _TOOLS_VARNAME.chgrp=		CHGRP
 _TOOLS_VARNAME.chmod=		CHMOD
 _TOOLS_VARNAME.chown=		CHOWN
+_TOOLS_VARNAME.ci=		CI
 _TOOLS_VARNAME.cmake=		CMAKE
 _TOOLS_VARNAME.cmp=		CMP
+_TOOLS_VARNAME.co=		CO
 _TOOLS_VARNAME.cp=		CP
 _TOOLS_VARNAME.cpack=		CPACK
 _TOOLS_VARNAME.csh=		CSH
@@ -106,6 +108,7 @@ _TOOLS_VARNAME.lzcat=		LZCAT
 _TOOLS_VARNAME.m4=		M4
 _TOOLS_VARNAME.mail=		MAIL_CMD
 _TOOLS_VARNAME.makeinfo=	MAKEINFO
+_TOOLS_VARNAME.merge=		MERGE
 _TOOLS_VARNAME.mkdir=		MKDIR
 _TOOLS_VARNAME.mktemp=		MKTEMP
 _TOOLS_VARNAME.mtree=		MTREE
@@ -120,6 +123,7 @@ _TOOLS_VARNAME.perl=		PERL5
 _TOOLS_VARNAME.pod2man=		POD2MAN
 _TOOLS_VARNAME.printf=		PRINTF
 _TOOLS_VARNAME.pwd=		PWD_CMD
+_TOOLS_VARNAME.rcs=		RCS
 _TOOLS_VARNAME.rm=		RM
 _TOOLS_VARNAME.rmdir=		RMDIR
 _TOOLS_VARNAME.rpm2pkg=		RPM2PKG
@@ -139,6 +143,7 @@ _TOOLS_VARNAME.touch=		TOUCH
 _TOOLS_VARNAME.tr=		TR
 _TOOLS_VARNAME.true=		TRUE
 _TOOLS_VARNAME.tsort=		TSORT
+_TOOLS_VARNAME.tty=		TTY
 _TOOLS_VARNAME.uniq=		UNIQ
 _TOOLS_VARNAME.unrar=		UNRAR
 _TOOLS_VARNAME.unzip=		UNZIP_CMD
diff --git a/mk/tools/replace.mk b/mk/tools/replace.mk
index dbcdd6e12de..e3ba0be4766 100644
--- a/mk/tools/replace.mk
+++ b/mk/tools/replace.mk
@@ -492,15 +492,19 @@ TOOLS_ARGS.gzip=		-nf ${GZIP}
 .  endif
 .endif
 
-.if !defined(TOOLS_IGNORE.ident) && !empty(_USE_TOOLS:Mident)
-.  if !empty(PKGPATH:Mdevel/rcs)
-MAKEFLAGS+=			TOOLS_IGNORE.ident=
-.  elif !empty(_TOOLS_USE_PKGSRC.ident:M[yY][eE][sS])
-TOOLS_DEPENDS.ident?=		rcs-[0-9]*:../../devel/rcs
-TOOLS_CREATE+=			ident
-TOOLS_PATH.ident=		${LOCALBASE}/bin/ident
-.  endif
-.endif
+_TOOLS.rcsutils=	ident merge ci co rcs
+.for _t_ in ${_TOOLS.rcsutils}
+.	if !defined(TOOLS_IGNORE.${_t_}) && !empty(_USE_TOOLS:M${_t_})
+.		if !empty(PKGPATH:Mdevel/rcs)
+MAKEFLAGS+=             TOOLS_IGNORE.${_t_}=
+.	elif !empty(_TOOLS_USE_PKGSRC.${_t_}:M[yY][eE][sS])
+TOOLS_DEPENDS.${_t_}?=		rcs-[0-9]*:../../devel/rcs
+TOOLS_CREATE+=			${_t_}
+TOOLS_PATH.${_t_}=		${LOCALBASE}/bin/${_t_}
+.		endif
+.	endif
+.endfor
+
 
 .if !defined(TOOLS_IGNORE.install-info) && !empty(_USE_TOOLS:Minstall-info)
 .  if !empty(PKGPATH:Mpkgtools/pkg_install-info)
diff --git a/mk/tools/tools.AIX.mk b/mk/tools/tools.AIX.mk
index d358456f02a..2feee639702 100644
--- a/mk/tools/tools.AIX.mk
+++ b/mk/tools/tools.AIX.mk
@@ -63,6 +63,9 @@ TOOLS_PLATFORM.touch?=		/usr/bin/touch
 TOOLS_PLATFORM.tr?=		/usr/bin/tr
 TOOLS_PLATFORM.true?=		true			# shell builtin
 TOOLS_PLATFORM.tsort?=		/usr/bin/tsort
+.if exists(/usr/bin/tty)
+TOOLS_PLATFORM.tty?=		tty
+.endif
 TOOLS_PLATFORM.uniq?=		/usr/bin/uniq
 TOOLS_PLATFORM.wc?=		/usr/bin/wc
 TOOLS_PLATFORM.xargs?=		/usr/bin/xargs
diff --git a/mk/tools/tools.BSDOS.mk b/mk/tools/tools.BSDOS.mk
index 8bad48758ea..2f876ec9a41 100644
--- a/mk/tools/tools.BSDOS.mk
+++ b/mk/tools/tools.BSDOS.mk
@@ -82,6 +82,9 @@ TOOLS_PLATFORM.touch?=		/usr/bin/touch
 TOOLS_PLATFORM.tr?=		/usr/bin/tr
 TOOLS_PLATFORM.true?=		true			# shell builtin
 TOOLS_PLATFORM.tsort?=		/usr/bin/tsort
+.if exists(/usr/bin/tty)
+TOOLS_PLATFORM.tty?=		/usr/bin/tty
+.endif
 TOOLS_PLATFORM.uniq?=		/usr/bin/uniq
 TOOLS_PLATFORM.wc?=		/usr/bin/wc
 TOOLS_PLATFORM.xargs?=		/usr/bin/xargs
diff --git a/mk/tools/tools.Bitrig.mk b/mk/tools/tools.Bitrig.mk
index 3ea39e7c296..2ba513f6d56 100644
--- a/mk/tools/tools.Bitrig.mk
+++ b/mk/tools/tools.Bitrig.mk
@@ -10,7 +10,9 @@ TOOLS_PLATFORM.cat?=		/bin/cat
 TOOLS_PLATFORM.chgrp?=		/bin/chgrp
 TOOLS_PLATFORM.chmod?=		/bin/chmod
 TOOLS_PLATFORM.chown?=		/sbin/chown
+TOOLS_PLATFORM.ci?=		/usr/bin/ci
 TOOLS_PLATFORM.cmp?=		/usr/bin/cmp
+TOOLS_PLATFORM.co?=		/usr/bin/co
 TOOLS_PLATFORM.cp?=		/bin/cp
 TOOLS_PLATFORM.csh?=		/bin/csh
 TOOLS_PLATFORM.cut?=		/usr/bin/cut
@@ -45,6 +47,7 @@ TOOLS_PLATFORM.ls?=		/bin/ls
 TOOLS_PLATFORM.m4?=		/usr/bin/m4
 TOOLS_PLATFORM.mail?=		/usr/bin/mail
 TOOLS_PLATFORM.makeinfo?=	/usr/bin/makeinfo
+TOOLS_PLATFORM.merge?=		/usr/bin/merge
 TOOLS_PLATFORM.mkdir?=		/bin/mkdir -p
 TOOLS_PLATFORM.mktemp?=		/usr/bin/mktemp
 TOOLS_PLATFORM.mtree?=		/usr/sbin/mtree
@@ -58,6 +61,7 @@ TOOLS_PLATFORM.patch?=		/usr/bin/patch
 TOOLS_PLATFORM.pax?=		/bin/pax
 TOOLS_PLATFORM.printf?=		/usr/bin/printf
 TOOLS_PLATFORM.pwd?=		/bin/pwd
+TOOLS_PLATFORM.rcs?=		/usr/bin/rcs
 TOOLS_PLATFORM.readelf?=	/usr/bin/readelf
 TOOLS_PLATFORM.readlink?=	/usr/bin/readlink
 TOOLS_PLATFORM.rm?=		/bin/rm
diff --git a/mk/tools/tools.Cygwin.mk b/mk/tools/tools.Cygwin.mk
index 5991699eb8c..98c1c5e21d1 100644
--- a/mk/tools/tools.Cygwin.mk
+++ b/mk/tools/tools.Cygwin.mk
@@ -25,7 +25,13 @@ TOOLS_PLATFORM.cat?=		/bin/cat
 TOOLS_PLATFORM.chgrp?=		/bin/chgrp
 TOOLS_PLATFORM.chmod?=		/bin/chmod
 TOOLS_PLATFORM.chown?=		/bin/chown
+.if exists(/bin/ci)
+TOOLS_PLATFORM.ci?=		/bin/ci
+.endif
 TOOLS_PLATFORM.cmp?=		/bin/cmp
+.if exists(/bin/co)
+TOOLS_PLATFORM.co?=		/bin/co
+.endif
 TOOLS_PLATFORM.cp?=		/bin/cp
 .if exists(/bin/tcsh)
 TOOLS_PLATFORM.csh?=		/bin/tcsh
@@ -86,6 +92,9 @@ TOOLS_PLATFORM.m4?=		/bin/m4
 TOOLS_PLATFORM.gmake?=		/bin/make
 .endif
 TOOLS_PLATFORM.makeinfo?=	/bin/makeinfo
+.if exists(/bin/merge)
+TOOLS_PLATFORM.merge?=		/bin/merge
+.endif
 TOOLS_PLATFORM.mkdir?=		/bin/mkdir -p
 TOOLS_PLATFORM.mktemp?=		/bin/mktemp
 .if exists(/bin/msgconv)
@@ -119,6 +128,9 @@ TOOLS_PLATFORM.pkg-config?=	/bin/pkg-config
 .endif
 TOOLS_PLATFORM.printf?=		/bin/printf
 TOOLS_PLATFORM.pwd?=		/bin/pwd
+.if exists(/bin/rcs)
+TOOLS_PLATFORM.rcs?=		/bin/rcs
+.endif
 TOOLS_PLATFORM.readlink?=	/bin/readlink
 TOOLS_PLATFORM.rm?=		/bin/rm
 TOOLS_PLATFORM.rmdir?=		/bin/rmdir
diff --git a/mk/tools/tools.Darwin.mk b/mk/tools/tools.Darwin.mk
index 2464ea7b2bf..6e0305323d7 100644
--- a/mk/tools/tools.Darwin.mk
+++ b/mk/tools/tools.Darwin.mk
@@ -25,7 +25,9 @@ TOOLS_PLATFORM.cat?=		/bin/cat
 TOOLS_PLATFORM.chgrp?=		/usr/bin/chgrp
 TOOLS_PLATFORM.chmod?=		/bin/chmod
 TOOLS_PLATFORM.chown?=		/usr/sbin/chown
+TOOLS_PLATFORM.ci?=		/usr/bin/ci
 TOOLS_PLATFORM.cmp?=		/usr/bin/cmp
+TOOLS_PLATFORM.co?=		/usr/bin/co
 TOOLS_PLATFORM.cp?=		/bin/cp
 TOOLS_PLATFORM.csh?=		/bin/tcsh
 .if exists(/usr/bin/curl)
@@ -78,6 +80,9 @@ TOOLS_PLATFORM.mail?=		/usr/bin/mail
 .if exists(/usr/bin/makeinfo)
 TOOLS_PLATFORM.makeinfo?=	/usr/bin/makeinfo
 .endif
+.if exists(/usr/bin/merge)
+TOOLS_PLATFORM.merge?=		/usr/bin/merge
+.endif
 TOOLS_PLATFORM.mkdir?=		/bin/mkdir -p
 TOOLS_PLATFORM.mktemp?=		/usr/bin/mktemp
 TOOLS_PLATFORM.mtree?=		/usr/sbin/mtree
@@ -90,6 +95,7 @@ TOOLS_PLATFORM.pax?=		/bin/pax
 #TOOLS_PLATFORM.patch?=		/usr/bin/patch
 TOOLS_PLATFORM.printf?=		/usr/bin/printf
 TOOLS_PLATFORM.pwd?=		/bin/pwd
+TOOLS_PLATFORM.rcs?=		/usr/bin/rcs
 TOOLS_PLATFORM.readlink?=	/usr/bin/readlink
 TOOLS_PLATFORM.rm?=		/bin/rm
 TOOLS_PLATFORM.rmdir?=		/bin/rmdir
@@ -117,6 +123,7 @@ TOOLS_PLATFORM.touch?=		/usr/bin/touch
 TOOLS_PLATFORM.tr?=		/usr/bin/tr
 TOOLS_PLATFORM.true?=		true			# shell builtin
 TOOLS_PLATFORM.tsort?=		/usr/bin/tsort
+TOOLS_PLATFORM.tty?=		/usr/bin/tty
 TOOLS_PLATFORM.uniq?=		/usr/bin/uniq
 TOOLS_PLATFORM.unzip?=		/usr/bin/unzip
 TOOLS_PLATFORM.wc?=		/usr/bin/wc
diff --git a/mk/tools/tools.DragonFly.mk b/mk/tools/tools.DragonFly.mk
index d0533aff27c..197c1df7612 100644
--- a/mk/tools/tools.DragonFly.mk
+++ b/mk/tools/tools.DragonFly.mk
@@ -15,7 +15,9 @@ TOOLS_PLATFORM.cat?=		/bin/cat
 TOOLS_PLATFORM.chgrp?=		/usr/bin/chgrp
 TOOLS_PLATFORM.chmod?=		/bin/chmod
 TOOLS_PLATFORM.chown?=		/usr/sbin/chown
+TOOLS_PLATFORM.ci?=		/usr/bin/ci
 TOOLS_PLATFORM.cmp?=		/usr/bin/cmp
+TOOLS_PLATFORM.co?=		/usr/bin/co
 TOOLS_PLATFORM.cp?=		/bin/cp
 TOOLS_PLATFORM.csh?=		/bin/csh
 TOOLS_PLATFORM.cut?=		/usr/bin/cut
@@ -59,6 +61,9 @@ TOOLS_PLATFORM.mail?=		/usr/bin/mail
 .if exists(/usr/bin/makeinfo)
 TOOLS_PLATFORM.makeinfo?=	/usr/bin/makeinfo
 .endif
+.if exists(/usr/bin/merge)
+TOOLS_PLATFORM.merge?=		/usr/bin/merge
+.endif
 TOOLS_PLATFORM.mkdir?=		/bin/mkdir -p
 TOOLS_PLATFORM.mktemp?=		/usr/bin/mktemp
 TOOLS_PLATFORM.mtree?=		/usr/sbin/mtree
@@ -70,6 +75,7 @@ TOOLS_PLATFORM.patch?=		/usr/bin/patch
 TOOLS_PLATFORM.pax?=		/bin/pax
 TOOLS_PLATFORM.printf?=		/usr/bin/printf
 TOOLS_PLATFORM.pwd?=		/bin/pwd
+TOOLS_PLATFORM.rcs?=		/usr/bin/rcs
 TOOLS_PLATFORM.readelf?=	/usr/bin/readelf
 TOOLS_PLATFORM.readlink?=	/usr/bin/readlink
 TOOLS_PLATFORM.rm?=		/bin/rm
@@ -91,6 +97,7 @@ TOOLS_PLATFORM.touch?=		/usr/bin/touch
 TOOLS_PLATFORM.tr?=		/usr/bin/tr
 TOOLS_PLATFORM.true?=		/usr/bin/true
 TOOLS_PLATFORM.tsort?=		/usr/bin/tsort
+TOOLS_PLATFORM.tty?=		/usr/bin/tty
 TOOLS_PLATFORM.uniq?=		/usr/bin/uniq
 TOOLS_PLATFORM.wc?=		/usr/bin/wc
 TOOLS_PLATFORM.xargs?=		/usr/bin/xargs
diff --git a/mk/tools/tools.FreeBSD.mk b/mk/tools/tools.FreeBSD.mk
index 7841315e47d..f9213238c3c 100644
--- a/mk/tools/tools.FreeBSD.mk
+++ b/mk/tools/tools.FreeBSD.mk
@@ -15,6 +15,7 @@ TOOLS_PLATFORM.cat?=		/bin/cat
 TOOLS_PLATFORM.chgrp?=		/usr/bin/chgrp
 TOOLS_PLATFORM.chmod?=		/bin/chmod
 TOOLS_PLATFORM.chown?=		/usr/sbin/chown
+TOOLS_PLATFORM.ci?=             /usr/bin/ci
 TOOLS_PLATFORM.cmp?=		/usr/bin/cmp
 TOOLS_PLATFORM.cp?=		/bin/cp
 TOOLS_PLATFORM.csh?=		/bin/csh
@@ -67,6 +68,7 @@ TOOLS_PLATFORM.openssl?=	/usr/bin/openssl
 TOOLS_PLATFORM.pax?=		/bin/pax
 TOOLS_PLATFORM.printf?=		/usr/bin/printf
 TOOLS_PLATFORM.pwd?=		/bin/pwd
+TOOLS_PLATFORM.rcs?=		/usr/bin/rcs
 TOOLS_PLATFORM.readelf?=	/usr/bin/readelf
 TOOLS_PLATFORM.readlink?=	/usr/bin/readlink
 TOOLS_PLATFORM.rm?=		/bin/rm
@@ -89,6 +91,7 @@ TOOLS_PLATFORM.touch?=		/usr/bin/touch
 TOOLS_PLATFORM.tr?=		/usr/bin/tr
 TOOLS_PLATFORM.true?=		true			# shell builtin
 TOOLS_PLATFORM.tsort?=		/usr/bin/tsort
+TOOLS_PLATFORM.tty?=		/usr/bin/tty
 TOOLS_PLATFORM.uniq?=		/usr/bin/uniq
 .if exists(/usr/bin/unzip)
 TOOLS_PLATFORM.unzip?=		/usr/bin/unzip
diff --git a/mk/tools/tools.FreeMiNT.mk b/mk/tools/tools.FreeMiNT.mk
index 2a93943ae38..2639efe2eb5 100644
--- a/mk/tools/tools.FreeMiNT.mk
+++ b/mk/tools/tools.FreeMiNT.mk
@@ -86,6 +86,9 @@ TOOLS_PLATFORM.touch?=		/bin/touch
 TOOLS_PLATFORM.tr?=		/usr/bin/tr
 TOOLS_PLATFORM.true?=		true			# shell builtin
 TOOLS_PLATFORM.tsort?=		/usr/bin/tsort
+.if exists(/usr/bin/tty)
+TOOLS_PLATFORM.tty?=		/usr/bin/tty
+.endif
 TOOLS_PLATFORM.uniq?=		/bin/uniq
 TOOLS_PLATFORM.wc?=		/usr/bin/wc
 TOOLS_PLATFORM.xargs?=		/usr/bin/xargs -r
diff --git a/mk/tools/tools.GNUkFreeBSD.mk b/mk/tools/tools.GNUkFreeBSD.mk
index 2972c83dc1f..4c359971085 100644
--- a/mk/tools/tools.GNUkFreeBSD.mk
+++ b/mk/tools/tools.GNUkFreeBSD.mk
@@ -81,6 +81,7 @@ TOOLS_PLATFORM.touch?=		/usr/bin/touch
 TOOLS_PLATFORM.tr?=		/usr/bin/tr
 TOOLS_PLATFORM.true?=		true			# shell builtin
 TOOLS_PLATFORM.tsort?=		/usr/bin/tsort
+TOOLS_PLATFORM.tty?=		/usr/bin/tty
 TOOLS_PLATFORM.uniq?=		/usr/bin/uniq
 TOOLS_PLATFORM.wc?=		/usr/bin/wc
 TOOLS_PLATFORM.xargs?=		/usr/bin/xargs -r
diff --git a/mk/tools/tools.HPUX.mk b/mk/tools/tools.HPUX.mk
index 03a88589675..b002d2fb2d6 100644
--- a/mk/tools/tools.HPUX.mk
+++ b/mk/tools/tools.HPUX.mk
@@ -56,6 +56,7 @@ TOOLS_PLATFORM.touch?=		/usr/bin/touch
 TOOLS_PLATFORM.tr?=		/usr/bin/tr
 TOOLS_PLATFORM.true?=		true			# shell builtin
 TOOLS_PLATFORM.tsort?=		/usr/bin/tsort
+TOOLS_PLATFORM.tty?=		/usr/bin/tty
 TOOLS_PLATFORM.uniq?=		/usr/bin/uniq
 TOOLS_PLATFORM.wc?=		/usr/bin/wc
 TOOLS_PLATFORM.xargs?=		/usr/bin/xargs
diff --git a/mk/tools/tools.Haiku.mk b/mk/tools/tools.Haiku.mk
index 0bca51421dc..6817afd18e2 100644
--- a/mk/tools/tools.Haiku.mk
+++ b/mk/tools/tools.Haiku.mk
@@ -24,7 +24,9 @@ TOOLS_PLATFORM.cat?=		/bin/cat
 TOOLS_PLATFORM.chgrp?=		/bin/chgrp
 TOOLS_PLATFORM.chmod?=		/bin/chmod
 TOOLS_PLATFORM.chown?=		/bin/chown
+TOOLS_PLATFORM.ci?=		/bin/ci
 TOOLS_PLATFORM.cmp?=		/bin/cmp
+TOOLS_PLATFORM.co?=		/bin/co
 TOOLS_PLATFORM.cp?=		/bin/cp
 TOOLS_PLATFORM.cut?=		/bin/cut
 .if exists(/bin/curl)
@@ -101,6 +103,9 @@ TOOLS_PLATFORM.makeinfo?=	/bin/makeinfo
 .elif exists(/boot/common/bin/makeinfo)
 TOOLS_PLATFORM.makeinfo?=	/boot/common/bin/makeinfo
 .endif
+.if exists(/bin/merge)
+TOOLS_PLATFORM.merge?=		/bin/merge
+.endif
 TOOLS_PLATFORM.mkdir?=		/bin/mkdir -p
 .if exists(/bin/mktemp)
 TOOLS_PLATFORM.mktemp?=		/bin/mktemp
@@ -120,6 +125,7 @@ TOOLS_PLATFORM.openssl?=	/boot/common/bin/openssl
 #TOOLS_PLATFORM.patch?=		/bin/patch
 TOOLS_PLATFORM.printf?=		/bin/printf
 TOOLS_PLATFORM.pwd?=		/bin/pwd
+TOOLS_PLATFORM.rcs?=		/bin/rcs
 TOOLS_PLATFORM.readlink?=	/bin/readlink
 TOOLS_PLATFORM.rm?=		/bin/rm
 TOOLS_PLATFORM.rmdir?=		/bin/rmdir
@@ -149,6 +155,9 @@ TOOLS_PLATFORM.touch?=		/bin/touch
 TOOLS_PLATFORM.tr?=		/bin/tr
 TOOLS_PLATFORM.true?=		true			# shell builtin
 TOOLS_PLATFORM.tsort?=		/bin/tsort
+.if exists(/bin/tty)
+TOOLS_PLATFORM.tty?=		/bin/tty
+.endif
 TOOLS_PLATFORM.uniq?=		/bin/uniq
 TOOLS_PLATFORM.unzip?=		/bin/unzip
 TOOLS_PLATFORM.wc?=		/bin/wc
diff --git a/mk/tools/tools.IRIX.mk b/mk/tools/tools.IRIX.mk
index f761a7e6523..20d47058c93 100644
--- a/mk/tools/tools.IRIX.mk
+++ b/mk/tools/tools.IRIX.mk
@@ -66,6 +66,9 @@ TOOLS_PLATFORM.touch?=		/usr/bin/touch
 TOOLS_PLATFORM.tr?=		/usr/bin/tr
 TOOLS_PLATFORM.true?=		true			# shell builtin
 TOOLS_PLATFORM.tsort?=		/usr/bin/tsort
+.if exists(/usr/bin/tty)
+TOOLS_PLATFORM.tty?=		/usr/bin/tty
+.endif
 TOOLS_PLATFORM.uniq?=		/usr/bin/uniq
 TOOLS_PLATFORM.wc?=		/sbin/wc
 TOOLS_PLATFORM.xargs?=		/sbin/xargs
diff --git a/mk/tools/tools.Interix.mk b/mk/tools/tools.Interix.mk
index 4c30c5baccc..8ae0da14d3c 100644
--- a/mk/tools/tools.Interix.mk
+++ b/mk/tools/tools.Interix.mk
@@ -79,6 +79,9 @@ TOOLS_PLATFORM.touch?=		/bin/touch
 TOOLS_PLATFORM.tr?=		/bin/tr
 TOOLS_PLATFORM.true?=		true			# shell builtin
 TOOLS_PLATFORM.tsort?=		/bin/tsort
+.if exists(/bin/tty)
+TOOLS_PLATFORM.tty?=		/bin/tty
+.endif
 TOOLS_PLATFORM.uniq?=		/bin/uniq
 TOOLS_PLATFORM.wc?=		/bin/wc
 .if !empty(MACHINE_PLATFORM:MInterix-[0-5].*-*)
diff --git a/mk/tools/tools.Linux.mk b/mk/tools/tools.Linux.mk
index 151a919f460..70cf7713ad5 100644
--- a/mk/tools/tools.Linux.mk
+++ b/mk/tools/tools.Linux.mk
@@ -45,11 +45,17 @@ TOOLS_PLATFORM.chown?=		/bin/chown
 .elif exists(/usr/sbin/chown)
 TOOLS_PLATFORM.chown?=		/usr/sbin/chown
 .endif
+.if exists(/usr/bin/ci)
+TOOLS_PLATFORM.ci?=		/usr/bin/ci
+.endif
 .if exists(/bin/cmp)
 TOOLS_PLATFORM.cmp?=		/bin/cmp
 .elif exists(/usr/bin/cmp)
 TOOLS_PLATFORM.cmp?=		/usr/bin/cmp
 .endif
+.if exists(/usr/bin/co)
+TOOLS_PLATFORM.co?=		/usr/bin/co
+.endif
 TOOLS_PLATFORM.cp?=		/bin/cp
 .if exists(/bin/tcsh)
 TOOLS_PLATFORM.csh?=		/bin/tcsh
@@ -188,6 +194,9 @@ TOOLS_PLATFORM.mail?=		/usr/bin/mail	# Debian, Slackware, SuSE
 .if exists(/usr/bin/makeinfo)
 TOOLS_PLATFORM.makeinfo?=	/usr/bin/makeinfo
 .endif
+.if exists(/usr/bin/merge)
+TOOLS_PLATFORM.merge?=		/usr/bin/merge
+.endif
 TOOLS_PLATFORM.mkdir?=		/bin/mkdir -p
 .if exists(/usr/bin/mktemp)
 TOOLS_PLATFORM.mktemp?=		/usr/bin/mktemp
@@ -221,6 +230,9 @@ TOOLS_PLATFORM.openssl?=	/usr/bin/openssl
 TOOLS_PLATFORM.printf?=		/usr/bin/printf
 .endif
 TOOLS_PLATFORM.pwd?=		/bin/pwd
+.if exists(/usr/bin/rcs)
+TOOLS_PLATFORM.rcs?=		/usr/bin/rcs 
+.endif
 TOOLS_PLATFORM.readlink?=	/bin/readlink
 TOOLS_PLATFORM.rm?=		/bin/rm
 TOOLS_PLATFORM.rmdir?=		/bin/rmdir
@@ -260,6 +272,7 @@ TOOLS_PLATFORM.touch?=		/usr/bin/touch
 TOOLS_PLATFORM.tr?=		/usr/bin/tr
 TOOLS_PLATFORM.true?=		true			# shell builtin
 TOOLS_PLATFORM.tsort?=		/usr/bin/tsort
+TOOLS_PLATFORM.tty?=		/usr/bin/tty
 .if exists(/bin/uniq)
 TOOLS_PLATFORM.uniq?=		/bin/uniq
 .elif exists(/usr/bin/uniq)
diff --git a/mk/tools/tools.Minix.mk b/mk/tools/tools.Minix.mk
index 6a00c5c0bbc..1f47e9cba58 100644
--- a/mk/tools/tools.Minix.mk
+++ b/mk/tools/tools.Minix.mk
@@ -69,6 +69,7 @@ TOOLS_PLATFORM.touch?=		/usr/bin/touch
 TOOLS_PLATFORM.tr?=		/usr/bin/tr
 TOOLS_PLATFORM.true?=		/bin/true
 TOOLS_PLATFORM.tsort?=		/usr/bin/tsort
+TOOLS_PLATFORM.tty?=		/usr/bin/tty
 TOOLS_PLATFORM.uniq?=		/usr/bin/uniq
 TOOLS_PLATFORM.wc?=		/usr/bin/wc
 TOOLS_PLATFORM.xargs?=		/usr/bin/xargs
diff --git a/mk/tools/tools.MirBSD.mk b/mk/tools/tools.MirBSD.mk
index a19cc3e4307..941d4857a4c 100644
--- a/mk/tools/tools.MirBSD.mk
+++ b/mk/tools/tools.MirBSD.mk
@@ -72,6 +72,7 @@ TOOLS_PLATFORM.touch?=		/usr/bin/touch
 TOOLS_PLATFORM.tr?=		/usr/bin/tr
 TOOLS_PLATFORM.true?=		/bin/sh -c true
 TOOLS_PLATFORM.tsort?=		/usr/bin/tsort
+TOOLS_PLATFORM.tty?=		/usr/bin/tty
 TOOLS_PLATFORM.uniq?=		/usr/bin/uniq
 TOOLS_PLATFORM.wc?=		/usr/bin/wc
 TOOLS_PLATFORM.xargs?=		/usr/bin/xargs -r
diff --git a/mk/tools/tools.NetBSD.mk b/mk/tools/tools.NetBSD.mk
index 0ec2a1a5a3e..60cb16293f0 100644
--- a/mk/tools/tools.NetBSD.mk
+++ b/mk/tools/tools.NetBSD.mk
@@ -14,7 +14,9 @@ TOOLS_PLATFORM.cat?=		/bin/cat
 TOOLS_PLATFORM.chgrp?=		/usr/bin/chgrp
 TOOLS_PLATFORM.chmod?=		/bin/chmod
 TOOLS_PLATFORM.chown?=		/usr/sbin/chown
+TOOLS_PLATFORM.ci?=		/usr/bin/ci
 TOOLS_PLATFORM.cmp?=		/usr/bin/cmp
+TOOLS_PLATFORM.co?=		/usr/bin/co
 TOOLS_PLATFORM.cp?=		/bin/cp
 TOOLS_PLATFORM.csh?=		/bin/csh
 .if exists(/usr/bin/ctfconvert)
@@ -71,6 +73,7 @@ TOOLS_PLATFORM.mail?=		/usr/bin/mail
 .if exists(/usr/bin/makeinfo)
 TOOLS_PLATFORM.makeinfo?=	/usr/bin/makeinfo
 .endif
+TOOLS_PLATROFM.merge?=		/usr/bin/merge
 TOOLS_PLATFORM.mkdir?=		/bin/mkdir -p
 TOOLS_PLATFORM.mktemp?=		/usr/bin/mktemp
 .if exists(/usr/bin/msgconv)
@@ -94,6 +97,7 @@ TOOLS_PLATFORM.paxctl?=		/usr/sbin/paxctl
 .endif
 TOOLS_PLATFORM.printf?=		/usr/bin/printf
 TOOLS_PLATFORM.pwd?=		/bin/pwd
+TOOLS_PLATFORM.rcs?=		/usr/bin/rcs
 .if empty(USE_CROSS_COMPILE:M[yY][eE][sS])
 TOOLS_PLATFORM.readelf?=	/usr/bin/readelf
 .else
@@ -128,6 +132,7 @@ TOOLS_PLATFORM.touch?=		/usr/bin/touch
 TOOLS_PLATFORM.tr?=		/usr/bin/tr
 TOOLS_PLATFORM.true?=		true			# shell builtin
 TOOLS_PLATFORM.tsort?=		/usr/bin/tsort
+TOOLS_PLATFORM.tty?=		/usr/bin/tty
 TOOLS_PLATFORM.uniq?=		/usr/bin/uniq
 .if exists(/usr/bin/unzip)
 TOOLS_PLATFORM.unzip?=		/usr/bin/unzip
diff --git a/mk/tools/tools.OSF1.mk b/mk/tools/tools.OSF1.mk
index 84aed7ce5da..e9a7c26280d 100644
--- a/mk/tools/tools.OSF1.mk
+++ b/mk/tools/tools.OSF1.mk
@@ -57,6 +57,7 @@ TOOLS_PLATFORM.touch?=		/usr/bin/touch
 TOOLS_PLATFORM.tr?=		/usr/bin/tr
 TOOLS_PLATFORM.true?=		true			# shell builtin
 TOOLS_PLATFORM.tsort?=		/usr/bin/tsort
+TOOLS_PLATFORM.tty?=		/usr/bin/tty
 TOOLS_PLATFORM.uniq?=		/usr/bin/uniq
 TOOLS_PLATFORM.wc?=		/usr/bin/wc
 TOOLS_PLATFORM.xargs?=		/usr/bin/xargs
diff --git a/mk/tools/tools.OpenBSD.mk b/mk/tools/tools.OpenBSD.mk
index 516d133270a..c32a6d58925 100644
--- a/mk/tools/tools.OpenBSD.mk
+++ b/mk/tools/tools.OpenBSD.mk
@@ -20,7 +20,13 @@ TOOLS_PLATFORM.chown?=		/sbin/chown
 .elif exists(/usr/sbin/chown)
 TOOLS_PLATFORM.chown?=		/usr/sbin/chown
 .endif
+.if exists(/usr/bin/ci)
+TOOLS_PLATFORM?=		/usr/bin/ci
+.endif
 TOOLS_PLATFORM.cmp?=		/usr/bin/cmp
+.if exists(/usr/bin/co)
+TOOLS_PLATFORM?=		/usr/bin/co
+.endif
 TOOLS_PLATFORM.cp?=		/bin/cp
 TOOLS_PLATFORM.csh?=		/bin/csh
 TOOLS_PLATFORM.cut?=		/usr/bin/cut
@@ -59,6 +65,9 @@ TOOLS_PLATFORM.mail?=		/usr/bin/mail
 .if exists(/usr/bin/makeinfo)
 TOOLS_PLATFORM.makeinfo?=	/usr/bin/makeinfo
 .endif
+.if exists(/usr/bin/merge)
+TOOLS_PLATFORM.merge?=		/usr/bin/merge
+.endif
 TOOLS_PLATFORM.mkdir?=		/bin/mkdir -p
 TOOLS_PLATFORM.mktemp?=		/usr/bin/mktemp
 TOOLS_PLATFORM.mtree?=		/usr/sbin/mtree
@@ -104,6 +113,7 @@ TOOLS_PLATFORM.touch?=		/usr/bin/touch
 TOOLS_PLATFORM.tr?=		/usr/bin/tr
 TOOLS_PLATFORM.true?=		true			# shell builtin
 TOOLS_PLATFORM.tsort?=		/usr/bin/tsort
+TOOLS_PLATFORM.tty?=		/usr/bin/tty
 TOOLS_PLATFORM.uniq?=		/usr/bin/uniq
 TOOLS_PLATFORM.wc?=		/usr/bin/wc
 TOOLS_PLATFORM.xargs?=		/usr/bin/xargs -r
diff --git a/mk/tools/tools.QNX.mk b/mk/tools/tools.QNX.mk
index 1a2d288e3ac..21bbf7fd863 100644
--- a/mk/tools/tools.QNX.mk
+++ b/mk/tools/tools.QNX.mk
@@ -77,6 +77,7 @@ TOOLS_PLATFORM.touch?=		/usr/bin/touch
 TOOLS_PLATFORM.tr?=		/usr/bin/tr
 TOOLS_PLATFORM.true?=		true			# shell builtin
 TOOLS_PLATFORM.tsort?=		/usr/bin/tsort
+TOOLS_PLATFORM.tty?=		/usr/bin/tty
 TOOLS_PLATFORM.uniq?=		/usr/bin/uniq
 TOOLS_PLATFORM.unzip?=		/usr/bin/unzip
 TOOLS_PLATFORM.wc?=		/usr/bin/wc
diff --git a/mk/tools/tools.SCO_SV.mk b/mk/tools/tools.SCO_SV.mk
index f81c13d5e37..db6497a5e8f 100644
--- a/mk/tools/tools.SCO_SV.mk
+++ b/mk/tools/tools.SCO_SV.mk
@@ -59,6 +59,9 @@ TOOLS_PLATFORM.touch?=		/bin/touch
 TOOLS_PLATFORM.tr?=		/usr/bin/tr
 TOOLS_PLATFORM.true?=		/bin/true
 TOOLS_PLATFORM.tsort?=		/bin/tsort
+.if exists(/bin/tty)
+TOOLS_PLATFORM.tty?=		/bin/tty
+.endif
 TOOLS_PLATFORM.wc?=		/bin/wc
 TOOLS_PLATFORM.xargs?=		/usr/bin/xargs
 TOOLS_PLATFORM.xgettext?=	/usr/gnu/bin/xgettext
diff --git a/mk/tools/tools.SunOS.mk b/mk/tools/tools.SunOS.mk
index 079ea307b51..cacc9b0b7c2 100644
--- a/mk/tools/tools.SunOS.mk
+++ b/mk/tools/tools.SunOS.mk
@@ -207,6 +207,7 @@ TOOLS_PLATFORM.touch?=		/usr/bin/touch
 TOOLS_PLATFORM.tr?=		/usr/xpg4/bin/tr
 TOOLS_PLATFORM.true?=		true			# shell builtin
 TOOLS_PLATFORM.tsort?=		/usr/ccs/bin/tsort
+TOOLS_PLATFORM.tty?=		/usr/bin/tty
 TOOLS_PLATFORM.uniq?=		/usr/bin/uniq
 .if exists(/usr/bin/unzip)
 TOOLS_PLATFORM.unzip?=		/usr/bin/unzip
diff --git a/mk/tools/tools.UnixWare.mk b/mk/tools/tools.UnixWare.mk
index d59bd916823..3a3bf9ae288 100644
--- a/mk/tools/tools.UnixWare.mk
+++ b/mk/tools/tools.UnixWare.mk
@@ -49,6 +49,7 @@ TOOLS_PLATFORM.touch?=		/usr/bin/touch
 TOOLS_PLATFORM.tr?=		/usr/bin/tr
 TOOLS_PLATFORM.true?=		/usr/bin/true
 TOOLS_PLATFORM.tsort?=		/usr/ccs/bin/tsort
+TOOLS_PLATFORM.tty?=		/usr/bin/tty
 TOOLS_PLATFORM.uniq?=		/usr/bin/uniq
 TOOLS_PLATFORM.wc?=		/usr/bin/wc
 TOOLS_PLATFORM.xargs?=		/usr/bin/xargs


Home | Main Index | Thread Index | Old Index