summaryrefslogtreecommitdiff
path: root/scripts/create-binary-archive.sh
blob: 9d56f2f4ac501762c4b1c77533e777e3ea8103d0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#!/usr/bin/env bash

function usage()
{
	echo "Usage:"
	echo " $0 [options]"
	echo "Options:"
	echo "     -h                       Display help or usage"
	echo "     -p <opensbi_source_path> OpenSBI source path"
	echo "     -o <output_path>         Build output path"
	echo "     -d                       Build and install documentation"
	echo "     -t                       Build only with no archive created"
	echo "     -j <num_threads>         Number of threads for Make (Default: 1)"
	echo "     -s <archive_suffix>      Archive name suffix (Default: unknown)"
	echo "     -x <riscv_xlen>          RISC-V XLENs for Build (Default: 0)"
	echo "                                 0: RV32 and RV64"
	echo "                                32: RV32 only"
	echo "                                64: RV64 only"
	exit 1;
}

# Command line options
NUM_THREADS=1
OUTPUT_PATH="$(pwd)/build"
OPENSBI_SOURCE_PATH="$(pwd)"
NEED_DOCS="no"
COMPILE_ONLY="no"
ARCHIVE_SUFFIX="unknown"
RISCV_XLEN=0

while getopts "hdtj:o:p:s:x:" o; do
	case "${o}" in
	h)
		usage
		;;
	d)
		NEED_DOCS="yes"
		;;
	t)
		COMPILE_ONLY="yes"
		;;
	j)
		NUM_THREADS=${OPTARG}
		;;
	o)
		OUTPUT_PATH=${OPTARG}
		;;
	p)
		OPENSBI_SOURCE_PATH=${OPTARG}
		;;
	s)
		ARCHIVE_SUFFIX=${OPTARG}
		;;
	x)
		RISCV_XLEN=${OPTARG}
		;;
	*)
		usage
		;;
	esac
done
shift $((OPTIND-1))

if [ -z "${OPENSBI_SOURCE_PATH}" ]; then
	echo "Must specify OpenSBI source path"
	usage
fi

if [ ! -d "${OPENSBI_SOURCE_PATH}" ]; then
	echo "OpenSBI source path does not exist"
	usage
fi

if [ -z "${ARCHIVE_SUFFIX}" ]; then
	echo "Archive suffice cannot be empty"
	usage
fi

build_opensbi() {
	# Setup parameters
	BUILD_NUM_THREADS=$1
	BUILD_OUTPUT_PATH=$2
	BUILD_OPENSBI_SOURCE_PATH=$3
	BUILD_DOCS=$4
	BUILD_ONLY=$5
	BUILD_RISCV_XLEN=$6
	BUILD_ARCHIVE_RISCV_XLEN=$7
	BUILD_ARCHIVE_SUFFIX=$8

	# Setup derived parameters
	BUILD_VERSION_MAJOR=$(grep "define OPENSBI_VERSION_MAJOR" "${BUILD_OPENSBI_SOURCE_PATH}/include/sbi/sbi_version.h" | sed 's/.*MAJOR.*\([0-9][0-9]*\)/\1/')
	BUILD_VERSION_MINOR=$(grep "define OPENSBI_VERSION_MINOR" "${BUILD_OPENSBI_SOURCE_PATH}/include/sbi/sbi_version.h" | sed 's/.*MINOR.*\([0-9][0-9]*\)/\1/')
	BUILD_NAME="opensbi-${BUILD_VERSION_MAJOR}.${BUILD_VERSION_MINOR}-rv${BUILD_RISCV_XLEN}"
	BUILD_ARCHIVE_NAME="opensbi-${BUILD_VERSION_MAJOR}.${BUILD_VERSION_MINOR}-rv${BUILD_ARCHIVE_RISCV_XLEN}-${BUILD_ARCHIVE_SUFFIX}"
	case "${BUILD_RISCV_XLEN}" in
	32)
		# Setup 32-bit platform list
		BUILD_PLATFORM_SUBDIR+=("generic")
		;;
	64)
		# Setup 64-bit platform list
		BUILD_PLATFORM_SUBDIR+=("nuclei/ux600")
		BUILD_PLATFORM_SUBDIR+=("kendryte/k210")
		BUILD_PLATFORM_SUBDIR+=("fpga/ariane")
		BUILD_PLATFORM_SUBDIR+=("fpga/openpiton")
		BUILD_PLATFORM_SUBDIR+=("generic")
		;;
	*)
		echo "Invalid Build RISC-V XLEN"
		usage
		;;
	esac

	# Ensure output directory is present
	mkdir -p "${BUILD_OUTPUT_PATH}/${BUILD_NAME}"

	# Build and install generic library
	echo "Build and install generic library XLEN=${BUILD_RISCV_XLEN}"
	echo ""
	make -C "${BUILD_OPENSBI_SOURCE_PATH}" O="${BUILD_OUTPUT_PATH}/${BUILD_NAME}" I="${BUILD_OUTPUT_PATH}/${BUILD_ARCHIVE_NAME}" PLATFORM_RISCV_XLEN="${BUILD_RISCV_XLEN}" install_libsbi -j "${BUILD_NUM_THREADS}"
	echo ""

	# Build and install relevant platforms
	for INDEX in $(seq 0 1 "$(expr ${#BUILD_PLATFORM_SUBDIR[*]} - 1)")
	do
		echo "Build and install PLATFORM=${BUILD_PLATFORM_SUBDIR[${INDEX}]} XLEN=${BUILD_RISCV_XLEN}"
		echo ""
		make -C "${BUILD_OPENSBI_SOURCE_PATH}" O="${BUILD_OUTPUT_PATH}/${BUILD_NAME}" I="${BUILD_OUTPUT_PATH}/${BUILD_ARCHIVE_NAME}" PLATFORM="${BUILD_PLATFORM_SUBDIR[${INDEX}]}" PLATFORM_RISCV_XLEN="${BUILD_RISCV_XLEN}" install_libplatsbi install_firmwares -j "${BUILD_NUM_THREADS}"
		echo ""
	done

	# Build and install docs
	if [ "${BUILD_DOCS}" == "yes" ]; then
		echo "Build and install docs"
		echo ""
		make -C "${BUILD_OPENSBI_SOURCE_PATH}" O="${BUILD_OUTPUT_PATH}/${BUILD_NAME}" I="${BUILD_OUTPUT_PATH}/${BUILD_ARCHIVE_NAME}" install_docs
		echo ""
	fi

	# Create archive file
	if [ "${BUILD_ONLY}" == "no" ]; then
		echo "Create archive ${BUILD_ARCHIVE_NAME}.tar.xz"
		echo ""
		tar  -C "${BUILD_OUTPUT_PATH}" -cJvf "${BUILD_OUTPUT_PATH}/${BUILD_ARCHIVE_NAME}.tar.xz" "${BUILD_ARCHIVE_NAME}"
		echo ""
	fi
}

case "${RISCV_XLEN}" in
0)
	build_opensbi ${NUM_THREADS} ${OUTPUT_PATH} ${OPENSBI_SOURCE_PATH} "no" "yes" "32" "" ${ARCHIVE_SUFFIX}
	build_opensbi ${NUM_THREADS} ${OUTPUT_PATH} ${OPENSBI_SOURCE_PATH} ${NEED_DOCS} ${COMPILE_ONLY} "64" "" ${ARCHIVE_SUFFIX}
	;;
32)
	build_opensbi ${NUM_THREADS} ${OUTPUT_PATH} ${OPENSBI_SOURCE_PATH} ${NEED_DOCS} ${COMPILE_ONLY} "32" "32" ${ARCHIVE_SUFFIX}
	;;
64)
	build_opensbi ${NUM_THREADS} ${OUTPUT_PATH} ${OPENSBI_SOURCE_PATH} ${NEED_DOCS} ${COMPILE_ONLY} "64" "64" ${ARCHIVE_SUFFIX}
	;;
*)
	echo "Invalid RISC-V XLEN"
	usage
	;;
esac