123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394 |
- 0. Pre-Checkin Checklist
- Performed from top of repo, default branch, head:
- [ ] Is tag 'current' at or near head of 'vendor'?
- hg heads
- hg tags
- [ ] Expected differences between vendor and default? Very
- little of the original source should be modified.
- hg diff -rcurrent libxml2
- [ ] Are the 'vendor' and 'default' branch source directories
- 'libxml2' and not 'libxml2-<version>'?
- [ ] Have you reverted/blocked checkin of files modified by
- configure or nmake such as
- libxml2/include/libxml/xmlversion.h?
- [ ] On Linux and Mac, confirm Zlib and ICU detection working
- as expected. That will typically mean these showing up
- during the builds:
- Checking zlib
- checking zlib.h usability... yes
- checking zlib.h presence... yes
- checking for zlib.h... yes
- checking for gzread in -lz... yes
- ...
- Disabling ICU support
- (We'll revisit ICU support in the future...)
- [ ] Did the libraries pick up the correct version of zlib?
- Xmllint? Run strings over them:
- $ strings stage/lib/debug/lib* | grep 1\\.[0-9]\\.
- 1.2.8
- 1.2.8
- $ strings stage/lib/release/lib* | grep 1\\.[0-9]\\.
- 1.2.8
- 1.2.8
- $ strings stage/bin/xmllint | grep 1\\.[0-9]\\.
- 1.2.8
- deflate 1.2.8 Copyright 1995-2013 Jean-loup Gailly and Mark Adler
- inflate 1.2.8 Copyright 1995-2013 Mark Adler
- [ ] Does the xmllint program (stage/bin/openssl) run as expected?
- Are the library bindings (ldd/otool/depends.exe) as expected?
- 1. Introduction
- Simple build of libxml2 library from xmlsoft.org.
- With 2.9.1, repo structure follows standard conventions (see
- section at end).
- 2. Modifications
- Unit test 'test/errors/name2.xml' appears to be sensitive to
- running environment. Supplied version doesn't work on my pdp
- (pdp14) but modified version doesn't work on Squeeze build host.
- Both detect an error, just differently. So, it is being disabled
- by being renamed. Some later version may handle this more
- consistently.
- EBCDIC unit test fails on Windows and Mac due to source conversion
- problems in platform libraries. Test has been disabled by 'hg mv'
- command moving it into a 'test/disabled_tests' subdirectory.
- API unit test in the debug build takes an enormous amount of time
- to run on Windows. Be patient.
- Windows makefile (win32/Makefile.msvc) is modified to work with
- Linden zlib artifacts and is hardened against finding bash
- commands that look like cmd.exe commands.
- There's a second Windows build scheme based on project files but
- it wasn't used for this. It may or may not be more effective.
- 3. Source Origin
- 2.9.1:
- ftp://xmlsoft.org/libxml2/libxml2-2.9.1.tar.gz
- 4. Package Contents
- Common:
- * include/libxml2/libxml/*.h
- Windows (debug and release):
- * lib/release/libxml2_a.lib
- * lib/debug/libxml2_a.lib
- Mac OS X (debug and release):
- * lib/release/libxml2.a
- * lib/debug/libxml2.a
- Explicit -liconv required when linking with OS X libraries due to
- Unicode support.
- Linux (debug and release):
- * lib/release/libxml2.a
- * lib/debug/libxml2.a
- 5. Consumers/Dependents
- Packages dependent on libxml2 which will need attention
- (autobuild.xml) after changes. This is not authoritative, use
- appropriate build tools to find all dependents.
- * fontconfig (should we actually decide to use it)
- * colladadom
- * viewer
- ===================================================================
- Third-Party Library Repo Structure
- Introduction
- We want to have a way to capture local modifications to a third-party
- open-source project, such as libcurl, without needing write access to
- their public repository. We want to be able to carry forward such
- modifications to newer versions of the public project. All this
- should be independent of the organizational decision as to whether
- it's even desirable to try to submit our local modifications upstream.
- Fortunately, the Subversion folks articulated a process years ago that
- addresses this very requirement. They call it "Vendor Branches." The
- same tactic, suitably adapted, works with Mercurial too.
- The essence of the idea is that we capture and tag a particular
- snapshot of the open-source project. We develop our local
- modifications to that, and the repository tip incorporates them. But
- when we want to update to a newer version of the public project, we
- bring it into the repository in such a way that we can discover the
- changes from the original snapshot and the new one -- and then have
- Mercurial apply those deltas to the ''combined'' source.
- The following material is adapted from
- http://svnbook.red-bean.com/en/1.1/ch07s05.html, the Red Bean
- Subversion book, but recast for Mercurial. The Linden source for this
- material is an internal wiki. There may be superceding documentation
- on the public wiki when you read this. We recommend searching there
- for updates to conventions below. And note that each particular
- library may implement variations of this scheme.
- General Vendor Branch Management Procedure
- Managing vendor branches generally works like this. You create a
- named branch ("vendor") to store the vendor source snapshots. Then
- you import the third party code into that branch. Your modified
- branch (named "default") is based on "vendor". You always make your
- local changes to the default branch. With each new release of the
- code you are tracking you bring it into the "vendor" branch and merge
- the changes into "default", resolving whatever conflicts occur between
- your local changes and the upstream changes.
- Perhaps an example will help to clarify this algorithm. We'll use a
- scenario where your development team is creating a calculator program
- that links against a third-party complex number arithmetic library,
- libcomplex. We'll construct a repository specifically for our
- locally-modified version of that library. To begin, we must
- initialize our repository and create at least one file in our
- "default" branch.
- $ hg init ourcomplex
- $ cd ourcomplex
- $ touch README.txt
- $ hg commit README.txt
- Now we can create the vendor branch and do the import of the first
- vendor drop. We'll call our vendor branch "vendor", and each
- successive code drop will be tagged "current".
- $ hg branch vendor
- $ tar -xjf ../libcomplex-1.0.tar.bz2
- $ mv libcomplex-1.0 libcomplex
- $ hg addremove
- $ hg commit -m "1.0 source drop"
- $ hg tag -r tip current
- $ hg tag -r current 1.0
- We now have the current version of the libcomplex source code in
- branch "vendor", tagged "current" and in a non-version-specific source
- code subdirectory ("libcomplex"). Next, we merge it into the default
- branch. It is in the default branch that we will make our
- customizations.
- $ hg update default
- $ hg merge vendor
- $ hg commit -m "initial: 1.0"
- We get to work customizing the libcomplex code. Before we know it,
- our modified version of libcomplex is now completely integrated into
- our calculator program.
- A few weeks later, the developers of libcomplex release a new version
- of their library, version 1.1, which contains some features and
- functionality that we really want. We'd like to upgrade to this new
- version, but without losing the customizations we made to the existing
- version. What we essentially would like to do is to replace our
- current baseline version of libcomplex 1.0 with a copy of libcomplex
- 1.1, and then have Mercurial re-apply the custom modifications we
- previously made to that library to the new version. But we actually
- approach the problem from the other direction, applying the changes
- made to libcomplex between versions 1.0 and 1.1 to our modified copy
- of it.
- To perform this upgrade, we update our repository to our vendor
- branch, and update the "current" tag with the new libcomplex 1.1
- source code. We quite literally replace the existing files with the
- new files, clearing out the whole tree and exploding the libcomplex
- 1.1 release tarball in its place. The goal here is to make the tip of
- our vendor branch contain only the libcomplex 1.1 code, and to ensure
- that all that code is under version control. Oh, and we want to do
- this with as little version control history disturbance as possible.
- $ hg update vendor
- $ rm -rf *
- $ tar -xjf ../libcomplex-1.1.tar.bz2
- $ mv libcomplex-1.1 libcomplex
- $ hg addremove -s 60
- $ # Additional 'hg add' and 'hg rm' commands if needed
- $ hg commit -m "1.1 source drop"
- After unpacking the 1.1 tarball, hg status will show files with local
- modifications as well as, perhaps, some unversioned or missing files.
- If we did what we were supposed to do, the unversioned files are only
- those new files introduced in the 1.1 release of libcomplex. The
- missing files are files that were in 1.0 but not in 1.1. The 'hg
- addremove' command deals with both, and more: the '-s 60' switch
- directs Mercurial to compare added files to deleted files, recognizing
- any file at least 60% similar as a move/rename.
- For simple or stable libraries, the 'hg addremove' command should be
- reliable. For more complicated libraries subject to refactoring or
- large gaps of time between updates (e.g. libcurl), it can get a little
- lost trying to match files in the old release with files in the new
- release. Pay attention to the output of the command or better still,
- do dry runs. Files erroneously moved can be excluded with the '-X'
- option and then dealt with individually with 'hg add' and 'hg rm'
- commands after 'hg addremove'. (The readme file in the curl library
- should document a particularly challenging case.)
- The 'addremove' process doesn't have to be perfect. Recreating the
- evolution of the upstream source tree isn't universally practical.
- But we'd like to capture movement of files in the vendor branch that
- are modified in the default branch. If achieving that becomes too
- tedious, then re-implementation of the default branch edit in a new
- file is fine. Just note it here for the next developer.
- Finally, once our current working copy contains only the libcomplex
- 1.1 code, we commit the changes we made to get it looking that way.
- Our current vendor branch now contains the new vendor drop. We move
- the 'current' tag to the new version (in the same way we previously
- tagged the version 1.0 vendor drop), and then merge the differences
- between the version 1.0 and version 1.1 into our default branch.
- $ hg tag -f -r tip current
- $ hg tag -r current 1.1
- $ hg update default
- $ hg merge vendor
- # resolve all the conflicts between their changes and our changes
- # if you will have conflicts in .hgtags, simply take *all* lines
- ...
- $ hg commit -m "update with 1.1"
- Any additional work needed to get the merged library working can
- now be done on the default branch.
- Revision Tags
- We don't currently make use of Mercurial tags in the build and release
- process for 3rd-party libraries. But we would like to establish a
- convention to document update and release points. The tags we would
- like to establish are:
- * 'current' Points to a succession of vendor releases checked into
- the 'vendor' branch. Will almost always be at or close to branch
- head.
- * '<version>' Tag on the 'vendor' branch pointing to a verbatim
- checkin of a 3rd-party's <version> release. Example: '7.21.1' for
- a particular version of libcurl we have used.
- * Release-type tags on the default branch aren't as useful given how
- Mercurial handles tags and how autobuild works.
- Schematic of a Third-Party Repository
- Below is the output of the 'hg glog' command showing a library project
- going through an initial 1.0 release and an update from the vendor to
- 1.1. Significant revisions in the repository lifecycle are as
- follows:
- 0 Creation of the repo with an initial file.
- 1 1.0 code drop on branch 'vendor'
- 4 Merge of 1.0 code onto branch 'default'
- 5 Modifications to library we wish to keep over time. Released.
- 6 1.1 code drop on branch 'vendor'
- 9 Merge of 1.1 code onto branch 'default'
- 10 Fixes to merge yielding production 1.1 library. Released.
-
- @ changeset: 10:888229641f6e
- | tag: tip
- | user: Monty Brandenberg <[email protected]>
- | date: Wed Oct 30 13:35:51 2013 -0400
- | summary: Work to get 1.1 merge working. Release.
- |
- o changeset: 9:925ccdf09f50
- |\ parent: 5:83c5775c23dc
- | | parent: 8:977001a08e48
- | | user: Monty Brandenberg <[email protected]>
- | | date: Wed Oct 30 13:35:20 2013 -0400
- | | summary: update with 1.1
- | |
- | o changeset: 8:977001a08e48
- | | branch: vendor
- | | user: Monty Brandenberg <[email protected]>
- | | date: Wed Oct 30 13:33:49 2013 -0400
- | | summary: Added tag 1.1 for changeset 5f6cb89add91
- | |
- | o changeset: 7:59bce0f6d12f
- | | branch: vendor
- | | user: Monty Brandenberg <[email protected]>
- | | date: Wed Oct 30 13:33:41 2013 -0400
- | | summary: Added tag current for changeset 5f6cb89add91
- | |
- | o changeset: 6:5f6cb89add91
- | | branch: vendor
- | | tag: current
- | | tag: 1.1
- | | parent: 3:8525ad934ecd
- | | user: Monty Brandenberg <[email protected]>
- | | date: Wed Oct 30 13:33:29 2013 -0400
- | | summary: 1.1 source drop
- | |
- o | changeset: 5:83c5775c23dc
- | | tag: 1.0
- | | user: Monty Brandenberg <[email protected]>
- | | date: Wed Oct 30 13:32:31 2013 -0400
- | | summary: Linden-specific changes to the library. Release
- | |
- o | changeset: 4:bccb736585f4
- |\| parent: 0:400e4516c406
- | | parent: 3:8525ad934ecd
- | | user: Monty Brandenberg <[email protected]>
- | | date: Wed Oct 30 13:31:40 2013 -0400
- | | summary: initial: 1.0
- | |
- | o changeset: 3:8525ad934ecd
- | | branch: vendor
- | | user: Monty Brandenberg <[email protected]>
- | | date: Wed Oct 30 13:30:21 2013 -0400
- | | summary: Added tag 1.0 for changeset 8ac3828d03bb
- | |
- | o changeset: 2:7aa1a1cb62d9
- | | branch: vendor
- | | user: Monty Brandenberg <[email protected]>
- | | date: Wed Oct 30 13:30:14 2013 -0400
- | | summary: Added tag current for changeset 8ac3828d03bb
- | |
- | o changeset: 1:8ac3828d03bb
- |/ branch: vendor
- | tag: 1.0
- | user: Monty Brandenberg <[email protected]>
- | date: Wed Oct 30 13:30:09 2013 -0400
- | summary: 1.0 source drop
- |
- o changeset: 0:400e4516c406
- user: Monty Brandenberg <[email protected]>
- date: Wed Oct 30 13:29:16 2013 -0400
- summary: Created repo with initial readme file
|