• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Eigene Variablen/Makros in automake/autoconf

Moin,
also, ich wollte eine shared library in meinem Projekt benutzen, wobei es halt sein kann, dass die Datein nicht da installiert wo sie bei mir sind. Also wollte ich in configure nach diesen Dateien suchen lassen und wenn die in den Standard- Verzeichnissen nicht gefunden werden eine Fehlermeldung ausgeben, dass der Benutzer die Position direkt eingeben muss, halt mit ./configure --with-sources=/path und so.
Wie das mit dem direktem Eingeben geht hab ich nach nem bissl Suchen herausgefunden, aber irgendwie kann ich nix wegen dem Suchen finden. Darauf hin hab ich mir mal ein paar andere configure.in Dateien angeguckt, aber irgendwie steig ich da nich durch :(
Hat vielleicht jemand ne Idee wie das geht oder eine gute Seite, wo sowas beschrieben steht?
 
Nach einigem rumsuchen & -probieren hab ich nu folgendes in configure.in stehn
Code:
# check for libid3 header in default dirs
id3found=no
AC_CHECK_HEADER(id3.h, [id3found=yes],[])
if test $id3found = no; then
	#not in default dir...
	AC_ARG_WITH([libid3header],
				[ --with-libid3header=<path> path to the id3.h e.g. /usr/include],
				[LIBID3_HEADER=$with_libid3header id3found=yes],
				[]
	)
fi
if test $id3found = no; then
	AC_MSG_ERROR([You must call configure with --with-libid3header=<path> pointing to where id3.h is found or with --with-nolidid3])
fi
if test $id3found = yes; then
	AC_DEFINE(HAVE_LIBID3_H,[],[If we got the libid3])
fi
AC_MSG_RESULT([$id3found])

Aaaaaaber, das führt zu folgender ausgabe:
Code:
checking id3.h usability... yes
checking id3.h presence... yes
checking for id3.h... yes
Sprich... der macht den Test 3 mal. Wieso? :/
Ausserdem steht noch folgendes in der konsole wenn ich
./configure > configuretest
ausführe:
Code:
./configure: line 19708: syntax error near unexpected token `fi'
./configure: line 19708: `fi;'
Diese Zeilen sehn so aus:
Code:
# Check whether --with-libid3header or --without-libid3header was given.
if test "${with_libid3header+set}" = set; then
  withval="$with_libid3header"
  LIBID3_HEADER=$with_libid3header id3found=yes
else


fi;
fi
Der hat also automatisch ein fi; eingefügt... wieso? :(
Und ausserdem.. anscheinend macht der den Test schon automatisch... wieso? :(
Hilfe :?
 
Dir ist schon klar, dass Du Dir die ganze Sache eigentlich sparen kannst?

Alle autoconf-Skripte beachten automatisch einen gewissen Satz standardisierter Umgebungsvariablen. Dazu gehören:

CPPFLAGS (benutzerdefinierte Optionen für den Präprozessor)
LDFLAGS (benutzerdefinierte Optionen für den Linker)

Wenn jemand die id3lib nicht in einem systemweiten Standardverzeichnis installiert hat, dann kann er diese einbinden, indem er diese beiden Umgebungsvariablen nutzt. Hätte er sie zum Beispiel in /usr/local installiert, dann müsste er folgendes tun:
Code:
export CPPFLAGS="-I /usr/local/include"
export LDFLAGS="-L /usr/local/lib"
./configure
Das beantwortet zwar Deine Frage nicht, würde aber das Problem auch lösen. Wäre es mein Projekt, dann würde ich auf dieses leider sehr unbekannte autoconf-Feature in einer README-Datei hinweisen.

Aus irgendeinem Grund sind diese "--with-wasauchimmer-dir=/bla/blubb"-Optionen trotzdem sehr beliebt - das meinte ich oben mit "eigentlich". Ich persönlich mag sie nicht besonders, weil sie Funktionalität duplizieren, die autoconf automatisch mitbringt.
teilzeitstudent schrieb:
Sprich... der macht den Test 3 mal. Wieso? :/
Macht er nicht. Das sieht nur so aus und ist schon OK so.
 
Hmmm joa aber nur das auffinden der includes und so is ja nur die Hälfte von dem, was ich eigentlich erreichen will.
Diese libid3 ist halt optional...so mehr oder weniger. Diese libid3 ließt halt ID3 tags aus und eine Klasse benutzt das. Will man aber diese Funktionalität auf andere Art und Weise bereitstellen, macht man seine eigene Klasse die libid3 nicht benutzt.
Sprich, meine library sollte auch dann compilierbar sein, wenn libid3 nicht da ist.
Andererseits... AC_CHECK_HEADER wird ja auch in den Pfaden dieser Umgebungsvariablen nach id3.h gucken.
Also
Code:
AC_CHECK_HEADER(id3.h, [AC_DEFINE(HAVE_LIBID3)])
Sollte dann das Gleiche erreichen. Oder?
 
Oben