KDevelop

Hallo zusammen, ich hoffe mal das die Frage noch halbwegs in dieses Forum passt :confused: .

Ich habe in Kdevelop eine C++ Anwendung entwickelt und ein tgz Archiv mit make dist erstellt. Ich kann dieses auch wunederbar entpacken und die Anwendung mit configure und make übersetzen.

Ich würde aber gerne verschiedene Features durch configure Optionen mit --enable-FEATURE aktivieren.

Im Moment habe ich z.B. eine Klasse für das erstellen von Logeinträgen die jeweils in eine Textdatei, in Syslog oder eine SQLite Datenbank geschrieben werden können.
Aber leider entscheide ich welches Loggingziel genutzt wird über Compiler Schalter, z.B.:

#ifdef WITH_SQLITE
...
#endif

Diese würe ich aber gerne über --enable-FEATURE regeln.
Weiß vielleicht jemand wie man dies in KDevelop, oder zur Not auch manuel bewerkstelligen kann ?

Mfg.
 
Hi.

Du kannst ja mal hier (http://www.kdevelop.org/index.html?filename=3.0/doc/tutorial_autoconf.html) vorbeischauen.

Da ist beschrieben wie man autoconf (was für die Erstellung des configure Skripts verwantwortlich ist) konfiguriert.

Dann mußt du nur das M4 Makro AC_ARG_ENABLE in die configure.in.in einfügen. Ungefähr so
Code:
AC_ARG_ENABLE (logging, AS_HELP_STRING([--enable-logging], [enable logging support [file|syslog|sqlite] (default=file)]), , enable_logging=file)

if test x"${enable_logging}" = x"sqlite"
then
  AC_DEFINE(WITH_SQLITE)
else if test x"${enable_logging}" = x"file"
then
  AC_DEFINE(WITH_LOGFILE)
...

Usw. Da mußt du dir evtl. aber nochmal genau die autoconf Dokumenation anschauen.

Gruß
 
Also den groben Überblick habe ich jetzt schon :) , sieht auch garnicht so schwierig aus.
Aber es wird ja beschrieben das ich die Datei configure.in.in veränden muss, allerdings
kann ich in dem gesamten Projektordner nur die Datei configure.in finden.

Sind diese vielleicht gleichwertig zu verwenden ?
 
Tja, das weiß ich leider auch nicht so genau. Aber du kannst es ja einfach mal ausprobieren (vorher am besten eine Sicherheitskopie anlegen).

Gruß
 
Sind diese vielleicht gleichwertig zu verwenden ?

configure.ac configure.in sind gleichwertig, wobei ersterers die aktuelle Methode ist, sich
mit autoconf ein configure Skript generieren zu lassen.

Von einer Datei mit der Endung configure.in.in hab ich noch nichts gehört, ich tippe
auf einen Schreibfehler im Dokument.

Gruß

RedWing
 
Zuletzt bearbeitet:
Ok, so wie es aussieht gibt es wirklich nur die configure.in Datei.

In dieser Habe ich jetzt folgendes stehen:

Code:
AC_INIT(configure.in)

AM_CONFIG_HEADER(config.h)
AM_INIT_AUTOMAKE(mailwatch, 0.1)

AC_LANG_CPLUSPLUS
AC_PROG_CXX
AM_PROG_LIBTOOL

AC_OUTPUT(Makefile src/Makefile)

AC_ARG_ENABLE(sqlite, AS_HELP_STRING([--enable-sqlite], [Mailwatch can use SQLite Databases for Logging]), [with_sqlite="yes"] )

if test "x$with_sqlite" = "xyes"; then
   KDE_FIND_PATH(sqlite3.a, LIB_SQLITE, [/lib/ /usr/lib/ /usr/local/lib/], [])
   
   if test -n "$LIB_SQLITE"; then
      AC_DEFINE([WITH_SQLITE], [1], [Compile with sqlite support])
   fi
   
fi

AC_ARG_ENABLE(syslog, AS_HELP_STRING([--enable-syslog], [Mailwatch can use Syslog for Logging]), [with_syslog="yes"] )

if test "x$with_syslog" = "xyes"; then
   AC_DEFINE([WITH_SYSLOG], [1], [Compile with syslog support])
fi

Es soll also der geprüft werden ob die SQLite3 Library gefunden wird, da sonst
das Program ja nicht korrekt übersetzt werden kann.

Leider bekomme ich jetzt immer den Fehler:
Code:
./configure: line 20992: syntax error near unexpected token `sqlite3.a,'
./configure: line 20992: `KDE_FIND_PATH(sqlite3.a,LIB_SQLITE, /lib/ /usr/lib/ /usr/local/lib/, )'
 
KDE_FIND_PATH ist ein Makro welches ein Programm im Pfad sucht. Das ist wohl nicht das richtige um eine Bibliothek zu finden.

Irgendwie hatte ich dich so verstanden, das du eine Möglichkeit für's logging vom User beim ./configure auswählen lassen wolltest. So wie es jetzt aussieht willst du anscheinend doch mehrere Möglichkeiten zulassen. Dann solltest du dafür lieber das AC_ARG_WITH Makro benutzen:
Code:
AC_ARG_WITH([sqlite3], AS_HELP_STRING([--with-sqlite3=DIR], [use sqlite database (yes|no|DIR)]), [
  have_sqlite3=0
  if test "$withval" = "yes"; then
      AC_CHECK_HEADER(sqlite3.h, AC_CHECK_LIB(sqlite3, sqlite3_open, [have_sqlite3=1]))
    elif test "$withval" = "no"; then
      have_sqlite3=0
    else
      CPPFLAGS="-I$withval/include"
      LIBS="-L$withval/lib "

      AC_MSG_NOTICE(checking for sqlite3 in $withval)
      AC_CHECK_HEADER(sqlite3.h, AC_CHECK_LIB(sqlite3, sqlite3_open, [have_sqlite3=1]))
      if test "$have_sqlite3" != "0"; then
       dnl Include und Lib Verzeichnis zu Compiler/Linker Flags hinzufügen.
      fi
    fi
  ], [
    have_sqlite3=0
    AC_CHECK_HEADER(sqlite3.h, AC_CHECK_LIB(sqlite3, sqlite3_open, [apu_have_sqlite3=1]))
  ])

  AC_DEFINE(HAVE_SQLITE3)

  dnl Since we have already done the AC_CHECK_LIB tests, if we have it, 
  dnl we know the library is there.
  if test "$have_sqlite3" = "1"; then
    dnl Bibliothek zu Linker Flags hinzufügen.
  fi
])

Gruß
 
Ich glaube ich bin wahrscheinlich zu blöd dafür :-)

Habe jetzt das configure.in Script soweit eigentlich fertig, wahrscheinlich
habe ich das alles etwas zu umständlich geschrieben, aber na ja
ist ja auch mein erstes configure.in Script.

Code:
AC_INIT(configure.in)

AM_CONFIG_HEADER(config.h)
AM_INIT_AUTOMAKE(mailwatch, 0.1)

AC_LANG_CPLUSPLUS
AC_PROG_CXX
AM_PROG_LIBTOOL



dnl Enable Arguement SQLite
dnl -----------------------------------------------------------------------------------------------

with_sqlite3=0

AC_ARG_ENABLE( sqlite3, AS_HELP_STRING( [--enable-sqlite3=yes], [Enable sqlite3 database. (yes|no)] ),
[
    if test "$withval" = "no"; then
    	enable_sqlite3=0
	else
        enable_sqlite3=1
    fi
] )



dnl Enable Arguement Syslog
dnl -----------------------------------------------------------------------------------------------

with_syslog=0

AC_ARG_ENABLE( syslog, AS_HELP_STRING( [--enable-sysqlog=no], [use Syslog (yes|no)] ),
[
	if test "$withval" = "no"; then
    	enable_syslog=0
    else
		enable_syslog=1
	fi    
] )



dnl With SQLite 3 includes and libraries
dnl -----------------------------------------------------------------------------------------------

AC_ARG_WITH( sqlite3-include, AS_HELP_STRING( [--with-sqlite3-include=DIR], [Specify SQLite3 inlcude DIR] ),
[
	with_sqlite3_include="$withval"
] )

AC_ARG_WITH( sqlite3-lib, AS_HELP_STRING( [--with-sqlite3-lib=DIR], [Specify SQLite libraries DIR] ),
[
	with_sqlite3_lib="$withval"
] )


dnl With Syslog includes
dnl -----------------------------------------------------------------------------------------------

AC_ARG_WITH( syslog-include, AS_HELP_STRING( [--with-syslog-include=DIR], [Specify Syslog include DIR] ),
[
	with_syslog_include="$withval"
] )


dnl With wxWidgets includes and libraries
dnl -----------------------------------------------------------------------------------------------

AC_ARG_WITH( wx-include, AS_HELP_STRING( [--with-wx-include=DIR], [Specify wxWidgets inlcude DIR] ),
[
    with_wx_includes="$withval"
])

AC_ARG_WITH( wx-lib, AS_HELP_STRING( [--with-wx-lib=DIR], [Specify wxWidgets libraries DIR] ),
[
    with_wx_lib="$withval"
])


dnl With jwsmtp includes and libraries
dnl -----------------------------------------------------------------------------------------------

AC_ARG_WITH( jwsmtp_include, AS_HELP_STRING( [--with-jwsmtp-include=DIR], [Specify jwsmtp inlcude DIR] ),
[
    with_jwsmtp_include="$withval"
])

AC_ARG_WITH( jwsmtp-lib, AS_HELP_STRING( [--with-jwsmtp-lib=DIR], [Specify jwsmtp libraries DIR] ),
[
    with_jwsmtp_lib="$withval"
])



dnl Check for SQLite3
dnl -----------------------------------------------------------------------------------------------

if test "$enable_sqlite3" = "1"; then
	have_sqlite3=0	

    if test -n "$with_sqlite3_include"; then
        CPPFLAGS="$CPPFLAGS -I$with_sqlite3_include"
    fi

    if test -n "$with_sqlite3_lib"; then
    	LDFLAGS="$LDFLAGS -L$with_sqlite3_lib"
	fi

	AC_CHECK_HEADER( sqlite3.h, AC_HAVE_LIBRARY(sqlite3, [have_sqlite3=1]) ) 

	if test "$have_sqlite3" -ne "1"; then
		AC_MSG_ERROR( [You must have SQLie3 libraries installed] )
	else
        LIBS="$LIBS -lsqlite3"
	fi

fi


dnl Check for Syslog 
dnl -----------------------------------------------------------------------------------------------

if test "$enable_syslog" = "1"; then

	if test -n "$with_syslog_include"; then
		CPPFLAGS="$CPPFLAGS $with_syslog_include"
	fi

    AC_CHECK_HEADER( syslog.h, [],
	[
    	AC_MSG_ERROR([You must have Syslog include files installed])
	] )
fi


dnl Check for wxWidgets Base 2.6
dnl -----------------------------------------------------------------------------------------------

if test -n "$with_wx_include"; then
    CPPFLAGS="$CPPFLAGS -I$with_wx_include/"
fi

if test -n "$with_wx_lib"; then
	LDFLAGS="$LDFLAGS -L$with_wx_lib/"
fi

AC_CHECK_HEADER( wx.h, AC_HAVE_LIBRARY( [wx_base-2.6], [have_wx=1] ), [have_wx=0] )

if test "$have_wx" -ne "1"; then
    AC_MSG_ERROR([You must have wxWidgets-Base 2.6 installed])
else
	LIBS="$LIBS -lwx_base-2.6"
fi



dnl Check for jwsmtp
dnl -----------------------------------------------------------------------------------------------

if test -n "$with_jwsmtp_include"; then
	CPPFLAGS="$CPPFLAGS -I$with_jwsmtp_include"
fi

if test -n "$with_jwsmtp_lib"; then
	LDFLAGS="$LDFLAGS -L$with_jwsmtp_lib"
fi

AC_CHECK_HEADER( jwsmtp.h,
[
	AC_HAVE_LIBRARY( jwsmtp, [have_jwsmtp=1] )
],
[
	have_jwsmtp=0
]

if test "$have_jwsmtp" -ne "1"; then
    AC_MSG_ERROR([You must have JwSMTP installed])
else
	LIBS="$LIBS -ljwsmtp"
fi

AC_OUTPUT(Makefile src/Makefile)

Es funktioniert auch alles wunderbar, bis auf die Prüfung bei wxWidgets

Im Verzeichniss /usr/local/include habe ich folgenden Inhalt

Code:
lrwxrwxrwx   1 root root    10 2006-01-16 10:45 wx -> wx-2.6/wx/
drwxr-xr-x   3 root root    72 2006-01-16 10:43 wx-2.6

Und im Verzeichnis wx-2.6/wx/ befindet sich die Datei wx.h

Aber das Script sagt immer das er die Datei nicht finden könnte, z.B.

Code:
./configure --with-wx-include=/usr/local/include/wx-2.6/wx
...
checking wx.h usability... no
checking wx.h presence... no
checking for wx.h... no
 
Wenn ich mich richtig erinnere gibt's für wxwidgets ein Skript was die Flags für die Compiler bzw. Linker usw. ausgibt. Normalerweise reicht es das Skript mit --cflags --libs aufzurufen um diese Optionen zu bekommen. Da könntest du dann wieder KDE_FIND_PATH verwenden um das Skript im Pfad zu finden - oder halt per Option. Das Skript sollte wx-config oder wx2.6-config o.ä. heißen.

Du kannst ja mal in die config.log Datei kucken was beim Prüfen des wx.h Headers schief gelaufen ist.

Gruß
 
Zurück