build 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. #!/bin/bash
  2. [% c("var/setarch") -%]
  3. [% c("var/set_default_env") -%]
  4. [% IF c("var/windows") -%]
  5. [% pc('gcc', 'var/setup', { compiler_tarfile => c('input_files_by_name/gcc') }) %]
  6. # We need a link to our GCC, otherwise the system cc gets used which points to
  7. # /usr/bin/gcc.
  8. ln -s gcc /var/tmp/dist/gcc/bin/cc
  9. [% END -%]
  10. [% pc(c('var/compiler'), 'var/setup', { compiler_tarfile => c('input_files_by_name/' _ c('var/compiler')) }) %]
  11. distdir=/var/tmp/dist/[% project %]
  12. mkdir -p /var/tmp/build
  13. [% IF c("var/windows") -%]
  14. mingwdir=/var/tmp/dist/mingw-w64
  15. mkdir -p $mingwdir/helpers
  16. cat > $mingwdir/helpers/[% c("arch") %]-w64-mingw32-g++ << 'EOF'
  17. #!/bin/sh
  18. /var/tmp/dist/mingw-w64/bin/[% c("arch") %]-w64-mingw32-g++ [% c("var/LDFLAGS") %] [% c("var/CFLAGS") %] "$@"
  19. EOF
  20. cat > $mingwdir/helpers/[% c("arch") %]-w64-mingw32-gcc << 'EOF'
  21. #!/bin/sh
  22. /var/tmp/dist/mingw-w64/bin/[% c("arch") %]-w64-mingw32-gcc [% c("var/LDFLAGS") %] [% c("var/CFLAGS") %] "$@"
  23. EOF
  24. cat > $mingwdir/helpers/[% c("arch") %]-w64-mingw32-ld << 'EOF'
  25. #!/bin/sh
  26. /var/tmp/dist/mingw-w64/bin/[% c("arch") %]-w64-mingw32-ld [% c("var/LDFLAGS") %] "$@"
  27. EOF
  28. chmod +x $mingwdir/helpers/*
  29. export PATH="$mingwdir/helpers:$PATH"
  30. [% END -%]
  31. [% IF c("var/windows") %]
  32. # Unpack fxc2.
  33. mkdir -p /var/tmp/dist
  34. tar -C /var/tmp/dist -xf [% c('input_files_by_name/fxc2') %]
  35. fxcdir=/var/tmp/dist/fxc2/bin
  36. cp $mingwdir/[% c("arch") %]-w64-mingw32/bin/libwinpthread-1.dll $fxcdir
  37. export PATH="$fxcdir:$PATH"
  38. # fxc2 requires Wine.
  39. [% IF c("var/windows-x86_64") %]
  40. export WINEARCH=win64
  41. [% END %]
  42. export HOME=/var/tmp/home
  43. mkdir -p $HOME
  44. WINEROOT=$HOME/.wine/drive_c
  45. wine wineboot -i
  46. [% END -%]
  47. [% IF c("var/linux") %]
  48. mkdir -p /var/tmp/dist
  49. tar -C /var/tmp/dist -xf $rootdir/[% c('input_files_by_name/binutils') %]
  50. export PATH="/var/tmp/dist/binutils/bin:$PATH"
  51. [% END -%]
  52. [% IF c("var/selfrando") -%]
  53. tar -C /var/tmp/dist -xf $rootdir/[% c('input_files_by_name/selfrando') %]
  54. # Selfrando wrapper
  55. export PATH="/var/tmp/dist/selfrando/Tools/TorBrowser/tc-wrapper/:$PATH"
  56. # We need to avoid the shuffling while building as this breaks compilation
  57. export SELFRANDO_skip_shuffle=
  58. [% END -%]
  59. mkdir -p /var/tmp/dist
  60. tar -C /var/tmp/dist -xf [% c('input_files_by_name/rust') %]
  61. export PATH="/var/tmp/dist/rust/bin:$PATH"
  62. [% IF c("var/linux") %]
  63. # Add llvm so stylo can build
  64. tar -C /var/tmp/dist -xf [% c('input_files_by_name/llvm') %]
  65. export LLVM_CONFIG="/var/tmp/dist/llvm/bin/llvm-config"
  66. [% END -%]
  67. tar -C /var/tmp/build -xf [% project %]-[% c('version') %].tar.gz
  68. [% IF c("var/osx") %]
  69. mkdir -p "$distdir/Tor Browser.app/Contents/MacOS"
  70. [% ELSE %]
  71. mkdir -p $distdir/Browser
  72. [% END %]
  73. [% IF c("var/linux") %]
  74. mkdir -p $distdir/Debug/Browser/
  75. [% END %]
  76. cd /var/tmp/build/[% project %]-[% c("version") %]
  77. mv -f $rootdir/[% c('input_files_by_name/mozconfig') %] .mozconfig
  78. [% IF c("var/asan") -%]
  79. mv -f .mozconfig-asan .mozconfig
  80. # Without disabling LSan our build is blowing up:
  81. # https://bugs.torproject.org/10599#comment:52
  82. export ASAN_OPTIONS="detect_leaks=0"
  83. [% END -%]
  84. eval $(perl $rootdir/get-moz-build-date [% c("var/copyright_year") %] $(cat browser/config/version.txt))
  85. if [ -z $MOZ_BUILD_DATE ]
  86. then
  87. echo "MOZ_BUILD_DATE is not set"
  88. exit 1
  89. fi
  90. [% IF c("var/windows") %]
  91. # FIXME
  92. # Ideally, using LDFLAGS (and e.g. DLLFLAGS for NSS) would be enough to get
  93. # all Firefox libraries linked against msvcr100. Alas, this does not hold for
  94. # NSPR. Without patching it we get a "missing entry points for _strcmpi in
  95. # msvcr100.dll". Now, this should be fixed in rev>=6179 as the def file there
  96. # contains a proper patch according to the mingw-w64 developers.
  97. # However, even with this patch the _strcmpi issue is still popping up,
  98. # probably due to a bug in our current linking setup. The small patch below
  99. # is therefore just a workaround which should get fixed but is at least
  100. # justified as the signature of _strcmpi and _stricmp is the same, see:
  101. # http://msdn.microsoft.com/en-us/library/k59z8dwe.aspx.
  102. sed 's/strcmpi/stricmp/' -i nsprpub/pr/src/linking/prlink.c
  103. export HOST_LDFLAGS=" "
  104. export LDFLAGS="-specs=/var/tmp/dist/mingw-w64/msvcr100.spec"
  105. # Our flags don't get passed to NSS. We need to do that manually using an
  106. # obscure one.
  107. export DLLFLAGS="-specs=/var/tmp/dist/mingw-w64/msvcr100.spec"
  108. # Make sure widl is not inserting random timestamps, see #21837.
  109. export WIDL_TIME_OVERRIDE="0"
  110. [% END %]
  111. [% IF c("var/osname") == "linux-i686" -%]
  112. export LDFLAGS=-m32
  113. export CFLAGS=-m32
  114. export CC='gcc -m32'
  115. [% END -%]
  116. [% IF c("var/windows") %]
  117. patch -p1 < $rootdir/nsis-uninstall.patch
  118. patch -p1 < $rootdir/1464084.patch
  119. patch -p1 < $rootdir/1467041.patch
  120. [% END -%]
  121. rm -f configure
  122. rm -f js/src/configure
  123. ./mach configure --with-tor-browser-version=[% c("var/torbrowser_version") %] --with-distribution-id=org.torproject --enable-update-channel=[% c("var/torbrowser_update_channel") %] --enable-bundled-fonts
  124. ./mach build --verbose
  125. ./mach build stage-package
  126. [% IF c("var/osx") %]
  127. cp -a obj-macos/dist/firefox/* $distdir
  128. # Remove firefox-bin (we don't use it, see ticket #10126)
  129. rm -f "$distdir/Tor Browser.app/Contents/MacOS/firefox-bin"
  130. # Adjust the Info.plist file
  131. INFO_PLIST="$distdir/Tor Browser.app/Contents/Info.plist"
  132. mv "$INFO_PLIST" tmp.plist
  133. python $rootdir/fix-info-plist.py '[% c("var/torbrowser_version") %]' '[% c("var/copyright_year") %]' < tmp.plist > "$INFO_PLIST"
  134. rm -f tmp.plist
  135. [% END %]
  136. [% IF c("var/linux") %]
  137. cp -a obj-*/dist/firefox/* $distdir/Browser/
  138. # Remove firefox-bin (we don't use it, see ticket #10126)
  139. rm -f $distdir/Browser/firefox-bin
  140. # TODO: There goes FIPS-140.. We could upload these somewhere unique and
  141. # subsequent builds could test to see if they've been uploaded before...
  142. # But let's find out if it actually matters first..
  143. rm -f $distdir/Browser/*.chk
  144. # Replace firefox by a wrapper script (#25485)
  145. mv $distdir/Browser/firefox $distdir/Browser/firefox.real
  146. mv $rootdir/start-firefox $distdir/Browser/firefox
  147. chmod 755 $distdir/Browser/firefox
  148. [% END %]
  149. [% IF c("var/windows-x86_64") -%]
  150. mv $rootdir/msvcr100-x86_64.dll $rootdir/msvcr100.dll
  151. [% END -%]
  152. [% IF c("var/windows") %]
  153. cp -a obj-*/dist/firefox/* $distdir/Browser/
  154. cp -a $rootdir/msvcr100.dll $distdir/Browser
  155. cp -a $gcclibs/libssp-0.dll $distdir/Browser
  156. cp -a $fxcdir/d3dcompiler_47.dll $distdir/Browser
  157. [% END %]
  158. # Make MAR-based update tools available for use during the bundle phase.
  159. # Note that mar and mbsdiff are standalone tools, compiled for the build
  160. # host's architecture. We also include signmar, certutil, and the libraries
  161. # they require; these utilities and libraries are built for the target
  162. # architecture.
  163. MARTOOLS=$distdir/mar-tools
  164. mkdir -p $MARTOOLS
  165. cp -p config/createprecomplete.py $MARTOOLS/
  166. cp -p tools/update-packaging/*.sh $MARTOOLS/
  167. cp -p obj-*/dist/host/bin/mar $MARTOOLS/
  168. cp -p obj-*/dist/host/bin/mbsdiff $MARTOOLS/
  169. [% IF c("var/linux") %]
  170. cp -p obj-*/modules/libmar/tool/signmar $MARTOOLS/
  171. cp -p obj-*/security/nss/cmd/certutil/certutil_certutil/certutil $MARTOOLS/
  172. cp -p obj-*/security/nss/cmd/modutil/modutil_modutil/modutil $MARTOOLS/
  173. cp -p obj-*/security/nss/cmd/pk12util/pk12util_pk12util/pk12util $MARTOOLS/
  174. cp -p obj-*/security/nss/cmd/shlibsign/shlibsign_shlibsign/shlibsign $MARTOOLS/
  175. NSS_LIBS="libfreeblpriv3.so libmozsqlite3.so libnss3.so libnssckbi.so libnssdbm3.so libnssutil3.so libsmime3.so libsoftokn3.so libssl3.so"
  176. NSPR_LIBS="libnspr4.so libplc4.so libplds4.so"
  177. for LIB in $NSS_LIBS $NSPR_LIBS; do
  178. cp -p obj-*/dist/bin/$LIB $MARTOOLS/
  179. done
  180. [% END %]
  181. [% IF c("var/osx") %]
  182. cp -p obj-*/modules/libmar/tool/signmar $MARTOOLS/
  183. cp -p obj-*/security/nss/cmd/certutil/certutil_certutil/certutil $MARTOOLS/
  184. cp -p obj-*/security/nss/cmd/modutil/modutil_modutil/modutil $MARTOOLS/
  185. cp -p obj-*/security/nss/cmd/pk12util/pk12util_pk12util/pk12util $MARTOOLS/
  186. cp -p obj-*/security/nss/cmd/shlibsign/shlibsign_shlibsign/shlibsign $MARTOOLS/
  187. NSS_LIBS="libfreebl3.dylib libmozglue.dylib libnss3.dylib libnssckbi.dylib libnssdbm3.dylib libsoftokn3.dylib"
  188. for LIB in $NSS_LIBS; do
  189. cp -p obj-*/dist/bin/$LIB $MARTOOLS/
  190. done
  191. [% END %]
  192. [% IF c("var/windows") %]
  193. cp -p obj-*/modules/libmar/tool/signmar.exe $MARTOOLS/
  194. cp -p obj-*/security/nss/cmd/certutil/certutil_certutil/certutil.exe $MARTOOLS/
  195. cp -p obj-*/security/nss/cmd/modutil/modutil_modutil/modutil.exe $MARTOOLS/
  196. cp -p obj-*/security/nss/cmd/pk12util/pk12util_pk12util/pk12util.exe $MARTOOLS/
  197. cp -p obj-*/security/nss/cmd/shlibsign/shlibsign_shlibsign/shlibsign.exe $MARTOOLS/
  198. NSS_LIBS="freebl3.dll mozglue.dll nss3.dll nssckbi.dll nssdbm3.dll softokn3.dll"
  199. for LIB in $NSS_LIBS; do
  200. cp -p obj-*/dist/bin/$LIB $MARTOOLS/
  201. done
  202. cp -a $rootdir/msvcr100.dll $MARTOOLS/
  203. [% END %]
  204. cd $distdir
  205. [% IF c("var/linux-x86_64") %]
  206. # Strip and generate debuginfo for the firefox binary that we keep, all *.so
  207. # files, the plugin-container, and the updater (see ticket #10126)
  208. for LIB in Browser/*.so Browser/firefox.real Browser/plugin-container Browser/updater
  209. do
  210. objcopy --only-keep-debug $LIB Debug/$LIB
  211. strip $LIB
  212. objcopy --add-gnu-debuglink=./Debug/$LIB $LIB
  213. [% IF c("var/selfrando") -%]
  214. # remove RUNPATH added by selfrando (see #22242)
  215. chrpath -d $LIB
  216. [% END -%]
  217. done
  218. [% END %]
  219. # Re-zipping the omni.ja files is not needed to make them reproductible,
  220. # however if we don't re-zip them, the files become corrupt when we
  221. # update them using 'zip' and firefox will silently fail to load some
  222. # parts.
  223. [% IF c("var/windows") || c("var/linux") %]
  224. [% c("var/rezip", { rezip_file => 'Browser/omni.ja' }) %]
  225. [% c("var/rezip", { rezip_file => 'Browser/browser/omni.ja' }) %]
  226. [% ELSIF c("var/osx") %]
  227. [% c("var/rezip", { rezip_file => '"Tor Browser.app/Contents/Resources/omni.ja"' }) %]
  228. [% c("var/rezip", { rezip_file => '"Tor Browser.app/Contents/Resources/browser/omni.ja"' }) %]
  229. [% END %]
  230. mkdir -p [% dest_dir _ '/' _ c('filename') %]
  231. [%
  232. IF c("var/osx");
  233. SET browserdir='"Tor Browser.app/Contents"';
  234. ELSE;
  235. SET browserdir='Browser';
  236. END;
  237. %]
  238. [% IF c("var/linux") %]
  239. /var/tmp/dist/gcc/bin/g++ $rootdir/abicheck.cc -o Browser/abicheck
  240. [% END %]
  241. [% c('tar', {
  242. tar_src => [ browserdir ],
  243. tar_args => '-czf ' _ dest_dir _ '/' _ c('filename') _ '/tor-browser.tar.gz',
  244. }) %]
  245. [% IF c("var/linux-x86_64") %]
  246. [% c('tar', {
  247. tar_src => [ 'Debug' ],
  248. tar_args => '-cJf ' _ dest_dir _ '/' _ c('filename') _ '/tor-browser-debug.tar.xz',
  249. }) %]
  250. [% END %]
  251. [% c('zip', {
  252. zip_src => [ 'mar-tools' ],
  253. zip_args => dest_dir _ '/' _ c('filename') _ '/' _ c('var/martools_filename'),
  254. }) %]