#!/bin/sh
#       $NetBSD: mknative-gdb,v 1.19 2024/08/27 21:50:20 christos Exp $
#
# Shell script for generating all the constants needed for a native
# platform build of src/external/gpl3/gdb
#

# initialise

_TMPDIR=$2
_TOP=$3
_PLATFORM=$4
_MACHINE_SUBDIR=$5
_VPATH=`grep VPATH ${_TMPDIR}/Makefile | sed 's,^.*=[   ]*,,'`
_GDB=external/gpl3/gdb

$_TOP/tools/gcc/mknative.common

##### gdb/lib/libbfd #####

get_gdb_libbfd () {
       local _BFD=$_GDB/lib/libbfd
       mkdir -p $_TOP/$_BFD/arch/$_MACHINE_SUBDIR

       {
               getvars bfd/Makefile \
                       libbfd_la_DEPENDENCIES libbfd_la_OBJECTS DEFS \
                       INCLUDES TDEFAULTS
       } | write_mk $_BFD/arch/$_MACHINE_SUBDIR/defs.mk

       for i in bfd-in3.h config.h bfd.h bfdver.h targmatch.h
       do
           write_c $_BFD/arch/$_MACHINE_SUBDIR/$i <$_TMPDIR/bfd/$i
       done
}

##### gdb/lib/libopcodes #####

get_gdb_libopcodes () {
       local _OPCODES=$_GDB/lib/libopcodes
       mkdir -p $_TOP/$_OPCODES/arch/$_MACHINE_SUBDIR

       {
               getvars opcodes/Makefile \
                       archdefs BFD_MACHINES libopcodes_la_SOURCES
       } | write_mk $_GDB/lib/libopcodes//arch/$_MACHINE_SUBDIR/defs.mk

       {
               cat $_TMPDIR/opcodes/config.h
       } | write_c $_OPCODES/arch/$_MACHINE_SUBDIR/config.h
}

##### gdb/lib/libiberty #####

get_gdb_libiberty () {
       local _IBERTY=$_GDB/lib/libiberty
       mkdir -p $_TOP/$_IBERTY/arch/$_MACHINE_SUBDIR

       getvars libiberty/Makefile \
               ALLOCA EXTRA_OFILES LIBOBJS REQUIRED_OFILES \
               | write_mk $_IBERTY/arch/$_MACHINE_SUBDIR/defs.mk

       write_c $_IBERTY/arch/$_MACHINE_SUBDIR/config.h \
               <$_TMPDIR/libiberty/config.h
}

##### gdb/lib/libreadline #####

get_gdb_libreadline () {
       local _READLINE=$_GDB/lib/libreadline
       mkdir -p $_TOP/$_READLINE/arch/$_MACHINE_SUBDIR

       {
               getvars readline/readline/Makefile \
                       CCFLAGS OBJECTS
       } | write_mk $_READLINE/arch/$_MACHINE_SUBDIR/defs.mk

       write_c $_READLINE/arch/$_MACHINE_SUBDIR/config.h \
               <$_TMPDIR/readline/readline/config.h
}

##### gdb/lib/libdecnumber #####

get_gdb_libdecnumber () {
       local _DECNUMBER=$_GDB/lib/libdecnumber
       mkdir -p $_TOP/$_DECNUMBER/arch/$_MACHINE_SUBDIR

       getvars libdecnumber/Makefile libdecnumber_a_OBJS |
       sed -e s/libdecnumber_a_//g |
       write_mk $_DECNUMBER/arch/$_MACHINE_SUBDIR/defs.mk

       write_c $_DECNUMBER/arch/$_MACHINE_SUBDIR/config.h \
               <$_TMPDIR/readline/readline/config.h

       write_c $_DECNUMBER/arch/$_MACHINE_SUBDIR/gstdint.h \
               < $_TMPDIR/libdecnumber/gstdint.h
}

##### gdb/lib/libgdbsupport #####

get_gdb_libgdbsupport () {
       local _GDBSUPPORT=$_GDB/lib/libgdbsupport
       mkdir -p $_TOP/$_GDBSUPPORT/arch/$_MACHINE_SUBDIR/gdbsupport

       getvars gdbsupport/Makefile libgdbsupport_a_OBJECTS |
       sed -e s/libgdbsupport_a_//g |
       write_mk $_GDBSUPPORT/arch/$_MACHINE_SUBDIR/defs.mk

       write_c $_GDBSUPPORT/arch/$_MACHINE_SUBDIR/gdbsupport/config.h \
               <$_TMPDIR/gdbsupport/config.h
}

##### gdb/lib/libctf #####

get_gdb_libctf () {
       local _CTF=$_GDB/lib/libctf
       mkdir -p $_TOP/$_CTF/arch/$_MACHINE_SUBDIR

       getvars libctf/Makefile libctf_la_OBJECTS |
       sed -e s/libctf_la_//g -e 's/\.lo/.o/g' -e s/libctf_la-//g |
       write_mk $_CTF/arch/$_MACHINE_SUBDIR/defs.mk

       write_c $_CTF/arch/$_MACHINE_SUBDIR/config.h \
               <$_TMPDIR/libctf/config.h
}

##### gdb/lib/libbacktrace #####

get_gdb_libbacktrace () {
       local _BACKTRACE=$_GDB/lib/libbacktrace
       mkdir -p $_TOP/$_BACKTRACE/arch/$_MACHINE_SUBDIR

       getvars libbacktrace/Makefile libbacktrace_la_OBJECTS \
           libbacktrace_la_LIBADD |
       sed -e s/libbacktrace_la_//g -e 's/\.lo/.o/g' -e s/libbacktrace_la-//g |
       write_mk $_BACKTRACE/arch/$_MACHINE_SUBDIR/defs.mk

       write_c $_BACKTRACE/arch/$_MACHINE_SUBDIR/config.h \
               <$_TMPDIR/libbacktrace/config.h
       write_c $_BACKTRACE/arch/$_MACHINE_SUBDIR/backtrace-supported.h \
               <$_TMPDIR/libbacktrace/backtrace-supported.h
}

##### gdb/lib/libsframe #####

get_gdb_libsframe () {
       local _SFRAME=$_GDB/lib/libsframe
       mkdir -p $_TOP/$_SFRAME/arch/$_MACHINE_SUBDIR

       getvars libsframe/Makefile libsframe_la_OBJECTS |
       sed -e s/libsframe_la_//g -e 's/\.lo/.o/g' -e s/libsframe_la-//g |
       write_mk $_SFRAME/arch/$_MACHINE_SUBDIR/defs.mk
}

##### gdb/lib/libgnulib #####

get_gdb_libgnulib () {
       local _GNULIB=$_GDB/lib/libgnulib
       mkdir -p $_TOP/$_GNULIB/arch/$_MACHINE_SUBDIR/gnulib/import/malloc

       (getvars gnulib/Makefile gl_LIBOBJS |
       sed -e s/gl_LIB//g &&
       getvars gnulib/import/Makefile libgnu_a_OBJECTS |
       sed -e s/libgnu_a-//g -e s@glthread/@@g -e s@malloc/@@g) |
       write_mk $_GNULIB/arch/$_MACHINE_SUBDIR/defs.mk

       for i in config.h \
           import/alloca.h import/ctype.h \
           import/dirent.h import/fcntl.h \
           import/fnmatch.h import/glob.h \
           import/glob-libc.gl.h \
           import/inttypes.h import/limits.h \
           import/locale.h import/math.h \
           import/malloc/scratch_buffer.gl.h \
           import/signal.h import/stdint.h \
           import/stdio.h import/stdlib.h \
           import/string.h import/time.h \
           import/unistd.h import/wchar.h \
           import/wctype.h
       do
           write_c $_GNULIB/arch/$_MACHINE_SUBDIR/gnulib/$i \
               < $_TMPDIR/gnulib/$i
       done
}

##### gdb/lib/libgdb #####

get_gdb_libgdb () {
       local _GDBP=$_GDB/lib/libgdb

       {
               getvars gdb/Makefile \
                       INTERNAL_CFLAGS LIBGDB_OBS SIM_OBS
       } | sed -e s@arch/@@g -e s@cli/@@g -e s@common/agent@common-agent@ \
               -e s@common/@@g -e s@compile/@@g -e s@guile/@@g -e s@mi/@@g \
               -e s@nat/@@g -e s@python/@@g -e s@target/@@g \
               -e s@dwarf2/@@g -e s@unittests/@@g \
               -e s@tui/@@g | write_mk $_GDBP/arch/$_MACHINE_SUBDIR/defs.mk

#       getvars gdb/gdbserver/Makefile \
#               INTERNAL_CFLAGS OBS \
#               | write_mk $_GDB/bin/gdb/arch/$_MACHINE_SUBDIR/gdbserver.mk

       for i in config.h version.c init.c \
           xml-builtin.c jit-reader.h
       do
           write_c $_GDBP/arch/$_MACHINE_SUBDIR/$i \
               < $_TMPDIR/gdb/$i
       done


       for f in nm tm xm; do
               if [ ! -f $_TMPDIR/gdb/$f.h ]; then
                       continue
               fi
               ls -l $_TMPDIR/gdb/$f.h | \
                       sed 's,^.*->.*/gdb/,,;s,^,#include <,;s,$,>,' | \
                       write_c $_GDBP/arch/$_MACHINE_SUBDIR/$f.h
       done

       local _LIBSIM=$_GDB/lib/libsim
       case $_MACHINE_SUBDIR in
       xxpowerpc*)
               mkdir -p $_TOP/$_LIBSIM/arch/$_MACHINE_SUBDIR
               write_c $_LIBSIM/arch/$_MACHINE_SUBDIR/config.h \
                       <$_TMPDIR/sim/config.h
               #write_c $_LIBSIM/arch/$_MACHINE_SUBDIR/build-config.h \
               #       <$_TMPDIR/sim/ppc/build-config.h
               #write_c $_LIBSIM/arch/$_MACHINE_SUBDIR/cconfig.h \
               #       <$_TMPDIR/sim/common/cconfig.h
               ;;
       xxmips*)        # Disabled for now
               mkdir -p $_TOP/$_LIBSIM/arch/$_MACHINE_SUBDIR
               write_c $_LIBSIM/arch/$_MACHINE_SUBDIR/config.h \
                       <$_TMPDIR/sim/mips/config.h
               #write_c $_LIBSIM/arch/$_MACHINE_SUBDIR/cconfig.h \
               #       <$_TMPDIR/sim/common/cconfig.h
               {
                       getvars sim/mips/Makefile \
                               LIB_OBJS CONFIG_CFLAGS \
                               BUILT_SRC_FROM_IGEN IGEN_OBJS
               } | write_mk $_LIBSIM/arch/$_MACHINE_SUBDIR/defs.mk
               ;;
       *)
               ;;
       esac
}

# gdb/bin/gdbserver`

get_gdb_bingdbserver () {
       local _CTF=$_GDB/bin/gdbserver

       if [ ! -f $_CTF/arch/$_MACHINE_SUBDIR/config.h ]; then
               return
       fi
       mkdir -p $_TOP/$_CTF/arch/$_MACHINE_SUBDIR

       write_c $_CTF/arch/$_MACHINE_SUBDIR/config.h \
               <$_TMPDIR/gdbserver/config.h
       write_c $_CTF/arch/$_MACHINE_SUBDIR/version.cc \
               <$_TMPDIR/gdbserver/version-generated.cc
}

# info

get_gdb_info () {
       local _INFO=$_GDB/info
       local _SRC=$_TMPDIR/gdb/doc

       mkdir -p $_TOP/$_INFO

       for i in $_SRC/*.info; do
               j=`basename $i`
               writefile $_INFO/$j < $i
       done
}

##### main #####

case $1 in
all|gdb)        # everything (uses "canadian cross" temp environment)
       get_gdb_libgdb
       get_gdb_libgdbsupport
       get_gdb_libctf
       get_gdb_libbacktrace
       get_gdb_libsframe
       get_gdb_libgnulib
       get_gdb_libbfd
       get_gdb_libopcodes
       get_gdb_libiberty
       get_gdb_libreadline
       get_gdb_libdecnumber
       get_gdb_bingdbserver
       get_gdb_info
       exit 0
       ;;

*)      echo invalid arguments; exit 1;;
esac