xref: /netbsd-src/external/bsd/elftoolchain/dist/tools/netbsd-base-system-import.sh (revision 5ac3bc719ce6e70593039505b491894133237d12)
12dc6aafaSjkoshy#!/bin/sh
22dc6aafaSjkoshy#
32dc6aafaSjkoshy# Copy files from an Elftoolchain checkout and prepare them for import
42dc6aafaSjkoshy# into the NetBSD 'src' tree.
52dc6aafaSjkoshy#
62dc6aafaSjkoshy# Usage:
72dc6aafaSjkoshy#
82dc6aafaSjkoshy#   netbsd-base-system-import.sh [-D] -s SRCDIR -d DISTDIR -m MODULE \
92dc6aafaSjkoshy#     [-m MODULE]...
102dc6aafaSjkoshy
112dc6aafaSjkoshyusage() {
122dc6aafaSjkoshy  echo "Usage: $0 [options]"
132dc6aafaSjkoshy  echo
142dc6aafaSjkoshy  echo "Prepare elftoolchain sources for importing into NetBSD src."
152dc6aafaSjkoshy  echo
162dc6aafaSjkoshy  echo "Options:"
172dc6aafaSjkoshy  echo "  -D            Only show diffs."
182dc6aafaSjkoshy  echo "  -d DISTDIR    Set the 'dist' directory for the elftoolchain import."
192dc6aafaSjkoshy  echo "                Defaults to './dist'."
202dc6aafaSjkoshy  echo "  -h            Display this help text."
212dc6aafaSjkoshy  echo "  -m MODULE     A subdirectory of the elftoolchain tree to be"
222dc6aafaSjkoshy  echo "                imported, e.g. 'libelf', 'common', 'libdwarf', etc."
232dc6aafaSjkoshy  echo "  -s SRCDIR     The 'trunk' directory of an elftoolchain checkout."
242dc6aafaSjkoshy  echo "  -v            Be verbose."
252dc6aafaSjkoshy}
262dc6aafaSjkoshy
272dc6aafaSjkoshyerr() {
282dc6aafaSjkoshy  echo ERROR: "$@" 1>&2
292dc6aafaSjkoshy  echo
302dc6aafaSjkoshy  usage
312dc6aafaSjkoshy  exit 1
322dc6aafaSjkoshy}
332dc6aafaSjkoshy
342dc6aafaSjkoshy## Parse options.
352dc6aafaSjkoshydiff_only=NO
362dc6aafaSjkoshyverbose=NO
372dc6aafaSjkoshyoptions=":d:hs:m:vD"
382dc6aafaSjkoshywhile getopts "$options" var; do
392dc6aafaSjkoshy  case $var in
402dc6aafaSjkoshy  d) dstdir="$OPTARG";;
412dc6aafaSjkoshy  h) usage; exit 0;;
422dc6aafaSjkoshy  m) modules="$OPTARG $modules";;
432dc6aafaSjkoshy  s) srcdir="$OPTARG";;
442dc6aafaSjkoshy  v) verbose=YES;;
452dc6aafaSjkoshy  D) diff_only=YES;;
462dc6aafaSjkoshy  '?') err "Unknown option: '-$OPTARG'.";;
472dc6aafaSjkoshy  ':') err "Option '-$OPTARG' expects an argument.";;
482dc6aafaSjkoshy  esac
49*5ac3bc71Schristos#  shift $((OPTIND - 1))
502dc6aafaSjkoshydone
512dc6aafaSjkoshy
522dc6aafaSjkoshy[ -n "${srcdir}" ] || err "Option -s must be specified."
532dc6aafaSjkoshy[ -n "${modules}" ] || err "Option -m must be specified at least once."
542dc6aafaSjkoshy
552dc6aafaSjkoshyif [ -z "${dstdir}" ]; then
562dc6aafaSjkoshy  dstdir="./dist"
572dc6aafaSjkoshyfi
582dc6aafaSjkoshy
592dc6aafaSjkoshy[ -d ${srcdir} ] || err "Missing source directory '$srcdir'."
602dc6aafaSjkoshy[ -d ${dstdir} ] || err "Missing destination directory '$dstdir'."
612dc6aafaSjkoshy
622dc6aafaSjkoshy# Verify that the source modules exist.
632dc6aafaSjkoshyfor m in ${modules}; do
642dc6aafaSjkoshy  [ -d ${srcdir}/${m} ] || err "Missing source module '${srcdir}/${m}'"
652dc6aafaSjkoshydone
662dc6aafaSjkoshy
672dc6aafaSjkoshy## Helpers.
682dc6aafaSjkoshyrename_svn_id() {
692dc6aafaSjkoshy  sed -e '/\$Id:/ {
702dc6aafaSjkoshy    s/\$Id:/Id:/;
712dc6aafaSjkoshy    s/[ ]*\$//
722dc6aafaSjkoshy  }'
732dc6aafaSjkoshy}
742dc6aafaSjkoshy
752dc6aafaSjkoshyhandle_block_comment() {
762dc6aafaSjkoshy  sed -e '/^\/\*-/ { i\
772dc6aafaSjkoshy/*	\$NetBSD\$	*/\
782dc6aafaSjkoshy
792dc6aafaSjkoshy}'
802dc6aafaSjkoshy}
812dc6aafaSjkoshy
822dc6aafaSjkoshytransform_placeholders() {
832dc6aafaSjkoshy  sed -e \
842dc6aafaSjkoshy'/@ELFTC-DECLARE-DOWNSTREAM-VCSID@/ {
852dc6aafaSjkoshyc \
862dc6aafaSjkoshy#if !defined(__RCSID)\
872dc6aafaSjkoshy#define __RCSID(ID) /**/\
882dc6aafaSjkoshy#endif  /* !defined(__RCSID) */
892dc6aafaSjkoshy}' -e \
902dc6aafaSjkoshy'/@ELFTC-DEFINE-ELFTC-VCSID@/ {
912dc6aafaSjkoshyc \
922dc6aafaSjkoshy#ifndef	ELFTC_VCSID\
932dc6aafaSjkoshy#define	ELFTC_VCSID(ID)		/**/\
942dc6aafaSjkoshy#endif
952dc6aafaSjkoshy}' -e \
962dc6aafaSjkoshy'/@ELFTC-USE-DOWNSTREAM-VCSID@/ {
972dc6aafaSjkoshyc \
98*5ac3bc71Schristos__RCSID("$NetBSD: netbsd-base-system-import.sh,v 1.2 2024/03/03 17:37:34 christos Exp $");
992dc6aafaSjkoshy}' -e \
1002dc6aafaSjkoshy'/@ELFTC-INCLUDE-SYS-CDEFS@/ {
1012dc6aafaSjkoshyc \
1022dc6aafaSjkoshy#include <sys/cdefs.h>
1032dc6aafaSjkoshy}'
1042dc6aafaSjkoshy}
1052dc6aafaSjkoshy
1062dc6aafaSjkoshy# compare_and_move_or_diff filename generated_temp_file
1072dc6aafaSjkoshycompare_and_move_or_diff() {
1082dc6aafaSjkoshy  local dstfile=${dstdir}/${1}
1092dc6aafaSjkoshy
1102dc6aafaSjkoshy  egrep -v '\$NetBSD.*\$' ${2}       > ${srccmptmp}
1112dc6aafaSjkoshy  egrep -v '\$NetBSD.*\$' ${dstfile} > ${dstcmptmp} 2> /dev/null
1122dc6aafaSjkoshy
1132dc6aafaSjkoshy  if cmp -s ${srccmptmp} ${dstcmptmp}; then
1142dc6aafaSjkoshy    return 0
1152dc6aafaSjkoshy  fi
1162dc6aafaSjkoshy
1172dc6aafaSjkoshy  if [ "${diff_only}" = YES ]; then
1182dc6aafaSjkoshy    # Show the changes needed to update the destination.
1192dc6aafaSjkoshy    if [ -f ${dstfile} ]; then
1202dc6aafaSjkoshy      diff -u ${dstfile} ${2}
1212dc6aafaSjkoshy    else
1222dc6aafaSjkoshy      echo '--- new file' ${file}
1232dc6aafaSjkoshy      diff -u /dev/null ${2}
1242dc6aafaSjkoshy    fi
1252dc6aafaSjkoshy  else
1262dc6aafaSjkoshy    mv ${2} ${dstfile} || exit ${?}
1272dc6aafaSjkoshy    changed_file="${1}"
1282dc6aafaSjkoshy  fi
1292dc6aafaSjkoshy}
1302dc6aafaSjkoshy
1312dc6aafaSjkoshy# Manual pages need a CVS ID, and renaming of their SVN IDs.
1322dc6aafaSjkoshyhandle_manual_page() {
133*5ac3bc71Schristos  echo '.\"	$NetBSD: netbsd-base-system-import.sh,v 1.2 2024/03/03 17:37:34 christos Exp $'         > ${srctmp}
1342dc6aafaSjkoshy  echo '.\"'                     >> ${srctmp}
1352dc6aafaSjkoshy  rename_svn_id < ${srcdir}/${1} >> ${srctmp}
1362dc6aafaSjkoshy
1372dc6aafaSjkoshy  compare_and_move_or_diff ${1} ${srctmp}
1382dc6aafaSjkoshy}
1392dc6aafaSjkoshy
1402dc6aafaSjkoshy# M4 files need a NetBSD RCS Id prepended, and any embedded
1412dc6aafaSjkoshy# VCS IDs transformed.
1422dc6aafaSjkoshyhandle_m4_file() {
143*5ac3bc71Schristos  echo 'dnl 	$NetBSD: netbsd-base-system-import.sh,v 1.2 2024/03/03 17:37:34 christos Exp $'  > ${srctmp}
1442dc6aafaSjkoshy  transform_placeholders   <  ${srcdir}/${1} | \
1452dc6aafaSjkoshy    rename_svn_id         >> ${srctmp}
1462dc6aafaSjkoshy
1472dc6aafaSjkoshy  compare_and_move_or_diff ${1} ${srctmp}
1482dc6aafaSjkoshy}
1492dc6aafaSjkoshy
1502dc6aafaSjkoshy# Regular files only need their SVN IDs renamed.
1512dc6aafaSjkoshyhandle_regular_file() {
1522dc6aafaSjkoshy  rename_svn_id < ${srcdir}/${1} > ${srctmp}
1532dc6aafaSjkoshy
1542dc6aafaSjkoshy  compare_and_move_or_diff ${1} ${srctmp}
1552dc6aafaSjkoshy}
1562dc6aafaSjkoshy
1572dc6aafaSjkoshy# C sources need a NetBSD RCS Id prepended, the
1582dc6aafaSjkoshy# ELFTC macros and SVN ids transformed.
1592dc6aafaSjkoshyhandle_c_source() {
1602dc6aafaSjkoshy  handle_block_comment < ${srcdir}/${1} | \
1612dc6aafaSjkoshy    transform_placeholders | \
1622dc6aafaSjkoshy    rename_svn_id > ${srctmp}
1632dc6aafaSjkoshy
1642dc6aafaSjkoshy  compare_and_move_or_diff ${1} ${srctmp}
1652dc6aafaSjkoshy}
1662dc6aafaSjkoshy
1672dc6aafaSjkoshy# Prepare temporary files.
1682dc6aafaSjkoshyget_temporary_file() {
1692dc6aafaSjkoshy  mktemp -p ${TMPDIR:-/tmp} -t import-et.XXXXXX
1702dc6aafaSjkoshy}
1712dc6aafaSjkoshy
1722dc6aafaSjkoshysrctmp=`get_temporary_file`
1732dc6aafaSjkoshysrccmptmp=`get_temporary_file`
1742dc6aafaSjkoshydstcmptmp=`get_temporary_file`
1752dc6aafaSjkoshy
1762dc6aafaSjkoshytrap "rm ${srctmp} ${srcmptmp} ${dstcmptmp};" 0 1 2 3 15
1772dc6aafaSjkoshy
1782dc6aafaSjkoshy# For each module:
1792dc6aafaSjkoshy#  - Create new directories in the destination.
1802dc6aafaSjkoshy#  - For each file in the source directory.
1812dc6aafaSjkoshy#    - Transform the source file to its imported content.
1822dc6aafaSjkoshy#    - Ignore files that differ only in RCS
1832dc6aafaSjkoshy#    - Display diffs or move changed files to the destination directory.
1842dc6aafaSjkoshy
1852dc6aafaSjkoshyfor m in ${modules}; do
1862dc6aafaSjkoshy  [ "$verbose" = YES ] && echo Examining module "'$m'".
1872dc6aafaSjkoshy
1882dc6aafaSjkoshy  # Create any new directories under the destination root.
1892dc6aafaSjkoshy  (cd "${srcdir}" && find "${m}" -depth -type d) | \
1902dc6aafaSjkoshy    while read dir; do
1912dc6aafaSjkoshy      [ "${verbose}" = YES ] && echo "Creating '$dir'."
1922dc6aafaSjkoshy      mkdir -p "${dstdir}/${dir}"
1932dc6aafaSjkoshy    done
1942dc6aafaSjkoshy
1952dc6aafaSjkoshy  # Import files, transforming them along the way.
1962dc6aafaSjkoshy  (cd "${srcdir}" && find "${m}" -depth -type f $pattern) | \
1972dc6aafaSjkoshy    egrep -v '.o$|.a$|.po$|.so$|.swp$|*~$' | \
1982dc6aafaSjkoshy    while read file; do
1992dc6aafaSjkoshy      changed_file=''  # Set by 'compare_and_move_or_diff'.
2002dc6aafaSjkoshy
2012dc6aafaSjkoshy      if [ "${diff_only}" = NO ]; then
2022dc6aafaSjkoshy        [ "${verbose}" = YES ] && echo -n "Importing file '$file'"
2032dc6aafaSjkoshy      fi
2042dc6aafaSjkoshy
2052dc6aafaSjkoshy      case "${file##*/}" in
2062dc6aafaSjkoshy        *.[0-9])
2072dc6aafaSjkoshy	  handle_manual_page "${file}"
2082dc6aafaSjkoshy	  ;;
2092dc6aafaSjkoshy        *.m4 )
2102dc6aafaSjkoshy	  handle_m4_file "${file}"
2112dc6aafaSjkoshy	  ;;
2122dc6aafaSjkoshy        Makefile | Version.map | *.m4 | *.mk)
2132dc6aafaSjkoshy	  handle_regular_file "${file}"
2142dc6aafaSjkoshy	  ;;
2152dc6aafaSjkoshy        *.[ch])
2162dc6aafaSjkoshy 	  handle_c_source "${file}"
2172dc6aafaSjkoshy          ;;
2182dc6aafaSjkoshy        * ) error "Unsupported file: ${file}."
2192dc6aafaSjkoshy          ;;
2202dc6aafaSjkoshy      esac
2212dc6aafaSjkoshy
2222dc6aafaSjkoshy      if [ "${diff_only}" = NO -a "${verbose}" = YES ]; then
2232dc6aafaSjkoshy	if [ -n "${changed_file}" ]; then
2242dc6aafaSjkoshy	  echo '- changed.'
2252dc6aafaSjkoshy	else
2262dc6aafaSjkoshy	  echo '- unchanged.'
2272dc6aafaSjkoshy	fi
2282dc6aafaSjkoshy      fi
2292dc6aafaSjkoshy    done
2302dc6aafaSjkoshydone
231