Ich versuche gerade ein älteres (~2006) open source Programm auf einem aktuellen Ubuntu zu bauen. Es werden Autotools verwendet.
Habe zwar Grundkenntnisse in makefile und bash, aber von der M4 Macrosprache noch nie gehört.
Der Build ist ziemlich komplex, zuerst werden für mich nicht benötigte Libs gebaut (QT, AAC, ...), dann der eigentliche Code. Es geht um eine alte Version 1.12 des DRM Dream Decoders. Die bietet einen Simulationsmode, beispielsweise ohne das QT User Interface und die Quellendecoder AAC. Das sollte sich über Parameter ins configure steuern (abschalten mit --enable-simulation) lassen.
Zum eigentlichen Punkt: ausgehend vom Makefile.am und configure.in bauen die Autotools das sehr längliche configure. Jenes sollte dann mit übergebenen Parametern das finale makefile erzeugen. Tut es aber nicht. Meine Hoffnung ist, dass mir config.log Hinweise auf Fehler gibt. Eine Suche nach "error" liefert viele Treffer, z.B.
1
configure:4332: gcc -V >&5
2
gcc: error: unrecognized command-line option '-V'
3
gcc: fatal error: no input files
4
compilation terminated.
5
configure:4343: $? = 1
6
configure:4332: gcc -qversion >&5
7
gcc: error: unrecognized command-line option '-qversion'; did you mean '--version'?
Ich frage mich, ist das von Relevanz oder werden da einfach mehrere Abfragen nach der Compilerversion nur durchiteriert?
Die Sequenz taucht mehrfach im Log auf.
Weitere Frage: kann man aus den im Log angegebenen Nummern, hier als Beispiel 18699, auf die Fehler auslösende Zeile im configure schließen?
Sehe da irgendwie keinen Zusammenhang. Hier eine Meldung im Log:
Nein, die gibt es nicht. An sich genommen, sind die Fehlermeldung alle plausibel. Aber wo kommen die Befehle her, sind die relevant?
"gcc -version >&5" führt auch zu einem Fehler, um mal ein Beispiel von weiter oben zu nehmen. Wenn ich das in die shell tippe, kommt exakt der gleiche Fehler wie im Log. Aber wo kommt das her?
In den Eingangsdateien wie configure.in und Makefile.am steht nichts davon. Das haben sich die Autotools irgend wo her generiert, aber woher? Ist es relevant?
"gcc -version >&5" führt auch zu einem Fehler, um mal ein Beispiel von
weiter oben zu nehmen. Wenn ich das in die shell tippe, kommt exakt der
gleiche Fehler wie im Log. Aber wo kommt das her?
1
gcc -v
1
gcc --version
erzeugen zwei völlig unterschiedliche Ausgaben.
Die Umleitung
1
>&5
funktioniert nur, wenn auch irgend jemand auf diesem Descriptor lauscht. In die Bash eingetippt ist das tendentiell eher unwahrscheinlich.
Vermutlich wird die Ausgabe von einem weiteren Werkzeug auf ›5‹ entgegen genommen und nach bestimmten Informationen durchsucht.
Ist hier im Forum allerdings schwer zu erkennen.
Die Langversionen der Optionen haben zwei - vorne dran.
Dafür gibt's »PRE«
Edit: Nur mal zum Test -- --version
Scheint mit Firefox und Debian-Stable auch zu funktionieren. Dieses ›verschmelzen‹ zweier Striche zu einem Langen wird also ein Browser- oder ein Betrübssystem-Problem sein.
Aber am Ende macht es meiner Meinung nach überhaupt keinen Sinn sich mit dem configure Script näher auseinander zu setzen: ist automatengeneriert und parktisch nicht menschen-lesbar ist. Allein schon die schiere Länge von über 22000 Zeilen.
Aus den beiden Komponenten Makefile.am
1
AUTOMAKE_OPTIONS = foreign
2
3
EXTRA_DIST = \
4
drm.spec \
5
drm.spec.in
6
7
SUBDIRS = linux
8
9
rpm: Makefile
10
make dist
11
$(RPMBUILD) -ta $(PACKAGE)-$(VERSION).tar.gz
12
rm $(PACKAGE)-$(VERSION).tar.gz
und eben configure.in (moderner wäre configure.ac). erzeugen die Autotools wie autoconf, automake und aclocal dann das script configure, welches in der Kommandozeile gestartet, ein maschinenabhängiges makefile als Ergebnis liefern sollte.
Nehme an, dass in den mehr als 15 Jahre alten Scripten etwas zu heutigen Systemen inkompatibles schlummert.
Muss mich wahrscheinlich im Detail einarbeiten. Oder versuchen, Scripte für ein mir bekanntes Build-System zu finden (z.B. CMake).
Finde den Unterschied…
Ist hier im Forum allerdings schwer zu erkennen.
Nur wenn man die Wischversion auf dem Smartphone nutzt. Auf richtigen Webbrowsern wird ein Monospaced-Font verwendet, und da ist das sehr eindeutig zu erkennen.
Es gibt Gründe, warum man als Programmierer sowohl auf die Verwendung von Proportionalschrift als auch auf die Verwendung typographisch ansprechender Ligaturen verzichtet.
ch frage mich, ist das von Relevanz oder werden da einfach mehrere
Abfragen nach der Compilerversion nur durchiteriert?
Aber am Ende macht es meiner Meinung nach überhaupt keinen Sinn sich mit
dem configure Script näher auseinander zu setzen: ist automatengeneriert
und parktisch nicht menschen-lesbar ist.
Richtig. Dafür ist es auch gar nicht gedacht. Ich habe mir noch nie die Details eines configure-Skriptes angesehen.
Nehme an, dass in den mehr als 15 Jahre alten Scripten etwas zu heutigen
Systemen inkompatibles schlummert.
Sehr wahrscheinlich. Eigentlich sollte das configure-Skript die Kompatibilität prüfen und, falls nicht gegeben, das Problem nennen. Allerdings gibt es viele Projekte, in denen das nicht konsequent durchgezogen wurde.
Das Problem würde ich eher in der fehlenden libdfftw vermuten. Eine Datei mit dem Namen scheint es früher bei FFTW2 auf manchen Distributionen gegeben zu haben, was aber eigentlich einfach nur die libfftw selbst ist.
Finde den Unterschied…
Ist hier im Forum allerdings schwer zu erkennen.
Nur wenn man die Wischversion auf dem Smartphone nutzt. Auf richtigen
Webbrowsern wird ein Monospaced-Font verwendet, und da ist das sehr
eindeutig zu erkennen.
Bei mir sieht es auf einem "richtigen Webbrowser" mit Monospace-Font aus wie im ersten Bild. Man kann es schon erkennen, aber es ist durchaus übersehbar.
Es gibt Gründe, warum man als Programmierer sowohl auf die Verwendung
von Proportionalschrift als auch auf die Verwendung typographisch
ansprechender Ligaturen verzichtet.
Und es gibt einen Grund, warum man Code-Tags verwenden sollte (siehe zweites Bild):
Bei mir sieht es auf einem "richtigen Webbrowser" mit Monospace-Font aus
wie im ersten Bild. Man kann es schon erkennen, aber es ist durchaus
übersehbar.
Das war dann ein ganz "schlauer" Browser, der -- durch — ersetzte.
Mein Smartphone ersetzt auch gerne ... durch …
Ganz tolle Wurst.
Das Problem würde ich eher in der fehlenden libdfftw vermuten. Eine
Datei mit dem Namen scheint es früher bei FFTW2 auf manchen
Distributionen gegeben zu haben, was aber eigentlich einfach nur die
libfftw selbst ist.
Danke, guter Hinweis. Habe mir die Quellen für libdfftw geladen und konnte die auch fehlerfrei bauen.
Jetzt muss ich die "nur" noch den alten Scripten unterschieben.
Ich frage mich, ist das von Relevanz oder werden da einfach mehrere
Abfragen nach der Compilerversion nur durchiteriert?
Ja. Natürlich ist es von Relevanz ob bestimmte Features vorhanden sind oder nicht, und wie diese gegebenenfalls anzusprechen sind. Es ist ja Sinn & Zweck von configure, das abzufragen.
Die Fehlermeldungen an sich sind nicht schlimm, ist eben die Reaktion von GCC auf nen bestimmten Test.
Wenn ein configure mit nem Fehler abbricht, dann durchsucht man config.log besser vom Ende her statt von Anfang an. Ansonsten hat man da kiloweise unkritisvche Fehlermeldungen zu durchforsten.
Zunächst ist aber mal zu beurteilen, ob die stdout Ausgabe von configure wie erwartet ist, und ob alle strikt benötigten Vorbedingungen richtig detektiert wurden. Und natürlich, ob alle benötigten Pakete / Libs vorhanden sind.
Ja danke, habe mich so langsam mit den Autotools angefreundet und kann den configure log interpretieren.
Habe mehrere Builds mit verschiedenen Konfigurationen erstellen können.
Steigen leider alle nach dem Start aus, immer irgend was mit Audio-Treibern. Sicher Inkompatibilitäten der alten SW mit aktuellem Audiosystem. Auch portaudio kann das nicht lösen.
Aber ok, war ein Versuch wert.
Kommt drauf an, wie die Software auf die Soundkarte zugreift. Es wäre praktisch, wenn es etwas genauer ginge als "irgend was mit
Audio-Treibern". Die Art des Zugriffs auf die Soundkarte wurde über die Jahre mehrfach geändert. Wenn das noch auf das alte /dev/dsp zugreift, musst du dein Programm mit sowas wie padsp starten. Es könnte aber z.B. auch Jack nutzen. Dann müsstest du den jackd starten, beispielsweise über qjackctl.