build 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. #!/bin/bash
  2. [% c("var/set_default_env") -%]
  3. [% pc(c('var/compiler'), 'var/setup', {
  4. compiler_tarfile => c('input_files_by_name/' _ c('var/compiler')),
  5. hardened_gcc => 0, # don't set hardened_gcc since firefox is setting the hardened flags
  6. }) %]
  7. distdir=/var/tmp/dist/[% project %]
  8. mkdir -p /var/tmp/build
  9. mkdir -p [% dest_dir _ '/' _ c('filename') %]
  10. [% IF c("var/windows") -%]
  11. # Setting up fxc2
  12. tar -C /var/tmp/dist -xf [% c('input_files_by_name/fxc2') %]
  13. export PATH="/var/tmp/dist/fxc2/bin:$PATH"
  14. [% END -%]
  15. tar -C /var/tmp/dist -xf [% c('input_files_by_name/rust') %]
  16. tar -C /var/tmp/dist -xf [% c('input_files_by_name/cbindgen') %]
  17. tar -C /var/tmp/dist -xf [% c('input_files_by_name/nasm') %]
  18. tar -C /var/tmp/dist -xf [% c('input_files_by_name/node') %]
  19. export PATH="/var/tmp/dist/rust/bin:/var/tmp/dist/cbindgen:/var/tmp/dist/nasm/bin:/var/tmp/dist/node/bin:$PATH"
  20. [% IF c("var/linux") -%]
  21. tar -C /var/tmp/dist -xf [% c('input_files_by_name/clang') %]
  22. tar -C /var/tmp/dist -xf [% c('input_files_by_name/python') %]
  23. export PATH="/var/tmp/dist/python/bin:$PATH"
  24. tar -C /var/tmp/dist -xf $rootdir/[% c('input_files_by_name/binutils') %]
  25. export PATH="/var/tmp/dist/binutils/bin:$PATH"
  26. # Use clang for everything on Linux now if we don't build with ASan.
  27. [% IF ! c("var/asan") -%]
  28. export PATH="/var/tmp/dist/clang/bin:$PATH"
  29. [% END -%]
  30. [% IF c("var/linux-i686") -%]
  31. # Exporting `PKG_CONFIG_PATH` in the mozconfig file is causing build
  32. # breakage in Rust code. It seems that environment variable is not passed
  33. # down properly in that case. Thus, we set it here in the build script.
  34. export PKG_CONFIG_PATH="${PKG_CONFIG_PATH}:/usr/lib/i386-linux-gnu/pkgconfig"
  35. [% END -%]
  36. [% END -%]
  37. [% IF c("var/rlbox") -%]
  38. tar -C /var/tmp/dist -xf [% c('input_files_by_name/wasi-sysroot') %]
  39. # XXX: We need the libclang_rt.builtins-wasm32.a in our clang lib directory.
  40. # Copy it over.
  41. # https://searchfox.org/mozilla-central/source/build/build-clang/build-clang.py#890,
  42. # include it directly in our clang
  43. [% IF c("var/macos") -%]
  44. rtdir=/var/tmp/dist/macosx-toolchain/clang/lib/clang/[% pc("llvm-project", "var/llvm_major") %]/lib/wasi
  45. [% ELSIF c("var/windows") -%]
  46. rtdir=/var/tmp/dist/mingw-w64-clang/lib/clang/[% pc("llvm-project", "var/llvm_major") %]/lib/wasi
  47. [% ELSE -%]
  48. rtdir=/var/tmp/dist/clang/lib/clang/[% pc("llvm-project", "var/llvm_major") %]/lib/wasi
  49. [% END -%]
  50. mkdir -p $rtdir
  51. cp /var/tmp/dist/wasi-sysroot/lib/clang/*/lib/wasi/libclang_rt.builtins-wasm32.a $rtdir
  52. export WASI_SYSROOT=/var/tmp/dist/wasi-sysroot/share/wasi-sysroot
  53. [% END -%]
  54. tar -C /var/tmp/build -xf [% project %]-[% c('version') %].tar.[% c('compress_tar') %]
  55. mkdir -p $distdir/[% IF ! c("var/macos") %]Browser[% END %]
  56. cd /var/tmp/build/[% project %]-[% c("version") %]
  57. [% IF c("var/linux-arm64") || c("var/linux-armhf") -%]
  58. patch -p1 < $rootdir/linux-arm-mozconfig.patch
  59. [% END -%]
  60. [% IF c("var/linux-arm64") -%]
  61. [% IF c("var/mullvad-browser") -%]
  62. patch -p1 < $rootdir/mozconfig-mullvad-linux-arm64.patch
  63. [% ELSE -%]
  64. patch -p1 < $rootdir/mozconfig-linux-arm64.patch
  65. [% END -%]
  66. [% END -%]
  67. [% IF c("var/linux-armhf") -%]
  68. [% IF c("var/mullvad-browser") -%]
  69. patch -p1 < $rootdir/mozconfig-mullvad-linux-armhf.patch
  70. [% ELSE -%]
  71. patch -p1 < $rootdir/mozconfig-linux-armhf.patch
  72. [% END -%]
  73. [% END -%]
  74. [% IF c("var/linux-arm64") -%]
  75. patch -p1 < $rootdir/fix-aarch64-syscall-number.patch
  76. [% END -%]
  77. cat > .mozconfig << 'MOZCONFIG_EOF'
  78. [% INCLUDE mozconfig %]
  79. MOZCONFIG_EOF
  80. [% IF c("var/asan") -%]
  81. # Without disabling LSan our build is blowing up:
  82. # https://bugs.torproject.org/10599#comment:52
  83. export ASAN_OPTIONS="detect_leaks=0"
  84. [% END -%]
  85. [% c("var/set_MOZ_BUILD_DATE") %]
  86. [% IF c("var/windows") -%]
  87. # Make sure widl is not inserting random timestamps, see #21837.
  88. export WIDL_TIME_OVERRIDE="0"
  89. patch -p1 < $rootdir/nsis-uninstall.patch
  90. # mingw-w64 does not support SEH on 32bit systems. Be explicit about that.
  91. export LDFLAGS="[% c('var/flag_noSEH') %]"
  92. [% END -%]
  93. [% IF c("var/namecoin") -%]
  94. patch -p1 < $rootdir/namecoin-etld.patch
  95. [% END -%]
  96. [% IF c("var/namecoin") -%]
  97. pushd toolkit/torbutton
  98. patch -p1 < $rootdir/namecoin-torbutton.patch
  99. popd
  100. [% END -%]
  101. [% IF c("var/override_updater_url") -%]
  102. [% IF c("var/release") || c("var/alpha") -%]
  103. cp $rootdir/marsigner.der toolkit/mozapps/update/updater/release_secondary.der
  104. [% ELSIF c("var/nightly") -%]
  105. cp $rootdir/marsigner.der toolkit/mozapps/update/updater/nightly_aurora_level3_secondary.der
  106. [% END -%]
  107. [% END -%]
  108. export MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE=system
  109. # Create .mozbuild to avoid interactive prompt in configure
  110. mkdir "$HOME/.mozbuild"
  111. [% IF c("var/has_l10n") -%]
  112. supported_locales="[% tmpl(c('var/locales').join(' ')) %]"
  113. l10ncentral="$HOME/.mozbuild/l10n-central"
  114. mkdir "$l10ncentral"
  115. for tarball in $rootdir/[% c('input_files_by_name/firefox-l10n') %]/*; do
  116. tar -C "$l10ncentral" -xf "$tarball"
  117. done
  118. tar -C "$rootdir" -xf "$rootdir/[% c('input_files_by_name/translation-base-browser') %]"
  119. pushd "$rootdir/translation-base-browser"
  120. ln -s ja ja-JP-mac
  121. for lang in $supported_locales; do
  122. # Fluent
  123. mv $lang/base-browser.ftl "$l10ncentral/$lang/browser/browser/"
  124. # Properties (they use a different directory)
  125. mv $lang/* "$l10ncentral/$lang/browser/chrome/browser/"
  126. done
  127. popd
  128. [% IF c("var/tor-browser") -%]
  129. # We will have to keep the torbutton.jar until we stop using dtds, because
  130. # if we move them to the browser locale directory, browser.xhtml is not
  131. # loaded.
  132. tar -C "$rootdir" -xf "$rootdir/[% c('input_files_by_name/translation-tor-browser') %]"
  133. transl_tor_browser="$rootdir/translation-tor-browser"
  134. torbutton_locales="toolkit/torbutton/chrome/locale/"
  135. torbutton_jar="toolkit/torbutton/jar.mn"
  136. for lang in $supported_locales; do
  137. central_lang=$lang
  138. [% IF c("var/macos") -%]
  139. if [ "$lang" == "ja-JP-mac" ]; then
  140. lang="ja"
  141. fi
  142. [% END -%]
  143. mv "$transl_tor_browser/$lang/tor-browser.ftl" "$l10ncentral/$central_lang/browser/browser/"
  144. mv "$transl_tor_browser/$lang/cryptoSafetyPrompt.properties" "$l10ncentral/$central_lang/browser/chrome/browser/"
  145. mv "$transl_tor_browser/$lang" "$torbutton_locales/"
  146. echo "% locale torbutton $lang %locale/$lang/" >> "$torbutton_jar"
  147. echo " locale/$lang (chrome/locale/$lang/*)" >> "$torbutton_jar"
  148. done
  149. [% ELSIF c("var/mullvad-browser") -%]
  150. tar -C "$rootdir" -xf "$rootdir/[% c('input_files_by_name/translation-mullvad-browser') %]"
  151. pushd "$rootdir/translation-mullvad-browser"
  152. ln -s ja ja-JP-mac
  153. for lang in $supported_locales; do
  154. cp -Lr $lang "$l10ncentral/"
  155. done
  156. popd
  157. [% END -%]
  158. [% ELSE -%]
  159. supported_locales=""
  160. [% END -%]
  161. # PyYAML tries to read files as ASCII, otherwise
  162. export LC_ALL=C.UTF-8
  163. export LANG=C.UTF-8
  164. ./mach configure \
  165. --with-distribution-id=org.torproject \
  166. --with-base-browser-version=[% c("var/torbrowser_version") %] \
  167. [% IF c("var/updater_enabled") -%]--enable-update-channel=[% c("var/channel") %][% END %] \
  168. [% IF !c("var/base-browser") -%]--with-branding=browser/branding/[% c("var/branding_directory_prefix") %]-[% c("var/channel") %][% END %] \
  169. [% IF !c("var/rlbox") -%]--without-wasm-sandboxed-libraries[% END %]
  170. ./mach build --verbose
  171. [% IF c("var/has_l10n") -%]
  172. export MOZ_CHROME_MULTILOCALE="$supported_locales"
  173. # No quotes on purpose, see https://firefox-source-docs.mozilla.org/build/buildsystem/locales.html#instructions-for-multi-locale-builds
  174. ./mach package-multi-locale --locales en-US $MOZ_CHROME_MULTILOCALE
  175. AB_CD=multi ./mach build stage-package
  176. [% ELSE -%]
  177. ./mach build stage-package
  178. [% END -%]
  179. [% IF c("var/macos") -%]
  180. cp -a obj-*/dist/[% c('var/exe_name') %]/* $distdir
  181. [% IF c("var/base-browser") -%]
  182. mv "$distdir/Firefox.app" "$distdir/[% c('var/Project_Name') %].app"
  183. [% END -%]
  184. # Remove firefox-bin (we don't use it, see ticket #10126)
  185. rm -f "$distdir/[% c('var/Project_Name') %].app/Contents/MacOS/[% c('var/exe_name') %]-bin"
  186. # Adjust the Info.plist file
  187. INFO_PLIST="$distdir/[% c('var/Project_Name') %].app/Contents/Info.plist"
  188. python3 $rootdir/fix-info-plist.py \
  189. "$INFO_PLIST" \
  190. '[% c("var/Project_Name") %]' \
  191. '[% c("var/torbrowser_version") %]' \
  192. '[% c("var/copyright_year") %]' \
  193. [% IF c("var/mullvad-browser") -%]'Mullvad, Tor Browser and Mozilla Developers'[% ELSE -%]'The Tor Project'[% END %]
  194. [% END -%]
  195. [% IF c("var/linux") -%]
  196. [% IF c("var/linux-x86_64") && !c("var/asan") -%]
  197. cp obj-*/x86_64-unknown-linux-gnu/release/geckodriver $distdir
  198. [% END -%]
  199. cp -a obj-*/dist/[% c('var/exe_name') %]/* $distdir/Browser/
  200. mkdir -p $distdir/Debug
  201. # Some include files are symlinks, so use -Lr, or the tarball will fail
  202. # silently. Also, on Linux we populate the debug symbols by stripping later.
  203. cp -Lr obj-*/dist/include $distdir/Debug/
  204. # Remove firefox-bin (we don't use it, see ticket #10126)
  205. rm -f "$distdir/Browser/[% c('var/exe_name') %]-bin"
  206. # TODO: There goes FIPS-140.. We could upload these somewhere unique and
  207. # subsequent builds could test to see if they've been uploaded before...
  208. # But let's find out if it actually matters first..
  209. rm -f $distdir/Browser/*.chk
  210. # Replace $exe_name by a wrapper script (#25485)
  211. mv "$distdir/Browser/[% c('var/exe_name') %]" "$distdir/Browser/[% c('var/exe_name') %].real"
  212. cat > "$distdir/Browser/[% c('var/exe_name') %]" << 'RBM_TB_EOF'
  213. [% INCLUDE 'start-firefox' -%]
  214. RBM_TB_EOF
  215. chmod 755 "$distdir/Browser/[% c('var/exe_name') %]"
  216. [% END -%]
  217. [% IF c("var/windows") -%]
  218. cp -a obj-*/dist/[% c('var/exe_name') %]/* $distdir/Browser/
  219. [% IF c("var/windows-i686") -%]
  220. cp -a /var/tmp/dist/fxc2/bin/d3dcompiler_47_32.dll $distdir/Browser/d3dcompiler_47.dll
  221. [% ELSE -%]
  222. cp -a /var/tmp/dist/fxc2/bin/d3dcompiler_47.dll $distdir/Browser
  223. [% END -%]
  224. mkdir -p $distdir/Debug/Browser
  225. pushd obj-*
  226. cp -Lr dist/include $distdir/Debug/
  227. find . \( -path ./dist -o -path ./_tests \) -prune -o -name '*.pdb' -exec cp -l {} $distdir/Debug/Browser/ \;
  228. popd
  229. [% END -%]
  230. [% IF c("var/updater_enabled") -%]
  231. # Make MAR-based update tools available for use during the bundle phase.
  232. # Note that mar and mbsdiff are standalone tools, compiled for the build
  233. # host's architecture. We also include signmar, certutil, and the libraries
  234. # they require; these utilities and libraries are built for the target
  235. # architecture.
  236. MARTOOLS=$distdir/mar-tools
  237. mkdir -p $MARTOOLS
  238. cp -p config/createprecomplete.py $MARTOOLS/
  239. cp -p tools/update-packaging/*.sh $MARTOOLS/
  240. cp -p obj-*/dist/host/bin/mar $MARTOOLS/
  241. cp -p obj-*/dist/host/bin/mbsdiff $MARTOOLS/
  242. [% IF c("var/linux") || c("var/macos") -%]
  243. cp -p obj-*/dist/bin/signmar $MARTOOLS/
  244. cp -p obj-*/dist/bin/certutil $MARTOOLS/
  245. cp -p obj-*/dist/bin/pk12util $MARTOOLS/
  246. [% IF c("var/linux") -%]
  247. NSS_LIBS="libfreeblpriv3.so libmozsqlite3.so libnss3.so libnssckbi.so libnssutil3.so libsmime3.so libsoftokn3.so libssl3.so"
  248. NSPR_LIBS="libnspr4.so libplc4.so libplds4.so"
  249. [% ELSE -%]
  250. NSS_LIBS="libfreebl3.dylib libmozglue.dylib libnss3.dylib libnssckbi.dylib libsoftokn3.dylib"
  251. # No NSPR_LIBS for macOS
  252. NSPR_LIBS=""
  253. [% END -%]
  254. for LIB in $NSS_LIBS $NSPR_LIBS; do
  255. cp -p obj-*/dist/bin/$LIB $MARTOOLS/
  256. done
  257. [% END -%]
  258. [% IF c("var/windows") -%]
  259. cp -p obj-*/dist/bin/signmar.exe $MARTOOLS/
  260. cp -p obj-*/dist/bin/certutil.exe $MARTOOLS/
  261. cp -p obj-*/dist/bin/pk12util.exe $MARTOOLS/
  262. NSS_LIBS="freebl3.dll mozglue.dll nss3.dll nssckbi.dll softokn3.dll"
  263. for LIB in $NSS_LIBS; do
  264. cp -p obj-*/dist/bin/$LIB $MARTOOLS/
  265. done
  266. [% END -%]
  267. [% END -%]
  268. cd $distdir
  269. [% IF c("var/linux") -%]
  270. [% IF c("var/linux-x86_64") && !c("var/asan") -%]
  271. # No need for an unstripped geckodriver
  272. strip geckodriver
  273. [% END -%]
  274. mkdir -p $distdir/Debug/Browser
  275. # Strip and generate debuginfo for the firefox binary that we keep, all *.so
  276. # files, the plugin-container, and the updater (see ticket #10126)
  277. for LIB in Browser/*.so "Browser/[% c('var/exe_name') %].real" Browser/plugin-container [% IF c("var/updater_enabled") -%]Browser/updater[% END %]
  278. do
  279. objcopy --only-keep-debug $LIB Debug/$LIB
  280. strip $LIB
  281. objcopy --add-gnu-debuglink=./Debug/$LIB $LIB
  282. done
  283. [% END -%]
  284. # Re-zipping the omni.ja files is not needed to make them reproductible,
  285. # however if we don't re-zip them, the files become corrupt when we
  286. # update them using 'zip' and firefox will silently fail to load some
  287. # parts.
  288. [% IF c("var/windows") || c("var/linux") -%]
  289. [% c("var/rezip", { rezip_file => 'Browser/omni.ja' }) %]
  290. [% c("var/rezip", { rezip_file => 'Browser/browser/omni.ja' }) %]
  291. [% ELSIF c("var/macos") -%]
  292. [% c("var/rezip", { rezip_file => '"' _ c("var/Project_Name") _ '.app/Contents/Resources/omni.ja"' }) %]
  293. [% c("var/rezip", { rezip_file => '"' _ c("var/Project_Name") _ '.app/Contents/Resources/browser/omni.ja"' }) %]
  294. [% END -%]
  295. [%
  296. IF c("var/macos");
  297. SET browserdir='"' _ c("var/Project_Name") _ '.app/Contents"';
  298. ELSE;
  299. SET browserdir='Browser';
  300. END;
  301. %]
  302. [% IF c("var/linux") -%]
  303. /var/tmp/dist/gcc/bin/g++ $rootdir/abicheck.cc -o Browser/abicheck -std=c++17
  304. [% IF !c("var/torbrowser") -%]
  305. libdest=Browser/libstdc++
  306. mkdir -p "$libdest"
  307. # FIXME: tor-browser-build#40749
  308. cp /var/tmp/dist/gcc/[% c("var/libdir") %]/libstdc++.so.* "$libdest"
  309. [% IF c("var/asan") -%]
  310. cp /var/tmp/dist/gcc/[% c("var/libdir") %]/libasan.so.* "$libdest"
  311. cp /var/tmp/dist/gcc/[% c("var/libdir") %]/libubsan.so.* "$libdest"
  312. [% END -%]
  313. [% END -%]
  314. [% END -%]
  315. [% c('tar', {
  316. tar_src => [ browserdir ],
  317. tar_args => '-caf ' _ dest_dir _ '/' _ c('filename') _ '/browser.tar.' _ c('compress_tar'),
  318. }) %]
  319. [% IF c("var/linux") -%]
  320. [% c('tar', {
  321. tar_src => [ 'Debug' ],
  322. tar_args => '-cJf ' _ dest_dir _ '/' _ c('filename') _ '/browser-debug-symbols.tar.xz',
  323. }) %]
  324. [% IF c("var/linux-x86_64") && !c("var/asan") -%]
  325. [% c('tar', {
  326. tar_src => [ 'geckodriver' ],
  327. tar_args => '-cJf ' _ dest_dir _ '/' _ c('filename') _ '/geckodriver.tar.xz',
  328. }) %]
  329. [% END -%]
  330. [% ELSIF c("var/windows") -%]
  331. [% c('zip', {
  332. zip_src => [ 'Debug' ],
  333. zip_args => dest_dir _ '/' _ c('filename') _ '/browser-debug-symbols.zip',
  334. }) %]
  335. [% END -%]
  336. [% IF c("var/updater_enabled") -%]
  337. [% c('zip', {
  338. zip_src => [ 'mar-tools' ],
  339. zip_args => dest_dir _ '/' _ c('filename') _ '/' _ 'mar-tools-' _ c("var/osname") _ '-' _ c("var/torbrowser_version") _ '.zip',
  340. }) %]
  341. [% END -%]
  342. [% IF c("var/build_infos_json") -%]
  343. cat > "[% dest_dir _ '/' _ c('filename') _ '/build-infos.json' %]" << EOF_BUILDINFOS
  344. {
  345. "firefox_platform_version" : "[% c("var/firefox_platform_version") %]",
  346. "firefox_buildid" : "$MOZ_BUILD_DATE"
  347. }
  348. EOF_BUILDINFOS
  349. [% END -%]