#!/bin/csh -f
# Powered By Michael Kang
set INFO = "###(info) ${0}"
set ERROR = "###(error) ${0}"
if ($#argv < 2) then
echo "${ERROR}: Should be ${0} testname -<mlittle|mbig>"
exit 1
endif
if ("x$argv[2]" == "x-mlittle") then
set ENDIAN = "-mlittle"
set LDENDIAN = "-EL"
echo "${INFO}: Little Endian MODE"
else if ("x$argv[2]" == "x-mbig") then
set ENDIAN = "-mbig"
set LDENDIAN = "-EB"
echo "${INFO}: Big Endian MODE"
else
echo "${ERROR}: Endian argument must be -mbig or -mlittle"
exit 1
endif
set TEST_DIR = ../tests/$argv[1]/ppc
set LIB_DIR = ../rte/ppc/lib
set INC_DIR = ../rte/ppc/inc
set SRC_DIR = ${TEST_DIR}/src
set WRK_DIR = ${TEST_DIR}/work
set MEM_DIR = ${WRK_DIR}/mem
set LOG_DIR = ${WRK_DIR}/log
set OBJ_DIR = ${WRK_DIR}/obj
## Exit if no .s, .S, or .c files found
set ASM_FILES = `find ${SRC_DIR} -name "*.s" -o -name "*.S"`
set C_FILES = `find ${SRC_DIR} -name "*.c" -print`
if ( ( "${ASM_FILES}" == "" ) && ( "${C_FILES}" == "" ) ) then
echo "ERROR: No test files or direcory found"
exit 1
else
echo "${INFO}: Test files found are"
echo $ASM_FILES
echo $C_FILES
endif
##Create the mem, log, work dirs if they don't already exist
if ( ! -d ./mem ) then
echo "${INFO}: Creating ./mem"
mkdir -p ./mem
endif
if ( ! -d $MEM_DIR ) then
echo "${INFO}: Creating $MEM_DIR"
mkdir -p $MEM_DIR
endif
if ( ! -d $LOG_DIR) then
echo "${INFO}: Creating $LOG_DIR"
mkdir -p $LOG_DIR
endif
if ( ! -d $OBJ_DIR) then
echo "${INFO}: Creating $OBJ_DIR"
mkdir -p $OBJ_DIR
endif
## compile parameter
set BOOT_MEM = "./mem/brom64.hex"
set PROG_MEM = "./mem/asram64.hex"
set CPP = powerpc-elf-cpp
set CC = powerpc-elf-gcc
set AS = powerpc-elf-as
set LD = powerpc-elf-ld
## -ffreestanding 指明了自己实现OS kernel(即启动代码) 用最精简的basic库
set CCFLAGS = "-mcpu=440 -I. -I${INC_DIR} -ffreestanding $ENDIAN"
set ASFLAGS = "-m440 -I${INC_DIR} $ENDIAN"
set CPPFLAGS = "-E -I${INC_DIR}"
set ASM_ONLY = 1
if ( "${C_FILES}" != "" ) then
echo "${INFO}: Compile ${C_FILES}"
set ASM_ONLY = 0
foreach i ($C_FILES)
set base_name = "$i:t"
set base_name = "$base_name:r"
set obj_name = ${OBJ_DIR}/"${base_name}".o
## $CC ${CCFLAGS} -c -O $i -o $obj_name
## 同时编译出 C 相对照的 ASM文件
$CC ${CCFLAGS} -c -O -g -Wa,-adlhn $i -o $obj_name > ${OBJ_DIR}/"${base_name}".s
if ( $status ) exit 1
end
endif
if ( "${ASM_FILES}" != "" ) then
echo "${INFO}: Compile ${ASM_FILES}"
foreach i ($ASM_FILES)
set base_name = "$i:t"
set base_name = "$base_name:r"
set cpp_name = ${LOG_DIR}/"${base_name}".cpp
set obj_name = ${OBJ_DIR}/"${base_name}".o
set lst_name = ${LOG_DIR}/"${base_name}".lst
echo "${INFO}: $CPP : $i"
$CPP ${CPPFLAGS} $i -o ${cpp_name}
echo "${INFO}: $AS : ${cpp_name}"
$AS ${ASFLAGS} ${cpp_name} -o ${obj_name}
if ( $status ) exit 1
end
endif
## link mapping file
set LINK_MAP = "$INC_DIR/link.map" # default linker
if ( -e "$TEST_DIR/src/linker.map" ) then
set LINK_MAP = "$TEST_DIR/src/link.map"
endif
echo "${INFO}: Using link mapping file ${LINK_MAP}"
set OBJ_FILES = `find ${OBJ_DIR} -name "*.o" -print`
if ( $ASM_ONLY == 1 ) then
echo "${INFO}: Only assembler files found: runing $LD"
else
echo "${INFO}: At least one C source file found: running $LD"
endif
## 把一定要用的init.o和testcase调入内存,并在库中调用用的到的相应的子例程放入内存。库名为libmkp.a
## 库的前缀一定要为lib,全名为libxxx.a 而xxx就是要-l 指定的参数
$LD -T ${LINK_MAP} $LDENDIAN ${LIB_DIR}/init.o $OBJ_FILES -L${LIB_DIR} -lmkp -o ${WRK_DIR}/test.exe
if ( $status ) then
echo "${ERROR}: link of test program failed in $0:$LD"
exit 1
endif
echo "${INFO}: create the hex images and disassembly"
powerpc-elf-objcopy -O srec ${WRK_DIR}/test.exe ${MEM_DIR}/test.rec
powerpc-elf-objdump -D $LDENDIAN ${WRK_DIR}/test.exe > ${WRK_DIR}/test.dis
##大写的D 生成额外的RODATA等section
if ( $status ) then
echo "${ERROR}: dump hex image and disassemble failed in $0"
exit 1
endif
cp ${WRK_DIR}/test.dis ./mem/
echo "${INFO}: rec dump Done, please refer to ${MEM_DIR}/test.rec"
echo "${INFO}: dis-asm Done, please refer to ./mem/test.dis"
../rte/ppc/tools/hexFormat.pl ${MEM_DIR}/test