1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*6777b538SAndroid Build Coastguard Worker 3*6777b538SAndroid Build Coastguard Worker# Copyright 2017 The Chromium Authors 4*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 5*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Workerimport argparse 8*6777b538SAndroid Build Coastguard Workerimport os 9*6777b538SAndroid Build Coastguard Workerimport os.path 10*6777b538SAndroid Build Coastguard Workerimport shutil 11*6777b538SAndroid Build Coastguard Workerimport subprocess 12*6777b538SAndroid Build Coastguard Workerimport sys 13*6777b538SAndroid Build Coastguard Workerimport stat 14*6777b538SAndroid Build Coastguard Workerimport tempfile 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker# How to patch libxml2 in Chromium: 17*6777b538SAndroid Build Coastguard Worker# 18*6777b538SAndroid Build Coastguard Worker# 1. Write a .patch file and add it to third_party/libxml/chromium. 19*6777b538SAndroid Build Coastguard Worker# 2. Apply the patch in src: patch -p1 <../chromium/foo.patch 20*6777b538SAndroid Build Coastguard Worker# 3. Add the patch to the list of patches in this file. 21*6777b538SAndroid Build Coastguard Worker# 4. Update README.chromium with the provenance of the patch. 22*6777b538SAndroid Build Coastguard Worker# 5. Upload a change with the modified documentation, roll script, 23*6777b538SAndroid Build Coastguard Worker# patch, applied patch and any other relevant changes like 24*6777b538SAndroid Build Coastguard Worker# regression tests. Go through the usual review and commit process. 25*6777b538SAndroid Build Coastguard Worker# 26*6777b538SAndroid Build Coastguard Worker# How to roll libxml2 in Chromium: 27*6777b538SAndroid Build Coastguard Worker# 28*6777b538SAndroid Build Coastguard Worker# Prerequisites: 29*6777b538SAndroid Build Coastguard Worker# 30*6777b538SAndroid Build Coastguard Worker# 1. Check out Chromium somewhere on Linux, Mac and Windows. 31*6777b538SAndroid Build Coastguard Worker# 2. On Linux: 32*6777b538SAndroid Build Coastguard Worker# a. sudo apt-get install libicu-dev 33*6777b538SAndroid Build Coastguard Worker# b. git clone https://github.com/GNOME/libxml2.git somewhere 34*6777b538SAndroid Build Coastguard Worker# 3. On Mac, install these packages with brew: 35*6777b538SAndroid Build Coastguard Worker# autoconf automake libtool pkgconfig icu4c 36*6777b538SAndroid Build Coastguard Worker# 37*6777b538SAndroid Build Coastguard Worker# Procedure: 38*6777b538SAndroid Build Coastguard Worker# 39*6777b538SAndroid Build Coastguard Worker# Warning: This process is destructive. Run it on a clean branch. 40*6777b538SAndroid Build Coastguard Worker# 41*6777b538SAndroid Build Coastguard Worker# 1. On Linux, in the libxml2 repo directory: 42*6777b538SAndroid Build Coastguard Worker# a. git remote update origin 43*6777b538SAndroid Build Coastguard Worker# b. git checkout origin/master 44*6777b538SAndroid Build Coastguard Worker# 45*6777b538SAndroid Build Coastguard Worker# This will be the upstream version of libxml you are rolling to. 46*6777b538SAndroid Build Coastguard Worker# 47*6777b538SAndroid Build Coastguard Worker# 2. On Linux, in the Chromium src director: 48*6777b538SAndroid Build Coastguard Worker# a. third_party/libxml/chromium/roll.py --linux /path/to/libxml2 49*6777b538SAndroid Build Coastguard Worker# 50*6777b538SAndroid Build Coastguard Worker# If this fails, it may be a patch no longer applies. Reset to 51*6777b538SAndroid Build Coastguard Worker# head; modify the patch files, this script, and 52*6777b538SAndroid Build Coastguard Worker# README.chromium; then commit the result and run it again. 53*6777b538SAndroid Build Coastguard Worker# 54*6777b538SAndroid Build Coastguard Worker# b. Upload a CL, but do not Start Review. 55*6777b538SAndroid Build Coastguard Worker# 56*6777b538SAndroid Build Coastguard Worker# 2. On Windows, in the Chromium src directory: 57*6777b538SAndroid Build Coastguard Worker# a. git cl patch <Gerrit Issue ID> 58*6777b538SAndroid Build Coastguard Worker# b. third_party\libxml\chromium\roll.py --win32 59*6777b538SAndroid Build Coastguard Worker# c. git cl upload 60*6777b538SAndroid Build Coastguard Worker# 61*6777b538SAndroid Build Coastguard Worker# 3. On Mac, in the Chromium src directory: 62*6777b538SAndroid Build Coastguard Worker# a. git cl patch <Gerrit Issue ID> 63*6777b538SAndroid Build Coastguard Worker# b. third_party/libxml/chromium/roll.py --mac --icu4c_path=~/homebrew/opt/icu4c 64*6777b538SAndroid Build Coastguard Worker# c. Make and commit any final changes to README.chromium, BUILD.gn, etc. 65*6777b538SAndroid Build Coastguard Worker# d. git cl upload 66*6777b538SAndroid Build Coastguard Worker# e. Complete the review as usual 67*6777b538SAndroid Build Coastguard Worker# 68*6777b538SAndroid Build Coastguard Worker# The --linuxfast argument is an alternative to --linux which also deletes 69*6777b538SAndroid Build Coastguard Worker# files which are not intended to be checked in. This would normally happen at 70*6777b538SAndroid Build Coastguard Worker# the end of the --mac run, but if you want to run the roll script and get to 71*6777b538SAndroid Build Coastguard Worker# the final state without running the configure scripts on all three platforms, 72*6777b538SAndroid Build Coastguard Worker# this is helpful. 73*6777b538SAndroid Build Coastguard Worker 74*6777b538SAndroid Build Coastguard WorkerPATCHES = [ 75*6777b538SAndroid Build Coastguard Worker 'undo-sax-deprecation.patch', 76*6777b538SAndroid Build Coastguard Worker 'remove-getentropy.patch', 77*6777b538SAndroid Build Coastguard Worker] 78*6777b538SAndroid Build Coastguard Worker 79*6777b538SAndroid Build Coastguard Worker 80*6777b538SAndroid Build Coastguard Worker# See libxml2 configure.ac and win32/configure.js to learn what 81*6777b538SAndroid Build Coastguard Worker# options are available. We include every option here to more easily track 82*6777b538SAndroid Build Coastguard Worker# changes from one version to the next, and to be sure we only include what 83*6777b538SAndroid Build Coastguard Worker# we need. 84*6777b538SAndroid Build Coastguard Worker# These two sets of options should be in sync. You can check the 85*6777b538SAndroid Build Coastguard Worker# generated #defines in (win32|mac|linux)/include/libxml/xmlversion.h to confirm 86*6777b538SAndroid Build Coastguard Worker# this. 87*6777b538SAndroid Build Coastguard Worker# We would like to disable python but it introduces a host of build errors 88*6777b538SAndroid Build Coastguard WorkerSHARED_XML_CONFIGURE_OPTIONS = [ 89*6777b538SAndroid Build Coastguard Worker # These options are turned ON 90*6777b538SAndroid Build Coastguard Worker ('--with-html', 'html=yes'), 91*6777b538SAndroid Build Coastguard Worker ('--with-icu', 'icu=yes'), 92*6777b538SAndroid Build Coastguard Worker ('--with-output', 'output=yes'), 93*6777b538SAndroid Build Coastguard Worker ('--with-push', 'push=yes'), 94*6777b538SAndroid Build Coastguard Worker ('--with-python', 'python=yes'), 95*6777b538SAndroid Build Coastguard Worker ('--with-reader', 'reader=yes'), 96*6777b538SAndroid Build Coastguard Worker ('--with-sax1', 'sax1=yes'), 97*6777b538SAndroid Build Coastguard Worker ('--with-threads', 'threads=yes'), 98*6777b538SAndroid Build Coastguard Worker ('--with-tree', 'tree=yes'), 99*6777b538SAndroid Build Coastguard Worker ('--with-writer', 'writer=yes'), 100*6777b538SAndroid Build Coastguard Worker ('--with-xpath', 'xpath=yes'), 101*6777b538SAndroid Build Coastguard Worker # These options are turned OFF 102*6777b538SAndroid Build Coastguard Worker ('--without-c14n', 'c14n=no'), 103*6777b538SAndroid Build Coastguard Worker ('--without-catalog', 'catalog=no'), 104*6777b538SAndroid Build Coastguard Worker ('--without-debug', 'xml_debug=no'), 105*6777b538SAndroid Build Coastguard Worker ('--without-ftp', 'ftp=no'), 106*6777b538SAndroid Build Coastguard Worker ('--without-http', 'http=no'), 107*6777b538SAndroid Build Coastguard Worker ('--without-iconv', 'iconv=no'), 108*6777b538SAndroid Build Coastguard Worker ('--without-iso8859x', 'iso8859x=no'), 109*6777b538SAndroid Build Coastguard Worker ('--without-legacy', 'legacy=no'), 110*6777b538SAndroid Build Coastguard Worker ('--without-lzma', 'lzma=no'), 111*6777b538SAndroid Build Coastguard Worker ('--without-mem-debug', 'mem_debug=no'), 112*6777b538SAndroid Build Coastguard Worker ('--without-modules', 'modules=no'), 113*6777b538SAndroid Build Coastguard Worker ('--without-pattern', 'pattern=no'), 114*6777b538SAndroid Build Coastguard Worker ('--without-regexps', 'regexps=no'), 115*6777b538SAndroid Build Coastguard Worker ('--without-schemas', 'schemas=no'), 116*6777b538SAndroid Build Coastguard Worker ('--without-schematron', 'schematron=no'), 117*6777b538SAndroid Build Coastguard Worker ('--without-valid', 'valid=no'), 118*6777b538SAndroid Build Coastguard Worker ('--without-xinclude', 'xinclude=no'), 119*6777b538SAndroid Build Coastguard Worker ('--without-xptr', 'xptr=no'), 120*6777b538SAndroid Build Coastguard Worker ('--without-xptr-locs', 'xptr_locs=no'), 121*6777b538SAndroid Build Coastguard Worker ('--without-zlib', 'zlib=no'), 122*6777b538SAndroid Build Coastguard Worker] 123*6777b538SAndroid Build Coastguard Worker 124*6777b538SAndroid Build Coastguard Worker 125*6777b538SAndroid Build Coastguard Worker# These options are only available in configure.ac for Linux and Mac. 126*6777b538SAndroid Build Coastguard WorkerEXTRA_NIX_XML_CONFIGURE_OPTIONS = [ 127*6777b538SAndroid Build Coastguard Worker '--without-fexceptions', 128*6777b538SAndroid Build Coastguard Worker '--without-minimum', 129*6777b538SAndroid Build Coastguard Worker '--without-readline', 130*6777b538SAndroid Build Coastguard Worker '--without-history', 131*6777b538SAndroid Build Coastguard Worker '--without-tls', 132*6777b538SAndroid Build Coastguard Worker] 133*6777b538SAndroid Build Coastguard Worker 134*6777b538SAndroid Build Coastguard Worker 135*6777b538SAndroid Build Coastguard Worker# These options are only available in win32/configure.js for Windows. 136*6777b538SAndroid Build Coastguard WorkerEXTRA_WIN32_XML_CONFIGURE_OPTIONS = [ 137*6777b538SAndroid Build Coastguard Worker 'walker=no', 138*6777b538SAndroid Build Coastguard Worker] 139*6777b538SAndroid Build Coastguard Worker 140*6777b538SAndroid Build Coastguard Worker 141*6777b538SAndroid Build Coastguard WorkerXML_CONFIGURE_OPTIONS = ( 142*6777b538SAndroid Build Coastguard Worker [option[0] for option in SHARED_XML_CONFIGURE_OPTIONS] + 143*6777b538SAndroid Build Coastguard Worker EXTRA_NIX_XML_CONFIGURE_OPTIONS) 144*6777b538SAndroid Build Coastguard Worker 145*6777b538SAndroid Build Coastguard Worker 146*6777b538SAndroid Build Coastguard WorkerXML_WIN32_CONFIGURE_OPTIONS = ( 147*6777b538SAndroid Build Coastguard Worker [option[1] for option in SHARED_XML_CONFIGURE_OPTIONS] + 148*6777b538SAndroid Build Coastguard Worker EXTRA_WIN32_XML_CONFIGURE_OPTIONS) 149*6777b538SAndroid Build Coastguard Worker 150*6777b538SAndroid Build Coastguard Worker 151*6777b538SAndroid Build Coastguard WorkerFILES_TO_REMOVE = [ 152*6777b538SAndroid Build Coastguard Worker 'src/DOCBparser.c', 153*6777b538SAndroid Build Coastguard Worker 'src/HACKING', 154*6777b538SAndroid Build Coastguard Worker 'src/INSTALL', 155*6777b538SAndroid Build Coastguard Worker 'src/INSTALL.libxml2', 156*6777b538SAndroid Build Coastguard Worker 'src/MAINTAINERS', 157*6777b538SAndroid Build Coastguard Worker 'src/Makefile.in', 158*6777b538SAndroid Build Coastguard Worker 'src/Makefile.win', 159*6777b538SAndroid Build Coastguard Worker 'src/README.cvs-commits', 160*6777b538SAndroid Build Coastguard Worker # This is unneeded "legacy" SAX API, even though we enable SAX1. 161*6777b538SAndroid Build Coastguard Worker 'src/SAX.c', 162*6777b538SAndroid Build Coastguard Worker 'src/VxWorks', 163*6777b538SAndroid Build Coastguard Worker 'src/aclocal.m4', 164*6777b538SAndroid Build Coastguard Worker 'src/autogen.sh', 165*6777b538SAndroid Build Coastguard Worker 'src/autom4te.cache', 166*6777b538SAndroid Build Coastguard Worker 'src/bakefile', 167*6777b538SAndroid Build Coastguard Worker 'src/build_glob.py', 168*6777b538SAndroid Build Coastguard Worker 'src/CMakeLists.txt', 169*6777b538SAndroid Build Coastguard Worker 'src/c14n.c', 170*6777b538SAndroid Build Coastguard Worker 'src/catalog.c', 171*6777b538SAndroid Build Coastguard Worker 'src/compile', 172*6777b538SAndroid Build Coastguard Worker 'src/config.guess', 173*6777b538SAndroid Build Coastguard Worker 'src/config.sub', 174*6777b538SAndroid Build Coastguard Worker 'src/configure', 175*6777b538SAndroid Build Coastguard Worker 'src/chvalid.def', 176*6777b538SAndroid Build Coastguard Worker 'src/debugXML.c', 177*6777b538SAndroid Build Coastguard Worker 'src/depcomp', 178*6777b538SAndroid Build Coastguard Worker 'src/doc', 179*6777b538SAndroid Build Coastguard Worker 'src/example', 180*6777b538SAndroid Build Coastguard Worker 'src/fuzz', 181*6777b538SAndroid Build Coastguard Worker 'src/genChRanges.py', 182*6777b538SAndroid Build Coastguard Worker 'src/global.data', 183*6777b538SAndroid Build Coastguard Worker 'src/include/libxml/Makefile.in', 184*6777b538SAndroid Build Coastguard Worker 'src/include/libxml/xmlversion.h', 185*6777b538SAndroid Build Coastguard Worker 'src/include/libxml/xmlwin32version.h', 186*6777b538SAndroid Build Coastguard Worker 'src/include/libxml/xmlwin32version.h.in', 187*6777b538SAndroid Build Coastguard Worker 'src/include/Makefile.in', 188*6777b538SAndroid Build Coastguard Worker 'src/install-sh', 189*6777b538SAndroid Build Coastguard Worker 'src/legacy.c', 190*6777b538SAndroid Build Coastguard Worker 'src/libxml2.doap', 191*6777b538SAndroid Build Coastguard Worker 'src/libxml2.syms', 192*6777b538SAndroid Build Coastguard Worker 'src/ltmain.sh', 193*6777b538SAndroid Build Coastguard Worker 'src/m4', 194*6777b538SAndroid Build Coastguard Worker 'src/macos/libxml2.mcp.xml.sit.hqx', 195*6777b538SAndroid Build Coastguard Worker 'src/missing', 196*6777b538SAndroid Build Coastguard Worker 'src/optim', 197*6777b538SAndroid Build Coastguard Worker 'src/os400', 198*6777b538SAndroid Build Coastguard Worker 'src/python', 199*6777b538SAndroid Build Coastguard Worker 'src/relaxng.c', 200*6777b538SAndroid Build Coastguard Worker 'src/result', 201*6777b538SAndroid Build Coastguard Worker 'src/rngparser.c', 202*6777b538SAndroid Build Coastguard Worker 'src/schematron.c', 203*6777b538SAndroid Build Coastguard Worker 'src/test', 204*6777b538SAndroid Build Coastguard Worker 'src/testOOM.c', 205*6777b538SAndroid Build Coastguard Worker 'src/testOOMlib.c', 206*6777b538SAndroid Build Coastguard Worker 'src/testOOMlib.h', 207*6777b538SAndroid Build Coastguard Worker 'src/vms', 208*6777b538SAndroid Build Coastguard Worker 'src/win32/VC10/config.h', 209*6777b538SAndroid Build Coastguard Worker 'src/win32/configure.js', 210*6777b538SAndroid Build Coastguard Worker 'src/win32/wince', 211*6777b538SAndroid Build Coastguard Worker 'src/xinclude.c', 212*6777b538SAndroid Build Coastguard Worker 'src/xlink.c', 213*6777b538SAndroid Build Coastguard Worker 'src/xml2-config.in', 214*6777b538SAndroid Build Coastguard Worker 'src/xmlcatalog.c', 215*6777b538SAndroid Build Coastguard Worker 'src/xmllint.c', 216*6777b538SAndroid Build Coastguard Worker 'src/xmlmodule.c', 217*6777b538SAndroid Build Coastguard Worker 'src/xmlregexp.c', 218*6777b538SAndroid Build Coastguard Worker 'src/xmlschemas.c', 219*6777b538SAndroid Build Coastguard Worker 'src/xmlschemastypes.c', 220*6777b538SAndroid Build Coastguard Worker 'src/xpointer.c', 221*6777b538SAndroid Build Coastguard Worker 'src/xstc', 222*6777b538SAndroid Build Coastguard Worker 'src/xzlib.c', 223*6777b538SAndroid Build Coastguard Worker 'linux/.deps', 224*6777b538SAndroid Build Coastguard Worker 'linux/doc', 225*6777b538SAndroid Build Coastguard Worker 'linux/example', 226*6777b538SAndroid Build Coastguard Worker 'linux/fuzz', 227*6777b538SAndroid Build Coastguard Worker 'linux/include/private', 228*6777b538SAndroid Build Coastguard Worker 'linux/python', 229*6777b538SAndroid Build Coastguard Worker 'linux/xstc', 230*6777b538SAndroid Build Coastguard Worker] 231*6777b538SAndroid Build Coastguard Worker 232*6777b538SAndroid Build Coastguard Worker 233*6777b538SAndroid Build Coastguard WorkerTHIRD_PARTY_LIBXML_SRC = 'third_party/libxml/src' 234*6777b538SAndroid Build Coastguard Worker 235*6777b538SAndroid Build Coastguard Worker 236*6777b538SAndroid Build Coastguard Workerclass WorkingDir(object): 237*6777b538SAndroid Build Coastguard Worker """"Changes the working directory and resets it on exit.""" 238*6777b538SAndroid Build Coastguard Worker def __init__(self, path): 239*6777b538SAndroid Build Coastguard Worker self.prev_path = os.getcwd() 240*6777b538SAndroid Build Coastguard Worker self.path = path 241*6777b538SAndroid Build Coastguard Worker 242*6777b538SAndroid Build Coastguard Worker def __enter__(self): 243*6777b538SAndroid Build Coastguard Worker os.chdir(self.path) 244*6777b538SAndroid Build Coastguard Worker 245*6777b538SAndroid Build Coastguard Worker def __exit__(self, exc_type, exc_value, traceback): 246*6777b538SAndroid Build Coastguard Worker if exc_value: 247*6777b538SAndroid Build Coastguard Worker print('was in %s; %s before that' % (self.path, self.prev_path)) 248*6777b538SAndroid Build Coastguard Worker os.chdir(self.prev_path) 249*6777b538SAndroid Build Coastguard Worker 250*6777b538SAndroid Build Coastguard Worker 251*6777b538SAndroid Build Coastguard Workerdef git(*args): 252*6777b538SAndroid Build Coastguard Worker """Runs a git subcommand. 253*6777b538SAndroid Build Coastguard Worker 254*6777b538SAndroid Build Coastguard Worker On Windows this uses the shell because there's a git wrapper 255*6777b538SAndroid Build Coastguard Worker batch file in depot_tools. 256*6777b538SAndroid Build Coastguard Worker 257*6777b538SAndroid Build Coastguard Worker Arguments: 258*6777b538SAndroid Build Coastguard Worker args: The arguments to pass to git. 259*6777b538SAndroid Build Coastguard Worker """ 260*6777b538SAndroid Build Coastguard Worker command = ['git'] + list(args) 261*6777b538SAndroid Build Coastguard Worker subprocess.check_call(command, shell=(os.name == 'nt')) 262*6777b538SAndroid Build Coastguard Worker 263*6777b538SAndroid Build Coastguard Worker 264*6777b538SAndroid Build Coastguard Workerdef remove_tracked_and_local_dir(path): 265*6777b538SAndroid Build Coastguard Worker """Removes the contents of a directory from git, and the filesystem. 266*6777b538SAndroid Build Coastguard Worker 267*6777b538SAndroid Build Coastguard Worker Arguments: 268*6777b538SAndroid Build Coastguard Worker path: The path to remove. 269*6777b538SAndroid Build Coastguard Worker """ 270*6777b538SAndroid Build Coastguard Worker remove_tracked_files([path]) 271*6777b538SAndroid Build Coastguard Worker shutil.rmtree(path, ignore_errors=True) 272*6777b538SAndroid Build Coastguard Worker os.mkdir(path) 273*6777b538SAndroid Build Coastguard Worker 274*6777b538SAndroid Build Coastguard Worker 275*6777b538SAndroid Build Coastguard Workerdef remove_tracked_files(files_to_remove): 276*6777b538SAndroid Build Coastguard Worker """Removes tracked files from git. 277*6777b538SAndroid Build Coastguard Worker 278*6777b538SAndroid Build Coastguard Worker Arguments: 279*6777b538SAndroid Build Coastguard Worker files_to_remove: The files to remove. 280*6777b538SAndroid Build Coastguard Worker """ 281*6777b538SAndroid Build Coastguard Worker files_to_remove = [f for f in files_to_remove if os.path.exists(f)] 282*6777b538SAndroid Build Coastguard Worker if files_to_remove: 283*6777b538SAndroid Build Coastguard Worker git('rm', '-rf', '--ignore-unmatch', *files_to_remove) 284*6777b538SAndroid Build Coastguard Worker 285*6777b538SAndroid Build Coastguard Worker 286*6777b538SAndroid Build Coastguard Workerdef sed_in_place(input_filename, program): 287*6777b538SAndroid Build Coastguard Worker """Replaces text in a file. 288*6777b538SAndroid Build Coastguard Worker 289*6777b538SAndroid Build Coastguard Worker Arguments: 290*6777b538SAndroid Build Coastguard Worker input_filename: The file to edit. 291*6777b538SAndroid Build Coastguard Worker program: The sed program to perform edits on the file. 292*6777b538SAndroid Build Coastguard Worker """ 293*6777b538SAndroid Build Coastguard Worker # OS X's sed requires -e 294*6777b538SAndroid Build Coastguard Worker subprocess.check_call(['sed', '-i', '-e', program, input_filename]) 295*6777b538SAndroid Build Coastguard Worker 296*6777b538SAndroid Build Coastguard Worker 297*6777b538SAndroid Build Coastguard Workerdef check_copying(full_path_to_third_party_libxml_src): 298*6777b538SAndroid Build Coastguard Worker path = os.path.join(full_path_to_third_party_libxml_src, 'COPYING') 299*6777b538SAndroid Build Coastguard Worker if not os.path.exists(path): 300*6777b538SAndroid Build Coastguard Worker return 301*6777b538SAndroid Build Coastguard Worker with open(path) as f: 302*6777b538SAndroid Build Coastguard Worker s = f.read() 303*6777b538SAndroid Build Coastguard Worker if 'GNU' in s: 304*6777b538SAndroid Build Coastguard Worker raise Exception('check COPYING') 305*6777b538SAndroid Build Coastguard Worker 306*6777b538SAndroid Build Coastguard Worker 307*6777b538SAndroid Build Coastguard Workerdef prepare_libxml_distribution(src_path, libxml2_repo_path, temp_dir): 308*6777b538SAndroid Build Coastguard Worker """Makes a libxml2 distribution. 309*6777b538SAndroid Build Coastguard Worker 310*6777b538SAndroid Build Coastguard Worker Args: 311*6777b538SAndroid Build Coastguard Worker src_path: The path to the Chromium checkout. 312*6777b538SAndroid Build Coastguard Worker libxml2_repo_path: The path to the local clone of the libxml2 repo. 313*6777b538SAndroid Build Coastguard Worker temp_dir: A temporary directory to stage the distribution to. 314*6777b538SAndroid Build Coastguard Worker 315*6777b538SAndroid Build Coastguard Worker Returns: A tuple of commit hash and full path to the archive. 316*6777b538SAndroid Build Coastguard Worker """ 317*6777b538SAndroid Build Coastguard Worker # If it was necessary to push from a distribution prepared upstream, 318*6777b538SAndroid Build Coastguard Worker # this is the point to inject it: Return the version string and the 319*6777b538SAndroid Build Coastguard Worker # distribution tar file. 320*6777b538SAndroid Build Coastguard Worker 321*6777b538SAndroid Build Coastguard Worker # The libxml2 repo we're pulling changes from should not have 322*6777b538SAndroid Build Coastguard Worker # local changes. This *should* be a commit that's publicly visible 323*6777b538SAndroid Build Coastguard Worker # in the upstream repo; reviewers should check this. 324*6777b538SAndroid Build Coastguard Worker check_clean(libxml2_repo_path) 325*6777b538SAndroid Build Coastguard Worker 326*6777b538SAndroid Build Coastguard Worker temp_config_path = os.path.join(temp_dir, 'config') 327*6777b538SAndroid Build Coastguard Worker os.mkdir(temp_config_path) 328*6777b538SAndroid Build Coastguard Worker temp_src_path = os.path.join(temp_dir, 'src') 329*6777b538SAndroid Build Coastguard Worker os.mkdir(temp_src_path) 330*6777b538SAndroid Build Coastguard Worker 331*6777b538SAndroid Build Coastguard Worker with WorkingDir(libxml2_repo_path): 332*6777b538SAndroid Build Coastguard Worker commit = subprocess.check_output( 333*6777b538SAndroid Build Coastguard Worker ['git', 'log', '-n', '1', '--pretty=format:%H', 334*6777b538SAndroid Build Coastguard Worker 'HEAD']).decode('ascii') 335*6777b538SAndroid Build Coastguard Worker subprocess.check_call( 336*6777b538SAndroid Build Coastguard Worker 'git archive HEAD | tar -x -C "%s"' % temp_src_path, 337*6777b538SAndroid Build Coastguard Worker shell=True) 338*6777b538SAndroid Build Coastguard Worker with WorkingDir(temp_src_path): 339*6777b538SAndroid Build Coastguard Worker os.remove('.gitignore') 340*6777b538SAndroid Build Coastguard Worker for patch in PATCHES: 341*6777b538SAndroid Build Coastguard Worker print('applying %s' % patch) 342*6777b538SAndroid Build Coastguard Worker subprocess.check_call( 343*6777b538SAndroid Build Coastguard Worker 'patch -p1 --fuzz=0 < %s' % os.path.join( 344*6777b538SAndroid Build Coastguard Worker src_path, THIRD_PARTY_LIBXML_SRC, '..', 'chromium', patch), 345*6777b538SAndroid Build Coastguard Worker shell=True) 346*6777b538SAndroid Build Coastguard Worker 347*6777b538SAndroid Build Coastguard Worker with WorkingDir(temp_config_path): 348*6777b538SAndroid Build Coastguard Worker print('../src/autogen.sh %s' % XML_CONFIGURE_OPTIONS) 349*6777b538SAndroid Build Coastguard Worker subprocess.check_call(['../src/autogen.sh'] + XML_CONFIGURE_OPTIONS) 350*6777b538SAndroid Build Coastguard Worker subprocess.check_call(['make', 'dist-all']) 351*6777b538SAndroid Build Coastguard Worker 352*6777b538SAndroid Build Coastguard Worker # Work out what it is called 353*6777b538SAndroid Build Coastguard Worker tar_file = subprocess.check_output( 354*6777b538SAndroid Build Coastguard Worker '''awk '/PACKAGE =/ {p=$3} /VERSION =/ {v=$3} ''' 355*6777b538SAndroid Build Coastguard Worker '''END {printf("%s-%s.tar.xz", p, v)}' Makefile''', 356*6777b538SAndroid Build Coastguard Worker shell=True).decode('ascii') 357*6777b538SAndroid Build Coastguard Worker return commit, os.path.abspath(tar_file) 358*6777b538SAndroid Build Coastguard Worker 359*6777b538SAndroid Build Coastguard Worker 360*6777b538SAndroid Build Coastguard Workerdef roll_libxml_linux(src_path, libxml2_repo_path, fast): 361*6777b538SAndroid Build Coastguard Worker with WorkingDir(src_path): 362*6777b538SAndroid Build Coastguard Worker # Export the upstream git repo. 363*6777b538SAndroid Build Coastguard Worker try: 364*6777b538SAndroid Build Coastguard Worker temp_dir = tempfile.mkdtemp() 365*6777b538SAndroid Build Coastguard Worker print('temporary directory: %s' % temp_dir) 366*6777b538SAndroid Build Coastguard Worker 367*6777b538SAndroid Build Coastguard Worker commit, tar_file = prepare_libxml_distribution( 368*6777b538SAndroid Build Coastguard Worker src_path, libxml2_repo_path, temp_dir) 369*6777b538SAndroid Build Coastguard Worker 370*6777b538SAndroid Build Coastguard Worker # Remove all of the old libxml to ensure only desired cruft 371*6777b538SAndroid Build Coastguard Worker # accumulates 372*6777b538SAndroid Build Coastguard Worker remove_tracked_and_local_dir(THIRD_PARTY_LIBXML_SRC) 373*6777b538SAndroid Build Coastguard Worker 374*6777b538SAndroid Build Coastguard Worker # Update the libxml repo and export it to the Chromium tree 375*6777b538SAndroid Build Coastguard Worker with WorkingDir(THIRD_PARTY_LIBXML_SRC): 376*6777b538SAndroid Build Coastguard Worker subprocess.check_call( 377*6777b538SAndroid Build Coastguard Worker 'tar xJf %s --strip-components=1' % tar_file, 378*6777b538SAndroid Build Coastguard Worker shell=True) 379*6777b538SAndroid Build Coastguard Worker finally: 380*6777b538SAndroid Build Coastguard Worker shutil.rmtree(temp_dir) 381*6777b538SAndroid Build Coastguard Worker 382*6777b538SAndroid Build Coastguard Worker with WorkingDir(THIRD_PARTY_LIBXML_SRC): 383*6777b538SAndroid Build Coastguard Worker # Put the version number is the README file 384*6777b538SAndroid Build Coastguard Worker sed_in_place('../README.chromium', 385*6777b538SAndroid Build Coastguard Worker 's/Version: .*$/Version: %s/' % commit) 386*6777b538SAndroid Build Coastguard Worker 387*6777b538SAndroid Build Coastguard Worker with WorkingDir('../linux'): 388*6777b538SAndroid Build Coastguard Worker subprocess.check_call( 389*6777b538SAndroid Build Coastguard Worker ['../src/autogen.sh'] + XML_CONFIGURE_OPTIONS) 390*6777b538SAndroid Build Coastguard Worker check_copying(os.getcwd()) 391*6777b538SAndroid Build Coastguard Worker sed_in_place('config.h', 's/#define HAVE_RAND_R 1//') 392*6777b538SAndroid Build Coastguard Worker 393*6777b538SAndroid Build Coastguard Worker # Add *everything* 394*6777b538SAndroid Build Coastguard Worker with WorkingDir('../src'): 395*6777b538SAndroid Build Coastguard Worker git('add', '*') 396*6777b538SAndroid Build Coastguard Worker if fast: 397*6777b538SAndroid Build Coastguard Worker with WorkingDir('..'): 398*6777b538SAndroid Build Coastguard Worker remove_tracked_files(FILES_TO_REMOVE) 399*6777b538SAndroid Build Coastguard Worker git('commit', '-am', '%s libxml, linux' % commit) 400*6777b538SAndroid Build Coastguard Worker if fast: 401*6777b538SAndroid Build Coastguard Worker print('Now upload for review, etc.') 402*6777b538SAndroid Build Coastguard Worker else: 403*6777b538SAndroid Build Coastguard Worker print('Now push to Windows and run steps there.') 404*6777b538SAndroid Build Coastguard Worker 405*6777b538SAndroid Build Coastguard Worker 406*6777b538SAndroid Build Coastguard Workerdef roll_libxml_win32(src_path): 407*6777b538SAndroid Build Coastguard Worker with WorkingDir(src_path): 408*6777b538SAndroid Build Coastguard Worker # Run the configure script. 409*6777b538SAndroid Build Coastguard Worker with WorkingDir(os.path.join(THIRD_PARTY_LIBXML_SRC, 'win32')): 410*6777b538SAndroid Build Coastguard Worker subprocess.check_call( 411*6777b538SAndroid Build Coastguard Worker ['cscript', '//E:jscript', 'configure.js', 'compiler=msvc'] + 412*6777b538SAndroid Build Coastguard Worker XML_WIN32_CONFIGURE_OPTIONS) 413*6777b538SAndroid Build Coastguard Worker 414*6777b538SAndroid Build Coastguard Worker # Add and commit the result. 415*6777b538SAndroid Build Coastguard Worker shutil.move('../config.h', '../../win32/config.h') 416*6777b538SAndroid Build Coastguard Worker git('add', '../../win32/config.h') 417*6777b538SAndroid Build Coastguard Worker shutil.move('../include/libxml/xmlversion.h', 418*6777b538SAndroid Build Coastguard Worker '../../win32/include/libxml/xmlversion.h') 419*6777b538SAndroid Build Coastguard Worker git('add', '../../win32/include/libxml/xmlversion.h') 420*6777b538SAndroid Build Coastguard Worker git('commit', '--allow-empty', '-m', 'Windows') 421*6777b538SAndroid Build Coastguard Worker git('clean', '-f') 422*6777b538SAndroid Build Coastguard Worker print('Now push to Mac and run steps there.') 423*6777b538SAndroid Build Coastguard Worker 424*6777b538SAndroid Build Coastguard Worker 425*6777b538SAndroid Build Coastguard Workerdef roll_libxml_mac(src_path, icu4c_path): 426*6777b538SAndroid Build Coastguard Worker icu4c_path = os.path.abspath(os.path.expanduser(icu4c_path)) 427*6777b538SAndroid Build Coastguard Worker os.environ["LDFLAGS"] = "-L" + os.path.join(icu4c_path, 'lib') 428*6777b538SAndroid Build Coastguard Worker os.environ["CPPFLAGS"] = "-I" + os.path.join(icu4c_path, 'include') 429*6777b538SAndroid Build Coastguard Worker os.environ["PKG_CONFIG_PATH"] = os.path.join(icu4c_path, 'lib/pkgconfig') 430*6777b538SAndroid Build Coastguard Worker 431*6777b538SAndroid Build Coastguard Worker full_path_to_third_party_libxml = os.path.join( 432*6777b538SAndroid Build Coastguard Worker src_path, THIRD_PARTY_LIBXML_SRC, '..') 433*6777b538SAndroid Build Coastguard Worker 434*6777b538SAndroid Build Coastguard Worker with WorkingDir(os.path.join(full_path_to_third_party_libxml, 'mac')): 435*6777b538SAndroid Build Coastguard Worker subprocess.check_call(['autoreconf', '-i', '../src']) 436*6777b538SAndroid Build Coastguard Worker os.chmod('../src/configure', 437*6777b538SAndroid Build Coastguard Worker os.stat('../src/configure').st_mode | stat.S_IXUSR) 438*6777b538SAndroid Build Coastguard Worker subprocess.check_call(['../src/configure'] + XML_CONFIGURE_OPTIONS) 439*6777b538SAndroid Build Coastguard Worker sed_in_place('config.h', 's/#define HAVE_RAND_R 1//') 440*6777b538SAndroid Build Coastguard Worker 441*6777b538SAndroid Build Coastguard Worker with WorkingDir(full_path_to_third_party_libxml): 442*6777b538SAndroid Build Coastguard Worker commit = subprocess.check_output( 443*6777b538SAndroid Build Coastguard Worker ['awk', '/Version:/ {print $2}', 444*6777b538SAndroid Build Coastguard Worker 'README.chromium']).decode('ascii') 445*6777b538SAndroid Build Coastguard Worker remove_tracked_files(FILES_TO_REMOVE) 446*6777b538SAndroid Build Coastguard Worker commit_message = 'Roll libxml to %s' % commit 447*6777b538SAndroid Build Coastguard Worker git('commit', '-am', commit_message) 448*6777b538SAndroid Build Coastguard Worker print('Now upload for review, etc.') 449*6777b538SAndroid Build Coastguard Worker 450*6777b538SAndroid Build Coastguard Worker 451*6777b538SAndroid Build Coastguard Workerdef check_clean(path): 452*6777b538SAndroid Build Coastguard Worker with WorkingDir(path): 453*6777b538SAndroid Build Coastguard Worker status = subprocess.check_output(['git', 'status', 454*6777b538SAndroid Build Coastguard Worker '-s']).decode('ascii') 455*6777b538SAndroid Build Coastguard Worker if len(status) > 0: 456*6777b538SAndroid Build Coastguard Worker raise Exception('repository at %s is not clean' % path) 457*6777b538SAndroid Build Coastguard Worker 458*6777b538SAndroid Build Coastguard Worker 459*6777b538SAndroid Build Coastguard Workerdef main(): 460*6777b538SAndroid Build Coastguard Worker src_dir = os.getcwd() 461*6777b538SAndroid Build Coastguard Worker if not os.path.exists(os.path.join(src_dir, 'third_party')): 462*6777b538SAndroid Build Coastguard Worker print('error: run this script from the Chromium src directory') 463*6777b538SAndroid Build Coastguard Worker sys.exit(1) 464*6777b538SAndroid Build Coastguard Worker 465*6777b538SAndroid Build Coastguard Worker parser = argparse.ArgumentParser( 466*6777b538SAndroid Build Coastguard Worker description='Roll the libxml2 dependency in Chromium') 467*6777b538SAndroid Build Coastguard Worker platform = parser.add_mutually_exclusive_group(required=True) 468*6777b538SAndroid Build Coastguard Worker platform.add_argument('--linux', action='store_true') 469*6777b538SAndroid Build Coastguard Worker platform.add_argument('--win32', action='store_true') 470*6777b538SAndroid Build Coastguard Worker platform.add_argument('--mac', action='store_true') 471*6777b538SAndroid Build Coastguard Worker platform.add_argument('--linuxfast', action='store_true') 472*6777b538SAndroid Build Coastguard Worker parser.add_argument( 473*6777b538SAndroid Build Coastguard Worker 'libxml2_repo_path', 474*6777b538SAndroid Build Coastguard Worker type=str, 475*6777b538SAndroid Build Coastguard Worker nargs='?', 476*6777b538SAndroid Build Coastguard Worker help='The path to the local clone of the libxml2 git repo.') 477*6777b538SAndroid Build Coastguard Worker parser.add_argument( 478*6777b538SAndroid Build Coastguard Worker '--icu4c_path', 479*6777b538SAndroid Build Coastguard Worker help='The path to the homebrew installation of icu4c.') 480*6777b538SAndroid Build Coastguard Worker args = parser.parse_args() 481*6777b538SAndroid Build Coastguard Worker 482*6777b538SAndroid Build Coastguard Worker if args.linux or args.linuxfast: 483*6777b538SAndroid Build Coastguard Worker libxml2_repo_path = args.libxml2_repo_path 484*6777b538SAndroid Build Coastguard Worker if not libxml2_repo_path: 485*6777b538SAndroid Build Coastguard Worker print('Specify the path to the local libxml2 repo clone.') 486*6777b538SAndroid Build Coastguard Worker sys.exit(1) 487*6777b538SAndroid Build Coastguard Worker libxml2_repo_path = os.path.abspath(libxml2_repo_path) 488*6777b538SAndroid Build Coastguard Worker roll_libxml_linux(src_dir, libxml2_repo_path, args.linuxfast) 489*6777b538SAndroid Build Coastguard Worker elif args.win32: 490*6777b538SAndroid Build Coastguard Worker roll_libxml_win32(src_dir) 491*6777b538SAndroid Build Coastguard Worker elif args.mac: 492*6777b538SAndroid Build Coastguard Worker icu4c_path = args.icu4c_path 493*6777b538SAndroid Build Coastguard Worker if not icu4c_path: 494*6777b538SAndroid Build Coastguard Worker print('Specify the path to the homebrew installation of icu4c with --icu4c_path.') 495*6777b538SAndroid Build Coastguard Worker print(' ex: roll.py --mac --icu4c_path=~/homebrew/opt/icu4c') 496*6777b538SAndroid Build Coastguard Worker sys.exit(1) 497*6777b538SAndroid Build Coastguard Worker roll_libxml_mac(src_dir, icu4c_path) 498*6777b538SAndroid Build Coastguard Worker 499*6777b538SAndroid Build Coastguard Worker 500*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__': 501*6777b538SAndroid Build Coastguard Worker main() 502