PageRenderTime 2231ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/CloverGrowerPro.sh

https://gitlab.com/envieidoc/Clover
Shell | 886 lines | 801 code | 54 blank | 31 comment | 79 complexity | 90d0ab2fa29bea10a0607e85ee8789a3 MD5 | raw file
  1. #!/bin/bash
  2. declare -r CloverGrowerVersion="5.0"
  3. declare -r self="${0##*/}"
  4. # Reset locales (important when grepping strings from output commands)
  5. export LC_ALL=C
  6. # Retrieve full path of the command
  7. declare -r CMD=$(readlink "$0" || echo "$0")
  8. # Retrieve full path of CloverGrowerPro
  9. declare -r CLOVER_GROWER_PRO_DIR="$(cd "$(dirname "$CMD")" && echo "$PWD")"
  10. declare -r CLOVER_GROWER_PRO_SCRIPT="$CLOVER_GROWER_PRO_DIR/$(basename "$CMD")"
  11. declare -r CLOVER_GROWER_PRO_CONF="$CLOVER_GROWER_PRO_DIR/CloverGrowerPro.conf"
  12. # Source librarie
  13. source "$CLOVER_GROWER_PRO_DIR/CloverGrowerPro.lib"
  14. # Check that CloverGrowerPro is well installed
  15. if [[ ! -e "$CLOVER_GROWER_PRO_DIR"/.git ]]; then
  16. error "Bad installation !"
  17. sayColor red "$self must be installed with the git clone command and not from an archive !"
  18. sayColor red "See https://github.com/JrCs/CloverGrowerPro/blob/master/README.md for more information"
  19. exit 1
  20. fi
  21. # Source config file
  22. [[ ! -f "$CLOVER_GROWER_PRO_CONF" ]] && touch "$CLOVER_GROWER_PRO_CONF"
  23. source "$CLOVER_GROWER_PRO_CONF"
  24. DO_SETUP=
  25. MAKE_PACKAGE=1
  26. CLOVER_REMOTE_REV=
  27. CLOVER_LOCAL_REV=
  28. FORCE_REVISION=
  29. FORCE_CHECK_UPDATE=0
  30. UPDATE_SOURCES=1
  31. FW_VBIOS_PATH=
  32. USE_LOCAL_BUILDGCC=0
  33. # Usage: usage
  34. # Print the usage.
  35. usage () {
  36. printf "Usage: %s [OPTION]\n" "$self"
  37. echo "Compile Clover UEFI/Bios OS X Booter"
  38. echo
  39. printOptionHelp "-r, --revision" "compile a specific Clover revision"
  40. printOptionHelp "-t, --target" "choose target(s) to build [default=x64]. Targets currently supported: ia32, x64 and x64-mcp. You can specify multiple targets (ie. --target=\"ia32 x64\")."
  41. printOptionHelp "-u, --check-update" "force check update."
  42. printOptionHelp "-n, --no-source-updates" "Disable clover and edk2 source updates."
  43. printOptionHelp "-s, --setup" "setup $self."
  44. printOptionHelp "-h, --help" "print this message and exit"
  45. printOptionHelp "-v, --version" "print the version information and exit"
  46. echo
  47. echo "Report any issue to https://github.com/JrCs/CloverGrowerPro/issues"; echo
  48. }
  49. function checkOptions() {
  50. if [[ -n "$FORCE_REVISION" && ! "$FORCE_REVISION" =~ ^[0-9]*$ ]];then
  51. die "Invalid revision '$FORCE_REVISION': must be an integer !"
  52. fi
  53. }
  54. function checkConfig() {
  55. if [[ -z "$CHECKUPDATEINTERVAL" || -n "$DO_SETUP" ]];then
  56. local updateInterval
  57. local msg=$(printf "Check for CloverGrowerPro update every %say/%seek/%sonth/%sever" \
  58. $(echob "D") $(echob "W") $(echob "M") $(echob "N"))
  59. local default_checkupdateinterval='W'
  60. case ${CHECKUPDATEINTERVAL} in
  61. -1) default_checkupdateinterval='N' ;;
  62. 86400) default_checkupdateinterval='D' ;;
  63. 18446400) default_checkupdateinterval='M' ;;
  64. esac
  65. CHECKUPDATEINTERVAL=
  66. while [[ -z "$CHECKUPDATEINTERVAL" ]]; do
  67. CHECKUPDATEINTERVAL=$(prompt "$msg" "$default_checkupdateinterval")
  68. case "$CHECKUPDATEINTERVAL" in
  69. [Nn]) CHECKUPDATEINTERVAL=-1 ;;
  70. [Dd]) CHECKUPDATEINTERVAL=86400 ;;
  71. [Ww]) CHECKUPDATEINTERVAL=604800 ;;
  72. [Mm]) CHECKUPDATEINTERVAL=18446400 ;;
  73. *) CHECKUPDATEINTERVAL= ;;
  74. esac
  75. done
  76. storeConfig 'CHECKUPDATEINTERVAL' "$CHECKUPDATEINTERVAL"
  77. echo
  78. fi
  79. if [[ -z "$TOOLCHAIN" || -n "$DO_SETUP" ]];then
  80. echo "Where to put the toolchain directory ?"
  81. local default_toolchain="${TOOLCHAIN:-${CLOVER_GROWER_PRO_DIR}/toolchain}"
  82. TOOLCHAIN=$(prompt "TOOCHAIN directory" "$default_toolchain")
  83. storeConfig 'TOOLCHAIN' "$TOOLCHAIN"
  84. echo
  85. fi
  86. if [[ -z "$EDK2DIR" || -n "$DO_SETUP" ]];then
  87. echo "Where to put the edk2 source files ?"
  88. local default_edk2dir="${EDK2DIR:-${CLOVER_GROWER_PRO_DIR}/edk2}"
  89. EDK2DIR=$(prompt "edk2 directory" "$default_edk2dir")
  90. storeConfig 'EDK2DIR' "$EDK2DIR"
  91. echo
  92. fi
  93. if [[ -z "$CLOVERSVNURL" || -n "$DO_SETUP" ]]; then
  94. local default_developer='No'
  95. local default_login=''
  96. case "$CLOVERSVNURL" in
  97. *svn+ssh:*) default_developer='Yes'
  98. default_login=$(echo "$CLOVERSVNURL" | sed -nE 's#.*//(.+)@.*#\1#p')
  99. ;;
  100. esac
  101. local developer=$(prompt "Do you have the rights to commit Clover source files" "$default_developer")
  102. local login
  103. if [[ $(lc "$developer") == y* ]];then
  104. login=$(prompt "What is your login on sourceforge.net" "$default_login")
  105. fi
  106. if [[ -n "$login" ]];then
  107. CLOVERSVNURL="svn+ssh://$login@svn.code.sf.net/p/cloverefiboot/code"
  108. else
  109. CLOVERSVNURL='svn://svn.code.sf.net/p/cloverefiboot/code'
  110. fi
  111. storeConfig 'CLOVERSVNURL' "$CLOVERSVNURL"
  112. echo
  113. fi
  114. if [[ -z "$EDK2SVNURL" || -n "$DO_SETUP" ]]; then
  115. local default_edk2_svn_url='svn://svn.code.sf.net/p/edk2/code/trunk/edk2'
  116. EDK2SVNURL=$(prompt "EDK2 svn url to use" "${EDK2SVNURL:-$default_edk2_svn_url}")
  117. storeConfig 'EDK2SVNURL' "$EDK2SVNURL"
  118. echo
  119. fi
  120. if [[ -z "$DEFAULT_TARGET" || -n "$DO_SETUP" ]];then
  121. DEFAULT_TARGET=$(prompt "Default target(s) to use (ia32, x64, x64-mcp)" "${DEFAULT_TARGET:-x64}")
  122. storeConfig 'DEFAULT_TARGET' "$DEFAULT_TARGET"
  123. echo
  124. fi
  125. case "$DEFAULT_TARGET" in
  126. mc) DEFAULT_TARGET=x64-mcp; storeConfig 'DEFAULT_TARGET' "$DEFAULT_TARGET";;
  127. esac
  128. if [[ -z "$VBIOS_PATCH_IN_CLOVEREFI" || -n "$DO_SETUP" ]];then
  129. local default_vbios_patch_in_cloverefi='No'
  130. [[ "$VBIOS_PATCH_IN_CLOVEREFI" -ne 0 ]] && \
  131. default_vbios_patch_in_cloverefi='Yes'
  132. local answer=$(prompt "Activate VBios Patch in CloverEFI by default" \
  133. "$default_vbios_patch_in_cloverefi")
  134. VBIOS_PATCH_IN_CLOVEREFI=0
  135. [[ $(lc "$answer") == y* ]] && VBIOS_PATCH_IN_CLOVEREFI=1
  136. storeConfig 'VBIOS_PATCH_IN_CLOVEREFI' "$VBIOS_PATCH_IN_CLOVEREFI"
  137. echo
  138. fi
  139. if [[ -z "$ONLY_SATA0_PATCH" || -n "$DO_SETUP" ]];then
  140. local default_only_sata0_patch='No'
  141. [[ "$ONLY_SATA0_PATCH" -ne 0 ]] && \
  142. default_only_sata0_patch='Yes'
  143. local answer=$(prompt "Activate Only SATA0 Patch by default" \
  144. "$default_only_sata0_patch")
  145. ONLY_SATA0_PATCH=0
  146. [[ $(lc "$answer") == y* ]] && ONLY_SATA0_PATCH=1
  147. storeConfig 'ONLY_SATA0_PATCH' "$ONLY_SATA0_PATCH"
  148. echo
  149. fi
  150. if [[ -z "$ENABLE_SECURE_BOOT" || -n "$DO_SETUP" ]];then
  151. local default_enable_secure_boot='No'
  152. [[ "$ENABLE_SECURE_BOOT" -ne 0 ]] && \
  153. default_enable_secure_boot='Yes'
  154. local answer=$(prompt "Enable Secure Boot" \
  155. "$default_enable_secure_boot")
  156. ENABLE_SECURE_BOOT=0
  157. [[ $(lc "$answer") == y* ]] && ENABLE_SECURE_BOOT=1
  158. storeConfig 'ENABLE_SECURE_BOOT' "$ENABLE_SECURE_BOOT"
  159. echo
  160. fi
  161. if [[ -z "$USE_APPLE_HFSPLUS_DRIVER" || -n "$DO_SETUP" ]];then
  162. local default_use_apple_hfs_driver='Yes'
  163. [[ "${USE_APPLE_HFSPLUS_DRIVER:-1}" -ne 1 ]] && \
  164. default_use_apple_hfs_driver='No'
  165. local msg=$(printf "Use Apple HFS+ driver (%so, %ses)" \
  166. $(echob "N") $(echob "Y"))
  167. local answer=$(prompt "$msg" "$default_use_apple_hfs_driver" 'N' 'Y')
  168. USE_APPLE_HFSPLUS_DRIVER=1
  169. [[ $(lc "$answer") == n* ]] && USE_APPLE_HFSPLUS_DRIVER=0
  170. storeConfig 'USE_APPLE_HFSPLUS_DRIVER' "$USE_APPLE_HFSPLUS_DRIVER"
  171. echo
  172. fi
  173. if [[ -n "$DO_SETUP" ]];then
  174. local default_ebuild_optional_args=''
  175. EBUILD_OPTIONAL_ARGS=$(echo "$EBUILD_OPTIONAL_ARGS" | sed -E 's/-D *(ENABLE_SECURE_BOOT|USE_APPLE_HFSPLUS_DRIVER)//g;s/^ *//;s/ *$//;s/ +/ /g')
  176. EBUILD_OPTIONAL_ARGS=$(prompt "Additionnal parameters to pass to ebuild.sh script" "${EBUILD_OPTIONAL_ARGS:-}")
  177. storeConfig 'EBUILD_OPTIONAL_ARGS' "$EBUILD_OPTIONAL_ARGS"
  178. echo
  179. fi
  180. if [[ -z "$BUILD_PACKAGE" || -n "$DO_SETUP" ]]; then
  181. local default_build_package="${BUILD_PACKAGE:-Ask}"
  182. local msg=$(printf "Build the installer package after the compilation (%so, %ssk, %ses)" \
  183. $(echob "N") $(echob "A") $(echob "Y"))
  184. local answer=$(prompt "$msg" "$default_build_package" 'N' 'A' 'Y')
  185. case $(lc "$answer") in
  186. n*) BUILD_PACKAGE='No' ;;
  187. y*) BUILD_PACKAGE='Yes' ;;
  188. *) BUILD_PACKAGE='Ask' ;;
  189. esac
  190. storeConfig 'BUILD_PACKAGE' "$BUILD_PACKAGE"
  191. echo
  192. fi
  193. }
  194. function checkUpdate() {
  195. [[ "$CHECKUPDATEINTERVAL" -lt 0 && "$FORCE_CHECK_UPDATE" -eq 0 ]] && return
  196. local check_timestamp_file="$CLOVER_GROWER_PRO_DIR/.last_check"
  197. local last_check=0
  198. [[ "$FORCE_CHECK_UPDATE" -eq 0 ]] && last_check=$(cat "$check_timestamp_file" 2>/dev/null)
  199. local now=$(date '+%s')
  200. if [[ $(( ${last_check:-0} + ${CHECKUPDATEINTERVAL:-604800} )) -lt $now ]]; then
  201. echo "Checking for new version of CloverGrowerPro..."
  202. (cd "$CLOVER_GROWER_PRO_DIR" && LC_ALL=C git pull --rebase -f) || exit 1
  203. echo "$now" > "$check_timestamp_file"
  204. exec "$0" "${ARGS[@]}"
  205. fi
  206. }
  207. argument() {
  208. local opt=$1
  209. shift
  210. if [[ $# -eq 0 ]]; then
  211. die $(printf "%s: option \`%s' requires an argument\n" "$0" "$opt")
  212. fi
  213. echo $1
  214. }
  215. function checkCloverLink() {
  216. if [[ ! -L "/usr/local/bin/cloverpro" || $(readlink "/usr/local/bin/cloverpro") != "$CLOVER_GROWER_PRO_SCRIPT" ]]; then
  217. echob "Running CloverGrowerPro.sh"
  218. printf "Will create link %s to %s\n" $(echob "/usr/local/bin/cloverpro") $(echob "CloverGrowerPro.sh")
  219. echob "You can THEN 'run' CloverGrowerPro.sh by typing 'cloverpro' ;)"
  220. echob "Press Enter to continue"
  221. read
  222. if [ ! -d /usr/local/bin ]; then
  223. command="sudo mkdir -p /usr/local/bin"; echob "$command" ; eval $command
  224. fi
  225. command="sudo ln -sf '$CLOVER_GROWER_PRO_SCRIPT' /usr/local/bin/cloverpro && sudo chown $theBoss /usr/local/bin/cloverpro"
  226. echob "$command" ; eval $command
  227. fi
  228. }
  229. # Check XCode command line tools
  230. function checkXCode() {
  231. if [[ ! -x /usr/bin/gcc ]]; then
  232. echob "ERROR:"
  233. echob " Xcode Command Line Tools from Apple not found!"
  234. echob " CloverGrowerPro.sh needs it";echo
  235. echob " Going To Apple Developer Site"
  236. echob " Download & Install XCode Command Line Tools then re-run CloverGrowerPro.sh"
  237. echo
  238. echob " Press enter to open a browser to download XCode Command Line Tools"
  239. read
  240. open "https://developer.apple.com/downloads/"
  241. wait
  242. echob "Good $hours"
  243. tput bel
  244. exit 1
  245. fi
  246. }
  247. # Check Toolchain
  248. function checkToolchain() {
  249. [[ -z "$TOOLCHAIN" ]] && echob "variable TOOLCHAIN not defined !" && exit 1
  250. if [[ ! -x "${TOOLCHAIN}/bin/msgmerge" ]]; then
  251. installGettext
  252. fi
  253. if [[ ! -x "${TOOLCHAIN}/bin/gcc" || ! -x "${TOOLCHAIN}/cross/bin/x86_64-clover-linux-gnu-gcc" ]]; then
  254. installToolchain
  255. fi
  256. if [[ ! -x "${TOOLCHAIN}/bin/nasm" ]]; then
  257. installNasm
  258. fi
  259. }
  260. # Check the build environment
  261. function checkEnv() {
  262. checkCloverLink
  263. checkXCode
  264. # Check for svn
  265. [[ -z $(type -P svn) ]] && { echob "svn command not found. Exiting..." >&2 ; exit 1; }
  266. # Check that some directories exists
  267. if [ ! -d "${srcDIR}" ]; then
  268. echob "Make src Folder.."
  269. mkdir "${srcDIR}"
  270. fi
  271. # Check the toolchain
  272. checkToolchain
  273. }
  274. function getCloverLastModifiedSource() {
  275. find "$CloverDIR/" \
  276. -type d \( -path '*/.svn' -o -path '*/.git' -o -path '*/CloverPackage/CloverV2' \
  277. -o -path '*/CloverPackage/sym' -o -path '*/CloverPackage/CloverUpdater' \
  278. -o -path '*/CloverPackage/CloverPrefpane' \) -prune -o \
  279. -type f -print0 | xargs -0 stat -f "%m %N" | \
  280. egrep -v 'vers.txt|Version.h|revision|version|.DS_Store|\.efi$' | sort -n | tail -1 | \
  281. cut -f1 -d' ' # ' fix xemacs fontification
  282. }
  283. # checkout/update svn
  284. # $1=name $2=Local folder, $3=svn Remote url
  285. # return code:
  286. # 0: no update found
  287. # 1: update found
  288. function getSOURCEFILE() {
  289. local name="$1"
  290. local localdir="$2"
  291. local svnremoteurl="$3"
  292. local remoteRev # Don't define and affect a variable in a single line to retrieve return code
  293. remoteRev=$(getSvnRevision "$svnremoteurl")
  294. [[ $? -ne 0 ]] && return 1
  295. if [[ ! -d "$localdir" ]]; then
  296. echob " ERROR:"
  297. echo " Local $localdir folder not found.."
  298. echob " Making local ${localdir} folder..."
  299. mkdir "$localdir"
  300. fi
  301. if [[ ! -d "${localdir}/.svn" && ! -d "${localdir}/.git" ]]; then
  302. echob " Checking out Remote $name revision $remoteRev"
  303. checkout_repository "$localdir" "$svnremoteurl"
  304. return 1
  305. fi
  306. local localRev=$(getSvnRevision "$localdir")
  307. local checkoutRev=$remoteRev
  308. [[ "$localdir" == */Clover ]] && checkoutRev=${FORCE_REVISION:-$remoteRev}
  309. if [[ "${localRev}" == "${checkoutRev}" ]]; then
  310. echob " Checked $name SVN, 'No updates were found...'"
  311. return 0
  312. fi
  313. printf " %s, %s\n" "$(echob Checked $name SVN)" "$(sayColor info Updates found...)"
  314. printf " %s %s %s %s ...\n" "$(sayColor info Auto Updating $name From)" "$(sayColor yellow $localRev)" "$(sayColor info 'to')" "$(sayColor green $checkoutRev)"
  315. tput bel
  316. if [[ "$localdir" == */Clover ]]; then
  317. update_repository --remote-url="$svnremoteurl" --force-revision="$checkoutRev" "$localdir"
  318. else
  319. # EDK2 directory
  320. # First revert local modifications done by EDK2 patches
  321. svn revert -q -R "$localdir"
  322. update_repository --remote-url="$svnremoteurl" "$localdir"
  323. fi
  324. checkit " Svn up $name" "$svnremoteurl"
  325. return $?
  326. }
  327. # sets up svn sources
  328. function getSOURCE() {
  329. if [ ! -d "${EDK2DIR}"/Build/CloverX64 ] && [ ! -d "${EDK2DIR}"/Build/CloverIA32 ]; then
  330. buildMode=">CleanAll< Build "
  331. fi
  332. if [ -d "${EDK2DIR}"/Build/CloverX64 ] || [ -d "${EDK2DIR}"/Build/CloverIA32 ]; then
  333. buildMode=">>>Clean<<< Build "
  334. fi
  335. # Don't update edk2 if no Clover updates
  336. if [[ "${cloverUpdate}" == "Yes" ]]; then
  337. # Get edk2 source
  338. cd "${srcDIR}"
  339. getSOURCEFILE edk2 "$EDK2DIR" "$EDK2SVNURL"
  340. local return_code=$?
  341. if [[ $return_code -ne 0 && "$EDK2SVNURL" == svn://* ]]; then
  342. echo $(sayColor yellow "Can't get edk2 source from svn transport protocol !")
  343. echo $(sayColor yellow "Trying http transport protocol...")
  344. EDK2SVNURL=$(echo "http${EDK2SVNURL#svn}")
  345. getSOURCEFILE edk2 "$EDK2DIR" "$EDK2SVNURL"
  346. return_code=$?
  347. fi
  348. [[ $return_code -ne 0 ]] && echo $(sayColor red "Unable to checkout new EDK2 sources !")
  349. local buildBaseTools=$?
  350. # Is edk2 need to be update
  351. if [[ "$buildBaseTools" -eq 1 ]]; then
  352. cd "${EDK2DIR}"
  353. # Remove old edk2 config files
  354. rm -f "${EDK2DIR}"/Conf/{BuildEnv.sh,build_rule.txt,target.txt,tools_def.txt}
  355. # Create new default edk2 files in edk2/Conf
  356. ./edksetup.sh >/dev/null
  357. make -C BaseTools clean &>/dev/null
  358. # Basetool will be build automatically when Clover will be build
  359. fi
  360. echo
  361. fi
  362. # Get Clover source
  363. cd "${EDK2DIR}"
  364. getSOURCEFILE Clover "$CloverDIR" "$CLOVERSVNURL"
  365. buildClover=$?
  366. echo
  367. }
  368. # compiles X64 or IA32 versions of Clover and rEFIt_UEFI
  369. function cleanRUN(){
  370. local archs=$(echo "$1" | awk '{print toupper($0)}')
  371. # Clear the package dir before compilation
  372. [[ "$versionToBuild" -ge 1166 ]] && ./ebuild.sh cleanpkg &>/dev/null
  373. echo
  374. echo "Starting $buildMode Process: $(date -j +%T)"
  375. echo "Building Clover$archs, ${ebuildToolchainFlag} $style"
  376. # Mount the RamDisk
  377. mountRamDisk "$EDK2DIR/Build"
  378. cd "${CloverDIR}"
  379. local IFS=" /" # archs can be separate by space or /
  380. local archs=$(lc $archs)
  381. unset IFS
  382. echo "Using TOOLCHAIN_DIR='$TOOLCHAIN'"
  383. for arch in $archs; do
  384. echob "running ${EBUILD_COMMAND[@]} --$arch"
  385. echo
  386. TOOLCHAIN_DIR="$TOOLCHAIN" ${EBUILD_COMMAND[@]} --$arch
  387. checkit "Clover$arch $style"
  388. done
  389. echo
  390. }
  391. function installToolchain() {
  392. cd "${WORKDIR}"/Files
  393. echo "Download and install toolchain to compile Clover"
  394. printf "toolchain will be install in %s\n" "$(echob "${TOOLCHAIN}")"
  395. echo "Press any key to start the process..."
  396. read
  397. if [[ "$USE_LOCAL_BUILDGCC" -eq 1 ]]; then
  398. echob "Using local version of buildgcc.sh..."
  399. cp "$CloverDIR"/buildgcc-4.9.sh "$srcDIR"/buildgcc.sh
  400. else
  401. # Get the latest version of buildgcc.sh from clover
  402. echob "Checking out last version of buildgcc.sh from clover repository..."
  403. svn export --force "$CLOVERSVNURL"/buildgcc-4.9.sh "$srcDIR"/buildgcc.sh >/dev/null
  404. fi
  405. echob "Starting CloverGrower Compile Tools process..."
  406. date
  407. # build only x64 because it can compile ia32 too
  408. PREFIX="$TOOLCHAIN" DIR_MAIN="$CLOVER_GROWER_PRO_DIR" DIR_TOOLS="$srcDIR" \
  409. "$srcDIR"/buildgcc.sh -x64 -all
  410. checkit "Toolchain build"
  411. tput bel
  412. cd ..
  413. }
  414. function installGettext() {
  415. cd "${WORKDIR}"/Files
  416. # Get the latest version of buildgettext.sh from clover
  417. echob "Checking out last version of buildgettext.sh from clover..."
  418. svn export --force "$CLOVERSVNURL"/buildgettext.sh "$srcDIR"/buildgettext.sh >/dev/null
  419. echob "Starting CloverGrower Compile GetText process..."
  420. date
  421. # build gettext
  422. TOOLCHAIN_DIR="$TOOLCHAIN" DIR_MAIN="$srcDIR" DIR_TOOLS="$srcDIR/CloverTools" \
  423. "$srcDIR"/buildgettext.sh
  424. checkit "GetText binaries built"
  425. cd ..
  426. }
  427. function installNasm() {
  428. cd "${WORKDIR}"/Files
  429. # Get the latest version of buildnasl.sh from clover
  430. echob "Checking out last version of buildnasm.sh from clover..."
  431. svn export --force "$CLOVERSVNURL"/buildnasm.sh "$srcDIR"/buildnasm.sh >/dev/null
  432. echob "Starting CloverGrower Compile Nasm process..."
  433. date
  434. # build gettext
  435. TOOLCHAIN_DIR="$TOOLCHAIN" DIR_MAIN="$srcDIR" DIR_TOOLS="$srcDIR/CloverTools" \
  436. "$srcDIR"/buildnasm.sh
  437. checkit "NASM binary built"
  438. cd ..
  439. }
  440. autoBuild(){
  441. local theARCHS="$1"
  442. if [ "$built" == "No" ]; then
  443. local buildMess="* Auto-Build Full Clover rEFIt_UEFI *"
  444. local cleanMode=""
  445. buildMode=">>>>New<<<< Build "
  446. local edk2LocalRev=$(getSvnRevision "$EDK2DIR")
  447. local buildVersioncolor='green'
  448. [[ "$CLOVER_LOCAL_REV" -ne "$CLOVER_REMOTE_REV" ]] && buildVersioncolor='yellow'
  449. echob "*******************************************"
  450. echob "$buildMess"
  451. echob "$(printf '* Revisions: %s: %-29s%s\n' $(sayColor info 'edk2') $(sayColor green $edk2LocalRev) $(echob '*'))"
  452. echob "$(printf '* %s: %-29s%s\n' $(sayColor info 'Clover') $(sayColor $buildVersioncolor $versionToBuild) $(echob '*'))"
  453. local IFS=
  454. local flags="$ebuildToolchainFlag $theARCHS $style"
  455. echob "$(printf '* Using Flags: %-24s*\n' $flags)"
  456. echob "*******************************************"
  457. tput bel
  458. if [[ "$versionToBuild" -ge 3014 ]]; then
  459. # Copy files from Patches_for_EDK2
  460. rsync -a --exclude '.cache' "${CloverDIR}"/Patches_for_EDK2/ "${EDK2DIR}"/
  461. fi
  462. local startEpoch=$(date -u "+%s")
  463. # Start build process
  464. cleanRUN "$theARCHS"
  465. built="Yes"
  466. local stopEpoch=$(date -u "+%s")
  467. local buildTime=$(expr $stopEpoch - $startEpoch)
  468. local timeToBuild
  469. if [[ $buildTime -gt 59 ]]; then
  470. timeToBuild=$(printf "%dm%ds\n" $((buildTime/60%60)) $((buildTime%60)))
  471. else
  472. timeToBuild=$(printf "%ds\n" $((buildTime)))
  473. fi
  474. printf "%s %s %s\n" "$(sayColor info 'Clover Grower Complete Build process took')" \
  475. "$(sayColor green $timeToBuild)" "$(sayColor info 'to complete...')"
  476. echo
  477. fi
  478. }
  479. # makes pkg if Built OR builds THEN makes pkg
  480. function makePKG(){
  481. local theARCHS="$1"
  482. echo
  483. echob "********************************************"
  484. echob "* Good $hours *"
  485. echob "* Welcome To CloverGrowerPro v$CloverGrowerVersion *"
  486. echob "* This script by JrCs *"
  487. echob "* Original script by STLVNUB *"
  488. echob "* Clover Credits: Slice, dmazar and others *"
  489. echob "********************************************"
  490. echo
  491. echob "running '$(basename $CMD)' on '$rootSystem'"
  492. echo
  493. echob "Work Folder: $WORKDIR"
  494. echob "Available : ${workSpaceAvail} MB"
  495. echo
  496. cloverUpdate="No"
  497. versionToBuild=
  498. if [[ -d "${CloverDIR}" ]]; then
  499. CLOVER_LOCAL_REV=$(getSvnRevision "${CloverDIR}")
  500. if [[ -d "${CloverDIR}/.git" ]]; then
  501. # Check if we are on the master branch
  502. local branch=$(cd "$CloverDIR" && LC_ALL=C git rev-parse --abbrev-ref HEAD)
  503. if [[ "$branch" != master ]]; then
  504. echob "You're not on the 'master' branch. Can't update the repository !"
  505. versionToBuild=$CLOVER_LOCAL_REV
  506. fi
  507. fi
  508. if [[ -z "$versionToBuild" ]]; then
  509. if [[ -n "$FORCE_REVISION" ]]; then
  510. versionToBuild=$FORCE_REVISION
  511. else
  512. if [[ "$UPDATE_SOURCES" -eq 1 ]]; then
  513. CLOVER_REMOTE_REV=$(getSvnRevision "$CLOVERSVNURL")
  514. else
  515. CLOVER_REMOTE_REV=$CLOVER_LOCAL_REV
  516. fi
  517. versionToBuild=$CLOVER_REMOTE_REV
  518. fi
  519. if [[ -n "$FORCE_REVISION" ]]; then
  520. versionToBuild=$FORCE_REVISION
  521. if [[ "${CLOVER_LOCAL_REV}" -ne "${versionToBuild}" ]]; then
  522. printf "%s %s\n" "$(sayColor info 'Forcing Clover revision')" "$(sayColor yellow $versionToBuild)"
  523. cloverUpdate="Yes"
  524. fi
  525. else
  526. if [[ "${CLOVER_LOCAL_REV}" -ne "${versionToBuild}" ]]; then
  527. sayColor info "Clover Update Detected !"
  528. echob "******** Clover Package STATS **********"
  529. echob "$(printf '* local revision at %-23s%s\n' $(sayColor yellow $CLOVER_LOCAL_REV) $(echob '*'))"
  530. echob "$(printf '* remote revision at %-23s%s\n' $(sayColor green $CLOVER_REMOTE_REV) $(echob '*'))"
  531. echob "$(printf '* Package Built = %-23s%s\n' $(sayColor info $built) $(echob '*'))"
  532. echob "****************************************"
  533. cloverUpdate="Yes"
  534. else
  535. printf "%s %s %s\n" "$(sayColor info 'No Clover Update found.')" \
  536. "$(echob 'Current revision:')" "$(sayColor green ${CLOVER_LOCAL_REV})"
  537. fi
  538. fi
  539. fi
  540. else
  541. CLOVER_LOCAL_REV=0
  542. cloverUpdate="Yes"
  543. fi
  544. echo
  545. if [[ "${cloverUpdate}" == "Yes" ]]; then
  546. echob "Getting SVN Source, Hang ten…"
  547. getSOURCE
  548. CLOVER_LOCAL_REV=$(getSvnRevision "${CloverDIR}") # Update
  549. versionToBuild=$CLOVER_LOCAL_REV
  550. rm -Rf "${buildDIR}"/*
  551. checkit "Clover updated, so rm the build folder"
  552. cp -R "${filesDIR}/HFSPlus/" "${CloverDIR}/HFSPlus/"
  553. checkit "Copy Files/HFSPlus Clover/HFSPlus"
  554. # Only for clover revisions < 3014
  555. if [[ "$versionToBuild" -lt 3014 ]]; then
  556. if [[ -n "$FORCE_REVISION" || ! -f "${EDK2DIR}/Conf/tools_def.txt" || \
  557. $(grep -c 'GCC49_' "${EDK2DIR}/Conf/tools_def.txt") -eq 0 || \
  558. "${CloverDIR}/Patches_for_EDK2/tools_def.txt" -nt "${EDK2DIR}/Conf/tools_def.txt" ]]; then
  559. # First revert local modifications done by EDK2 patches
  560. svn revert -q -R "$EDK2DIR"
  561. # get configuration files from Clover
  562. cp "${CloverDIR}/Patches_for_EDK2/tools_def.txt" "${EDK2DIR}/Conf/"
  563. cp "${CloverDIR}/Patches_for_EDK2/build_rule.txt" "${EDK2DIR}/Conf/"
  564. # tools_def.txt need to be patch for version < 2863
  565. if [[ "$versionToBuild" -lt 2863 ]]; then
  566. # Patch edk2/Conf/tools_def.txt for GCC
  567. sed -i'.orig' -e 's!^\(DEFINE GCC4[78]_[IA32X64]*_PREFIX *= *\).*!\1'${TOOLCHAIN}'/cross/bin/x86_64-clover-linux-gnu-!' \
  568. "${EDK2DIR}/Conf/tools_def.txt"
  569. # Patch edk2/Conf/tools_def.txt for NASM
  570. sed -i'.orig' -e 's!^\(.*_NASM_PATH *= *\).*!\1'${TOOLCHAIN}'/bin/nasm!' \
  571. "${EDK2DIR}/Conf/tools_def.txt"
  572. checkit "Patching edk2/Conf/tools_def.txt for NASM"
  573. fi
  574. fi
  575. fi
  576. fi
  577. # Construct EBUILD_COMMAND
  578. EBUILD_COMMAND=("./ebuild.sh" "-${ebuildToolchainFlag}" "-$style")
  579. # We can activate VBios Patch in CloverEFI since revision 1162 of Clover
  580. [[ "$VBIOS_PATCH_IN_CLOVEREFI" -ne 0 && "$versionToBuild" -ge 1162 ]] && \
  581. EBUILD_COMMAND+=("--vbios-patch-cloverefi")
  582. # We can activate Only SATA0 Patch in CloverEFI since revision 1853 of Clover
  583. [[ "$ONLY_SATA0_PATCH" -ne 0 && "$versionToBuild" -ge 1853 ]] && \
  584. EBUILD_COMMAND+=("--only-sata0")
  585. # We can activate Secure Bool in CloverEFI since revision 2436 of Clover
  586. [[ "$ENABLE_SECURE_BOOT" -ne 0 && "$versionToBuild" -ge 2436 ]] && \
  587. EBUILD_COMMAND+=(-D ENABLE_SECURE_BOOT)
  588. # Use Apple HFS+ driver
  589. [[ "$USE_APPLE_HFSPLUS_DRIVER" -eq 1 ]] && EBUILD_COMMAND+=(-D USE_APPLE_HFSPLUS_DRIVER)
  590. [[ -n "${EBUILD_OPTIONAL_ARGS:-}" ]] && EBUILD_COMMAND+=($EBUILD_OPTIONAL_ARGS)
  591. local check_ebuild_options="${EBUILD_COMMAND[@]} $theARCHS"
  592. local last_ebuild_options=""
  593. [[ -f "$last_ebuild_options_file" ]] && last_ebuild_options=$(cat "$last_ebuild_options_file")
  594. # Check last modified file
  595. local last_timestamp=$(getCloverLastModifiedSource)
  596. local last_save_timestamp=$(stat -f '%m' "$last_ebuild_options_file" 2>/dev/null || echo '0')
  597. # If not already built force Clover build
  598. if [[ "$built" == "No" && ( "$last_timestamp" -gt "$last_save_timestamp" || \
  599. "$last_ebuild_options" != "$check_ebuild_options" ) ]]; then
  600. printf "%s %s\n" "$(echob 'No build already done.')" \
  601. "$(sayColor info 'Forcing Clover build...')"
  602. echo
  603. buildClover=1
  604. fi
  605. if [[ "$buildClover" -eq 1 ]]; then
  606. echob "Ready to build Clover $versionToBuild, Using Gcc $gccVersToUse"
  607. autoBuild "$theARCHS"
  608. echo "$check_ebuild_options" > "$last_ebuild_options_file"
  609. fi
  610. if [ "$MAKE_PACKAGE" -eq 1 ]; then
  611. local package_name="Clover_v2_r${versionToBuild}.pkg"
  612. if [[ ! -f "${builtPKGDIR}/$package_name" ]]; then # make pkg if not there
  613. if [[ "$(lc $BUILD_PACKAGE)" == a* ]]; then
  614. echob "Type 'm' To make ${package_name}..."
  615. read choose
  616. else
  617. choose='m'
  618. fi
  619. case $choose in
  620. m|M)
  621. if [ -d "${CloverDIR}"/CloverPackage/sym ]; then
  622. rm -rf "${CloverDIR}"/CloverPackage/sym
  623. fi
  624. if [ -f "${UserDIR}"/rc.local ] || [ -f "${UserDIR}"/rc.shutdown.local ]; then
  625. if [ -f "${UserDIR}"/rc.local ]; then
  626. echob "copy User rc.local To Package"
  627. cp -R "${UserDIR}"/rc.local "${CloverDIR}"/CloverPackage/CloverV2/etc
  628. fi
  629. if [ -f "${UserDIR}"/rc.shutdown.local ]; then
  630. echob "copy User rc.shutdown.local To Package"
  631. cp -R "${UserDIR}"/rc.shutdown.local "${CloverDIR}"/CloverPackage/CloverV2/etc
  632. fi
  633. fi
  634. cd "${CloverDIR}"/CloverPackage
  635. echob "cd to ${CloverDIR}/CloverPackage and run ./makepkg."
  636. export GETTEXT_PREFIX="$TOOLCHAIN"
  637. ./makepkg "No" || exit $?
  638. [[ ! -d "${builtPKGDIR}" ]] && mkdir "${builtPKGDIR}"
  639. cp -p "${CloverDIR}"/CloverPackage/sym/*.pkg "${builtPKGDIR}"/
  640. rm -rf "${CloverDIR}"/CloverPackage/sym
  641. echob "open builtPKG"
  642. open "${builtPKGDIR}"/
  643. tput bel
  644. ;;
  645. *)
  646. esac
  647. else
  648. echob "$package_name ALREADY Made !"
  649. fi
  650. else
  651. echob "Skipping pkg creation."
  652. open "${cloverPKGDIR}"/CloverV2/
  653. fi
  654. }
  655. # Check the arguments.
  656. declare -a ARGS=()
  657. force_target=
  658. set -e
  659. while [[ $# -gt 0 ]]; do
  660. option=$1
  661. case "$option" in
  662. -h | --help)
  663. usage
  664. exit 0 ;;
  665. -v | --version)
  666. echo "$self $CloverGrowerVersion"
  667. exit 0 ;;
  668. -r | --revision)
  669. shift
  670. FORCE_REVISION=$(argument $option "$@"); shift
  671. ARGS[${#ARGS[*]}]="--revision=$FORCE_REVISION" ;;
  672. --revision=*)
  673. shift
  674. FORCE_REVISION=$(echo "$option" | sed 's/--revision=//')
  675. ARGS[${#ARGS[*]}]="--revision=$FORCE_REVISION" ;;
  676. -t | --target)
  677. shift
  678. force_target=$(argument $option "$@"); shift
  679. ARGS[${#ARGS[*]}]="--target=$target" ;;
  680. --target=*)
  681. shift
  682. force_target=$(echo "$option" | sed 's/--target=//')
  683. ARGS[${#ARGS[*]}]="--target=$target" ;;
  684. -s | --setup)
  685. shift
  686. DO_SETUP=1
  687. ARGS[${#ARGS[*]}]="$option" ;;
  688. -u | --check-update)
  689. shift
  690. FORCE_CHECK_UPDATE=1 ;;
  691. -n | --no-source-updates)
  692. shift
  693. UPDATE_SOURCES=0 ;;
  694. --use-local-buildgcc)
  695. shift
  696. USE_LOCAL_BUILDGCC=1 ;;
  697. *)
  698. printf "Unrecognized option \`%s'\n" "$option" 1>&2
  699. usage
  700. exit 1
  701. ;;
  702. esac
  703. done
  704. set +e
  705. checkOptions
  706. checkUpdate
  707. checkConfig
  708. target="${force_target:-$DEFAULT_TARGET}"
  709. unset force_target
  710. [[ $(lc "$BUILD_PACKAGE") == n* ]] && MAKE_PACKAGE=0
  711. # don't use -e
  712. set -u
  713. theBoss=$(id -ur)
  714. hours=$(get_hours)
  715. #vars
  716. export WORKDIR="$CLOVER_GROWER_PRO_DIR"
  717. workSpace=$(df -m "${WORKDIR}" | tail -n1 | awk '{ print $4 }')
  718. workSpaceNeeded="522"
  719. workSpaceMin="104"
  720. filesDIR="${WORKDIR}"/Files
  721. UserDIR="${WORKDIR}"/User/etc
  722. etcDIR="${WORKDIR}"/Files/etc
  723. srcDIR="${WORKDIR}"/src
  724. CloverDIR="${EDK2DIR}"/Clover
  725. rEFItDIR="${CloverDIR}"/rEFIt_UEFI
  726. buildDIR="${EDK2DIR}"/Build
  727. cloverPKGDIR="${CloverDIR}"/CloverPackage
  728. builtPKGDIR="${WORKDIR}"/builtPKG
  729. last_ebuild_options_file="$filesDIR"/.last_ebuild_options
  730. theBuiltVersion=""
  731. # Some Flags
  732. buildClover=0
  733. [[ ! -d "${builtPKGDIR}" ]] && mkdir "${builtPKGDIR}"
  734. style=release
  735. if [[ ! -d "$EDK2DIR" && "$workSpace" -lt "$workSpaceNeeded" ]]; then
  736. echob "error!!! Not enough free space"
  737. echob "Need at least $workSpaceNeeded bytes free"
  738. echob "Only have $workSpace bytes"
  739. echob "move CloverGrower to different Folder"
  740. echob "OR free some space"
  741. exit 1
  742. elif [[ "$workSpace" -lt "$workSpaceMin" ]]; then
  743. echob "Getting low on free space"
  744. fi
  745. workSpaceAvail="$workSpace"
  746. #what system
  747. theSystem=$(uname -r)
  748. theSystem="${theSystem:0:2}"
  749. case "${theSystem}" in
  750. [0-8]) rootSystem="unsupported" ;;
  751. 9) rootSystem="Leopard" ;;
  752. 10) rootSystem="Snow Leopard" ;;
  753. 11) rootSystem="Lion" ;;
  754. 12) rootSystem="Mountain Lion" ;;
  755. 13) rootSystem="Mavericks" ;;
  756. 14) rootSystem="Yosemite" ;;
  757. 15) rootSystem="El Capitan" ;;
  758. *) rootSystem="Unknown" ;;
  759. esac
  760. # Check CloverGrower build environment
  761. checkEnv
  762. declare -r gccVersToUse=$("${TOOLCHAIN}"/bin/gcc -dumpversion)
  763. declare -r ebuildToolchainFlag='gcc'$(echo "$gccVersToUse" | sed 's/\.//;s/\..*$//')
  764. buildMess="* Auto-Build Full Clover rEFIt_UEFI *"
  765. cleanMode=""
  766. built="No"
  767. makePKG "$target" # do complete build
  768. echob "Good $hours."
  769. # Local Variables: #
  770. # mode: ksh #
  771. # tab-width: 4 #
  772. # indent-tabs-mode: nil #
  773. # End: #
  774. #
  775. # vi: set expandtab ts=4 sw=4 sts=4: #