Entries Tagged as ''

Working through the Openismus’s example code for Automake (Part 2)

I’ve been working on dissecting so sample code from the Openismus site for Automake.

I was searching through code search to post a link here and I noticed that they had basic sample projects for creating and installing libraries.  I’m still focused on reviewing the basic Automake, perhaps this will be a topic for another day.

Based on what I’ve learned from the most excellent EPITA – LRD tutorial, the main files, from which everything else sprouts are the configure.ac and makefile.am’s that occur in the project.

So… In the previous post I tore apart the configure.ac (which had deprecated features in it).

Today, I want to look at the makefile.am’s in the project:helloworld_cc-0.3.tar.gz

The sample project download on my machine and look like this:

jonas@Ubuntu4:~/helloworld_cc-0.3$ ls -1 -R
.:
aclocal.m4
AUTHORS
autogen.sh
ChangeLog
config.guess
config.h
config.h.in
config.log
config.status
config.sub
configure
configure.ac
COPYING
depcomp
INSTALL
install-sh
libtool
ltmain.sh
Makefile
Makefile.am
Makefile.in
missing
mkinstalldirs
NEWS
README
src
stamp-h1
./src:
foofiles
hello
hello.cc
hello.h
hello.o
main.cc
main.o
Makefile
Makefile.am
Makefile.in

./src/foofiles:
foo.cc
foo.h
foo.o
libfoo.a
Makefile
Makefile.am
Makefile.in
jonas@Ubuntu4:~/helloworld_cc-0.3$

There are 3 Makefile.am’s files to look at.

I was looking at these files:

I think that before I dive into this, I need to do a little basic research on what all this Makefile stuff is all about for context… I found some interesting stuff here which I need to digest.

On the most excellent EPITA – LRD tutorial,  Automake starts around page 295.

Btw,, Openismus discusses the non self-explanatory macros pretty well as far as what’s going on..

The LRD tutorial talks (~311)about the FHS , This  wiki link describes it pretty well.

I think I may have bit a few do many data sources in one bite here.  This is somewhat overwhelming to someone who grew up in the Ms-dos world…. Yikes…..

Ok… Time to break this down into little itty bitty pieces so this goes down easier.

Makefile.am

SUBDIRS = src
EXTRA_DIST=autogen.sh

Page 332 of the LRD tutorial discuss SUBDIRS

Points made:

  • One Makefile ergo, one Makefile.am per directory
  • You run make from the top directory
  • It figures out where to go by navigate through the directories called out in SUBDIRS in the individual make files.
  • All the Makefiles are declared in configure.ac

So the contents of configure.ac are;

AC_INIT(src/hello.cc)
AM_INIT_AUTOMAKE(helloworld_cc,0.3)
AM_CONFIG_HEADER(config.h)

AC_PROG_CC
AC_PROG_CXX
AC_PROG_INSTALL
AC_PROG_LIBTOOL
AC_OUTPUT(Makefile src/Makefile src/foofiles/Makefile)

Wow that was scary. It makes perfect sense.

Lets see what I can find as far as that deal with the EXTRA_DIST:

Page 359 in the tutorial says, EXTRA_DIST comes into play in the creation of tarballs. It’s used for adding extra files above and beyond what is normally done in the process.

While reading the linked wiki page about tarballs there was some discussion about tarbombs. This is something I’m going to need to research in the furture, when I get to the point of having some applications I wish to distribute.

./src/Makefile.am

bin_PROGRAMS = hello

hello_SOURCES = hello.h hello.cc main.cc

SUBDIRS = foofiles

LDADD = foofiles/libfoo.a

The first three lines make sense to me, So that leaves LDADD. Basically has to do with letting up libraries.  Page 427 of the tutorial EPITA – LRD tutorial, discusses that…  Back in a few minutes….

Ok… this LDADD is still a bit fuzzy for me, gut here’s what I got out of the tutorial. LDADD is the command that you use when linking up a library.  LDADD by itself without a lower case prefix is the global form.

According to the tutorial you’ll see the library name with a “la” suffix when you’re using a full library.  not the “a” we have here… When Automake runs across the “la” will figure out whether it should has a  .so or .dll extension depending on your os.    The “.a” is a convenience used when building the library (I hope I read that right).

Ok.. (page 438) apparently to use a library you need to cover your bases so to speak in three spots: configure.ac (AC_PROG_LIBTOOL), Makefile.am  (LDADD ) where you want to link, Makefile.am(LTLIBRARIES) what your linking.. Lets see

configure.ac

AC_INIT(src/hello.cc)
AM_INIT_AUTOMAKE(helloworld_cc,0.3)
AM_CONFIG_HEADER(config.h)
AC_PROG_CC
AC_PROG_CXX
AC_PROG_INSTALL
AC_PROG_LIBTOOL

AC_OUTPUT(Makefile src/Makefile src/foofiles/Makefile)

./src/Makefile.am

bin_PROGRAMS = hello
hello_SOURCES = hello.h hello.cc main.cc
SUBDIRS = foofiles

LDADD = foofiles/libfoo.a

./src/foofiles/Makefile.am

noinst_LIBRARIES = libfoo.a

libfoo_a_SOURCES = foo.h foo.cc

INCLUDE = -I@top_srcdir@/

#$% I was hoping for a match between the tutorial and the code… There is a difference in that the tutorial refers to “LTLIBRARY” and the code has plain “LIBRARY” So I’m not sure is LT is used with .la extensions only or If “LIBRARY” is something deprecated… The tutorial really seems to like LTLIBRARY… Off to GNU land…

Ok… I’m still confused..

I found some reference http://ftp.gnu.org/old-gnu/Manuals/automake-1.6.1/html_chapter/automake_9.html#SEC30

Doesn’t say anything about deprecation but having old_gnu in the hyperlink doesn’t make me feel any better.

Ok…. Back to my favorite tutorial.. It looks like talks about _LIBRARIES and _LTLIBRARIES (Libtool libraries)  Off to wikipedia

I’m not seeing this explicitely stated, but It sound like LTLIBRARIES invokes the big guns of libtool cross platform support, and plain old LIBRARIES doesn’t….  My head is starting to ache So I’m moving on to ./src/foofiles/Makefile.am

./src/foofiles/Makefile.am

noinst_LIBRARIES = libfoo.a

libfoo_a_SOURCES = foo.h foo.cc

INCLUDE = -I@top_srcdir@/

So here’s a link that describes whats going on with noinst_LIBRARIES

That link and couple of buzzword terms that I’ve seen and never bothered to understand.

canonicalize

Obfuscation

Now it sort of  makes sense why libfoo.a turns gets referenced as libfoo_a in the next line..
So…. that leaves “INCLUDE = -I@top_srcdir@/”
So… I found that top_srcdir is a makefile variable.  I need think I know what’s going on here but not well enough to explain.   I need to find a line that explains the use of @’s and $’s.
I found a link that sort explains the “@” aka the strudel. Basically here’s the pertinent code:

3.4 How derived variables are named

Sometimes a Makefile variable name is derived from some text the maintainer supplies. For instance, a program name listed in ‘_PROGRAMS’ is rewritten into the name of a ‘_SOURCES’ variable. In cases like this, Automake canonicalizes the text, so that program names and the like do not have to follow Makefile variable naming rules. All characters in the name except for letters, numbers, the strudel (@), and the underscore are turned into underscores when making variable references.

For example, if your program is named sniff-glue, the derived variable name would be ‘sniff_glue_SOURCES’, not ‘sniff-glue_SOURCES’. Similarly the sources for a library named libmumble++.a should be listed in the ‘libmumble___a_SOURCES’ variable.

The strudel is an addition, to make the use of Autoconf substitutions in variable names less obfuscating.

I need to move on too somthing else….

Working through the Openismus’s example code for Automake (Part 1)

I’m trying to spruce up my site a little bit.  I’ve been working on my favorites page.  I almost have it the way I like it.  I need figure out how to modify my WordPress  template so the page looks correct.
As good as a reason as any to give my sister(the web-design expert) a call to yak with..:)
Ok… I’m moving along here, I downloaded the example source from:
http://www.openismus.com/documents/linux/automake/automake.shtml
It basically has a very simple program with a whole bunch going on.

This whole project merits some close scrutiny.
Outside of the source source code the key files to focus on  are the configure.ac and Makefile.am‘s in the main directory and sub-directories of the project.  Here are the files in the project.

jonas@Ubuntu4:~/helloworld_cc-0.3$ ls -R
.:
aclocal.m4  ChangeLog     config.h.in    config.sub    COPYING  install-sh  Makefile     missing        README
AUTHORS     config.guess  config.log     configure     depcomp  libtool     Makefile.am mkinstalldirs  src
autogen.sh  config.h      config.status  configure.ac INSTALL  ltmain.sh   Makefile.in  NEWS           stamp-h1

./src:
foofiles  hello  hello.cc  hello.h  hello.o  main.cc  main.o  Makefile  Makefile.am Makefile.in

./src/foofiles:
foo.cc  foo.h  foo.o  libfoo.a  Makefile  Makefile.am Makefile.in
jonas@Ubuntu4:~/helloworld_cc-0.3$

The contents of the configure.ac are as follows. (I linked each macro to the appropriate  gnu help reference.)  I guess I should point out that italic macro commands  are deprecated.

configure.ac

AC_INIT(src/hello.cc)
AM_INIT_AUTOMAKE(helloworld_cc,0.3)
AM_CONFIG_HEADER(config.h)

AC_PROG_CC
AC_PROG_CXX
AC_PROG_INSTALL
AC_PROG_LIBTOOL
AC_OUTPUT(Makefile src/Makefile src/foofiles/Makefile)

So… I guess when I get done dissecting this stuff, I should know enough on how to redo to the  current state of the art..;)
A few points of interest in the gnu caught my eye an bear repeating so I can burn it into my brain.

  • A configure script will always begin with a AC_INIT and should end with a AC_OUTPUT.

The modified sample below is old school according to the gnu manual:

If your configure.ac has:

          AC_INIT([src/notourfoo.c])
          AM_INIT_AUTOMAKE([mumble], [1.5])

you can modernize it as follows:

          AC_INIT([mumble], [1.5])
          AC_CONFIG_SRCDIR([src/notourfoo.c])
          AM_INIT_AUTOMAKE
  • The AC_CONFIG_SRCDIR is considered to be a safety check.
  • This is new school:AM_INIT_AUTOMAKE([OPTIONS])
  • This is old school: AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
  • autoconf macros start with an "AC_"
  • automake macros start with an "AM_"

Ok… I got to AC_PROG_CC  which is the option of which c compiler to run.   I ran a interesting link that talks about this.  I guess it’s req’d to have the thing run correctly.  I suppose if you’re a geek supreme(I’m not), your going to have multiple compilers on your system.

AC_PROG_CXX is similar to AC_PROG_CC except for C++

Lets see what’s left,
AC_PROG_INSTALL
For me at the moment I’m just content running config and make… Sooner or later I suppose, I’ll need this but for now the explanation in the gnu help files works for me:
Set output variable INSTALL to the name of a BSD-compatible install program, if one is found in the current PATH. Otherwise, set INSTALL to `dir/install-sh -c‘, checking the directories specified to AC_CONFIG_AUX_DIR (or its default directories) to determine dir (see Output). Also set the variables INSTALL_PROGRAM and INSTALL_SCRIPT to `${INSTALL}‘ and INSTALL_DATA to `${INSTALL} -m 644‘.
This Linux/Unix stuff is still relatively new to me, I was curious what the deal is with BSD
There’s an interesting factoid about the link.. The world owes one to the Lawyers.  According to the page, if BSD wasn’t mired in lawsuits Linus Torvadis, may not have had the need to create Linux… Funny how the world works..
— Macro: AC_PROG_LIBTOOL
(straight from gnu:”If you are using GNU Autoconf (or Automake), you should add a call to AC_PROG_LIBTOOL to your configure.in file. This macro adds many new tests to the configure script so that the generated libtool script will understand the characteristics of the host: “
Good enough for me.

Taking a little time to regroup

Well, I got the demo working in the  autotools tutorial at http://www.lrde.epita.fr/~adl/autotools.htmlI sort of embarrassed and called for help on the ubuntuforums prematurely.
Note to self, watch out for whitespace in configure.ac and carefull cutting and pasting text from pdf’s and expecting the “-”‘s and “”"‘s to be the one’s that gnu expect.
I feel as if I was stuck in a rut for the last couple of weeks, but am still in the hole but finally starting to get some traction.
On the otherhand, I run across these incredible resources and thought I should come up with a useful links page.   So it goes….Useful and interesting links

Running through the autotools tutorial

Picking up from my last post:
http://www.lrde.epita.fr/~adl/autotools.html
Hm…. Page 95 of the tutorial gets interesting with a hello world example…

This make, autotools stuff is really confusing to me and the way I look at it is that I’m better offer getting a handle on this sooner rather than later.

Btw.. This pdf tutorial works much nicer with an adobe reader(which I downloaded from Medibuntu rather than Evince document viewer.  Carriage return works with adobe and the pages will page rather than scroll.   You need to flip through the pages to understand whats going on since its drawn like a cartoon.
Anyway back to business.
I’m starting out around page 95 of this tutorial..
I created a main.c program which I copied from the text (which by the way everything had spacing between the letters(I too figure out why one day)).
So….. Things look like this..

jonas@Ubuntu4:~/Hello_world_gnu$ ls -R
.:
src

./src:
main.c  main.c~
jonas@Ubuntu4:~/Hello_world_gnu$

Now.. Now the page that interests me is the slide titled: “‘autoreconf’ is Your Friend” on page 143.
Friends are a good thing…. Supposedly to get started you need to use “autoreconf –install” to setup the package initially… Well…. Lets see what happens for me.

jonas@Ubuntu4:~/Hello_world_gnu$ autoreconf –install
autoreconf: `configure.ac’ or `configure.in’ is required
jonas@Ubuntu4:~/Hello_world_gnu$

You know, I kind of thought that was going to happen… Really I did…
I haven’t run across the configure.in in the tutorial  I just did a search through the document… Nada…. I have seen a bunch with this configure.ac though. (178 hits to be exact).

Now pages 97-106 seems to be the meat and potatoes of what I’m looking for.  In particular:

  • configure.ac,
  • Makefile.am,
  • src/Makefile.am

It looks like these are the three critical files to get the Autotools to work(I think but do not know at this point).
I’m getting the impression that I’m on the hook to compose these manually myself..
@#%, I’m running out of time here…. Need to get to work…
I want to first try making the configure.ac and see what happens:

jonas@Ubuntu4:~/Hello_world_gnu$ autoreconf –install
configure:1987: error: possibly undefined macro: AC_PACKAGE_TARNAME
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
configure:1988: error: possibly undefined macro: AC_PACKAGE_VERSION
autoreconf: /usr/bin/autoconf failed with exit status: 1
jonas@Ubuntu4:~/Hello_world_gnu$ ls -R
.:
aclocal.m4  autom4te.cache  configure  configure.ac  configure.ac~  src

./autom4te.cache:
output.0  output.1  requests  traces.0  traces.1

./src:
main.c  main.c~
jonas@Ubuntu4:~/Hello_world_gnu$

I’m not sure I like where this is heading… I’m going to delete everything that got auto created and add the

  • Makefile.am,
  • src/Makefile.am

Per the tutorial instructions and see if I get an altered result..

jonas@Ubuntu4:~/amhello$ ls
configure.ac  Makefile.am  src
jonas@Ubuntu4:~/amhello$ autoreconf –install
configure:1987: error: possibly undefined macro: AC_PACKAGE_TARNAME
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
configure:1988: error: possibly undefined macro: AC_PACKAGE_VERSION
autoreconf: /usr/bin/autoconf failed with exit status: 1
jonas@Ubuntu4:~/amhello$ ls -R
.:
aclocal.m4  autom4te.cache  configure  configure.ac  Makefile.am  src

./autom4te.cache:
output.0  output.1  requests  traces.0  traces.1

./src:
main.c  Makefile.am
jonas@Ubuntu4:~/amhello$

Not exactly whats in the tutorial….(So what else is new.)
Ok.. So nothing in the tutorial on the following terms:
I make a bunch of silly mistakes setting up config.ac
Just ran accross another nice ref site.. http://www.cppreference.com/

Gtkmm and Opencascade

Ok… I think maybe the OCC is a bit too big of a piece to try to take on at the moment.
I just want to play with Occ and Makebottle with Gtk+ using Gtkmm.
I did some searching at lunch at game up with some interesting links:

http://www.opencascade.org/org/forum/thread_3518/

http://www.opencascade.org/org/forum/thread_8796/

http://www.opencascade.org/org/forum/thread_7427/

This looks promising

http://freebsd.ntu.edu.tw/FreeBSD/ports/local-distfiles/thierry/

This is really interesting…..

http://www.google.com/codesearch?hl=en&q=show:bAKdNAsFpkg:fAjszQnpqJk:S78yfL1Ucyo&sa=N&ct=rd&cs_p=http://edwin.iband.net/opencascade/gtkmmocascade.tar.bz2&cs_f=gtkmmocascade/MakeBottle.cpp

This google codesearch is something that I knew nothing about.  Learn something new every day. This is very very cool.
I found some code that looks simple enough to try to see if I could get it to work.
I wget’d the gtkmmocascade to see if I could get that to work…
So… never ran across a bz2 file before…  I ran across this site which explains what to do in various formats. http://www.ncsu.edu/it/essentials/managing_files/compress.html

Yehhh… go wolfpack…. Ahem anyway… According to the them this is what you do…..

Decompressing files with .bz or .bz2 endings

For a file with the extension .bz or .bz2, you must first gain access to the bzip and/or bzip2 commands by typing:

add zutils

Then, if the file ends in .bz, you uncompress it by using the command:

bzip -d filename.bz

or, if the file ends in .bz2, you uncompress it by using the command:

bzip2 -d filename.bz2

The decompressed file will appear in your directory listing, and the .bz or .bz2 will be removed.

Why did I know that wasn’t going to work of the get go..
I don’t have bzip but for some reason bzip2 is on my machine.

jonas@Ubuntu4:~/gtkmmocascade$ ls
gtkmmocascade.tar.bz2
jonas@Ubuntu4:~/gtkmmocascade$ bzip2 -d  gtkmmocascade.tar.bz2
bzip2: Can’t open input file gtkmmocascade.tar.bz2: No such file or directory.
jonas@Ubuntu4:~/gtkmmocascade$ bzip2 -d *
bzip2:  gtkmmocascade.tar.bz2 is not a bzip2 file.
jonas@Ubuntu4:~/gtkmmocascade$

Ok… This is not good…
Quick google…
http://ubuntuforums.org/archive/index.php/t-407556.html

Something looks hosed….
Time for brute force.  I can see the code from google. I guess I can try to copy and save to indivdual files.
brute for succeeds.  Now lets see if I can go anything with this code.
I took a look at make file… My Occ was set up via the deb.  So…. the make file should fail…
I guess I should confirm…

jonas@Ubuntu4:~/gtkmmocascade$ make
g++ -Wno-deprecated -I./ `pkg-config gtkmm-2.4  gtkglextmm-1.2 –cflags ` -DCSFDB -DHAVE_CONFIG_H -DHAVE_WOK_CONFIG_H -DLIN -DLININTEL -I/opt/OpenCASCADE5.2/ros/inc -I/opt/OpenCASCADE5.2/ros/src/WOKTclLib -c main.cpp -o main.o
In file included from main.cpp:2:
./gtkmmocascade.h:12:38: error: AIS_InteractiveContext.hxx: No such file or directory
./gtkmmocascade.h:14:24: error: V3d_View.hxx: No such file or directory
./gtkmmocascade.h:15:26: error: V3d_Viewer.hxx: No such file or directory
./gtkmmocascade.h:17:35: error: Geom_BSplineSurface.hxx: No such file or directory
./gtkmmocascade.h:19:37: error: AIS_InteractiveObject.hxx: No such file or directory
./gtkmmocascade.h:20:40: error: Graphic3d_NameOfMaterial.hxx: No such file or directory
./gtkmmocascade.h:22:28: error: TopoDS_Shape.hxx: No such file or directory
./gtkmmocascade.h:23:25: error: AIS_Shape.hxx: No such file or directory
./gtkmmocascade.h:25:43: error: Handle_V3d_OrthographicView.hxx: No such file or directory
./gtkmmocascade.h:26:42: error: Handle_V3d_PerspectiveView.hxx: No such file or directory
./gtkmmocascade.h:27:36: error: V3d_OrthographicView.hxx: No such file or directory
./gtkmmocascade.h:28:35: error: V3d_PerspectiveView.hxx: No such file or directory
./gtkmmocascade.h:29:29: error: Aspect_Handle.hxx: No such file or directory
./gtkmmocascade.h:30:36: error: Handle_AIS_Trihedron.hxx: No such file or directory
./gtkmmocascade.h:31:29: error: AIS_Trihedron.hxx: No such file or directory
./gtkmmocascade.h:32:35: error: Geom_Axis2Placement.hxx: No such file or directory
In file included from main.cpp:2:
./gtkmmocascade.h:63: error: ‘V3d_View’ has not been declared
./gtkmmocascade.h:63: error: ISO C++ forbids declaration of ‘Handle’ with no type
./gtkmmocascade.h:63: error: expected ‘;’ before ‘&’ token
./gtkmmocascade.h:68: error: expected `;’ before ‘Handle’
./gtkmmocascade.h:68: error: ‘V3d_Viewer’ has not been declared
./gtkmmocascade.h:68: error: ISO C++ forbids declaration of ‘Handle’ with no type
./gtkmmocascade.h:68: error: expected ‘;’ before ‘&’ token
./gtkmmocascade.h:73: error: expected `;’ before ‘Handle’
./gtkmmocascade.h:73: error: ‘AIS_InteractiveContext’ has not been declared
./gtkmmocascade.h:73: error: ISO C++ forbids declaration of ‘Handle’ with no type
./gtkmmocascade.h:73: error: expected ‘;’ before ‘&’ token
./gtkmmocascade.h:78: error: expected `;’ before ‘protected’
./gtkmmocascade.h:89: error: ‘V3d_View’ has not been declared
./gtkmmocascade.h:89: error: ISO C++ forbids declaration of ‘Handle’ with no type
./gtkmmocascade.h:89: error: expected ‘;’ before ‘myView’
./gtkmmocascade.h:90: error: ‘V3d_Viewer’ has not been declared
./gtkmmocascade.h:90: error: ISO C++ forbids declaration of ‘Handle’ with no type
./gtkmmocascade.h:90: error: expected ‘;’ before ‘myViewer’
./gtkmmocascade.h:91: error: ‘AIS_InteractiveContext’ has not been declared
./gtkmmocascade.h:91: error: ISO C++ forbids declaration of ‘Handle’ with no type
./gtkmmocascade.h:91: error: expected ‘;’ before ‘myContext’
main.cpp:4: error: ‘TopoDS_Shape’ does not name a type
main.cpp: In member function ‘void Simple::on_button_make_bottle_clicked()’:
main.cpp:96: error: ‘TopoDS_Shape’ was not declared in this scope
main.cpp:96: error: expected `;’ before ‘aBottle’
main.cpp:97: error: ‘AIS_Shape’ was not declared in this scope
main.cpp:97: error: ‘Handle’ was not declared in this scope
main.cpp:97: error: expected `;’ before ‘AISBottle’
main.cpp:98: error: ‘class GtkOpenCascade3d’ has no member named ‘getContext’
main.cpp:98: error: ‘AISBottle’ was not declared in this scope
main.cpp:98: error: ‘Graphic3d_NOM_GOLD’ was not declared in this scope
main.cpp:99: error: ‘class GtkOpenCascade3d’ has no member named ‘getContext’
main.cpp:99: error: ‘Standard_False’ was not declared in this scope
main.cpp:100: error: ‘class GtkOpenCascade3d’ has no member named ‘getContext’
main.cpp:106: error: ‘class GtkOpenCascade3d’ has no member named ‘getView’
main.cpp:107: error: ‘class GtkOpenCascade3d’ has no member named ‘getView’
main.cpp: In member function ‘void Simple::on_ocascade_init(GtkOpenCascade3d&)’:
main.cpp:116: error: ‘TopoDS_Shape’ was not declared in this scope
main.cpp:116: error: expected `;’ before ‘aBottle’
main.cpp:117: error: ‘AIS_Shape’ was not declared in this scope
main.cpp:117: error: ‘Handle’ was not declared in this scope
main.cpp:117: error: expected `;’ before ‘AISBottle’
main.cpp:118: error: ‘class GtkOpenCascade3d’ has no member named ‘getContext’
main.cpp:118: error: ‘AISBottle’ was not declared in this scope
main.cpp:118: error: ‘Graphic3d_NOM_GOLD’ was not declared in this scope
main.cpp:119: error: ‘class GtkOpenCascade3d’ has no member named ‘getContext’
main.cpp:119: error: ‘Standard_False’ was not declared in this scope
main.cpp:120: error: ‘class GtkOpenCascade3d’ has no member named ‘getContext’
main.cpp:126: error: ‘class GtkOpenCascade3d’ has no member named ‘getView’
main.cpp:127: error: ‘class GtkOpenCascade3d’ has no member named ‘getView’
make: *** [main.o] Error 1
jonas@Ubuntu4:~/gtkmmocascade$

Ok… This was not unexcepted.
Try #2.  I’m going to rename the make file to old and try automake to see what happens

jonas@Ubuntu4:~/gtkmmocascade$ automake
The program ‘automake’ can be found in the following packages:
* automake
* automake1.4
* automake1.7
* automake1.9
* automake1.8
Try: sudo apt-get install <selected package>
bash: automake: command not found
jonas@Ubuntu4:~/gtkmmocascade$ sudo apt-get install automake1.9
[sudo] password for jonas:
Reading package lists… Done
Building dependency tree
Reading state information… Done
Suggested packages:
automake1.9-doc
The following NEW packages will be installed:
automake1.9
0 upgraded, 1 newly installed, 0 to remove and 24 not upgraded.
Need to get 388kB of archives.
After this operation, 1470kB of additional disk space will be used.
Get:1 http://us.archive.ubuntu.com hardy/main automake1.9 1.9.6+nogfdl-3ubuntu1 [388kB]
Fetched 388kB in 6s (62.6kB/s)
Selecting previously deselected package automake1.9.
(Reading database … 222950 files and directories currently installed.)
Unpacking automake1.9 (from …/automake1.9_1.9.6+nogfdl-3ubuntu1_all.deb) …
Processing triggers for man-db …
Setting up automake1.9 (1.9.6+nogfdl-3ubuntu1) …

jonas@Ubuntu4:~/gtkmmocascade$ automake
automake: `configure.ac’ or `configure.in’ is required
jonas@Ubuntu4:~/gtkmmocascade$

@#%^@  Ok… Should I try to manual fix the make or should I investigate the configure.in or configure.ac.
To the man pages Robin… EECH… Circular logic…. Must be the riddler.
Yet another interesting site.
http://www.lrde.epita.fr/~adl/autotools.html
Hm…. Page 95 of the tutorial gets interesting with a hello world example…
If you download the PDF resize it to a single page…. and then go page to page versus scrolling.
The documentation was designed that way for presentations..
I really need to understand this gnu file structures so I can use these tools….

getting occviewer-0.1.tar.gz to run a GNU compiler

Ok… I’m using Linux workspaces for a real reason for the first time.
Basically I have my Blog and the tutorial in one work space and the tutorial and a terminal in the other.  One thing that I’m doing is to click the radio button on the Browers window (upper left hand corner) to  “Always on visible work space”.  This is such a cool feature.

Yesterday night, my five year old was learning to read while play Arthur while I was reading the GNU tutorial, well up until the point she want to play virtual pin the tail on donkey anyway…
Ehhh.. digressing quite a bit this morning….

Time to recap,
I’m interested in using the library opencascade.
It’s in C++, which I need to learn(see blog’s re Paul Kunz)
Got through that.
Tried Qtopencascade,  QT very nice stuff, Licensing is awkward for me.
Tried to occviewer which is based on GTK+.
couldn’t get it to run.
started researching GTK+ found what I need for C++ was gtkmm
started researching gtkmm, discovered I need to research how the GNU compiler works which got me to this point………..

One more thing… I ran into a term called tags and discussion about emacs, vi etc in the tutorial… very interesting stuff.
Back to the task at hand.
Following the instructions from:

jonas@Ubuntu4:~$ gunzip occviewer-0.1.tar.gz
jonas@Ubuntu4:~$ ls occ*
occviewer-0.1.tar
jonas@Ubuntu4:~$ tar xf occviewer-0.1.tar
jonas@Ubuntu4:~$

This results in the occviewer-0.1 directory being created. The next thing your supposed to do after this is to check out the README to see what other packages you need to install before installing this.
Ok…
Contents of the occviewer-01 readme are:

OCCViewer OpenCASCADE Viewer with GTK+ GUI

Introduction:
This is a port of the OpenCASCADE Qt IESample provided with the
installation of OPenCASCADE. This is an effort to give the OCC community a sample
based on GTK+ which is one of the leading gui toolkit for linux which is also cross
platform and under the LGPL license. The main difference you will find in this
example compared to the original IESample example provided by OpenCASCADE is that
this example is not an MDI (Multiple Document Interface) application.
This is also not having the Document/View architecture as in
IESample. It can be probably made to use Document/View architecture as well as MDI
using gtk notebook widget. Someone can give a try! The Adobe Reader 7x series for
linux is made using the Gtk+ toolkit and sports a nice MDI child widget in a
workspace like in Qt applications. I don’t know to achieve that.
Someone can give a try! And tell me too, if possible.

Requirements:
This program requires the GTK+ toolkit, GLADE Interface
builder and gtkglext – the gtk open gl extension.
I have used gcc version 4.1.0,
gtk+ version 2.8.20,
gtkglext version 1.2.0,
glade-2 2.12.1.
Anything greater than or equal to these versions must work.

Warning:
Be careful about the implications of the glade gui builder. The glade
project file generates files for C but I have set it to generate .cpp files and added
AM_PROG_CXX macro to convert the project to C++. This is a kind of cheating glade
because to generate C++ project itself from glade you have to have gtkmm, gtkglextmm
etc… But it still works fine. Only I had to manually rename main.c to main.cpp
when the source was built for the first time. Glade overwrites the Interface files
but not Callback, Support or main file. So you can freely extend the gui using glade.
New callbacks will be appended to the Callback files.

Anyone who makes this program better or finds any problem with it please let me know.
I am more interested to know the MDI part if someone does it.

Disclaimer:
This is free software; There is NO warranty;
not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Hmm.. He doesn’t mention the OCC library;)

Readme On JT’s machine
gcc version 4.1.0, 4:4.2.3-1Ubuntu6
gtk+ version 2.8.20, ?? not sure (I think this is supposed to be lib??
gtkglext version 1.2.0, 1.2.0-ubuntu1
glade-2 2.12.1. libglade 2.0-cil     (Version 2.12.0-2ubuntu) <===not quite current see

Seems like I have most of the stuff.
Following the tutorial instructions:

jonas@Ubuntu4:~$ cd occviewer-0.1
jonas@Ubuntu4:~/occviewer-0.1$ ./configure
bash: ./configure: /bin/sh^M: bad interpreter: No such file or directory
jonas@Ubuntu4:~/occviewer-0.1$

Ughhh. This is not good.
Lets try a quick google:
This looks promising:./configure bad interpreter – Ubuntu Forums

Post #4 by scorp123 suggests the following:

Sounds like you got MS-DOS “end of line” characters in a shell script? That’s bad. Can you try to convert the files back into UNIX format? Read here:

http://ubuntuforums.org/showpost.php…35&postcount=5

Hmm.. an interesting faction to file from that post.
“UNIX-style operating systems such as Linux use a different “line ending marker” than Microsoft OS’es.”
I guess I’ll try that and see what happens.

I’m back…  Rather than making a separate post, I thought I’d continue this one.

For that post, it needed to install a package:

sudo apt-get update
sudo apt-get install tofrodos

According to the post there are to programs in this package
unix2dos,  dos2unix.
I guess I need the dos2unix.

jonas@Ubuntu4:~/occviewer-0.1$ dos2unix configure
jonas@Ubuntu4:~/occviewer-0.1$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
: command not founder-0.1/missing: line 3:
: command not founder-0.1/missing: line 5:
: command not founder-0.1/missing: line 9:
: command not founder-0.1/missing: line 14:
: command not founder-0.1/missing: line 19:
: command not founder-0.1/missing: line 24:
: command not founder-0.1/missing: line 29:
/home/jonas/occviewer-0.1/missing: line 47: syntax error near unexpected token `'n
'home/jonas/occviewer-0.1/missing: line 47: `case "$1" in
configure: WARNING: `missing' script is too old or missing
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking for style of include used by make... GNU
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking dependency style of gcc... none
checking for library containing strerror... none required
checking for gcc... (cached) gcc
checking whether we are using the GNU C compiler... (cached) yes
checking whether gcc accepts -g... (cached) yes
checking for gcc option to accept ANSI C... (cached) none needed
checking dependency style of gcc... (cached) none
checking for gcc... (cached) gcc
checking whether we are using the GNU C compiler... (cached) yes
checking whether gcc accepts -g... (cached) yes
checking for gcc option to accept ANSI C... (cached) none needed
checking dependency style of gcc... (cached) none
checking how to run the C preprocessor... gcc -E
checking for egrep... grep -E
checking for ANSI C header files... yes
checking for g++... g++
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking dependency style of g++... none
checking whether gcc and cc understand -c and -o together... yes
checking for function prototypes... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking for string.h... (cached) yes
checking for X... libraries , headers
checking for ANSI C header files... (cached) yes
checking  for C header files ... checking dlfcn.h usability... yes
checking dlfcn.h presence... yes
checking for dlfcn.h... yes
checking dl.h usability... no
checking dl.h presence... no
checking for dl.h... no
checking ieeefp.h usability... no
checking ieeefp.h presence... no
checking for ieeefp.h... no
checking time.h usability... yes
checking time.h presence... yes
checking for time.h... yes
checking sys/time.h usability... yes
checking sys/time.h presence... yes
checking for sys/time.h... yes
checking pwd.h usability... yes
checking pwd.h presence... yes
checking for pwd.h... yes
checking sys/statvfs.h usability... yes
checking sys/statvfs.h presence... yes
checking for sys/statvfs.h... yes
checking sys/vfs.h usability... yes
checking sys/vfs.h presence... yes
checking for sys/vfs.h... yes
checking sys/param.h usability... yes
checking sys/param.h presence... yes
checking for sys/param.h... yes
checking osfcn.h usability... no
checking osfcn.h presence... no
checking for osfcn.h... no
checking netdb.h usability... yes
checking netdb.h presence... yes
checking for netdb.h... yes
checking sys/ioctl.h usability... yes
checking sys/ioctl.h presence... yes
checking for sys/ioctl.h... yes
checking net/if.h usability... yes
checking net/if.h presence... yes
checking for net/if.h... yes
checking sys/systeminfo.h usability... no
checking sys/systeminfo.h presence... no
checking for sys/systeminfo.h... no
checking sys/utsname.h usability... yes
checking sys/utsname.h presence... yes
checking for sys/utsname.h... yes
checking sysent.h usability... no
checking sysent.h presence... no
checking for sysent.h... no
checking for unistd.h... (cached) yes
checking sys/unistd.h usability... yes
checking sys/unistd.h presence... yes
checking for sys/unistd.h... yes
checking sys/socket.h usability... yes
checking sys/socket.h presence... yes
checking for sys/socket.h... yes
checking ndir.h usability... no
checking ndir.h presence... no
checking for ndir.h... no
checking sys/ndir.h usability... no
checking sys/ndir.h presence... no
checking for sys/ndir.h... no
checking sys/dir.h usability... yes
checking sys/dir.h presence... yes
checking for sys/dir.h... yes
checking signal.h usability... yes
checking signal.h presence... yes
checking for signal.h... yes
checking sys/signal.h usability... yes
checking sys/signal.h presence... yes
checking for sys/signal.h... yes
checking sigfpe.h usability... no
checking sigfpe.h presence... no
checking for sigfpe.h... no
checking floatingpoint.h usability... no
checking floatingpoint.h presence... no
checking for floatingpoint.h... no
checking sys/machsig.h usability... no
checking sys/machsig.h presence... no
checking for sys/machsig.h... no
checking sys/siginfo.h usability... no
checking sys/siginfo.h presence... no
checking for sys/siginfo.h... no
checking malloc.h usability... yes
checking malloc.h presence... yes
checking for malloc.h... yes
checking for strings.h... (cached) yes
checking for sys/stat.h... (cached) yes
checking sys/sem.h usability... yes
checking sys/sem.h presence... yes
checking for sys/sem.h... yes
checking sys/ipc.h usability... yes
checking sys/ipc.h presence... yes
checking for sys/ipc.h... yes
checking sys/times.h usability... yes
checking sys/times.h presence... yes
checking for sys/times.h... yes
checking dirent.h usability... yes
checking dirent.h presence... yes
checking for dirent.h... yes
checking getopt.h usability... yes
checking getopt.h presence... yes
checking for getopt.h... yes
checking sys/vnode.h usability... no
checking sys/vnode.h presence... no
checking for sys/vnode.h... no
checking  for C++ header files ... checking how to run the C++ preprocessor... g++ -E
checking istream usability... yes
checking istream presence... yes
checking for istream... yes
checking ostream usability... yes
checking ostream presence... yes
checking for ostream... yes
checking for istream... (cached) yes
checking fstream usability... yes
checking fstream presence... yes
checking for fstream... yes
checking ios usability... yes
checking ios presence... yes
checking for ios... yes
checking iomanip usability... yes
checking iomanip presence... yes
checking for iomanip... yes
checking iostream usability... yes
checking iostream presence... yes
checking for iostream... yes
checking stream.h usability... yes
checking stream.h presence... yes
checking for stream.h... yes
checking strstream.h usability... no
checking strstream.h presence... no
checking for strstream.h... no
checking istream.h usability... yes
checking istream.h presence... yes
checking for istream.h... yes
checking ostream.h usability... yes
checking ostream.h presence... yes
checking for ostream.h... yes
checking fstream.h usability... yes
checking fstream.h presence... yes
checking for fstream.h... yes
checking for stdlib.h... (cached) yes
checking ios.h usability... no
checking ios.h presence... no
checking for ios.h... no
checking iostream.h usability... yes
checking iostream.h presence... yes
checking for iostream.h... yes
checking iomanip.h usability... yes
checking iomanip.h presence... yes
checking for iomanip.h... yes
checking limits.h usability... yes
checking limits.h presence... yes
checking for limits.h... yes
checking values.h usability... yes
checking values.h presence... yes
checking for values.h... yes
checking float.h usability... yes
checking float.h presence... yes
checking for float.h... yes
checking siginfo.h usability... no
checking siginfo.h presence... no
checking for siginfo.h... no
checking bits/sigset.h usability... yes
checking bits/sigset.h presence... yes
checking for bits/sigset.h... yes
checking bstring.h usability... no
checking bstring.h presence... no
checking for bstring.h... no
checking for sys/types.h... (cached) yes
checking sys/select.h usability... yes
checking sys/select.h presence... yes
checking for sys/select.h... yes
checking X11/extensions/transovl.h usability... no
checking X11/extensions/transovl.h presence... no
checking for X11/extensions/transovl.h... no
checking X11/extensions/readdisplay.h usability... no
checking X11/extensions/readdisplay.h presence... no
checking for X11/extensions/readdisplay.h... no
checking X11/extensions/multibuf.h usability... no
checking X11/extensions/multibuf.h presence... yes
configure: WARNING: X11/extensions/multibuf.h: present but cannot be compiled
configure: WARNING: X11/extensions/multibuf.h:     check for missing prerequisite headers?
configure: WARNING: X11/extensions/multibuf.h: see the Autoconf documentation
configure: WARNING: X11/extensions/multibuf.h:     section "Present But Cannot Be Compiled"
configure: WARNING: X11/extensions/multibuf.h: proceeding with the preprocessor's result
configure: WARNING: X11/extensions/multibuf.h: in the future, the compiler will take precedence
configure: WARNING:     ## ------------------------------------------ ##
configure: WARNING:     ## Report this to the AC_PACKAGE_NAME lists.  ##
configure: WARNING:     ## ------------------------------------------ ##
checking for X11/extensions/multibuf.h... yes
checking sys/filio.h usability... no
checking sys/filio.h presence... no
checking for sys/filio.h... no
checking sys/mman.h usability... yes
checking sys/mman.h presence... yes
checking for sys/mman.h... yes
checking libc.h usability... no
checking libc.h presence... no
checking for libc.h... no
checking for size_t... yes
checking whether struct tm is in sys/time.h or time.h... time.h
checking for working alloca.h... yes
checking for alloca... yes
checking for working memcmp... yes
checking return type of signal handlers... void
checking for gethostname... yes
checking for putenv... yes
checking for re_comp... yes
checking for regcomp... yes
checking for strcspn... yes
checking for strdup... yes
checking for strtol... yes
checking for statfs... yes
checking for statvfs... yes
checking if it is OK to define stream input and output... no
checking if class ostream has member function form... no
checking if union semun is defined in <sys/sem.h>... no
checking if function semop takes a value... no
checking if function semctl takes a value... no
checking for mallinfo in -lmalloc... no
checking for ieee_handler in -lsunmath... no
checking for finite in -lm... yes
checking for OpenGL libraries... No --with-gl-include=DIR was specified
checking for Gl library... No --with-gl-library=DIR was specified
checking for _GLUfuncptr... yes
checking for Java header files... No --with-java-include=DIR was specified
checking jni_md.h usability... no
checking jni_md.h presence... no
checking for jni_md.h... no
checking for DPS header files ... No --with-dps-include=DIR was specified
configure: WARNING: No --with-dps-library=DIR was specified
checking for Xmu header files... No --with-xmu-include=DIR was specified
configure: WARNING: No --with-xmu-library=DIR was specified
checking for STLPort header files... No --with-stlport-include=DIR was specified
configure: WARNING: No --with-stlport-libname=NAME was specified
configure: WARNING: No --with-stlport-library=DIR was specified
checking for pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.9.0... yes
checking for PACKAGE... yes
checking locale.h usability... yes
checking locale.h presence... yes
checking for locale.h... yes
checking for LC_MESSAGES... yes
checking libintl.h usability... yes
checking libintl.h presence... yes
checking for libintl.h... yes
checking for ngettext in libc... yes
checking for dgettext in libc... yes
checking for bind_textdomain_codeset... yes
checking for msgfmt... /usr/bin/msgfmt
checking for dcgettext... yes
checking for gmsgfmt... /usr/bin/msgfmt
checking for xgettext... /usr/bin/xgettext
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating po/Makefile.in
config.status: creating config.h
config.status: executing depfiles commands
config.status: executing default-1 commands
jonas@Ubuntu4:~/occviewer-0.1$

Ok… Here is where things start getting fuzzy for me.

Apparently the file configure was screwed up and the dos2unix thing fixed it.  But there was a bunch of errors messages whenin it when it ran.
Just for giggles and snorts I want to run make and see what happens.
Lots of errors..
I ran dos2unix on config.in (but I was sure I needed to do that)
Proceded with autoconfig
and the ran ./config again.  It seems like there where a bunch less errors this time.
Time to try “make” again and the result is:

Now, there is also a configure.in which I believe autoconf will convert to configure.  (Now what could be a game change is that I used the deb file for install OCC which install stuff differently… This should be interesting.

jonas@Ubuntu4:~/occviewer-0.1$ make
make  all-recursive
make[1]: Entering directory `/home/jonas/occviewer-0.1'
Making all in src
make[2]: Entering directory `/home/jonas/occviewer-0.1/src'
Makefile:281: .deps/Callbacks.Po: No such file or directory
Makefile:282: .deps/Interface.Po: No such file or directory
Makefile:283: .deps/MakeBottle.Po: No such file or directory
Makefile:284: .deps/OccGtkGLView.Po: No such file or directory
Makefile:285: .deps/Support.Po: No such file or directory
Makefile:286: .deps/Translate.Po: No such file or directory
Makefile:287: .deps/main.Po: No such file or directory
make[2]: *** No rule to make target `.deps/main.Po'.  Stop.
make[2]: Leaving directory `/home/jonas/occviewer-0.1/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/jonas/occviewer-0.1'
make: *** [all] Error 2
jonas@Ubuntu4:~/occviewer-0.1$
jonas@Ubuntu4:~/occviewer-0.1$
jonas@Ubuntu4:~/occviewer-0.1$ locate Callbacks
/home/jonas/occviewer-0.1/src/Callbacks.cpp
/home/jonas/occviewer-0.1/src/Callbacks.h
/usr/share/man/man3/XtAddCallbacks.3.gz
/usr/share/man/man3/XtCallCallbacks.3.gz
/usr/share/man/man3/XtHasCallbacks.3.gz
/usr/share/man/man3/XtRemoveAllCallbacks.3.gz
/usr/share/man/man3/XtRemoveCallbacks.3.gz
jonas@Ubuntu4:~/occviewer-0.1$

Well, This is interesting… Apparently its looking for something with a .Po extension… Thats interesting.. In the words of the penguins from the movie Madagascar…Well…. this sucks….
This is going to require some further study…

More on the GNU compiler

For some reason, our Sonicwall filter at work doesn’t like automake and autoconf
I was surfing around at lunch and found this site which does about the same http://autotoolset.sourceforge.net/tutorial.html

Here is a linked table of contents(This could take the week…..)

More on the GNU make tutorial

This is my latest research,
Multi-file projects and the GNU Make utility which is a article written by George Foot for the on-line[?] magazine c-scene.  It seems like this magazine went dead circa 1997 but seems to have had a bunch of interesting content in it…
Anyway… I’ve had outside projects I need to get done so not much time for this stuff today.
I’m going to try to look at this at lunch tomorrow.  So…. here is  table of contents for this article. (I got up to about  2.3.)

0) Introduction
1) Multi-file projects
1.1 Why use them?
1.2 When to split up your projects
1.3 How to split up projects
1.4 Notes on common errors
1.5 Rebuilding a multi-file project
2) The GNU Make utility
2.1 Basic makefile structure
2.2 Writing make rules
2.3 Makefile variables
2.4 Implicit rules
2.5 Phony targets
2.6 Functions
2.7 A pretty effective makefile
2.8 A more effective makefile
3 In conclusion

Morning cup of coffee and more exploration into C++, gtkmm, autoconf

This is where I left off when sleep slowed me down….

“The tutorial seems informative.  Just made it up to chapter 3 headers and linking
On the bottom is a link to a tutorial for automake and autoconf”

I think it’s probably appropriate that I go down the automake and autoconf tutorial at this point.  When I was experimenting with QT life got a lot easier when I started using qmake.   I believe this is a long the same lines.   Something tells me if I understand this, I will know what to do to get the sample gtk+ based opencascade viewer to run :)
So… Onwards..
openismus tutorial points to an interesting C-scene article about the make utility by George Foot.
I love the intro:

This article will explain firstly why, when and how to split
your C source code between several files sensibly, and it will
then go on to show you how the GNU Make utility can handle all
your compilation and linking automatically. Users of other make
utilities may still find the information useful, but it may
require some adaptation to work on other utilities. If in doubt,
try it out, but check the manual first.

Mr. Foots advise seem sound and straight forward to me except for this section
section from ” 1.3 How to split up projects”

iv) Make each source file #include all the header files
            which declare information in the source file. Doing
            this means that the compiler is more likely to pick
            out mistakes, where you have declared something
            differently in the header file to what it is in the
            source file.

I’m sure will make sense, I probably not fully caffeinated yet..
I think I should probably print out this article and put the yellow highlighter to it.  This should be a good lunch project at work.

C++ and Gtk+

I’ve been playing around with Gtk+.  It turns out that the tutorial I was working was more for C.
My particular objective is to us Gtk in C++.   I guess the thing I need is the gtkmm library which is specific to C++.   I had it downloaded already in synaptic.  I did notice when there was a documentation download which included a tutorial..
I found the home page for gtkmm which also includes tutorials. http://www.gtkmm.org/

The tutorial is at: http://www.gtkmm.org/docs/gtkmm-2.4/docs/tutorial/html/index.html

Ok… I’m liking what I’m seeing far with gtkmm.   It seems like its far cleaner that straight gtk++
The tutorial seems informative.  Just made it up to chapter 3 headers and linking
On the bottom is a link to a tutorial for automake and autoconf