build 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. #!/bin/bash
  2. [% c("var/set_default_env") -%]
  3. distdir=/var/tmp/dist/[% project %]
  4. export TORBROWSER_VERSION='[% c("version") %]'
  5. mkdir -p $distdir
  6. scripts_dir=/var/tmp/build_scripts
  7. mkdir -p "$scripts_dir"
  8. OUTDIR='[% dest_dir _ "/" _ c("filename") %]'
  9. mkdir -p $OUTDIR
  10. # When we build with MULTI_LINGUAL=1, the browser will be packaged inside a
  11. # directory named tor-browser (instead of tor-browser_en-US). Therefore we
  12. # stage everything under tor-browser-stage to avoid a conflict.
  13. TB_STAGE_DIR=$distdir/tor-browser-stage
  14. GENERATEDPREFSPATH=$rootdir/Bundle-Data/PTConfigs/generated-prefs.js
  15. # Create initially empty prefs file where we can dump our conditionally included/genetered prefs
  16. touch "$GENERATEDPREFSPATH"
  17. [% IF c("var/osx") %]
  18. TBDIR="$TB_STAGE_DIR/Tor Browser.app"
  19. DOCSPATH=Contents/Resources/TorBrowser/Docs
  20. EXTSPATH=Contents/Resources/distribution/extensions
  21. TORBINPATH=Contents/MacOS/Tor
  22. TORCONFIGPATH=Contents/Resources/TorBrowser/Tor
  23. tar -C /var/tmp/dist -xf $rootdir/[% c('input_files_by_name/libdmg') %]
  24. export PATH=/var/tmp/dist/libdmg-hfsplus:$PATH
  25. [% ELSE %]
  26. TBDIR=$TB_STAGE_DIR/Browser
  27. DOCSPATH=TorBrowser/Docs
  28. EXTSPATH=TorBrowser/Data/Browser/profile.default/extensions
  29. TORCONFIGPATH=TorBrowser/Data/Tor
  30. mkdir -p "$TBDIR/TorBrowser/Data/Browser/Caches"
  31. [% END %]
  32. mkdir -p "$TBDIR/$EXTSPATH"
  33. # Extract the MAR tools.
  34. unzip -d $rootdir $rootdir/[% c('input_files_by_name/firefox') %]/mar-tools-*.zip
  35. MARTOOLS=$rootdir/mar-tools
  36. mv [% c('input_files_by_name/noscript') %] "$TBDIR/$EXTSPATH/{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi"
  37. tar -C "$TBDIR" -xf [% c('input_files_by_name/obfs4') %]
  38. [% IF c("var/snowflake") %]
  39. tar -C "$TBDIR" -xf [% c('input_files_by_name/snowflake') -%]
  40. [% END -%]
  41. tar -C "$TBDIR[% IF c("var/osx") %]/Contents/Resources[% END %]" -xf [% c('input_files_by_name/fonts') %]
  42. [% IF c("var/linux") %]
  43. cp RelativeLink/* ${TB_STAGE_DIR}/Browser/
  44. cp RelativeLink/start-tor-browser.desktop ${TB_STAGE_DIR}/
  45. cat > ${TB_STAGE_DIR}/Browser/start-tor-browser << 'RBM_TB_EOF'
  46. [% INCLUDE 'RelativeLink/start-tor-browser' -%]
  47. RBM_TB_EOF
  48. [% IF c("var/namecoin") %]
  49. pushd ${TB_STAGE_DIR}/Browser/
  50. patch -p1 < $rootdir/namecoin.patch
  51. popd
  52. [% END %]
  53. chmod +x ${TB_STAGE_DIR}/Browser/start-tor-browser
  54. # Make sure we get the desired scrollbar behavior with Gtk3, see bug 27546.
  55. GTK_SETTINGS_DIR=${TB_STAGE_DIR}/Browser/.config/gtk-3.0
  56. mkdir -p $GTK_SETTINGS_DIR
  57. cp $rootdir/gtk3-settings.ini $GTK_SETTINGS_DIR/settings.ini
  58. [% END %]
  59. tar -C ${TB_STAGE_DIR} -xf [% c('input_files_by_name/firefox') %]/tor-browser.tar.gz
  60. # Make unpacked HTTPS Everywhere available in resource://torbutton/content/extensions/https-everywhere/ as TB expects
  61. TMP_HTTPS_EVERYWHERE_PATH=$rootdir/tmp_https_everywhere/
  62. mkdir $TMP_HTTPS_EVERYWHERE_PATH
  63. pushd $TMP_HTTPS_EVERYWHERE_PATH
  64. mkdir -p chrome/torbutton/content/extensions/https-everywhere/
  65. unzip $rootdir/[% c('input_files_by_name/https-everywhere') %] -d chrome/torbutton/content/extensions/https-everywhere/
  66. find . -exec [% c("var/touch") %] {} \;
  67. find chrome/ | sort | zip -X -@ "$TBDIR[% IF c("var/osx") %]/Contents/Resources[% END %]/omni.ja"
  68. popd
  69. rm -rf $TMP_HTTPS_EVERYWHERE_PATH
  70. tar -C "$TBDIR[% IF ! c("var/osx") %]/TorBrowser[% END %]" -xf [% c('input_files_by_name/tor') %]/tor.tar.gz
  71. [% IF c("var/namecoin") %]
  72. # Extract Electrum-NMC
  73. tar -C "$TBDIR/TorBrowser" -xf [% c('input_files_by_name/electrum-nmc') %]
  74. # Extract ncprop279
  75. mkdir "$TBDIR/TorBrowser/ncprop279"
  76. tar -C "$TBDIR/TorBrowser/ncprop279" -xf [% c('input_files_by_name/ncprop279') %]
  77. # Extract StemNS
  78. tar -C "$TBDIR/TorBrowser" -xf [% c('input_files_by_name/stemns') %]
  79. [% END %]
  80. [% IF c("var/linux");
  81. SET bundledata_osname = 'linux';
  82. ELSIF c("var/osx");
  83. SET bundledata_osname = 'mac';
  84. ELSIF c("var/windows");
  85. SET bundledata_osname = 'windows';
  86. END; %]
  87. [% IF c("var/osx") %]
  88. # The Bundle-Data is designed for embedded data, so we need to modify
  89. # the structure when we want the data to be outside the app directory.
  90. # We also create an override.ini file to disable the profile migrator.
  91. SKELETON_TMP=$rootdir/Bundle-Data/mac-skeleton-tmp
  92. SKELETON_TMP_RESOURCES=$SKELETON_TMP/Contents/Resources
  93. mkdir -p $SKELETON_TMP_RESOURCES/browser
  94. echo "[XRE]" > $SKELETON_TMP_RESOURCES/browser/override.ini
  95. echo "EnableProfileMigrator=0" >> $SKELETON_TMP_RESOURCES/browser/override.ini
  96. mkdir -p $SKELETON_TMP_RESOURCES/TorBrowser/Tor
  97. cp -p Bundle-Data/mac/TorBrowser/Data/Tor/torrc-defaults $SKELETON_TMP_RESOURCES/TorBrowser/Tor/
  98. # Place a copy of the bookmarks.html file at the top. It will be moved into
  99. # browser/omni.ja later
  100. cp -p Bundle-Data/mac/TorBrowser/Data/Browser/profile.default/bookmarks.html $rootdir
  101. rm -Rf Bundle-Data/mac
  102. mv $SKELETON_TMP Bundle-Data/mac
  103. # Install a "tor" shim that sets the working directory. See #10030.
  104. mv "$TBDIR/$TORBINPATH/tor" "$TBDIR/$TORBINPATH/tor.real"
  105. cp Bundle-Data/mac-tor.sh "$TBDIR/$TORCONFIGPATH/tor"
  106. tar -C Bundle-Data/mac-applications.dmg -c . | tar -C $TB_STAGE_DIR -x
  107. [% END %]
  108. mkdir -p "$TBDIR/$DOCSPATH"
  109. cp -a Bundle-Data/Docs/* "$TBDIR/$DOCSPATH"
  110. tar -C Bundle-Data/[% bundledata_osname %] [% IF ! c("var/namecoin") %]--exclude=*Electrum-NMC* --exclude=*ncprop279*[% END %] -c . | tar -C "$TBDIR[% IF ! c("var/osx") %]/TorBrowser[% END %]" -x
  111. cat Bundle-Data/PTConfigs/[% bundledata_osname %]/torrc-defaults-appendix >> "$TBDIR/$TORCONFIGPATH/torrc-defaults"
  112. [% IF ! c("var/snowflake") %]
  113. grep -v 'default_bridge\.snowflake' Bundle-Data/PTConfigs/bridge_prefs.js \
  114. >> "$GENERATEDPREFSPATH"
  115. [% ELSE %]
  116. cat Bundle-Data/PTConfigs/bridge_prefs.js >> "$GENERATEDPREFSPATH"
  117. [% END %]
  118. [% IF ! c("var/multi_lingual") %]
  119. echo 'pref("extensions.torlauncher.prompt_for_locale", false);' >> "$GENERATEDPREFSPATH"
  120. [% END %]
  121. [% IF c("var/linux") %]
  122. chmod 700 ${TB_STAGE_DIR}/Browser/TorBrowser/Data/Browser
  123. chmod 700 ${TB_STAGE_DIR}/Browser/TorBrowser/Data/Tor
  124. [% END %]
  125. [% IF c("var/multi_lingual") %]
  126. # If we are building a multi-lingual package, use "ALL" in the package name
  127. # and as the locale for update purposes. We do not include "ALL" in the name
  128. # of the directory that is inside the package (in other words, users will
  129. # not see tor-browser_ALL after they install Tor Browser).
  130. PKG_LOCALE="ALL"
  131. PKG_DIR="tor-browser"
  132. [% ELSE %]
  133. PKG_LOCALE="en-US"
  134. PKG_DIR="tor-browser_${PKG_LOCALE}"
  135. [% END %]
  136. pushd "$TBDIR[% IF c("var/osx") %]/Contents/Resources[% END %]/browser/"
  137. unzip omni.ja defaults/preferences/000-tor-browser.js || [ $? -lt 3 ]
  138. # Append our built extension-overrides.js to 000-tor-browser.js
  139. cat "$GENERATEDPREFSPATH" >> defaults/preferences/000-tor-browser.js
  140. cp defaults/preferences/000-tor-browser.js $rootdir
  141. [% IF c("var/osx") %]
  142. # Embed our default bookmarks within the en-US locale.
  143. mkdir -p chrome/en-US/locale/browser
  144. cp -p $rootdir/bookmarks.html chrome/en-US/locale/browser/
  145. [% c("var/touch") %] chrome/en-US/locale/browser/bookmarks.html
  146. chmod 600 chrome/en-US/locale/browser/bookmarks.html
  147. zip -Xm omni.ja chrome/en-US/locale/browser/bookmarks.html
  148. rm -rf chrome
  149. [% END %]
  150. # Set the locale of the bundle.
  151. echo "pref(\"intl.locale.requested\", \"en-US\");" >> defaults/preferences/000-tor-browser.js
  152. [% c("var/touch") %] defaults/preferences/000-tor-browser.js
  153. zip -Xm omni.ja defaults/preferences/000-tor-browser.js
  154. rm -rf defaults
  155. # create tbb_version.json file for #25020
  156. echo '{"version":"[% c("var/torbrowser_version") %]","architecture":"[% c("var/mar_osname") %]","channel":"[% c("var/channel") %]","locale":"en-US"}' > ../tbb_version.json
  157. popd
  158. [% IF c("var/osx") || c("var/multi_lingual") -%]
  159. # Prepare our language packs to embed our default bookmarks.
  160. # See bug 21879 for more details.
  161. [% SET locales = c("var/testbuild") ? [] : c("var/locales") -%]
  162. [% FOREACH lang = locales %]
  163. [% SET lang = tmpl(lang);
  164. SET xpi = '$rootdir/' _ c('input_files_by_name/firefox-langpacks') _ '/' _ lang _ '.xpi';
  165. %]
  166. [% IF c("var/osx") -%]
  167. unzip -d prep_[% lang %] [% xpi %]
  168. cp $rootdir/bookmarks.html prep_[% lang %]/browser/chrome/[% lang %]/locale/browser/
  169. rm [% xpi %]
  170. cd prep_[% lang %]
  171. [% c('zip', {
  172. zip_src => [ '.' ],
  173. zip_args => xpi,
  174. }) %]
  175. [% END -%]
  176. # If we are building a multi-lingual package, add all of the language packs.
  177. [% IF c("var/multi_lingual") %]
  178. cp [% xpi %] "$TBDIR/$EXTSPATH/langpack-[% lang %]@firefox.mozilla.org.xpi"
  179. [% END %]
  180. cd ..
  181. rm -rf prep_[% lang %]
  182. [% END %]
  183. [% END %]
  184. [% IF c("var/multi_lingual") %]
  185. # Set the update.locale (it is used to replace %LOCALE% within
  186. # app.update.url).
  187. pushd "$TBDIR[% IF c("var/osx") %]/Contents/Resources/[% END %]"
  188. echo ${PKG_LOCALE} > update.locale
  189. [% c("var/touch") %] update.locale
  190. zip -Xm omni.ja update.locale
  191. popd
  192. [% END %]
  193. [% IF c("var/windows") %]
  194. # We need to install a recent version of python-pefile so that it works
  195. # in a x86_64 container:
  196. # https://github.com/TheTorProject/tor-messenger-build/pull/10
  197. tar xf $rootdir/[% c('input_files_by_name/python-pefile') %]
  198. cd $(echo [% c('input_files_by_name/python-pefile') %] | sed s/\.tar\.gz$//)
  199. python setup.py install --user
  200. cd ..
  201. tar -C /var/tmp/dist -xf $rootdir/[% c('input_files_by_name/nsis') %]
  202. export PATH="/var/tmp/dist/nsis/bin:$PATH"
  203. tar -C $distdir -xf $rootdir/[% c('input_files_by_name/tbb-windows-installer') %]
  204. mv ${TB_STAGE_DIR} $distdir/tbb-windows-installer/"Tor Browser"
  205. mv $distdir/tbb-windows-installer ${TB_STAGE_DIR}
  206. [% END %]
  207. [% IF c("var/windows") %]
  208. TBDIR="$distdir/$PKG_DIR/Tor Browser/Browser"
  209. [% ELSIF c("var/osx") %]
  210. TBDIR="$distdir/$PKG_DIR/Tor Browser.app"
  211. [% ELSE %]
  212. TBDIR="$distdir/$PKG_DIR/Browser"
  213. [% END %]
  214. cat > "$scripts_dir/create-$PKG_DIR" << SCRIPT_EOF
  215. #!/bin/bash
  216. set -e
  217. cp -a ${TB_STAGE_DIR} $distdir/$PKG_DIR
  218. pushd "$TBDIR[% IF c("var/osx") %]/Contents/Resources/[% END %]"
  219. rm -f precomplete
  220. python $MARTOOLS/createprecomplete.py
  221. popd
  222. cd $distdir
  223. [% IF c("var/build_mar") -%]
  224. # Create full MAR file and compressed package.
  225. [% SET mar_file = 'tor-browser-' _ c("var/mar_osname") _ '-' _ c("var/torbrowser_version") _ '_${PKG_LOCALE}.mar' %]
  226. MAR=$MARTOOLS/mar \
  227. MOZ_PRODUCT_VERSION=[% c("var/torbrowser_version") %] \
  228. MAR_CHANNEL_ID=torbrowser-torproject-[% c("var/channel") %] \
  229. $MARTOOLS/make_full_update.sh -q $OUTDIR/[% mar_file %] "$TBDIR"
  230. [% END -%]
  231. [% IF c("var/linux") %]
  232. [% c('tar', {
  233. tar_src => [ '$PKG_DIR' ],
  234. tar_args => '-cJf $OUTDIR/tor-browser-' _ c("var/mar_osname") _ '-' _ c("var/torbrowser_version") _ '_${PKG_LOCALE}.tar.xz',
  235. }) %]
  236. [% ELSIF c("var/osx") %]
  237. [% c('var/ddmg', {
  238. dmg_src => '"$PKG_DIR"',
  239. dmg_out => '$OUTDIR/TorBrowser-' _ c("var/torbrowser_version") _ '-osx64_${PKG_LOCALE}.dmg',
  240. }) %]
  241. [% ELSIF c("var/windows") %]
  242. find "$PKG_DIR" -exec [% c("var/touch") %] {} \;
  243. pushd "$PKG_DIR"
  244. makensis torbrowser.nsi
  245. # Working around NSIS braindamage
  246. mv torbrowser-install.exe torbrowser-install-tmp.exe
  247. python $rootdir/pe_checksum_fix.py
  248. mv torbrowser-install-tmp2.exe torbrowser-install.exe
  249. rm torbrowser-install-tmp.exe
  250. mv torbrowser-install.exe $OUTDIR/torbrowser-install[% IF c("var/windows-x86_64") %]-win64[% END %]-[% c("var/torbrowser_version") %]_${PKG_LOCALE}.exe
  251. popd
  252. [% END %]
  253. rm -rf $distdir/${PKG_DIR}
  254. SCRIPT_EOF
  255. cp $rootdir/[% c('input_files_by_name/firefox') %]/mar-tools-*.zip "$OUTDIR"/
  256. [% IF c("var/linux-x86_64") -%]
  257. cp $rootdir/[% c('input_files_by_name/firefox') %]/tor-browser-debug.tar.xz "$OUTDIR"/tor-browser-[% c("var/mar_osname") %]-debug.tar.xz
  258. [% IF !c("var/asan") -%]
  259. cp $rootdir/[% c('input_files_by_name/firefox') %]/geckodriver-linux64.tar.xz "$OUTDIR"/
  260. [% END -%]
  261. [% END -%]
  262. [% IF c("var/linux") -%]
  263. cp $rootdir/[% c('input_files_by_name/tor') %]/tor-debug.tar.xz "$OUTDIR"/tor-[% c("var/mar_osname") %]-debug.tar.xz
  264. [% END -%]
  265. [% IF c("var/build_infos_json") -%]
  266. cp $rootdir/[% c('input_files_by_name/firefox') %]/build-infos.json "$OUTDIR"/build-infos-[% c("var/mar_osname") %].json
  267. [% END -%]
  268. # Create a tarball with all Linux x86_64 language packs (Bug 32676)
  269. [% IF c("var/linux-x86_64") && ! c("var/multi_lingual") && ! c("var/testbuild") -%]
  270. pushd $rootdir/[% c('input_files_by_name/firefox-langpacks') %]
  271. [% c('tar', {
  272. tar_src => [ '.' ],
  273. tar_args => '-cJf $OUTDIR/langpacks-tor-browser-linux64-' _ c("var/torbrowser_version") _ '.tar.xz',
  274. })
  275. %]
  276. popd
  277. [% END -%]
  278. # If we did not create a multi-lingual package above, create a package for
  279. # each locale.
  280. [% IF ! c("var/multi_lingual") %]
  281. [% SET locales = c("var/testbuild") ? [] : c("var/locales") -%]
  282. [% FOREACH lang = locales %]
  283. [% SET lang = tmpl(lang);
  284. SET xpi = '$rootdir/' _ c('input_files_by_name/firefox-langpacks') _ '/' _ lang _ '.xpi';
  285. SET tbdir = '$distdir/tor-browser_' _ lang;
  286. SET mar_file = 'tor-browser-' _ c("var/mar_osname") _ '-' _ c("var/torbrowser_version") _ '_' _ lang _ '.mar';
  287. IF c("var/osx");
  288. SET browserdir = tbdir _ '/Tor Browser.app';
  289. ELSIF c("var/windows");
  290. SET browserdir = tbdir _ '/Tor Browser/Browser';
  291. ELSE;
  292. SET browserdir = tbdir _ '/Browser';
  293. END;
  294. SET build_mar = c("var/build_mar");
  295. # On nightly we only build mar files for some locales
  296. IF c("var/nightly") && c("var/build_mar");
  297. build_mar = 0;
  298. FOREACH mar_lang = c("var/mar_locales");
  299. mar_lang = tmpl(mar_lang);
  300. IF mar_lang == lang;
  301. build_mar = 1;
  302. END;
  303. END;
  304. END;
  305. %]
  306. cat > "$scripts_dir/create-tor-browser_[% lang %]" << SCRIPT_EOF
  307. #!/bin/bash
  308. set -e
  309. cp -a ${TB_STAGE_DIR} [% tbdir %]
  310. cp [% xpi %] "[% browserdir %]/$EXTSPATH/langpack-[% lang %]@firefox.mozilla.org.xpi"
  311. pushd "[% browserdir %]/[% IF c("var/osx") %]Contents/Resources/[% END %]browser/"
  312. mkdir -p defaults/preferences
  313. cp $rootdir/000-tor-browser.js defaults/preferences/
  314. # Set the locale of the bundle.
  315. echo "pref(\"intl.locale.requested\", \"[% lang %]\");" >> defaults/preferences/000-tor-browser.js
  316. [% c("var/touch") %] defaults/preferences/000-tor-browser.js
  317. zip -Xm omni.ja defaults/preferences/000-tor-browser.js
  318. rm -rf defaults
  319. # create tbb_version.json file for #25020
  320. echo '{"version":"[% c("var/torbrowser_version") %]","architecture":"[% c("var/mar_osname") %]","channel":"[% c("var/channel") %]","locale":"[% lang %]"}' > ../tbb_version.json
  321. popd
  322. # Set the update.locale (it is used to replace %LOCALE% within
  323. # app.update.url), remove the en-US spellchecking dictionary, and
  324. # recreate precomplete file (needs to be accurate for full MAR updates).
  325. pushd "[% browserdir %]/[% IF c("var/osx") %]Contents/Resources/[% END %]"
  326. echo "[% lang %]" > update.locale
  327. [% c("var/touch") %] update.locale
  328. zip -Xm omni.ja update.locale
  329. rm -rf dictionaries
  330. rm -f precomplete
  331. python $MARTOOLS/createprecomplete.py
  332. popd
  333. cd $distdir
  334. [% IF build_mar -%]
  335. # Create full MAR file and compressed package for this locale.
  336. MAR=$MARTOOLS/mar \
  337. MOZ_PRODUCT_VERSION=[% c("var/torbrowser_version") %] \
  338. MAR_CHANNEL_ID=torbrowser-torproject-[% c("var/channel") %] \
  339. $MARTOOLS/make_full_update.sh -q $OUTDIR/[% mar_file %] "[% browserdir %]"
  340. [% END -%]
  341. [% IF c("var/linux") %]
  342. [% SET tardir = 'tor-browser_' _ lang;
  343. c('tar', {
  344. tar_src => [ tardir ],
  345. tar_args => '-cJf $OUTDIR/tor-browser-' _ c("var/mar_osname") _ '-' _ c("var/torbrowser_version") _ '_' _ lang _ '.tar.xz',
  346. }) %]
  347. [% ELSIF c("var/osx") %]
  348. [% # Rename the Japanese bundle to not confuse users
  349. IF lang == 'ja-JP-mac';
  350. SET lang = 'ja';
  351. END; -%]
  352. [% c('var/ddmg', {
  353. dmg_src => tbdir,
  354. dmg_out => '$OUTDIR/TorBrowser-' _ c("var/torbrowser_version") _ '-osx64_' _ lang _ '.dmg',
  355. }) %]
  356. [% ELSIF c("var/windows") %]
  357. find "[% tbdir %]" -exec [% c("var/touch") %] {} \;
  358. pushd "[% tbdir %]"
  359. makensis torbrowser.nsi
  360. # Working around NSIS braindamage
  361. mv torbrowser-install.exe torbrowser-install-tmp.exe
  362. python $rootdir/pe_checksum_fix.py
  363. mv torbrowser-install-tmp2.exe torbrowser-install.exe
  364. rm torbrowser-install-tmp.exe
  365. mv torbrowser-install.exe $OUTDIR/torbrowser-install[% IF c("var/windows-x86_64") %]-win64[% END %]-[% c("var/torbrowser_version") %]_[% lang %].exe
  366. popd
  367. [% END %]
  368. rm -rf [% tbdir %]
  369. SCRIPT_EOF
  370. [% END %]
  371. [% END %]
  372. chmod 775 $rootdir/run_scripts "$scripts_dir"/*
  373. $rootdir/run_scripts [% c("buildconf/num_procs") %] "$scripts_dir"