Before writing the client, let's generate a Fortran implementation as well. It is highly instructive to see how the makefiles differ between the different language bindings. From within the minimal/libCxx directory we do.
% cd ../libF90
% babel -makefile -sF90 ../../hello.sidl
This time there's even more files generated (Fortran 90 bindings are harder after all), and we need to add our implementation to the Hello_World_Impl.F90 file. The modified code will look like this.
1 !
2 ! Method: getMsg[]
3 !
4
5 recursive subroutine Hello_World_getMsg_mi(self, retval, exception)
6 use sidl
7 use sidl_BaseInterface
8 use sidl_RuntimeException
9 use Hello_World
10 use Hello_World_impl
11 ! DO-NOT-DELETE splicer.begin(Hello.World.getMsg.use)
12 ! Insert-Code-Here {Hello.World.getMsg.use} (use statements)
13 ! DO-NOT-DELETE splicer.end(Hello.World.getMsg.use)
14 implicit none
15 type(Hello_World_t) :: self ! in
16 character (len=*) :: retval ! out
17 type(sidl_BaseInterface_t) :: exception ! out
18
19 ! DO-NOT-DELETE splicer.begin(Hello.World.getMsg)
20 retval='Hello from Fortran 90!'
21 ! DO-NOT-DELETE splicer.end(Hello.World.getMsg)
22 end subroutine Hello_World_getMsg_mi
23
Note that the C function appears as a subroutine in Fortran. What was the return value appears here as the argument retval (line 5). For Fortran 90 there are also two splicer blocks per subroutine, one for use statements (lines 11-13) and another for the actual implementation (lines 19-21). This is where we put our implementation by setting retval to the string we want.
There are important differences in this Makefile from the C++ implementation, so we reproduce it in its entirety here.
1 include babel.make
2 # please name the server library here
3 LIBNAME=hello
4 # please name the SIDL file here
5 SIDLFILE=../../hello.sidl
6 # extra include/compile flags
7 EXTRAFLAGS=
8 # extra librarys that the implementation needs to link against
9 EXTRALIBS=
10 # library version number
11 VERSION=0.1.1
12 # PREFIX specifies the top of the installation directory
13 PREFIX=/usr/local
14 # the default installation installs the .la and .scl (if any) into the
15 # LIBDIR
16 LIBDIR=$(PREFIX)/lib
17 # the default installation installs the stub header and IOR header files
18 # in INCLDIR
19 INCLDIR=$(PREFIX)/include
20
21 # most of the rest of the file should not require editing
22
23 ifeq ($(IMPLSRCS),)
24 SCLFILE=
25 BABELFLAG=--client=f90
26 MODFLAG=
27 else
28 SCLFILE=lib$(LIBNAME).scl
29 BABELFLAG=--server=f90
30 MODFLAG=-module
31 endif
32
33 all : lib$(LIBNAME).la $(SCLFILE)
34
35 CC=`babel-config --query-var=CC`
36 CPP=`babel-config --query-var=CPP`
37 FC=`babel-config --query-var=FC`
38 INCLUDES=`babel-config --includes` `babel-config --includes-f90`
39 CFLAGS=`babel-config --flags-c`
40 FCFLAGS=`babel-config --flags-f90`
41 MODINCLUDES=`babel-config --includes-f90-mod`
42 LIBS=`babel-config --libs-f90-client`
43 F90CPPSUFFIX=`babel-config --query-var=F90CPPSUFFIX`
44
45 STUBOBJS=$(STUBSRCS:.c=.lo)
46 STUBMODULEOBJS=$(STUBMODULESRCS:.F90=.lo)
47 TYPEMODULEOBJS=$(TYPEMODULESRCS:.F90=.lo)
48 IOROBJS=$(IORSRCS:.c=.lo)
49 SKELOBJS=$(SKELSRCS:.c=.lo)
50 IMPLOBJS=$(IMPLSRCS:.F90=.lo)
51 IMPLMODULEOBJS=$(IMPLMODULESRCS:.F90=.lo)
52 BASICMODULEOBJ=$(BASICMODULESRC:.F90=.lo)
53 ARRAYMODULEOBJS=$(ARRAYMODULESRCS:.F90=.lo)
54 ALLOBJS=$(STUBOBJS) $(STUBMODULEOBJS) $(TYPEMODULEOBJS) $(IOROBJS) \
55 $(SKELOBJS) $(IMPLOBJS) $(IMPLMODULEOBJS) $(BASICMODULEOBJ) \
56 $(ARRAYMODULEOBJS)
57
58 PUREBABELGEN=$(ARRAYMODULESRCS) $(BASICMODULESRC) $(STUBMODULESRCS) \
59 $(TYPEMODULESRCS) \
60 $(IORHDRS) $(IORSRCS) $(STUBSRCS) $(STUBHDRS) $(SKELSRCS)
61 BABELGEN=$(IMPLSRCS) $(IMPLMODULESRCS)
62
63 $(TYPEMODULEOBJS) : $(BASICMODULEOBJ)
64 $(ARRAYMODULEOBJS) : $(TYPEMODULEOBJS)
65 $(STUBMODULEOBJS) : $(ARRAYMODULEOBJS) $(TYPEMODULEOBJS)
66 $(IMPLMODULEOBJS) : $(STUBMODULEOBJS)
67 $(IMPLOBJS) : $(IMPLMODULEOBJS) $(STUBMODULEOBJS) \
68
69 lib$(LIBNAME).la : $(ALLOBJS)
70 babel-libtool --mode=link --tag=FC $(FC) -o lib$(LIBNAME).la \
71 -rpath $(LIBDIR) -release $(VERSION) \
72 -no-undefined $(MODFLAG) \
73 $(FCFLAGS) $(EXTRAFLAGS) $^ $(LIBS) \
74 $(EXTRALIBS)
75
76 $(PUREBABELGEN) $(BABELGEN) : babel-stamp
77 @if test -f $@; then \
78 touch $@; \
79 else \
80 rm -f babel-stamp ; \
81 $(MAKE) babel-stamp; \
82 fi
83
84 babel-stamp: $(SIDLFILE)
85 @rm -f babel-temp
86 @touch babel-temp
87 babel $(BABELFLAG) $(SIDLFILE)
88 @mv -f babel-temp $@
89
90 lib$(LIBNAME).scl : $(IORSRCS)
91 ifeq ($(IORSRCS),)
92 echo "lib$(LIBNAME).scl is not needed for client-side C bindings."
93 else
94 -rm -f $@
95 echo '<?xml version="1.0" ?>' > $@
96 echo '<scl>' >> $@
97 if test `uname` = "Darwin"; then scope="global"; else scope="local"; \
98 fi ; \
99 echo ' <library uri="'`pwd`/lib$(LIBNAME).la'" scope="'"$$scope"'" resolution="lazy" >' >> $@
100 grep __set_epv $^ /dev/null | awk 'BEGIN {FS=":"} { print $$1}' | sort -u | sed -e 's/_IOR.c//g' -e 's/_/./g' | awk ' { printf " <class name=\"%s\" desc=\"ior/impl\" />\n", $$1 }' >>$@
101 echo " </library>" >>$@
102 echo "</scl>" >>$@
103 endif
104
105 .SUFFIXES: .lo .F90 .c
106
107 .c.lo:
108 babel-libtool --mode=compile --tag=CC $(CC) $(INCLUDES) $(CFLAGS) $(EXTRAFLAGS) -c -o $@ $<
109
110 .F90.lo:
111 $(CPP) -traditional $(INCLUDES) -P -o $(@:.lo=.tmp) -x c $<
112 sed -e 's/^#pragma.*$$//' < $(@:.lo=.tmp) > $(@:.lo=$(F90CPPSUFFIX))
113 babel-libtool --mode=compile --tag=FC $(FC) $(MODINCLUDES) $(FCFLAGS) -c -o $@ $(@:.lo=$(F90CPPSUFFIX))
114 rm -f $(@:.lo=$(F90CPPSUFFIX)) $(@:.lo=.tmp)
115
116 clean :
117 -rm -f $(PUREBABELGEN) babel-temp babel-stamp *.o *.lo *.mod
118
119 realclean : clean
120 -rm -f lib$(LIBNAME).la lib$(LIBNAME).scl
121 -rm -rf .libs
122
123 install : install-libs install-headers install-scl
124
125
126 install-libs : lib$(LIBNAME).la
127 -mkdir -p $(LIBDIR)
128 babel-libtool --mode=install install -c lib$(LIBNAME).la \
129 $(LIBDIR)/lib$(LIBNAME).la
130
131 install-scl : $(SCLFILE)
132 ifneq ($(IORSRCS),)
133 -mkdir -p $(LIBDIR)
134 -rm -f $(LIBDIR)/lib$(LIBNAME).scl
135 echo '<?xml version="1.0" ?>' > $(LIBDIR)/lib$(LIBNAME).scl
136 echo '<scl>' >> $(LIBDIR)/lib$(LIBNAME).scl
137 if test `uname` = "Darwin"; then scope="global"; else scope="local"; \
138 fi ; \
139 echo ' <library uri="'$(LIBDIR)/lib$(LIBNAME).la'" scope="'"$$scope"'" resolution="lazy" >' >> $(LIBDIR)/lib$(LIBNAME).scl
140 grep __set_epv $^ /dev/null | awk 'BEGIN {FS=":"} { print $$1}' | sort -u | sed -e 's/_IOR.c//g' -e 's/_/./g' | awk ' { printf " <class name=\"%s\" desc=\"ior/impl\" />\n", $$1 }' >>$(LIBDIR)/lib$(LIBNAME).scl
141 echo " </library>" >>$(LIBDIR)/lib$(LIBNAME).scl
142 echo "</scl>" >>$(LIBDIR)/lib$(LIBNAME).scl
143 endif
144
145 install-headers : $(IORHDRS) $(STUBHDRS) $(STUBDOCS)
146 -mkdir -p $(INCLDIR)
147 for i in $^ ; do \
148 babel-libtool --mode=install cp $$i $(INCLDIR)/$$i ; \
149 done
150
151 .PHONY: all clean realclean install install-libs install-headers install-scl
Again, we simply type make, and should end up with another libhello.la file.