Tutorial Library

From Apache OpenOffice Wiki
Revision as of 17:02, 16 May 2006 by ErAck (Talk | contribs)

Jump to: navigation, search
Hack up a library! Tutorial_Help

Once build figures out the individual sub-directories that need to be built, it descends into each of the sub-directories and invokes dmake, which is the build tool that takes makefile.mk as input as to what to build. It is dmake which now launches the error that a makefile is not present.

We can fix that, can't we now ? :-) We look for a healthy makefile.mk from a neighbouring project, copy it over and make the modifications to fit our needs:

--- /dev/null   2004-08-25 23:04:59.000000000 +0530
+++ helloworld/source/makefile.mk       2005-01-10 23:34:50.363586152 +0530
@@ -0,0 +1,17 @@
+
+PRJ=..
+PRJNAME=helloworld
+TARGET=helloworld
+
+# --- Settings ----------------------------------
+
+.INCLUDE : settings.mk
+
+# --- Files -------------------------------------
+
+SLOFILES=\
+       $(SLO)$/helloworld.obj
+
+# --- Targets ----------------------------------
+
+.INCLUDE : target.mk

With that information in, we indicate that we want a helloworld.obj built and issue 'build' again:

build -- version: 1.130

/home/raul/HEAD/ooo-build/build/src680-m65/helloworld/source
dmake:  Error -- `../unxlngi4.pro/slo/helloworld.obj' not found, and can't be made
'---* tg_merge.mk *---'

ERROR: Error 65280 occurred while making /home/raul/HEAD/ooo-build/build/src680-m65/helloworld/source

So what happens is that in order to generate a file-name.obj file, dmake searches for a file-name.cxx file and in this case, unable to find the source file, throws an error and halts.

In order to move ahead, we need to provide the source of what needs to be built, and we do that:

--- /dev/null   2004-08-25 23:04:59.000000000 +0530
+++ helloworld/inc/helloworld.hxx       2005-01-10 23:27:39.148140864 +0530
@@ -0,0 +1,12 @@
+namespace hello {
+
+    namespace world {
+
+       class HelloWorld {
+
+       public:
+           void adios();
+           
+       };
+    };
+};
--- /dev/null   2004-08-25 23:04:59.000000000 +0530
+++ helloworld/source/helloworld.cxx    2005-01-10 23:28:42.946442048 +0530
@@ -0,0 +1,8 @@
+#include <helloworld.hxx>
+
+using namespace hello::world;
+
+void HelloWorld::adios()
+{
+    fprintf( stderr, "Hello, World! :-)\n" );
+}

The include header file provided in angle brackets causes it to be picked up from the inc/ directory at the top, if quotes were used instead, the current directory would be searched in for the header file.

[ Stephan Bergmann corrects: #include "foo" first searches through user definable include directories for foo, then, if no foo has yet been found, searches through compiler-specific include directories. #include <foo> only searches through compiler-specific include directories. (From a Standards perspective, this is not entirely precise, but should suffice here.) With all the compilers we use for OOo, we set up the command line so that all the OOo-specific include directories are added to the set of compiler-specific include directories, not to the set of user-definable include directories. Thus, there should be no difference between using #include <helloworld.hxx> and #include "helloworld.hxx". As a matter of style, I recommend using "..." for all OOo-specific headers, and <...> for the official C++ headers (<string>, <cstring>, <string.h> etc.) and system headers (<unistd.h> etc.) only. Also see the thread at http://www.openoffice.org/servlets/ReadMsg?list=dev&msgNo=8008. ]

With that in place, we launch 'build' again:

build -- version: 1.130

/home/raul/HEAD/ooo-build/build/src680-m65/helloworld/source
mkout -- version: 1.3
-----------------------------------------------
Making: ../unxlngi4.pro/misc/helloworld.dpc
dmake subdmake=true  -f makefile.mk  depend=t ALLDPC
Making : Dependencies
touch ../unxlngi4.pro/misc/helloworld.dpc
-----------------------------------------------
Making: ../unxlngi4.pro/slo/helloworld.obj
g++ -Wuninitialized -fmessage-length=0 -c -I.  -I. -I../inc -I../inc -I../unx/inc -I../unxlngi4.pro/inc -I. -I/home/raul/HEAD/ooo-build/build/src680-m65/solver/680/unxlngi4.pro/inc/stl -I/home/raul/HEAD/ooo-build/build/src680-m65/solver/680/unxlngi4.pro/inc/external -I/home/raul/HEAD/ooo-build/build/src680-m65/solver/680/unxlngi4.pro/inc -I/home/raul/HEAD/ooo-build/build/src680-m65/solenv/unxlngi4/inc -I/home/raul/HEAD/ooo-build/build/src680-m65/solenv/inc -I/home/raul/HEAD/ooo-build/build/src680-m65/res -I/home/raul/HEAD/ooo-build/build/src680-m65/solver/680/unxlngi4.pro/inc/stl -I/home/raul/HEAD/ooo-build/build/src680-m65/solenv/inc/Xp31 -I/usr/lib/SunJava2-1.4.2/include -I/usr/lib/SunJava2-1.4.2/include/linux -I/usr/lib/SunJava2-1.4.2/include/native_threads/include -I/usr/X11R6/include     -I. -I../res -I. -O1   -pipe -mcpu=pentiumpro -Wno-ctor-dtor-privacy -include preinclude.h -fno-exceptions   -fpic -DLINUX -DUNX -DVCL -DGCC -DC300 -DINTEL -DGXX_INCLUDE_PATH=/usr/include/g++ -DCVER=C300 -D_USE_NAMESPACE -DGLIBC=2 -DX86 -D_PTHREADS -D_REENTRANT -DNEW_SOLAR -D_USE_NAMESPACE=1 -DSTLPORT_VERSION=400 -D__DMAKE -DUNIX -DCPPU_ENV=gcc3 -DSUPD=680 -DPRODUCT -DNDEBUG -DPRODUCT_FULL -DOSL_DEBUG_LEVEL=0 -DOPTIMIZE -DEXCEPTIONS_OFF -DCUI -DSOLAR_JAVA -DSRC680   -DSHAREDLIB -D_DLL_  -DMULTITHREAD  -o ../unxlngi4.pro/slo/helloworld.o /home/raul/HEAD/ooo-build/build/src680-m65/helloworld/source/helloworld.cxx
if ( -e ../unxlngi4.pro/slo/helloworld.o) touch ../unxlngi4.pro/slo/helloworld.obj
-----------------------------------------------
Making: ../unxlngi4.pro/slb/helloworld.lib
echo unxlngi4.pro/slo/helloworld.o | xargs -n1 > ../unxlngi4.pro/slb/helloworld.lib
-----------------------------------------------

Yo! Houston, we have an object file :-D

hmm... But where the objective is to use this function from a different top-level project, we need a library we can link to, so let's make up a shared object library that we can link to by adding in a couple of lines to our makefile.mk:

--- helloworld/source/makefile.mk.orig  2005-01-11 11:37:30.282214135 +0530
+++ helloworld/source/makefile.mk       2005-01-11 11:37:23.945251721 +0530
@@ -13,6 +13,9 @@
 SLOFILES=\
        $(SLO)$/helloworld.obj
 
+SHL1TARGET=    hworld$(UPD)$(DLLPOSTFIX)
+SHL1LIBS=      $(SLB)$/helloworld.lib
+
 # --- Targets ----------------------------------
 
 .INCLUDE : target.mk

The $UPD and $DLLPOSTFIX result in making up the final library as libhworld680li.so, the helloworld.lib includes the crucial symbols to link against and we 'build':

build -- version: 1.130

/home/raul/HEAD/ooo-build/build/src680-m65/helloworld/source
mkout -- version: 1.3
-----------------------------------------------
Making: ../unxlngi4.pro/misc/helloworld.dpc
dmake subdmake=true  -f makefile.mk  depend=t ALLDPC
Making : Dependencies
touch ../unxlngi4.pro/misc/helloworld.dpc
-----------------------------------------------
Making: ../unxlngi4.pro/slo/helloworld.obj
g++ -Wuninitialized -fmessage-length=0 -c -I.  -I. -I../inc -I../inc -I../unx/inc -I../unxlngi4.pro/inc -I. -I/home/raul/HEAD/ooo-build/build/src680-m65/solver/680/unxlngi4.pro/inc/stl -I/home/raul/HEAD/ooo-build/build/src680-m65/solver/680/unxlngi4.pro/inc/external -I/home/raul/HEAD/ooo-build/build/src680-m65/solver/680/unxlngi4.pro/inc -I/home/raul/HEAD/ooo-build/build/src680-m65/solenv/unxlngi4/inc -I/home/raul/HEAD/ooo-build/build/src680-m65/solenv/inc -I/home/raul/HEAD/ooo-build/build/src680-m65/res -I/home/raul/HEAD/ooo-build/build/src680-m65/solver/680/unxlngi4.pro/inc/stl -I/home/raul/HEAD/ooo-build/build/src680-m65/solenv/inc/Xp31 -I/usr/lib/SunJava2-1.4.2/include -I/usr/lib/SunJava2-1.4.2/include/linux -I/usr/lib/SunJava2-1.4.2/include/native_threads/include -I/usr/X11R6/include     -I. -I../res -I. -O1   -pipe -mcpu=pentiumpro -Wno-ctor-dtor-privacy -include preinclude.h -fno-exceptions   -fpic -DLINUX -DUNX -DVCL -DGCC -DC300 -DINTEL -DGXX_INCLUDE_PATH=/usr/include/g++ -DCVER=C300 -D_USE_NAMESPACE -DGLIBC=2 -DX86 -D_PTHREADS -D_REENTRANT -DNEW_SOLAR -D_USE_NAMESPACE=1 -DSTLPORT_VERSION=400 -D__DMAKE -DUNIX -DCPPU_ENV=gcc3 -DSUPD=680 -DPRODUCT -DNDEBUG -DPRODUCT_FULL -DOSL_DEBUG_LEVEL=0 -DOPTIMIZE -DEXCEPTIONS_OFF -DCUI -DSOLAR_JAVA -DSRC680   -DSHAREDLIB -D_DLL_  -DMULTITHREAD  -o ../unxlngi4.pro/slo/helloworld.o /home/raul/HEAD/ooo-build/build/src680-m65/helloworld/source/helloworld.cxx
if ( -e ../unxlngi4.pro/slo/helloworld.o) touch ../unxlngi4.pro/slo/helloworld.obj
-----------------------------------------------
Making: ../unxlngi4.pro/slb/helloworld.lib
echo unxlngi4.pro/slo/helloworld.o | xargs -n1 > ../unxlngi4.pro/slb/helloworld.lib
cp -f /home/raul/HEAD/ooo-build/build/src680-m65/solenv/src/default_description.xml ../unxlngi4.pro/misc/hworld_dflt.xml
xml2cmp -func ../unxlngi4.pro/misc/hworld_dflt_description.cxx ../unxlngi4.pro/misc/hworld_dflt.xml
File ../unxlngi4.pro/misc/hworld_dflt_description.cxx with component_getDescriptionFunc() is created now.
-----------------------------------------------
Making: ../unxlngi4.pro/slo/hworld_dflt_description.obj
g++ -Wuninitialized -fmessage-length=0 -c -I.  -I. -I../inc -I../inc -I../unx/inc -I../unxlngi4.pro/inc -I. -I/home/raul/HEAD/ooo-build/build/src680-m65/solver/680/unxlngi4.pro/inc/stl -I/home/raul/HEAD/ooo-build/build/src680-m65/solver/680/unxlngi4.pro/inc/external -I/home/raul/HEAD/ooo-build/build/src680-m65/solver/680/unxlngi4.pro/inc -I/home/raul/HEAD/ooo-build/build/src680-m65/solenv/unxlngi4/inc -I/home/raul/HEAD/ooo-build/build/src680-m65/solenv/inc -I/home/raul/HEAD/ooo-build/build/src680-m65/res -I/home/raul/HEAD/ooo-build/build/src680-m65/solver/680/unxlngi4.pro/inc/stl -I/home/raul/HEAD/ooo-build/build/src680-m65/solenv/inc/Xp31 -I/usr/lib/SunJava2-1.4.2/include -I/usr/lib/SunJava2-1.4.2/include/linux -I/usr/lib/SunJava2-1.4.2/include/native_threads/include -I/usr/X11R6/include     -I. -I../res -I. -O1   -pipe -mcpu=pentiumpro -Wno-ctor-dtor-privacy -include preinclude.h -fno-exceptions   -fpic -DLINUX -DUNX -DVCL -DGCC -DC300 -DINTEL -DGXX_INCLUDE_PATH=/usr/include/g++ -DCVER=C300 -D_USE_NAMESPACE -DGLIBC=2 -DX86 -D_PTHREADS -D_REENTRANT -DNEW_SOLAR -D_USE_NAMESPACE=1 -DSTLPORT_VERSION=400 -D__DMAKE -DUNIX -DCPPU_ENV=gcc3 -DSUPD=680 -DPRODUCT -DNDEBUG -DPRODUCT_FULL -DOSL_DEBUG_LEVEL=0 -DOPTIMIZE -DEXCEPTIONS_OFF -DCUI -DSOLAR_JAVA -DSRC680   -DSHAREDLIB -D_DLL_  -DMULTITHREAD  -o ../unxlngi4.pro/slo/hworld_dflt_description.o ../unxlngi4.pro/misc/hworld_dflt_description.cxx
if ( -e ../unxlngi4.pro/slo/hworld_dflt_description.o) touch ../unxlngi4.pro/slo/hworld_dflt_description.obj
-----------------------------------------------
SHL1FILTERFILE not set!
-----------------------------------------------
dummy file to keep the dependencies for later use.
cp -f /home/raul/HEAD/ooo-build/build/src680-m65/solenv/src/version.c ../unxlngi4.pro/misc/hworld_dflt_version.c
-----------------------------------------------
Making: ../unxlngi4.pro/slo/hworld_dflt_version.obj
gcc -Wuninitialized -fmessage-length=0 -c -I.  -I. -I../inc -I../inc -I../unx/inc -I../unxlngi4.pro/inc -I. -I/home/raul/HEAD/ooo-build/build/src680-m65/solver/680/unxlngi4.pro/inc/dont_use_stl -I/home/raul/HEAD/ooo-build/build/src680-m65/solver/680/unxlngi4.pro/inc/external -I/home/raul/HEAD/ooo-build/build/src680-m65/solver/680/unxlngi4.pro/inc -I/home/raul/HEAD/ooo-build/build/src680-m65/solenv/unxlngi4/inc -I/home/raul/HEAD/ooo-build/build/src680-m65/solenv/inc -I/home/raul/HEAD/ooo-build/build/src680-m65/res -I/home/raul/HEAD/ooo-build/build/src680-m65/solver/680/unxlngi4.pro/inc/dont_use_stl -I/home/raul/HEAD/ooo-build/build/src680-m65/solenv/inc/Xp31 -I/usr/lib/SunJava2-1.4.2/include -I/usr/lib/SunJava2-1.4.2/include/linux -I/usr/lib/SunJava2-1.4.2/include/native_threads/include -I/usr/X11R6/include     -I. -I../res -I. -O1   -pipe -mcpu=pentiumpro -fpic -DLINUX -DUNX -DVCL -DGCC -DC300 -DINTEL -DGXX_INCLUDE_PATH=/usr/include/g++ -DCVER=C300 -D_USE_NAMESPACE -DGLIBC=2 -DX86 -D_PTHREADS -D_REENTRANT -DNEW_SOLAR -D_USE_NAMESPACE=1 -DSTLPORT_VERSION=400 -D__DMAKE -DUNIX -DCPPU_ENV=gcc3 -DSUPD=680 -DPRODUCT -DNDEBUG -DPRODUCT_FULL -DOSL_DEBUG_LEVEL=0 -DOPTIMIZE -DEXCEPTIONS_OFF -DCUI -DSOLAR_JAVA -DSRC680   -DSHAREDLIB -D_DLL_   -o ../unxlngi4.pro/slo/hworld_dflt_version.o ../unxlngi4.pro/misc/hworld_dflt_version.c
if ( -e ../unxlngi4.pro/slo/hworld_dflt_version.o) touch ../unxlngi4.pro/slo/hworld_dflt_version.obj
-----------------------------------------------
Making: ../unxlngi4.pro/lib/libhworld680li.so
gcc -O2 -Bsymbolic -z combreloc -z defs -Wl,-rpath,'$ORIGIN' -shared -L../unxlngi4.pro/lib -L../lib -L/home/raul/HEAD/ooo-build/build/src680-m65/solenv/unxlngi4/lib -L/home/raul/HEAD/ooo-build/build/src680-m65/solver/680/unxlngi4.pro/lib -L/home/raul/HEAD/ooo-build/build/src680-m65/solenv/unxlngi4/lib -L/usr/lib/SunJava2-1.4.2/lib -L/usr/lib/SunJava2-1.4.2/jre/lib/i386 -L/usr/lib/SunJava2-1.4.2/jre/lib/i386/client -L/usr/lib/SunJava2-1.4.2/jre/lib/i386/native_threads -L/usr/X11R6/lib ../unxlngi4.pro/slo/hworld_dflt_version.o ../unxlngi4.pro/slo/hworld_dflt_description.o -o ../unxlngi4.pro/lib/libhworld680li.so ../unxlngi4.pro/slo/helloworld.o -ldl -lpthread -lm -Wl,-Bdynamic -lstlport_gcc -lstdc++
rm -f ../unxlngi4.pro/lib/check_libhworld680li.so
mv ../unxlngi4.pro/lib/libhworld680li.so ../unxlngi4.pro/lib/check_libhworld680li.so
/home/raul/HEAD/ooo-build/build/src680-m65/solenv/bin/checkdll.sh -L../unxlngi4.pro/lib -L../lib -L/home/raul/HEAD/ooo-build/build/src680-m65/solenv/unxlngi4/lib -L/home/raul/HEAD/ooo-build/build/src680-m65/solver/680/unxlngi4.pro/lib -L/home/raul/HEAD/ooo-build/build/src680-m65/solenv/unxlngi4/lib -L/usr/lib/SunJava2-1.4.2/lib -L/usr/lib/SunJava2-1.4.2/jre/lib/i386 -L/usr/lib/SunJava2-1.4.2/jre/lib/i386/client -L/usr/lib/SunJava2-1.4.2/jre/lib/i386/native_threads -L/usr/X11R6/lib ../unxlngi4.pro/lib/check_libhworld680li.so
Checking DLL ../unxlngi4.pro/lib/check_libhworld680li.so ...: ok
-rwxr-xr-x  1 raul users 7742 2005-01-11 13:14 ../unxlngi4.pro/lib/libhworld680li.so
-----------------------------------------------

We rock! :-)

So where would our wonderful library be ? In the intuitively named unxlngi4.pro directory under the top-level helloworld project. Why the name ? unx for the wonderful platform; lng for the operating system and compiler; i for the processor; 4 for the incremental version of compiler user and pro for product ? So based on that info wntmsci10.pro sounds logical too :-) The file specifying these is in solenv/config/ssrx645.ini and solenv/config/ssrc680.ini, though I am yet to figure out what an srx is from an src :-D


helloworld-ooo-style.diff Next: Tutorial_Client
Personal tools