141 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Bash
		
	
			
		
		
	
	
			141 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Bash
		
	
| #!/bin/sh
 | |
| 
 | |
| # You can run DF under gdb by passing -g or --gdb as the first argument.
 | |
| #
 | |
| # If the file ".dfhackrc" exists in the DF directory or your home directory
 | |
| # it will be sourced by this script, to let you set environmental variables.
 | |
| # If it exists in both places it will first source the one in your home
 | |
| # directory, then the one in the game directory.
 | |
| #
 | |
| # Shell variables .dfhackrc can set to affect this script:
 | |
| #     DF_GDB_OPTS: Options to pass to gdb, if it's being run
 | |
| #     DF_VALGRIND_OPTS: Options to pass to valgrind, if it's being run
 | |
| #     DF_HELGRIND_OPTS: Options to pass to helgrind, if it's being run
 | |
| #     DF_POST_CMD: Shell command to be run at very end of script
 | |
| 
 | |
| DF_DIR=$(dirname "$0")
 | |
| cd "${DF_DIR}"
 | |
| 
 | |
| # User config files
 | |
| RC=".dfhackrc"
 | |
| 
 | |
| if [ -r "$HOME/$RC" ]; then
 | |
|     . $HOME/$RC
 | |
| fi
 | |
| if [ -r "./$RC" ]; then
 | |
|     . "./$RC"
 | |
| fi
 | |
| 
 | |
| if [ ! -t 0 ]; then
 | |
|     stty() {
 | |
|         return
 | |
|     }
 | |
| fi
 | |
| 
 | |
| # Save current terminal settings
 | |
| old_tty_settings=$(stty -g)
 | |
| 
 | |
| # Now run
 | |
| export LD_LIBRARY_PATH=".:$LD_LIBRARY_PATH"
 | |
| 
 | |
| LIB="./hack/libdfhack.so"
 | |
| LIBSAN=""
 | |
| if which objdump > /dev/null; then
 | |
|   LIBSAN="$(objdump -p $LIB | sed -n 's/^.*NEEDED.*\(lib[a-z]san[a-z.0-9]*\).*$/\1/p' | head -n1):"
 | |
| fi
 | |
| PRELOAD_LIB="${PRELOAD_LIB:+$PRELOAD_LIB:}${LIBSAN}${LIB}"
 | |
| 
 | |
| setarch_arch=$(cat hack/dfhack_setarch.txt || printf x86_64)
 | |
| if ! setarch "$setarch_arch" -R true 2>/dev/null; then
 | |
|     echo "warn: architecture '$setarch_arch' not supported by setarch" >&2
 | |
|     if [ "$setarch_arch" = "i386" ]; then
 | |
|         setarch_arch=linux32
 | |
|     else
 | |
|         setarch_arch=linux64
 | |
|     fi
 | |
|     echo "using '$setarch_arch' instead. To silence this warning, edit" >&2
 | |
|     echo "hack/dfhack_setarch.txt to contain an architecture that works on your system." >&2
 | |
| fi
 | |
| 
 | |
| case "$1" in
 | |
|   -g | --gdb)
 | |
|     shift
 | |
|     echo "set exec-wrapper env LD_LIBRARY_PATH='$LD_LIBRARY_PATH' LD_PRELOAD='${LD_PRELOAD:+$LD_PRELOAD:}$PRELOAD_LIB' MALLOC_PERTURB_=45" > gdbcmd.tmp
 | |
|     gdb $DF_GDB_OPTS -x gdbcmd.tmp --args ./dwarfort "$@"
 | |
|     rm gdbcmd.tmp
 | |
|     ret=$?
 | |
|     ;;
 | |
|   -r | --remotegdb)
 | |
|     shift
 | |
|     if [ "$#" -gt 0 ]; then
 | |
|       echo "****"
 | |
|       echo "gdbserver doesn't support spaces in arguments."
 | |
|       echo "If your world gen name has spaces you need to remove spaces from the name in data/init/world_gen.txt"
 | |
|       echo "****"
 | |
|     fi
 | |
|     echo "set environment LD_LIBRARY_PATH $LD_LIBRARY_PATH" > gdbcmd.tmp
 | |
|     echo "set environment LD_PRELOAD $PRELOAD_LIB" >> gdbcmd.tmp
 | |
|     echo "set environment MALLOC_PERTURB_ 45" >> gdbcmd.tmp
 | |
|     echo "set startup-with-shell off" >> gdbcmd.tmp
 | |
|     echo "target extended-remote localhost:12345" >> gdbcmd.tmp
 | |
|     echo "set remote exec-file ./dwarfort" >> gdbcmd.tmp
 | |
|     # For some reason gdb ignores sysroot setting if it is from same file as
 | |
|     # target extended-remote command
 | |
|     echo "set sysroot /" > gdbcmd_sysroot.tmp
 | |
|     gdb $DF_GDB_OPTS -x gdbcmd.tmp -x gdbcmd_sysroot.tmp --args ./dwarfort "$@"
 | |
|     rm gdbcmd.tmp gdbcmd_sysroot.tmp
 | |
|     ret=$?
 | |
|     ;;
 | |
|   -s | --gdbserver) # -s for server
 | |
|     shift
 | |
|     echo "Starting gdbserver in multi mode."
 | |
|     echo "To exit the gdbserver you can enter 'monitor exit' command to gdb or use kill signal"
 | |
|     gdbserver --multi localhost:12345
 | |
|     ret=$?
 | |
|     ;;
 | |
|   -h | --helgrind)
 | |
|     shift
 | |
|     LD_PRELOAD="${LD_PRELOAD:+$LD_PRELOAD:}$PRELOAD_LIB" setarch "$setarch_arch" -R valgrind $DF_HELGRIND_OPTS --tool=helgrind --log-file=helgrind.log ./dwarfort "$@"
 | |
|     ret=$?
 | |
|     ;;
 | |
|   -v | --valgrind)
 | |
|     shift
 | |
|     LD_PRELOAD="${LD_PRELOAD:+$LD_PRELOAD:}$PRELOAD_LIB" setarch "$setarch_arch" -R valgrind $DF_VALGRIND_OPTS --log-file=valgrind.log ./dwarfort "$@"
 | |
|     ret=$?
 | |
|     ;;
 | |
|   -c | --callgrind)
 | |
|     shift
 | |
|     LD_PRELOAD="${LD_PRELOAD:+$LD_PRELOAD:}$PRELOAD_LIB" setarch "$setarch_arch" -R valgrind $DF_CALLGRIND_OPTS --tool=callgrind --separate-threads=yes --dump-instr=yes --instr-atstart=no --log-file=callgrind.log ./dwarfort "$@"
 | |
|     ret=$?
 | |
|     ;;
 | |
|   --strace)
 | |
|     shift
 | |
|     strace -f setarch "$setarch_arch" -R env LD_PRELOAD="${LD_PRELOAD:+$LD_PRELOAD:}$PRELOAD_LIB" ./dwarfort "$@" 2> strace.log
 | |
|     ret=$?
 | |
|     ;;
 | |
|   -x | --exec)
 | |
|     exec setarch "$setarch_arch" -R env LD_PRELOAD="${LD_PRELOAD:+$LD_PRELOAD:}$PRELOAD_LIB" ./dwarfort "$@"
 | |
|     # script does not resume
 | |
|     ;;
 | |
|   --sc | --sizecheck)
 | |
|     PRELOAD_LIB="${PRELOAD_LIB:+$PRELOAD_LIB:}./hack/libsizecheck.so"
 | |
|     MALLOC_PERTURB_=45 setarch "$setarch_arch" -R env LD_PRELOAD="${LD_PRELOAD:+$LD_PRELOAD:}$PRELOAD_LIB" ./dwarfort "$@"
 | |
|     ret=$?
 | |
|     ;;
 | |
|   *)
 | |
|     setarch "$setarch_arch" -R env LD_PRELOAD="${LD_PRELOAD:+$LD_PRELOAD:}$PRELOAD_LIB" ./dwarfort "$@"
 | |
|     ret=$?
 | |
|     ;;
 | |
| esac
 | |
| 
 | |
| # Restore previous terminal settings
 | |
| stty "$old_tty_settings"
 | |
| tput sgr0
 | |
| echo
 | |
| 
 | |
| if [ -n "$DF_POST_CMD" ]; then
 | |
|     eval $DF_POST_CMD
 | |
| fi
 | |
| 
 | |
| exit $ret
 |