BuildLinux.sh 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. #!/bin/bash
  2. #
  3. # This script can download and compile dependencies, compile SuperSlicer
  4. # and optional build a .tgz and an appimage.
  5. #
  6. # Original script from SuperSlicer by supermerill https://github.com/supermerill/SuperSlicer
  7. #
  8. # Change log:
  9. #
  10. # 20 Nov 2023, wschadow, branding and minor changes
  11. # 01 Jan 2024, wschadow, added build options
  12. #
  13. set -e # exit on first error
  14. export ROOT=`pwd`
  15. export NCORES=`nproc`
  16. function usage() {
  17. echo "Usage: ./BuildLinux.sh [-h][-u][-w][-r][-d][-s][-l][-t][-i][-v][-b debug|release][-g 2|3]"
  18. echo " -h: this message"
  19. echo " -u: only update dependency packets (optional and need sudo)"
  20. echo " -w: wipe build directories before building"
  21. echo " -g: force gtk2 build, need to then write the verison: '2' or '3' (BuildLinux.sh -g 2)"
  22. echo " -b: build with debug symbols. Build in full debug mode if then followed by 'debug' (need to be lowercase)"
  23. echo " -r: clean dependencies"
  24. echo " -d: build deps"
  25. echo " -s: build Slic3r"
  26. echo " -l: update language .pot file"
  27. echo " -t: build tests (in combination with -s)"
  28. echo " -i: generate .tgz and appimage (optional)"
  29. echo " -v: change the version 'UNKNOWN' to the date of the day"
  30. echo -e "\n For a first use, you want to 'sudo ./BuildLinux.sh -u'"
  31. echo -e " and then './BuildLinux.sh -dsi'\n"
  32. }
  33. function check_operating_system() {
  34. # check operating system
  35. OS_FOUND=$( command -v uname)
  36. case $( "${OS_FOUND}" | tr '[:upper:]' '[:lower:]') in
  37. linux*)
  38. TARGET_OS="linux"
  39. ;;
  40. msys*|cygwin*|mingw*)
  41. # or possible 'bash on windows'
  42. TARGET_OS='windows'
  43. ;;
  44. nt|win*)
  45. TARGET_OS='windows'
  46. ;;
  47. darwin)
  48. TARGET_OS='macos'
  49. ;;
  50. *)
  51. TARGET_OS='unknown'
  52. ;;
  53. esac
  54. echo
  55. if [ $TARGET_OS == "linux" ]; then
  56. if [ $(uname -m) == "x86_64" ]; then
  57. echo -e "$(tput setaf 2)Linux 64-bit found$(tput sgr0)\n"
  58. Processor="64"
  59. elif [[ $(uname -m) == "i386" || $(uname -m) == "i686" ]]; then
  60. echo "$(tput setaf 2)Linux 32-bit found$(tput sgr0)\n"
  61. Processor="32"
  62. else
  63. echo "$(tput setaf 1)Unsupported OS: Linux $(uname -m)"
  64. exit -1
  65. fi
  66. else
  67. echo -e "$(tput setaf 1)This script doesn't support your Operating system!"
  68. echo -e "Please use Linux 64-bit or Windows 10 64-bit with Linux subsystem / git-bash.$(tput sgr0)\n"
  69. exit -1
  70. fi
  71. }
  72. function check_available_memory_and_disk() {
  73. echo "Checking available memory and disk ..."
  74. FREE_MEM_GB=$(free -g -t | grep 'Mem:' | rev | cut -d" " -f1 | rev)
  75. MIN_MEM_GB=3
  76. echo "Available memory (GB): ${FREE_MEM_GB}"
  77. FREE_DISK_KB=$(df -k . | tail -1 | awk '{print $4}')
  78. MIN_DISK_KB=$((10 * 1024 * 1024))
  79. echo "Available disk (KB): ${FREE_DISK_KB}"
  80. if [ ${FREE_MEM_GB} -le ${MIN_MEM_GB} ]; then
  81. echo -e "\nERROR: SuperSlicer Builder requires at least ${MIN_MEM_GB}G of 'available' mem (systen has only ${FREE_MEM_GB}G available)"
  82. echo && free -h && echo
  83. exit 2
  84. fi
  85. if [[ ${FREE_DISK_KB} -le ${MIN_DISK_KB} ]]; then
  86. echo -e "\nERROR: SuperSlicer Builder requires at least $(echo ${MIN_DISK_KB} |awk '{ printf "%.1fG\n", $1/1024/1024; }') (systen has only $(echo ${FREE_DISK_KB} | awk '{ printf "%.1fG\n", $1/1024/1024; }') disk free)"
  87. echo && df -h . && echo
  88. exit 1
  89. fi
  90. }
  91. function check_distribution() {
  92. echo "Checking distribution ..."
  93. DISTRIBUTION=$(awk -F= '/^ID=/ {print $2}' /etc/os-release)
  94. # treat ubuntu as debian
  95. if [ "${DISTRIBUTION}" == "ubuntu" ]
  96. then
  97. DISTRIBUTION="debian"
  98. fi
  99. echo -e "$(tput setaf 2)${DISTRIBUTION} found$(tput sgr0)\n"
  100. if [ ! -f ./src/platform/unix/linux.d/${DISTRIBUTION} ]
  101. then
  102. echo "Your distribution does not appear to be currently supported by these build scripts"
  103. exit 1
  104. fi
  105. }
  106. #=======================================================================================
  107. check_operating_system
  108. check_distribution
  109. check_available_memory_and_disk
  110. #---------------------------------------------------------------------------------------
  111. #check command line arguments
  112. GTK_VERSION="3"
  113. BUILD_MODE="release"
  114. unset name
  115. while getopts ":bdhilrstuvwg:" opt; do
  116. case ${opt} in
  117. u )
  118. UPDATE_LIB="1"
  119. ;;
  120. i )
  121. BUILD_IMAGE="1"
  122. ;;
  123. d )
  124. BUILD_DEPS="1"
  125. ;;
  126. s )
  127. BUILD_SLIC3R="1"
  128. ;;
  129. l )
  130. UPDATE_POTFILE="1"
  131. ;;
  132. t )
  133. BUILD_TESTS="1"
  134. ;;
  135. b )
  136. BUILD_DEBUG="1"
  137. BUILD_MODE=$OPTARG
  138. ;;
  139. g )
  140. GTK_VERSION=$OPTARG
  141. ;;
  142. r )
  143. BUILD_CLEANDEPEND="1"
  144. ;;
  145. v )
  146. VERSION_DATE="1"
  147. ;;
  148. w )
  149. BUILD_WIPE="1"
  150. ;;
  151. h ) usage
  152. exit 0
  153. ;;
  154. * ) usage
  155. exit -1
  156. ;;
  157. esac
  158. done
  159. if [ ${OPTIND} -eq 1 ]
  160. then
  161. usage
  162. exit -1
  163. fi
  164. #---------------------------------------------------------------------------------------
  165. # check installation of required packages or update when -u is set
  166. source ./src/platform/unix/linux.d/${DISTRIBUTION}
  167. if [[ "$GTK_VERSION" == 2 ]]; then
  168. FOUND_GTK2=$(dpkg -l libgtk* | grep gtk2)
  169. FOUND_GTK2_DEV=$(dpkg -l libgtk* | grep gtk2.0-dev)
  170. echo -e "\nFOUND_GTK2:\n$FOUND_GTK2\n"
  171. echo -e "\FOUND_GTK2_DEV:\n$FOUND_GTK2_DEV\n"
  172. elif [[ "$GTK_VERSION" == 3 ]]; then
  173. FOUND_GTK3=$(dpkg -l libgtk* | grep gtk-3)
  174. FOUND_GTK3_DEV=$(dpkg -l libgtk* | grep gtk-3-dev)
  175. echo -e "\nFOUND_GTK3:\n$FOUND_GTK3)\n"
  176. echo -e "\nFOUND_GTK2_DEV:\n$FOUND_GTK3_DEV)\n"
  177. else
  178. echo -e "\nError, only GTK2 and GTK3 verison are supported. Asked GTK version: '$GTK_VERSION'\n"
  179. exit -1
  180. fi
  181. if [[ -n "$BUILD_DEPS" ]]
  182. then
  183. if [[ -n $BUILD_WIPE ]]
  184. then
  185. echo -e "\n wiping deps/build directory...\n"
  186. rm -fr deps/build
  187. echo -e " ... done\n"
  188. fi
  189. # mkdir build in deps
  190. if [ ! -d "deps/build" ]
  191. then
  192. mkdir deps/build
  193. fi
  194. echo -e "[1/9] Configuring dependencies ...\n"
  195. BUILD_ARGS=""
  196. if [[ -n "$FOUND_GTK3_DEV" ]]
  197. then
  198. BUILD_ARGS="-DDEP_WX_GTK3=ON"
  199. else
  200. BUILD_ARGS="-DDEP_WX_GTK3=OFF"
  201. fi
  202. if [[ -n "$BUILD_DEBUG" ]]; then
  203. if [[ $BUILD_MODE == "release" ]]; then
  204. BUILD_ARGS="${BUILD_ARGS} -DCMAKE_BUILD_TYPE=RelWithDebInfo"
  205. else
  206. BUILD_ARGS="${BUILD_ARGS} -DCMAKE_BUILD_TYPE=Debug"
  207. fi
  208. # have to build deps with debug & release or the cmake won't find evrything it needs
  209. if [ ! -d "deps/build/release" ]
  210. then
  211. mkdir deps/build/release
  212. fi
  213. pushd deps/build/release > /dev/null
  214. cmake ../.. -DDESTDIR="../destdir" $BUILD_ARGS
  215. popd > /dev/null
  216. fi
  217. pushd deps/build > /dev/null
  218. cmake .. $BUILD_ARGS
  219. echo -e "\n ... done\n"
  220. echo -e "\n[2/9] Building dependencies...\n"
  221. # make deps
  222. make -j$NCORES
  223. echo -e "\n ... done\n"
  224. # rename wxscintilla
  225. echo "[3/9] Renaming wxscintilla library..."
  226. pushd destdir/usr/local/lib > /dev/null
  227. if [[ -z "$FOUND_GTK3_DEV" ]]
  228. then
  229. cp libwxscintilla-3.2.a libwx_gtk2u_scintilla-3.2.a
  230. else
  231. cp libwxscintilla-3.2.a libwx_gtk3u_scintilla-3.2.a
  232. fi
  233. echo "> ls destdir/usr/local/lib"
  234. ls -al .
  235. echo "> ls ROOT/deps/build/destdir/usr/local/lib"
  236. ls -al $ROOT/deps/build/destdir/usr/local/lib
  237. echo "> ls ROOT/deps/build"
  238. ls -al $ROOT/deps/build
  239. popd > /dev/null
  240. popd > /dev/null
  241. echo -e "\n ... done\n"
  242. fi
  243. if [[ -n "$BUILD_CLEANDEPEND" ]]
  244. then
  245. echo -e "[4/9] Cleaning dependencies...\n"
  246. pushd deps/build > /dev/null
  247. df -h
  248. rm -fr dep_*
  249. rm -fr builds
  250. rm -fr download
  251. rm -fr release
  252. df -h
  253. popd > /dev/null
  254. echo -e " ... done\n"
  255. fi
  256. echo -n "Check space taken ..."
  257. du -h
  258. if [[ -n "$BUILD_SLIC3R" ]]
  259. then
  260. echo -e "[5/9] Configuring SuperSlicer ...\n"
  261. if [[ -n $BUILD_WIPE ]]
  262. then
  263. echo -n "wiping build directory ..."
  264. rm -fr build
  265. echo " done"
  266. fi
  267. echo -n "Updating submodules ..."
  268. {
  269. # update submodule profiles
  270. pushd resources/profiles
  271. git submodule update --init
  272. popd
  273. } #> $ROOT/build/Build.log # Capture all command output
  274. echo " done"
  275. if [[ -n $VERSION_DATE ]]
  276. then
  277. echo -n "Changing date in version ..."
  278. # change date in version
  279. sed "s/+UNKNOWN/-$(date '+%F')/" version.inc > version.date.inc
  280. echo " done"
  281. else
  282. sed "s/+UNKNOWN//" version.inc > version.date.inc
  283. fi
  284. # mkdir build
  285. if [ ! -d "build" ]; then
  286. mkdir build
  287. fi
  288. BUILD_ARGS=""
  289. if [[ -n "$FOUND_GTK3_DEV" ]]; then
  290. BUILD_ARGS="-DSLIC3R_GTK=3"
  291. fi
  292. if [[ -n "$BUILD_DEBUG" ]]; then
  293. if [[ $BUILD_MODE == "release" ]]; then
  294. # add debug symbols (relwithdebinfo)
  295. BUILD_ARGS="${BUILD_ARGS} -DCMAKE_BUILD_TYPE=RelWithDebInfo"
  296. echo -n "Build in release mode but with debug symbols ..."
  297. else
  298. BUILD_ARGS="${BUILD_ARGS} -DCMAKE_BUILD_TYPE=Debug"
  299. fi
  300. fi
  301. if [[ -n "$BUILD_TESTS" ]]; then
  302. BUILD_ARGS="${BUILD_ARGS} -DCMAKE_BUILD_TESTS=1"
  303. else
  304. BUILD_ARGS="${BUILD_ARGS} -DCMAKE_BUILD_TESTS=0"
  305. fi
  306. # cmake
  307. pushd build > /dev/null
  308. cmake .. -DCMAKE_PREFIX_PATH="$PWD/../deps/build/destdir/usr/local" -DSLIC3R_STATIC=1 ${BUILD_ARGS}
  309. echo " ... done"
  310. # make SuperSlicer
  311. echo -e "\n[6/9] Building SuperSlicer ...\n"
  312. df -h
  313. make -j$NCORES libslic3r
  314. df -h
  315. du -h
  316. make -j$NCORES libslic3r_gui
  317. df -h
  318. du -h
  319. make -j$NCORES Slic3r
  320. df -h
  321. make -j$NCORES OCCTWrapper
  322. echo -e "\n ... done"
  323. echo -e "\n[7/9] Generating language files ...\n"
  324. #make .mo
  325. if [[ -n "$UPDATE_POTFILE" ]]
  326. then
  327. make gettext_make_pot
  328. fi
  329. make gettext_po_to_mo
  330. popd > /dev/null
  331. echo -e "\n ... done"
  332. # Give proper permissions to script
  333. chmod 755 $ROOT/build/src/BuildLinuxImage.sh
  334. pushd build > /dev/null
  335. echo "\n[8/9] launch ${ROOT}/build/src/BuildLinuxImage.sh -a -g ${GTK_VERSION}"
  336. $ROOT/build/src/BuildLinuxImage.sh -a -g $GTK_VERSION
  337. popd > /dev/null
  338. echo "> ls ROOT"
  339. ls -al $ROOT
  340. echo "> ls ROOT/build"
  341. ls -al $ROOT/build
  342. echo "> ls -al ROOT/build/bin"
  343. ls -al $ROOT/build/bin
  344. echo "> ls -al ROOT/build/src"
  345. ls -al $ROOT/build/src
  346. fi
  347. if [[ -n "$BUILD_IMAGE" ]]
  348. then
  349. # Give proper permissions to script
  350. chmod 755 $ROOT/build/src/BuildLinuxImage.sh
  351. pushd build > /dev/null
  352. $ROOT/build/src/BuildLinuxImage.sh -i -g $GTK_VERSION
  353. popd > /dev/null
  354. echo "> ls ROOT"
  355. ls -al $ROOT
  356. echo "> ls ROOT/build"
  357. ls -al $ROOT/build
  358. echo "> ls -al ROOT/build/bin"
  359. ls -al $ROOT/build/bin
  360. echo "> ls -al ROOT/build/src"
  361. ls -al $ROOT/build/src
  362. fi