/build.sh

https://github.com/gauthamzz/John-Cena · Shell · 605 lines · 469 code · 60 blank · 76 comment · 33 complexity · 453118a7aad6eab6437cd89f23f738d0 MD5 · raw file

  1. #!/usr/bin/env bash
  2. # Build script for github.com/gauthamzz/johncena
  3. # -------------------------------------
  4. INSTALLED() {
  5. local loc;
  6. loc="$(which "$1" 2>&1)"
  7. if [ $? -eq 0 ] && [ -n "$loc" ]; then
  8. return 0
  9. fi
  10. return 1
  11. }
  12. BUILT() {
  13. # Force it to be consider built.
  14. case "$1" in
  15. "johncena"|"johncena"|"true"|"TRUE"|1)
  16. BUILD_LASTEXIT=0
  17. BUILD_COMPLETE=true
  18. BUILD_EXECUTED=true
  19. return 0
  20. ;;
  21. esac
  22. # Check if it's built.
  23. if [ "${BUILD_COMPLETE}" = "true" ]; then
  24. return 0
  25. fi
  26. if [ "${BUILD_LASTEXIT}" = "FAIL" ]; then
  27. return 0
  28. fi
  29. return 1
  30. }
  31. BUILD-FIND() {
  32. for program in "$@"; do
  33. if INSTALLED "$program"; then
  34. printf "%s" "$program"
  35. return 0
  36. fi
  37. done
  38. return 1
  39. }
  40. BUILD-START() {
  41. BUILD_LASTERROR=""
  42. BUILD_LASTEXIT=""
  43. BUILD_EXECUTED=false
  44. SRC_FILENAME="$2"
  45. OUT_FILENAME="$(sed 's/\./-/' <<< "$(basename "$2")")"
  46. SRC_FILE="${SRC}/${SRC_FILENAME}"
  47. OUT_FILE="${BIN}/${OUT_FILENAME}"
  48. printf "\033[33mBuilding \033[0m%-16s\033[3m... " "$1"
  49. }
  50. BUILD-RUN() {
  51. local first=true
  52. for arg in "$@"; do
  53. if "$first"; then
  54. first=false
  55. printf "\n\033[36m%s\033[0m" "$arg"
  56. else
  57. printf " %s" "$arg"
  58. fi
  59. done
  60. BUILD_EXECUTED=true
  61. BUILD_LASTERROR="$($@ 2>&1)"
  62. BUILD_LASTEXIT=$?
  63. printf "\033[2K\033[A\033[G\033[29C"
  64. return $ret
  65. }
  66. BUILD-END() {
  67. # Fail command.
  68. if [ "${BUILD_LASTEXIT}" = "FAIL" ]; then
  69. return 0;
  70. fi
  71. # Nothing executed.
  72. if ! [ "${BUILD_EXECUTED}" = "true" ]; then
  73. printf "\033[31mNo compiler.\033[0m\n"
  74. return 0
  75. fi
  76. # Success/error.
  77. if [ "${BUILD_LASTEXIT}" -eq 0 ]; then
  78. printf "\033[32mSuccess.\033[0m\n"
  79. else
  80. printf "\033[31mFailure.\033[0m\n"
  81. if "$OPT_SHOW_ERROR"; then
  82. printf "%s\033[0m\n" "${BUILD_LASTERROR}"
  83. fi
  84. fi
  85. }
  86. BUILD-FAIL() {
  87. printf "\033[31m%s\033[0m\n" "$1"
  88. BUILD_LASTEXIT="FAIL"
  89. }
  90. INTERPRETED-COPY() {
  91. if "${OPT_FORCE_WRAP}"; then
  92. return 1
  93. fi
  94. if [ "$(head -c2 < "${SRC_FILE}")" = "#!" ]; then
  95. cp "${SRC_FILE}" "${OUT_FILE}"
  96. chmod +x "${OUT_FILE}"
  97. return 0
  98. fi
  99. return 1
  100. }
  101. INTERPRETED-WRAP() {
  102. printf "#!/usr/bin/env bash\n"
  103. local first=true
  104. for arg in "$@"; do
  105. if "$first"; then
  106. first=false
  107. printf "%q" "$arg"
  108. else
  109. case "$arg" in
  110. '{$@}')
  111. printf ' $@'
  112. ;;
  113. *)
  114. printf " %q" "$arg"
  115. ;;
  116. esac
  117. fi
  118. done
  119. printf "\nexit $?\n"
  120. }
  121. # -------------------------------------
  122. # Preparation
  123. DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  124. BIN="${DIR}/bin"
  125. OBJ="${DIR}/obj"
  126. SRC="${DIR}"
  127. OPT_SHOW_ERROR=false
  128. OPT_FORCE_WRAP=false
  129. for arg in "$@"; do
  130. case "$arg" in
  131. -E|--show-errors)
  132. OPT_SHOW_ERROR=true
  133. ;;
  134. -W|--force-wrap)
  135. OPT_FORCE_WRAP=true
  136. ;;
  137. esac
  138. done
  139. mkdir -p "${BIN}" &>/dev/null
  140. mkdir -p "${OBJ}" &>/dev/null
  141. # -------------------------------------
  142. # AppleScript
  143. BUILD-START "AppleScript" "johncena.applescript"
  144. case "$(BUILD-FIND osascript)" in
  145. osascript)
  146. if INTERPRETED-COPY; then
  147. BUILT TRUE
  148. else
  149. INTERPRETED-WRAP osascript "${OBJ}/${SRC_FILENAME}" '{$@}' > "${OUT_FILE}"
  150. chmod +x "${OUT_FILE}"
  151. cp "${SRC_FILE}" "${OBJ}/${SRC_FILENAME}"
  152. BUILT TRUE
  153. fi
  154. ;;
  155. esac
  156. BUILD-END
  157. # -------------------------------------
  158. # Awk
  159. BUILD-START "Awk" "johncena.awk"
  160. case "$(BUILD-FIND awk)" in
  161. awk)
  162. if INTERPRETED-COPY; then
  163. BUILT true
  164. else
  165. INTERPRETED-WRAP awk "${OBJ}/${SRC_FILENAME}" -- '{$@}' > "${OUT_FILE}"
  166. chmod +x "${OUT_FILE}"
  167. cp "${SRC_FILE}" "${OBJ}/${SRC_FILENAME}"
  168. BUILT TRUE
  169. fi
  170. ;;
  171. esac
  172. BUILD-END
  173. # -------------------------------------
  174. # Brainfuck
  175. BUILD-START "Brainfuck" "johncena.bf"
  176. case "$(BUILD-FIND brainfuck)" in
  177. brainfuck)
  178. if INTERPRETED-COPY; then
  179. BUILT true
  180. else
  181. INTERPRETED-WRAP brainfuck "${OBJ}/${SRC_FILENAME}" > "${OUT_FILE}"
  182. chmod +x "${OUT_FILE}"
  183. cp "${SRC_FILE}" "${OBJ}/${SRC_FILENAME}"
  184. BUILT TRUE
  185. fi
  186. ;;
  187. esac
  188. BUILD-END
  189. # -------------------------------------
  190. # Brainfuck (Custom)
  191. BUILD-START "Brainfuck (Args)" "johncena.custom.bf"
  192. case "$(BUILD-FIND brainfuck)" in
  193. brainfuck)
  194. if INTERPRETED-COPY; then
  195. BUILT true
  196. else
  197. INTERPRETED-WRAP brainfuck "${OBJ}/${SRC_FILENAME}" > "${OUT_FILE}"
  198. chmod +x "${OUT_FILE}"
  199. cp "${SRC_FILE}" "${OBJ}/${SRC_FILENAME}"
  200. BUILT TRUE
  201. fi
  202. ;;
  203. esac
  204. BUILD-END
  205. # -------------------------------------
  206. # C
  207. BUILD-START "C" "johncena.c"
  208. case "$(BUILD-FIND clang gcc)" in
  209. clang)
  210. BUILD-RUN clang -O3 -o "${OUT_FILE}" "${SRC_FILE}"
  211. ;;
  212. gcc)
  213. BUILD-RUN gcc -O3 -o "${OUT_FILE}" "${SRC_FILE}"
  214. ;;
  215. esac
  216. BUILD-END
  217. # -------------------------------------
  218. # C++
  219. BUILD-START "C++" "johncena.cpp"
  220. case "$(BUILD-FIND clang++ g++)" in
  221. clang++)
  222. BUILD-RUN clang++ -O3 -o "${OUT_FILE}" "${SRC_FILE}"
  223. ;;
  224. g++)
  225. BUILD-RUN g++ -O3 -o "${OUT_FILE}" "${SRC_FILE}"
  226. ;;
  227. esac
  228. BUILD-END
  229. # -------------------------------------
  230. # C#
  231. BUILD-START "C#" "johncena.cs"
  232. case "$(BUILD-FIND mcs)" in
  233. mcs)
  234. BUILD-RUN mcs -optimize+ -out:"${OBJ}/${OUT_FILENAME}.exe" "${SRC_FILE}"
  235. INTERPRETED-WRAP mono "${OBJ}/${OUT_FILENAME}.exe" '{$@}' > "${OUT_FILE}"
  236. chmod +x "${OUT_FILE}"
  237. ;;
  238. esac
  239. BUILD-END
  240. # -------------------------------------
  241. # D
  242. BUILD-START "D" "johncena.d"
  243. case "$(BUILD-FIND rdmd)" in
  244. rdmd)
  245. rdmd --build-only -of"${BIN}/johncena-d" johncena.d
  246. BUILT true
  247. ;;
  248. esac
  249. BUILD-END
  250. # -------------------------------------
  251. # Dart
  252. BUILD-START "Dart" "johncena.dart"
  253. case "$(BUILD-FIND dart)" in
  254. dart)
  255. dart johncena.dart
  256. BUILT true
  257. ;;
  258. esac
  259. BUILD-END
  260. # -------------------------------------
  261. # Erlang
  262. BUILD-START "Erlang" "johncena.escript"
  263. BUILD-FAIL "TODO BUILD SCRIPT"
  264. BUILD-END
  265. # -------------------------------------
  266. # Fish
  267. BUILD-START "Fish" "johncena.fish"
  268. case "$(BUILD-FIND fish)" in
  269. fish)
  270. if INTERPRETED-COPY; then
  271. BUILT true
  272. else
  273. INTERPRETED-WRAP fish "${OBJ}/${SRC_FILENAME}" '{$@}' > "${OUT_FILE}"
  274. cp "${SRC_FILE}" "${OBJ}/${SRC_FILENAME}"
  275. chmod +x "${OUT_FILE}"
  276. BUILT TRUE
  277. fi
  278. ;;
  279. esac
  280. BUILD-END
  281. # -------------------------------------
  282. # Go
  283. BUILD-START "Go" "johncena.go"
  284. case "$(BUILD-FIND go)" in
  285. go)
  286. if INTERPRETED-COPY; then
  287. BUILT true
  288. else
  289. INTERPRETED-WRAP go run "${OBJ}/${SRC_FILENAME}" '{$@}' > "${OUT_FILE}"
  290. cp "${SRC_FILE}" "${OBJ}/${SRC_FILENAME}"
  291. chmod +x "${OUT_FILE}"
  292. BUILT TRUE
  293. fi
  294. ;;
  295. esac
  296. BUILD-END
  297. # -------------------------------------
  298. # Haskell
  299. BUILD-START "Haskell" "johncena.hs"
  300. case "$(BUILD-FIND ghc)" in
  301. ghc)
  302. BUILD-RUN ghc "-outputdir ${OBJ} -dynamic -o ${OUT_FILE} ${SRC_FILE}"
  303. ;;
  304. esac
  305. BUILD-END
  306. # -------------------------------------
  307. # IL
  308. BUILD-START "IL" "johncena.il"
  309. case "$(BUILD-FIND ilasm)" in
  310. ilasm)
  311. BUILD-RUN ilasm /out:"${OBJ}/${OUT_FILENAME}.exe" "${SRC_FILE}"
  312. INTERPRETED-WRAP mono "${OBJ}/${OUT_FILENAME}.exe" '{$@}' > "${OUT_FILE}"
  313. chmod +x "${OUT_FILE}"
  314. ;;
  315. esac
  316. BUILD-END
  317. # -------------------------------------
  318. # Java
  319. BUILD-START "Java" "johncena.java"
  320. case "$(BUILD-FIND javac)" in
  321. javac)
  322. BUILD-RUN javac -d "${OBJ}" "${SRC_FILE}"
  323. INTERPRETED-WRAP java -cp "${OBJ}" "johncena" '{$@}' > "${OUT_FILE}"
  324. chmod +x "${OUT_FILE}"
  325. ;;
  326. esac
  327. BUILD-END
  328. # -------------------------------------
  329. # Groovy
  330. BUILD-START "Groovy" "johncena.groovy"
  331. case "$(BUILD-FIND groovy)" in
  332. groovy)
  333. if INTERPRETED-COPY; then
  334. BUILT true
  335. else
  336. INTERPRETED-WRAP groovy "${OBJ}/${SRC_FILENAME}" '{$@}' > "${OUT_FILE}"
  337. cp "${SRC_FILE}" "${OBJ}/${SRC_FILENAME}"
  338. chmod +x "${OUT_FILE}"
  339. BUILT TRUE
  340. fi
  341. ;;
  342. esac
  343. BUILD-END
  344. # -------------------------------------
  345. # JavaScript
  346. BUILD-START "JavaScript" "johncena.js"
  347. case "$(BUILD-FIND node)" in
  348. node)
  349. if INTERPRETED-COPY; then
  350. BUILT true
  351. else
  352. INTERPRETED-WRAP node "${OBJ}/${SRC_FILENAME}" '{$@}' > "${OUT_FILE}"
  353. cp "${SRC_FILE}" "${OBJ}/${SRC_FILENAME}"
  354. chmod +x "${OUT_FILE}"
  355. BUILT TRUE
  356. fi
  357. ;;
  358. esac
  359. BUILD-END
  360. # -------------------------------------
  361. # Lisp
  362. BUILD-START "Lisp" "johncena.lisp"
  363. BUILD-FAIL "TODO BUILD SCRIPT"
  364. BUILD-END
  365. # -------------------------------------
  366. # Lua
  367. BUILD-START "Lua" "johncena.lua"
  368. BUILD-FAIL "TODO BUILD SCRIPT"
  369. BUILD-END
  370. # -------------------------------------
  371. # Objective-C
  372. BUILD-START "Objective-C" "johncena.m"
  373. case "$(BUILD-FIND clang)" in
  374. clang)
  375. BUILD-RUN clang -O3 -framework Foundation -o "${OUT_FILE}" "${SRC_FILE}"
  376. ;;
  377. esac
  378. BUILD-END
  379. # -------------------------------------
  380. # OCaml
  381. BUILD-START "OCaml" "johncena.ml"
  382. case "$(BUILD-FIND ocaml)" in
  383. ocaml)
  384. BASE_FILENAME="${SRC_FILENAME%%.*}"
  385. BUILD-RUN ocamlopt -o "${OUT_FILE}" "${SRC_FILE}"
  386. mv ${BASE_FILENAME}.cmi ${BASE_FILENAME}.cmx ${BASE_FILENAME}.o ${OBJ}
  387. ;;
  388. esac
  389. BUILD-END
  390. # -------------------------------------
  391. # PHP
  392. BUILD-START "PHP" "johncena.php"
  393. case "$(BUILD-FIND php)" in
  394. php)
  395. if INTERPRETED-COPY; then
  396. BUILT true
  397. else
  398. INTERPRETED-WRAP php "${OBJ}/${SRC_FILENAME}" '{$@}' > "${OUT_FILE}"
  399. cp "${SRC_FILE}" "${OBJ}/${SRC_FILENAME}"
  400. chmod +x "${OUT_FILE}"
  401. BUILT TRUE
  402. fi
  403. ;;
  404. esac
  405. BUILD-END
  406. # -------------------------------------
  407. # Perl
  408. BUILD-START "Perl" "johncena.pl"
  409. case "$(BUILD-FIND perl)" in
  410. perl)
  411. if INTERPRETED-COPY; then
  412. BUILT true
  413. else
  414. INTERPRETED-WRAP perl "${OBJ}/${SRC_FILENAME}" '{$@}' > "${OUT_FILE}"
  415. cp "${SRC_FILE}" "${OBJ}/${SRC_FILENAME}"
  416. chmod +x "${OUT_FILE}"
  417. BUILT TRUE
  418. fi
  419. ;;
  420. esac
  421. BUILD-END
  422. # -------------------------------------
  423. # Python
  424. BUILD-START "Python" "johncena.py"
  425. case "$(BUILD-FIND python)" in
  426. python)
  427. if INTERPRETED-COPY; then
  428. BUILT true
  429. else
  430. INTERPRETED-WRAP python "${OBJ}/${SRC_FILENAME}" '{$@}' > "${OUT_FILE}"
  431. cp "${SRC_FILE}" "${OBJ}/${SRC_FILENAME}"
  432. chmod +x "${OUT_FILE}"
  433. BUILT TRUE
  434. fi
  435. ;;
  436. esac
  437. BUILD-END
  438. # -------------------------------------
  439. # Prolog
  440. BUILD-START "Prolog" "johncena.prolog"
  441. case "$(BUILD-FIND swipl)" in
  442. swipl)
  443. swipl johncena.prolog
  444. BUILT true
  445. ;;
  446. esac
  447. BUILD-END
  448. # -------------------------------------
  449. # Racket
  450. BUILD-START "Racket" "johncena.rkt"
  451. case "$(BUILD-FIND racket)" in
  452. racket)
  453. if INTERPRETED-COPY; then
  454. BUILT true
  455. else
  456. INTERPRETED-WRAP racket "${OBJ}/${SRC_FILENAME}" '{$@}' > "${OUT_FILE}"
  457. cp "${SRC_FILE}" "${OBJ}/${SRC_FILENAME}"
  458. chmod +x "${OUT_FILE}"
  459. BUILT TRUE
  460. fi
  461. ;;
  462. esac
  463. BUILD-END
  464. # -------------------------------------
  465. # Ruby
  466. BUILD-START "Ruby" "johncena.rb"
  467. case "$(BUILD-FIND ruby)" in
  468. ruby)
  469. if INTERPRETED-COPY; then
  470. BUILT true
  471. else
  472. INTERPRETED-WRAP ruby "${OBJ}/${SRC_FILENAME}" '{$@}' > "${OUT_FILE}"
  473. cp "${SRC_FILE}" "${OBJ}/${SRC_FILENAME}"
  474. chmod +x "${OUT_FILE}"
  475. BUILT TRUE
  476. fi
  477. ;;
  478. esac
  479. BUILD-END
  480. # -------------------------------------
  481. # Rust
  482. BUILD-START "Rust" "johncena.rs"
  483. case "$(BUILD-FIND rustc)" in
  484. rustc)
  485. BUILD-RUN rustc -o "${OUT_FILE}" "${SRC_FILE}"
  486. ;;
  487. esac
  488. BUILD-END
  489. # -------------------------------------
  490. # Scala
  491. BUILD-START "Scala" "johncena.scala"
  492. BUILD-FAIL "TODO BUILD SCRIPT"
  493. BUILD-END
  494. # -------------------------------------
  495. # Shell
  496. BUILD-START "Shell" "johncena.sh"
  497. case "$(BUILD-FIND sh)" in
  498. sh)
  499. if INTERPRETED-COPY; then
  500. BUILT true
  501. else
  502. INTERPRETED-WRAP sh "${OBJ}/${SRC_FILENAME}" '{$@}' > "${OUT_FILE}"
  503. cp "${SRC_FILE}" "${OBJ}/${SRC_FILENAME}"
  504. chmod +x "${OUT_FILE}"
  505. BUILT TRUE
  506. fi
  507. ;;
  508. esac
  509. BUILD-END
  510. # -------------------------------------
  511. # Vala
  512. BUILD-START "Vala" "johncena.vala"
  513. case "$(BUILD-FIND valac)" in
  514. valac)
  515. BUILD-RUN valac -o "${OUT_FILE}" "${SRC_FILE}"
  516. ;;
  517. esac
  518. BUILD-END
  519. # -------------------------------------
  520. # VB
  521. BUILD-START "VB" "johncena.vb"
  522. case "$(BUILD-FIND vbnc)" in
  523. vbnc)
  524. BUILD-RUN vbnc -optimize+ -out:"${OBJ}/${OUT_FILENAME}.exe" "${SRC_FILE}"
  525. INTERPRETED-WRAP mono "${OBJ}/${OUT_FILENAME}.exe" '{$@}' > "${OUT_FILE}"
  526. chmod +x "${OUT_FILE}"
  527. ;;
  528. esac
  529. BUILD-END
  530. # -------------------------------------
  531. # Guile
  532. BUILD-START "Guile" "johncena.guile"
  533. case "$(BUILD-FIND guile)" in
  534. guile)
  535. if INTERPRETED-COPY; then
  536. BUILT true
  537. else
  538. INTERPRETED-WRAP sh "${OBJ}/${SRC_FILENAME}" '{$@}' > "${OUT_FILE}"
  539. cp "${SRC_FILE}" "${OBJ}/${SRC_FILENAME}"
  540. chmod +x "${OUT_FILE}"
  541. BUILT TRUE
  542. fi
  543. ;;
  544. esac
  545. BUILD-END