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