Tuning in to a CWS

From Apache OpenOffice Wiki
Revision as of 16:44, 28 December 2007 by ErAck (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Method and script to tune in to an already existing CWS based on a specific milestone that's already built.

If you just want to build a CWS and don't need the milestone build for other purposes or CWSs based on it, there is a much simpler method that checks out the milestone and updates modules with the CWS branch, see Getting It: Checking out a CWS through CVS

This method here is especially useful when working on multiple CWSs based on the same milestone, saving disk space and build time. It also serves when working on just one CWS, to be able to compare differences between the unmodified master's environment and installation and the modifications done in the CWS. It comes also handy if you already have a milestone build and want to tune in to a CWS based on that milestone.

The method needs a full master build of the milestone, but for the CWS build only copies of the modules added to the CWS are needed, modules not added to the CWS are created as symbolic links to the master build, effectively saving 4GB of disk space and hours of build time for each subsequent CWS based on the same milestone master. The method takes advantage of a build tool feature that skips .lnk directory entries (see solenv/bin/build.pl for reference). It is heavily inspired by a feature of the cwscreate tool that does almost the same in Sun Microsystem's Hamburg labs where a series of recent milestone builds is kept to branch off and resync to, but due to fixed directory structures not being available in personal plain OOo checkout builds is not available there (see solenv/bin/cwscreate.pl for reference). cwscreate also does this only during creation of a CWS, not offering the "tune in to existing CWS" method introduced here.

To make things work some prerequisites have to be met:

  • The CWS does not introduce binary incompatible changes that would affect modules that are not added to the CWS. To be exact, it would work if at the end you manually removed the symbolic links of affected modules and copied the modules from the master to the CWS build tree, omitting the output directories respectively removing them from the copy. This is error prone though. The script checks if the CWS in EIS has modules marked as being incompatible and ceases to continue if that is the case.
  • The milestone master build tree must reside in and had been configured for a directory hierarchy that ends in /$WORK_STAMP/something because in the CWS environment's LinuxX86Env.Set* /$WORK_STAMP/ will be replaced with /$CWS_WORK_STAMP/$WORK_STAMP/ for CWS relevant directories like solver and such, using a dumb sed expression. The actual value of something doesn't matter, however, it is recommended to use something that corresponds to the milestone, e.g. src.m239, to keep things distinct. For example: the milestone build tree resides in $HOME/ooo/src/SRC680/src.m239, with /SRC680/ being the important part. The script does check this.
  • OOo must had been built up to at least module postprocess, install sets are not necessary, they can be created from within the CWS. However, they're good to have to compare the milestone with changes done in the CWS later. The script does check this.
  • The corresponding LinuxX86Env.Set.sh is sourced. The script does check (parts of) this.
  • The CWS_WORK_STAMP environment variable is set to the name of the CWS. The script does check this.
  • $HOME/.cwsrc with good values, see cws config file. The script does not check this but cwsquery will fail and the script does check that.
  • CVS tunnel must be up if the script's $myCvsId variable is not empty. The script does not check this.

Basically fulfilling the prerequisites means (untested, there may be typos and quirks lurking) [bash,N] mkdir -p $HOME/ooo/src/SRC680/src.m239 cd $HOME/ooo/src/SRC680/src.m239 cvs -d :pserver:anoncvs@anoncvs.services.openoffice.org:/cvs co -P -r SRC680_m239 OpenOffice2 cd config_office ./configure cd .. ./bootstrap source LinuxX86Env.Set.sh cd $SRC_ROOT/postprocess build --all setenv CWS_WORK_STAMP cwsname

Fire up CVS tunnel if appropriate.

The tune_in_to_cws bash script: [bash,N]

  1. !/bin/bash
  2. Start working on a CWS, e.g. based on SRC680_m239 milestone, linking all
  3. non-cws module directories. For details see
  4. http://wiki.services.openoffice.org/wiki/Tuning_in_to_a_CWS
  1. To make things work, the milestone build tree MUST had been configured for a
  2. directory hierarchy that ends in /$WORK_STAMP/something, e.g. /SRC680/src
  2. myCvsId: Obviously the CVS id you have commit right with. Used to update the
  3. CWS modules' copied CVS/Root files with your tunnel. If this is set empty,
  4. CVS/Root files are left untouched. It is a good idea to checkout the
  5. milestone using anoncvs to not accidentally commit anything, hence this
  6. procedure.


  1. myCvsTunnel: The line that is written to CVS/Root files if myCvsId is not
  2. empty. The tunnel must be up and running if myCvsId is not empty!


  1. myBaseDir: The CWS build tree is created as


  1. UPDMINOREXT: You may set this to anything you like. However, it is a good
  2. idea to make it correspond to the milestone your CWS is based on, since that
  3. leaves the old tree accessible after a resync and an upgrade to a newer
  4. milestone when working on a fresh tree. Not set if preset in the current
  5. environment.


  1. myOmitOutputDirs: Whether output directories are to be omitted from the CWS
  2. copy and you have to rebuild the CWS modules. You may set this to empty if
  3. and only if you are absolutely sure that the CWS does not have intermodule
  4. dependencies.


  1. Run this script and if everything went fine:
  3. # !!! ATTENTION !!! You MUST source the newly created environment!
  4. source LinuxX86Env.Set.sh
  5. cd $SRC_ROOT/postprocess
  6. build --all
  7. cd $SRC_ROOT/instsetoo_native/util
  8. dmake openoffice_en-US PKGFORMAT=installed
  9. You then have a working installation in

test "$SRC_ROOT" || { echo '$SRC_ROOT not set, source LinuxX86Env.Set.sh environment!'; exit 1; } test "$WORK_STAMP" || { echo '$WORK_STAMP not set, source LinuxX86Env.Set.sh environment!'; exit 1; } echo "$SRC_ROOT" | grep "/$WORK_STAMP/" if [ $? -ne 0 ]; then

   echo "/\$WORK_STAMP/ (/$WORK_STAMP/) not in \$SRC_ROOT ($SRC_ROOT)."
   exit 1

fi test "$CWS_WORK_STAMP" || { echo '$CWS_WORK_STAMP not set, export CWS_WORK_STAMP=cwsname'; exit 1; } if [ ! -f "$SRC_ROOT/postprocess/$INPATH/bin/uiconfig.zip" ]; then

   echo "$SRC_ROOT/postprocess/$INPATH/bin/uiconfig.zip doesn't exist, milestone master probably not built."
   exit 1

fi myModules="$(cwsquery modules)" if [ $? -ne 0 ]; then

   echo 'cwsquery modules unsuccessful, ~/.cwsrc bad or EIS not reachable.'
   exit 1

fi echo "Modules: $myModules" myIncompatible="$(cwsquery incompatible)" if [ $? -ne 0 ]; then

   echo 'cwsquery incompatible unsuccessful.'
   exit 1

fi if [ "$myIncompatible" != "" ]; then

   echo "Incompatible module(s) $myIncompatible"
   echo "This probably won't work with linked master modules."
   exit 1


myCwsBase="$myBaseDir/$CWS_WORK_STAMP/$WORK_STAMP" myCwsDir="$myCwsBase/src$UPDMINOREXT" mkdir -p $myCwsDir cd $myCwsDir || { echo "Are you sure you have permissions in $myCwsDir where you want to create the CWS tree?"; exit 1; } for dir in $SRC_ROOT/*; do

   # On subsequent runs don't create module.lnk/module links effectively being
   # $SRC_ROOT/module/module
   myLnk="$(basename "$dir").lnk"
   if [ ! -e "$myLnk" ]; then
       ln -s "$dir" "$myLnk"

done rm {LinuxX86Env.Set*,makefile.mk,solver,solenv,*_images,postprocess,instsetoo_native}.lnk

  1. solenv and *_images are needed without .lnk extension, instead of copying
  2. link them. If they're part of the CWS they're handled further down.

ln -s $SRC_ROOT/{solenv,*_images} "$myCwsDir" cp -auv $SRC_ROOT/{makefile.mk,solver,postprocess,instsetoo_native} "$myCwsDir" cp -av $SRC_ROOT/LinuxX86Env.Set* "$myCwsDir"

echo "Adapting" LinuxX86Env.Set* "and replacing /$WORK_STAMP/ with /$CWS_WORK_STAMP/$WORK_STAMP/" for file in LinuxX86Env.Set*; do

   sed --in-place -e "s/\/$WORK_STAMP\//\/$CWS_WORK_STAMP\/$WORK_STAMP\//g" "$file"

done echo "setenv CWS_WORK_STAMP \"$CWS_WORK_STAMP\"" >>LinuxX86Env.Set echo "export CWS_WORK_STAMP=\"$CWS_WORK_STAMP\"" >>LinuxX86Env.Set.sh echo "setenv LOCALINSTALLDIR \"$myCwsBase/inst$UPDMINOREXT\"" >>LinuxX86Env.Set echo "export LOCALINSTALLDIR=\"$myCwsBase/inst$UPDMINOREXT\"" >>LinuxX86Env.Set.sh

  1. Copy CWS modules from milestone.

for dir in $myModules; do

   rm "$dir.lnk"
   # May be linked solenv or *_images
   if [ -h "$dir" ]; then
       rm "$dir"
   if [ "$myOmitOutputDirs" == "" ]; then
       cp -av "$SRC_ROOT/$dir" "$myCwsDir"
       echo "Omitting output directories $SRC_ROOT/$dir/{$OUTPATH,$INPATH} (myOmitOutputDirs not empty)"
       mkdir -p "$myCwsDir/$dir"
       for sub in $SRC_ROOT/$dir/*; do
           if [ "$sub" != "$SRC_ROOT/$dir/$OUTPATH" -a "$sub" != "$SRC_ROOT/$dir/$INPATH" ]; then
               cp -av "$sub" "$myCwsDir/$dir"

done if [ "$myCvsId" != "" ]; then

   # In case milestone was checked out using anoncvs:
   echo "Changing CVS/Root files of CWS modules to  $myCvsTunnel"
   for dir in $myModules; do
       echo "Module $dir"
       for file in $(find "$dir" -name Root | grep '/CVS/Root'); do
           echo "$myCvsTunnel" >"$file"

fi myAllExit=0

  1. Update modules with CWS branch, all lower case tag.

myBranch="$(echo cws_${WORK_STAMP}_${CWS_WORK_STAMP}|tr A-Z a-z)" for dir in $myModules; do

   echo "CVS updating module $dir with $myBranch"
   pushd "$dir"
   cvs update -dP -r $myBranch
   if [ $myExit -ne 0 ]; then
       echo "Warning, $dir cvs update returned with exit code $myExit"

done if [ $myAllExit -ne 0 ]; then

   echo "Warning, at least one cvs update returned with exit code $myAllExit"


Run the tune_in_to_cws script and if everything went fine: [bash,N] cd $myBaseDir/$CWS_WORK_STAMP/$WORK_STAMP/src$UPDMINOREXT

  1.  !!! ATTENTION !!! You MUST source the newly created environment, or else
  2. you will spoil milestone's solver when delivering files from the CWS!

source LinuxX86Env.Set.sh cd $SRC_ROOT/postprocess build --all cd $SRC_ROOT/instsetoo_native/util dmake openoffice_en-US PKGFORMAT=installed

You then have a working installation in $myBaseDir/$CWS_WORK_STAMP/$WORK_STAMP/inst$UPDMINOREXT as this script adds LOCALINSTALLDIR $myBaseDir/$CWS_WORK_STAMP/$WORK_STAMP/inst$UPDMINOREXT to LinuxX86Env.Set* to create CWS installs within the CWS hierarchy, see also http://blogs.sun.com/GullFOSS/entry/the_fastest_way_to_get

After having tuned in the CWS, do not modify files on the master under solenv/ or the *_images/ modules that are linked from the CWS to the master if not part of the CWS, as building from within the CWS would build and deliver those to the CWS' solver. Modify the script to copy those directories if this somehow is likely to confuse your working habits.

Personal tools