Instructions for creating a uimacpp release


For a new release

1. create a tag for the new release, e.g.
	use the github webpage to create a new branch named rc/uimacpp-X.Y.Z
2. follow "new build" instructions below and update branch if needed. Iterate until clean.
3. create a new tag when ready to release.
4. sign release artifacts
5. copy signed release artifacts to staging spot
6. get successful release vote
7. releasing: see http://uima.apache.org/release.html


For a new build on Linux

0. confirm that prerequisite tools for automake and doxygen are installed.

1. Make sure configure.ac has the desired package version numbers in AC_INIT and library version in LT_VERSION_NUMBER. Update source control if necessary.
   Update the  library number by modifying LT_VERSION_NUMBER following the libtool version numbering convention. This is summarized on the wiki page https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=25201320

2. Update RELEASE_NOTES.html with new Jira report from Jira website:
   on jira web page, go to UIMA releases and select new release. For example:
     https://issues.apache.org/jira/projects/UIMA/versions/12346908
   hit "Release Notes", replace Jira report section with new html text from webpage.

3. checkout source from the tag and cd to that directory
   	git clone -b rc/uimacpp-X.Y.Z https://github.com/apache/uima-uimacpp uimacpp-X.Y.Z-rc
	cd uimacpp-X.Y.Z-rc

4. build all 3rd party dependencies, build & check UIMACPP, and create SDK tree with:
   	./uimacpp-make-sdk.sh

5. create bin tarball
   	cd sdk
	tar -czf uimacpp-X.Y.Z-bin.tgz uimacpp

7. sniff test of base sdk
	cd uimacpp
	export UIMACPP_HOME=`pwd`
	PATH=$PATH:`pwd`/bin
	export LD_LIBRARY_PATH=`pwd`/lib:`pwd`/examples/src
	cd examples/src
	make -f all.mak
	cd ..
	./runall.sh

8. sniff test of scriptators (following base sniff test)
	cd ../scriptators/tcl
	make
	LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`
	runAECpp TclSample.xml ../../examples/data/

	cd ../python
	make
	LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`h
	export PYTHONPATH=`pwd`
	runAECpp PythonSample.xml ../../examples/data/

	cd ../perl
	make
	PATH=$PATH:`pwd`
	LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`
	runAECpp PerlSample.xml ../../examples/data/

9. sniff test of uimacpp service wrapper
	in a new window start an ActiveMQ broker:
	  set UIMA_HOME and extend PATH with $UIMA_HOME/bin
	  startBroker.sh
	back in the UimaCpp test window:
	  cd $UIMACPP/examples/tutorial/src
	  make -f MeetingAnnotator.mak
	  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`
	  cd ..
	  set UIMA_HOME and extend PATH with $UIMA_HOME/bin
	  runRemoteAsyncAE.sh tcp://localhost:61616 MeetingAnnotator \
	  -d descriptors/Deploy_MeetingAnnotator.xml



For a new build on Windows

1. checkout source from current release branch
	svn co https://svn.apache.org/repos/asf/uima/uimacpp/branches/uimacpp-X.Y.Z

2. build, test and create sdk tree following the instructions in README.4src
	
3. create bin zipfile of buildDir\uimacpp as
	uimacpp-X.Y.Z-bin.zip

4. sniff test of base sdk
	cd uimacpp
	set UIMACPP_HOME=%cd%
	path=%path%;%cd%\bin;%cd%\examples\src
	cd examples\src
	devenv uimacpp-examples.sln /build release
	cd ..
	runall

5. sniff test of scriptators (following base sniff test)
	cd ..\scriptators\perl
	winmake
	runAECpp PerlSample.xml ..\..\examples\data\

	cd ..\python
	winmake
	runAECpp PythonSample.xml ..\..\examples\data\

	cd ..\tcl
	winmake
	runAECpp TclSample.xml ..\..\examples\data\

6. sniff test of uimacpp service wrapper
	in a "Uima AS window", run:
	  startBroker
	back in the UimaCpp test window:
	  cd ..\..\examples
	  runRemoteAsyncAE tcp://localhost:61616 MeetingAnnotator \
	  -d tutorial\descriptors\Deploy_MeetingAnnotator.xml


Create Source Tar ball

The source tar ball is created by zipping up the files from svn extract of UIMA C++ source.

The source tar ball contains all the files needed to build the Windows and/or
Linux binaries. 

1. checkout source from current release branch
   	git clone -b rc/uimacpp-X.Y.Z https://github.com/apache/uima-uimacpp uimacpp-X.Y.Z-rc

2. create the tar ball
	Remove git specific files: "rm -rf .git .gitattributes .asf.yaml"
        Create zip file for Windows: zip -r uimacpp-X.Y.Z-src.zip uimacpp-X.Y.Z
	Create tar file for Linux:   tar -zcvf uimacpp-X.Y.Z-src.tgz uimacpp-X.Y.Z

3. rat scan the source directory 
        java -jar apache-rat-0.13.jar -dir uimacpp-X.Y.Z-rc -e .*vcproj .*txt .*sln .*asc README.* RELEASE.* NOTICE.* autogen.sh dot.gdbinit doxyheader.html org_apache_uima_uimacpp_UimacppEngine.h config m4

  
