create-binary-archive.sh 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #!/bin/bash
  2. function usage()
  3. {
  4. echo "Usage:"
  5. echo " $0 [options]"
  6. echo "Options:"
  7. echo " -h Display help or usage"
  8. echo " -p <opensbi_source_path> OpenSBI source path"
  9. echo " -o <output_path> Build output path"
  10. echo " -d Build and install documentation"
  11. echo " -t Build only with no archive created"
  12. echo " -j <num_threads> Number of threads for Make (Default: 1)"
  13. echo " -s <archive_suffix> Archive name suffix (Default: unknown)"
  14. echo " -x <riscv_xlen> RISC-V XLENs for Build (Default: 0)"
  15. echo " 0: RV32 and RV64"
  16. echo " 32: RV32 only"
  17. echo " 64: RV64 only"
  18. exit 1;
  19. }
  20. # Command line options
  21. NUM_THREADS=1
  22. OUTPUT_PATH="$(pwd)/build"
  23. OPENSBI_SOURCE_PATH="$(pwd)"
  24. NEED_DOCS="no"
  25. COMPILE_ONLY="no"
  26. ARCHIVE_SUFFIX="unknown"
  27. RISCV_XLEN=0
  28. while getopts "hdtj:o:p:s:x:" o; do
  29. case "${o}" in
  30. h)
  31. usage
  32. ;;
  33. d)
  34. NEED_DOCS="yes"
  35. ;;
  36. t)
  37. COMPILE_ONLY="yes"
  38. ;;
  39. j)
  40. NUM_THREADS=${OPTARG}
  41. ;;
  42. o)
  43. OUTPUT_PATH=${OPTARG}
  44. ;;
  45. p)
  46. OPENSBI_SOURCE_PATH=${OPTARG}
  47. ;;
  48. s)
  49. ARCHIVE_SUFFIX=${OPTARG}
  50. ;;
  51. x)
  52. RISCV_XLEN=${OPTARG}
  53. ;;
  54. *)
  55. usage
  56. ;;
  57. esac
  58. done
  59. shift $((OPTIND-1))
  60. if [ -z "${OPENSBI_SOURCE_PATH}" ]; then
  61. echo "Must specify OpenSBI source path"
  62. usage
  63. fi
  64. if [ ! -d "${OPENSBI_SOURCE_PATH}" ]; then
  65. echo "OpenSBI source path does not exist"
  66. usage
  67. fi
  68. if [ -z "${ARCHIVE_SUFFIX}" ]; then
  69. echo "Archive suffice cannot be empty"
  70. usage
  71. fi
  72. build_opensbi() {
  73. # Setup parameters
  74. BUILD_NUM_THREADS=$1
  75. BUILD_OUTPUT_PATH=$2
  76. BUILD_OPENSBI_SOURCE_PATH=$3
  77. BUILD_DOCS=$4
  78. BUILD_ONLY=$5
  79. BUILD_RISCV_XLEN=$6
  80. BUILD_ARCHIVE_RISCV_XLEN=$7
  81. BUILD_ARCHIVE_SUFFIX=$8
  82. # Setup derived parameters
  83. 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/')
  84. 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/')
  85. BUILD_NAME="opensbi-${BUILD_VERSION_MAJOR}.${BUILD_VERSION_MINOR}-rv${BUILD_RISCV_XLEN}"
  86. BUILD_ARCHIVE_NAME="opensbi-${BUILD_VERSION_MAJOR}.${BUILD_VERSION_MINOR}-rv${BUILD_ARCHIVE_RISCV_XLEN}-${BUILD_ARCHIVE_SUFFIX}"
  87. case "${BUILD_RISCV_XLEN}" in
  88. 32)
  89. # Setup 32-bit platform list
  90. BUILD_PLATFORM_SUBDIR=("sifive/fu540")
  91. BUILD_PLATFORM_SUBDIR+=("generic")
  92. ;;
  93. 64)
  94. # Setup 64-bit platform list
  95. BUILD_PLATFORM_SUBDIR=("sifive/fu540")
  96. BUILD_PLATFORM_SUBDIR+=("nuclei/ux600")
  97. BUILD_PLATFORM_SUBDIR+=("kendryte/k210")
  98. BUILD_PLATFORM_SUBDIR+=("fpga/ariane")
  99. BUILD_PLATFORM_SUBDIR+=("fpga/openpiton")
  100. BUILD_PLATFORM_SUBDIR+=("andes/ae350")
  101. BUILD_PLATFORM_SUBDIR+=("generic")
  102. ;;
  103. *)
  104. echo "Invalid Build RISC-V XLEN"
  105. usage
  106. ;;
  107. esac
  108. # Ensure output directory is present
  109. mkdir -p "${BUILD_OUTPUT_PATH}/${BUILD_NAME}"
  110. # Build and install generic library
  111. echo "Build and install generic library XLEN=${BUILD_RISCV_XLEN}"
  112. echo ""
  113. 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 install_libsbiutils -j "${BUILD_NUM_THREADS}"
  114. echo ""
  115. # Build and install relevant platforms
  116. for INDEX in $(seq 0 1 "$(expr ${#BUILD_PLATFORM_SUBDIR[*]} - 1)")
  117. do
  118. echo "Build and install PLATFORM=${BUILD_PLATFORM_SUBDIR[${INDEX}]} XLEN=${BUILD_RISCV_XLEN}"
  119. echo ""
  120. 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}"
  121. echo ""
  122. done
  123. # Build and install docs
  124. if [ "${BUILD_DOCS}" == "yes" ]; then
  125. echo "Build and install docs"
  126. echo ""
  127. make -C "${BUILD_OPENSBI_SOURCE_PATH}" O="${BUILD_OUTPUT_PATH}/${BUILD_NAME}" I="${BUILD_OUTPUT_PATH}/${BUILD_ARCHIVE_NAME}" install_docs
  128. echo ""
  129. fi
  130. # Create archive file
  131. if [ "${BUILD_ONLY}" == "no" ]; then
  132. echo "Create archive ${BUILD_ARCHIVE_NAME}.tar.xz"
  133. echo ""
  134. tar -C "${BUILD_OUTPUT_PATH}" -cJvf "${BUILD_OUTPUT_PATH}/${BUILD_ARCHIVE_NAME}.tar.xz" "${BUILD_ARCHIVE_NAME}"
  135. echo ""
  136. fi
  137. }
  138. case "${RISCV_XLEN}" in
  139. 0)
  140. build_opensbi ${NUM_THREADS} ${OUTPUT_PATH} ${OPENSBI_SOURCE_PATH} "no" "yes" "32" "" ${ARCHIVE_SUFFIX}
  141. build_opensbi ${NUM_THREADS} ${OUTPUT_PATH} ${OPENSBI_SOURCE_PATH} ${NEED_DOCS} ${COMPILE_ONLY} "64" "" ${ARCHIVE_SUFFIX}
  142. ;;
  143. 32)
  144. build_opensbi ${NUM_THREADS} ${OUTPUT_PATH} ${OPENSBI_SOURCE_PATH} ${NEED_DOCS} ${COMPILE_ONLY} "32" "32" ${ARCHIVE_SUFFIX}
  145. ;;
  146. 64)
  147. build_opensbi ${NUM_THREADS} ${OUTPUT_PATH} ${OPENSBI_SOURCE_PATH} ${NEED_DOCS} ${COMPILE_ONLY} "64" "64" ${ARCHIVE_SUFFIX}
  148. ;;
  149. *)
  150. echo "Invalid RISC-V XLEN"
  151. usage
  152. ;;
  153. esac