Difference between revisions of "Tuning in to a CWS"
(Method and script to tune in to an already existing CWS based on a specific milestone that's already built.) |
(updated script checking some more variables and overriding UPDMINOREXT with ".$(cwsquery current)") |
||
Line 7: | Line 7: | ||
[[Getting_It#Checking_out_a_CWS_through_CVS | Getting It: Checking out a CWS | [[Getting_It#Checking_out_a_CWS_through_CVS | Getting It: Checking out a CWS | ||
through CVS]] | through CVS]] | ||
+ | |||
+ | == Introduction == | ||
This method here is especially useful when working on multiple CWSs based on | This method here is especially useful when working on multiple CWSs based on | ||
Line 29: | Line 31: | ||
this only during creation of a CWS, not offering the "tune in to existing CWS" | this only during creation of a CWS, not offering the "tune in to existing CWS" | ||
method introduced here. | method introduced here. | ||
+ | |||
+ | == Prerequisites == | ||
To make things work some prerequisites have to be met: | To make things work some prerequisites have to be met: | ||
Line 56: | Line 60: | ||
Fire up CVS tunnel if appropriate. | Fire up CVS tunnel if appropriate. | ||
+ | == The Script == | ||
The <tt>tune_in_to_cws</tt> bash script: | The <tt>tune_in_to_cws</tt> bash script: | ||
+ | |||
<code>[bash,N] | <code>[bash,N] | ||
#!/bin/bash | #!/bin/bash | ||
Line 84: | Line 90: | ||
# leaves the old tree accessible after a resync and an upgrade to a newer | # 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 | # milestone when working on a fresh tree. Not set if preset in the current | ||
− | # environment. | + | # environment, but ovrerridden if myAdaptExtToCurrent is not empty, see there. |
test "$UPDMINOREXT" || UPDMINOREXT=".m239" | 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 | # myOmitOutputDirs: Whether output directories are to be omitted from the CWS | ||
Line 106: | Line 115: | ||
# $myBaseDir/$CWS_WORK_STAMP/$WORK_STAMP/inst$UPDMINOREXT | # $myBaseDir/$CWS_WORK_STAMP/$WORK_STAMP/inst$UPDMINOREXT | ||
− | + | myEnvNotSet='not set, source LinuxX86Env.Set.sh environment!' | |
− | test "$WORK_STAMP" || { echo | + | test "$SRC_ROOT" || { echo "\$SRC_ROOT $myEnvNotSet"; exit 1; } |
+ | test "$WORK_STAMP" || { echo "\$WORK_STAMP $myEnvNotSet"; exit 1; } | ||
echo "$SRC_ROOT" | grep "/$WORK_STAMP/" | echo "$SRC_ROOT" | grep "/$WORK_STAMP/" | ||
if [ $? -ne 0 ]; then | if [ $? -ne 0 ]; then | ||
Line 113: | Line 123: | ||
exit 1 | exit 1 | ||
fi | fi | ||
− | test "$ | + | test "$INPATH" || { echo "\$INPATH $myEnvNotSet"; exit 1; } |
+ | test "$OUTPATH" || { echo "\$OUTPATH $myEnvNotSet"; exit 1; } | ||
if [ ! -f "$SRC_ROOT/postprocess/$INPATH/bin/uiconfig.zip" ]; then | 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." | echo "$SRC_ROOT/postprocess/$INPATH/bin/uiconfig.zip doesn't exist, milestone master probably not built." | ||
exit 1 | exit 1 | ||
fi | fi | ||
+ | test "$CWS_WORK_STAMP" || { echo '$CWS_WORK_STAMP not set, export CWS_WORK_STAMP=cwsname'; exit 1; } | ||
myModules="$(cwsquery modules)" | myModules="$(cwsquery modules)" | ||
if [ $? -ne 0 ]; then | if [ $? -ne 0 ]; then | ||
Line 133: | Line 145: | ||
echo "This probably won't work with linked master modules." | echo "This probably won't work with linked master modules." | ||
exit 1 | 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 | fi | ||
Line 209: | Line 231: | ||
echo "Warning, at least one cvs update returned with exit code $myAllExit" | echo "Warning, at least one cvs update returned with exit code $myAllExit" | ||
fi | 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!' | ||
</code> | </code> | ||
+ | |||
+ | == Epilogue == | ||
Run the <tt>tune_in_to_cws</tt> script and if everything went fine: | Run the <tt>tune_in_to_cws</tt> script and if everything went fine: |
Revision as of 14:21, 29 December 2007
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)
[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 Script
The tune_in_to_cws bash script:
[bash,N]
- !/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
- CWS modules' copied CVS/Root files 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 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" 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'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
- 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
- !!! ATTENTION !!! You MUST source the newly created environment, or else
- 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.