Difference between revisions of "Tuning in to a CWS"

From Apache OpenOffice Wiki
Jump to: navigation, search
(The Script: changed to <source lang="bash"> and eliminated apostrophes in comments that doesn't cope with)
(Prerequisites: changed to <source lang="bash">)
Line 44: Line 44:
  
 
Basically fulfilling the prerequisites means (untested, there may be typos and quirks lurking)
 
Basically fulfilling the prerequisites means (untested, there may be typos and quirks lurking)
<code>[bash,N]
+
<source lang="bash">
 
mkdir -p $HOME/ooo/src/SRC680/src.m239
 
mkdir -p $HOME/ooo/src/SRC680/src.m239
 
cd $HOME/ooo/src/SRC680/src.m239
 
cd $HOME/ooo/src/SRC680/src.m239
Line 55: Line 55:
 
cd $SRC_ROOT/postprocess
 
cd $SRC_ROOT/postprocess
 
build --all
 
build --all
setenv CWS_WORK_STAMP cwsname
+
export CWS_WORK_STAMP=cwsname
</code>
+
</source>
  
 
Fire up CVS tunnel if appropriate.
 
Fire up CVS tunnel if appropriate.

Revision as of 16:50, 16 February 2008

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

Introduction

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.

Prerequisites

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)

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
export CWS_WORK_STAMP=cwsname

Fire up CVS tunnel if appropriate.

The Script

The tune_in_to_cws bash script:

#!/bin/bash
# Start working on a CWS, e.g. based on SRC680_m239 milestone, linking all
# non-cws module directories. For details see
# http://wiki.services.openoffice.org/wiki/Tuning_in_to_a_CWS
 
# To make things work, the milestone build tree MUST had been configured for a
# directory hierarchy that ends in /$WORK_STAMP/something, e.g. /SRC680/src
 
# ADAPT THESE VARIABLES TO YOUR NEEDS:
# myCvsId: Obviously the CVS id you have commit right with. Used to update the
# CVS/Root files copied from CWS modules with your tunnel. If this is set empty,
# CVS/Root files are left untouched. It is a good idea to checkout the
# milestone using anoncvs to not accidentally commit anything, hence this
# procedure.
myCvsId=""
# myCvsTunnel: The line that is written to CVS/Root files if myCvsId is not
# empty. The tunnel must be up and running if myCvsId is not empty!
myCvsTunnel=":pserver:$myCvsId@localhost:/cvs"
# myBaseDir: The CWS build tree is created as
# $myBaseDir/$CWS_WORK_STAMP/$WORK_STAMP/src$UPDMINOREXT
myBaseDir="$HOME/ooo/src"
# UPDMINOREXT: You may set this to anything you like. However, it is a good
# idea to make it correspond to the milestone your CWS is based on, since that
# leaves the old tree accessible after a resync and an upgrade to a newer
# milestone when working on a fresh tree. Not set if preset in the current
# environment, but ovrerridden if myAdaptExtToCurrent is not empty, see there.
test "$UPDMINOREXT" || UPDMINOREXT=".m239"
# myAdaptExtToCurrent: If not empty, UPDMINOREXT will be overridden with
# ".$(cwsquery current)"
myAdaptExtToCurrent="Yes"
 
# myOmitOutputDirs: Whether output directories are to be omitted from the CWS
# copy and you have to rebuild the CWS modules. You may set this to empty if
# and only if you are absolutely sure that the CWS does not have intermodule
# dependencies.
myOmitOutputDirs="Yes"
 
# Run this script and if everything went fine:
#
# cd $myBaseDir/$CWS_WORK_STAMP/$WORK_STAMP/src$UPDMINOREXT
# # !!! ATTENTION !!! You MUST source the newly created environment!
# 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
 
myEnvNotSet='not set, source LinuxX86Env.Set.sh environment!'
test "$SRC_ROOT" || { echo "\$SRC_ROOT $myEnvNotSet"; exit 1; }
test "$WORK_STAMP" || { echo "\$WORK_STAMP $myEnvNotSet"; 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 "$INPATH" || { echo "\$INPATH $myEnvNotSet"; exit 1; }
test "$OUTPATH" || { echo "\$OUTPATH $myEnvNotSet"; 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
test "$CWS_WORK_STAMP" || { echo '$CWS_WORK_STAMP not set, export CWS_WORK_STAMP=cwsname'; exit 1; }
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
fi
 
if [ "$myAdaptExtToCurrent" != "" ]; then
    UPDMINOREXT=".$(cwsquery current)"
    if [ $? -ne 0 ]; then
        echo 'cwsquery current unsuccessful.'
        exit 1
    else
        echo "UPDMINOREXT: $UPDMINOREXT"
    fi
fi
 
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 do not create module.lnk/module links effectively being
    # $SRC_ROOT/module/module
    myLnk="$(basename "$dir").lnk"
    if [ ! -e "$myLnk" ]; then
        ln -s "$dir" "$myLnk"
    fi
done
rm {LinuxX86Env.Set*,makefile.mk,solver,solenv,*_images,postprocess,instsetoo_native}.lnk
# solenv and *_images are needed without .lnk extension, instead of copying
# link them. If they are part of the CWS they are 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
 
# 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"
    fi
    if [ "$myOmitOutputDirs" == "" ]; then
        cp -av "$SRC_ROOT/$dir" "$myCwsDir"
    else
        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"
            fi
        done
    fi
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"
        done
    done
fi
myAllExit=0
# 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
    myExit=$?
    if [ $myExit -ne 0 ]; then
        echo "Warning, $dir cvs update returned with exit code $myExit"
        myAllExit=$myExit
    fi
    popd
done
if [ $myAllExit -ne 0 ]; then
    echo "Warning, at least one cvs update returned with exit code $myAllExit"
fi
echo ''
echo '# And now:'
echo "cd $myCwsDir"
echo 'source LinuxX86Env.Set.sh'
echo '# !!! ATTENTION !!! You MUST source the newly created environment for the CWS!'

Epilogue

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