configure 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. #!/bin/sh
  2. event() {
  3. printf "$1... "
  4. }
  5. ARCH=${ARCH:-x86_64}
  6. # Define toolchain and QEMU/GDB settings for per architecture
  7. event "target architecture"
  8. echo "$ARCH"
  9. case "$ARCH" in
  10. x86_64)
  11. QEMU_EXECUTABLES="qemu-system-x86_64"
  12. GDB_EXECUTABLES="gdb x86_64-elf-gdb"
  13. : "${CROSS_COMPILE:=}"
  14. ;;
  15. riscv64)
  16. QEMU_EXECUTABLES="qemu-system-riscv64"
  17. GDB_EXECUTABLES="gdb riscv64-unknown-elf-gdb"
  18. : "${CROSS_COMPILE:=riscv64-unknown-elf-}"
  19. ;;
  20. aarch64)
  21. QEMU_EXECUTABLES="qemu-system-aarch64"
  22. GDB_EXECUTABLES="gdb aarch64-none-elf-gdb"
  23. : "${CROSS_COMPILE:=aarch64-none-elf-}"
  24. ;;
  25. *)
  26. echo "Unsupported ARCH: $ARCH"
  27. exit 1
  28. ;;
  29. esac
  30. # $1: OS NAME
  31. # $2: CROSS COMPILE FLAG
  32. # $3: FDISK_BIN
  33. generate_cross_compile_script() {
  34. cat > cross-compile.cmake <<EOF
  35. set(CMAKE_SYSTEM_NAME $1)
  36. set(TOOLCHAIN_PATH_AND_PREFIX "$2")
  37. set(CMAKE_C_COMPILER \${TOOLCHAIN_PATH_AND_PREFIX}gcc)
  38. set(CMAKE_CXX_COMPILER \${TOOLCHAIN_PATH_AND_PREFIX}c++)
  39. set(CMAKE_AR \${TOOLCHAIN_PATH_AND_PREFIX}ar)
  40. set(CMAKE_LINKER \${TOOLCHAIN_PATH_AND_PREFIX}ld)
  41. set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
  42. SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
  43. # for libraries and headers in the target directories
  44. SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
  45. SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  46. SET(FDISK_BIN $3)
  47. EOF
  48. }
  49. event "finding qemu"
  50. for item in $QEMU_EXECUTABLES; do
  51. if $item --version > /dev/null 2>&1; then
  52. QEMU="$item"
  53. break
  54. fi
  55. done
  56. if [ "$QEMU" = "" ]; then
  57. echo "failed"
  58. exit 1
  59. fi
  60. echo "$QEMU"
  61. check_gdb_arch() {
  62. local item="$1"
  63. if $item --init-eval-command 'set arch' \
  64. --init-eval-command 'q' 2>&1 \
  65. | grep "$ARCH" >/dev/null 2>&1; then
  66. return 0
  67. else
  68. return 1
  69. fi
  70. }
  71. if [ "$GDB" = "" ]; then
  72. event "finding gdb"
  73. for item in $GDB_EXECUTABLES; do
  74. if check_gdb_arch "$item"; then
  75. GDB="$item"
  76. break
  77. fi
  78. done
  79. if [ "$GDB" = "" ]; then
  80. echo "failed"
  81. exit 1
  82. fi
  83. else
  84. event 'checking given gdb'
  85. if ! check_gdb_arch "$GDB"; then
  86. echo "failed"
  87. exit 1
  88. fi
  89. fi
  90. echo "$GDB"
  91. event "checking os type"
  92. OS=`uname`
  93. case "$OS" in
  94. "Linux")
  95. echo "Linux"
  96. ;;
  97. "Darwin")
  98. echo "macOS"
  99. ;;
  100. *)
  101. echo "unknown"
  102. exit 1
  103. ;;
  104. esac
  105. event "setting hardware acceleration type"
  106. case "$OS" in
  107. "Linux")
  108. echo "kvm"
  109. # QEMU_ACCEL='-enable-kvm'
  110. ;;
  111. "Darwin")
  112. echo "tcg"
  113. QEMU_ACCEL='-accel tcg'
  114. ;;
  115. esac
  116. event "checking util-linux fdisk"
  117. if [ -z "$FDISK_BIN" ]; then
  118. if ! which fdisk > /dev/null 2>&1; then
  119. echo "no"
  120. exit 1
  121. fi
  122. FDISK_BIN=$(which fdisk)
  123. fi
  124. if ! $FDISK_BIN -v 2>&1 | grep util-linux > /dev/null 2>&1 ; then
  125. echo "no, fdisk is not from util-linux"
  126. exit 1
  127. else
  128. echo "$FDISK_BIN"
  129. fi
  130. event "checking cross compiling"
  131. if [ "$CROSS_COMPILE" != "" ]; then
  132. echo "yes"
  133. CROSS_COMPILE_FLAG='--toolchain cross-compile.cmake'
  134. generate_cross_compile_script "$OS" "$CROSS_COMPILE" "$FDISK_BIN"
  135. else
  136. echo "no"
  137. CROSS_COMPILE_FLAG=
  138. fi
  139. event "checking mkfs tool"
  140. if ! which mkfs.fat > /dev/null 2>&1; then
  141. echo "no"
  142. exit 1
  143. else
  144. echo `which mkfs.fat`
  145. fi
  146. cp Makefile.src Makefile
  147. sed -i '' -e "s|##PLACEHOLDER_1##|$QEMU|" Makefile > /dev/null 2>&1
  148. sed -i '' -e "s|##PLACEHOLDER_2##|$GDB|" Makefile > /dev/null 2>&1
  149. sed -i '' -e "s|##PLACEHOLDER_3##|$QEMU_ACCEL|" Makefile > /dev/null 2>&1
  150. sed -i '' -e "s|##PLACEHOLDER_4##|$CROSS_COMPILE_FLAG|" Makefile > /dev/null 2>&1
  151. sed -i '' -e "s|##PLACEHOLDER_5##|$FDISK_BIN|" Makefile > /dev/null 2>&1
  152. sed -i '' -e "s|##PLACEHOLDER_6##|$ARCH|" Makefile > /dev/null 2>&1
  153. echo "Configuration successful for architecture: $ARCH"
  154. exit 0