AC_TRY_COMPILE, autotools
-
Hallo Zusammen,
ich versuche eine m4 macro zu schreiben, die die Laenge eines "long"
mit "int" vergleicht und einen variable $prj_cv_intlong_size auf "yes"
setzt -wennsizeof(long) > sizeof(int)
. Dabei moechte ich den Makro
AC_TRY_COMPILE benutzen aber die ist bissle unverstaendlich.. In autobook
wird sie definiert als:AC_TRY_COMPILE([includes],[body], [case true], [case false]);
[includes], [case true] und [case false] sind klar. Nun im Bezug auf
[body] habe ich paar Fragen:- wie wird entschieden vom body aus, dass es [case true] ist zum Beispiel?
wann und wie liefert body SUCCESS und FAILURE? Sowie ich
verstanden habe soll der Programmierer am Ende von body(main) kein return
Anweisung benutzen(?).
- wuerde in meinem fall[if(sizeof(long) > sizeof(int)) ;]
ausreichen?
Wie gesagt, auch autobook sagt nicht viel darueber.. Danke im voraus,
-
AC_TRY_COMPILE probiert zu compilieren. Wenn der Compiler keinen Fehler ausgibt, wird der [case true]-Zweig ausgeführt, ansonsten [case false]. Der Code wird nicht ausgeführt. Ich fürchte, AC_TRY_COMPILE hilft Dir da nicht weiter.
Die Autotools unterstützen auch für Cross-Compile, wo der Compiler zwar übersetzen kann, aber den Code gar nicht ausführen kann, da dieser für einen anderen Prozessor bestimmt ist. Daher wirst Du Dein Problem wahrscheinlich so nicht lösen können.
Übrigens ist AC_TRY_COMPILE als obsolet gekennzeichnet. AC_COMPILE_IFELSE ist die bevorzugte Variante.
-
tntnet schrieb:
AC_TRY_COMPILE probiert zu compilieren. Wenn der Compiler keinen Fehler ausgibt, wird der [case true]-Zweig ausgeführt, ansonsten [case false]. Der Code wird nicht ausgeführt. Ich fürchte, AC_TRY_COMPILE hilft Dir da nicht weiter.
Die Autotools unterstützen auch für Cross-Compile, wo der Compiler zwar übersetzen kann, aber den Code gar nicht ausführen kann, da dieser für einen anderen Prozessor bestimmt ist. Daher wirst Du Dein Problem wahrscheinlich so nicht lösen können.
Übrigens ist AC_TRY_COMPILE als obsolet gekennzeichnet. AC_COMPILE_IFELSE ist die bevorzugte Variante.
Danke fuer die Erklaerung. Es wird in meinem fall immer [case true] ;). Was
ich an dieser Stelle gerne fragen moechte ist, kann man so einen Vergleich
mit Hilfe von vorhandenen Makro AC_CHECK_SIZEOF() und simple shell zeiler
hinkriegen koennte? Dafuer ist die konkrete frage: Liefert der AC_CHECK_SIZEOF
irgendeine Wert zurueck? Kann man dies in eine Variable speichern?dnl ob das ueberhaupt geht? test_int=AC_CHECK_SIZEOF(int) test_long=AC_CHECK_SIZEOF(long) if [ test_long > test_int] then ; AC_DEFINE(SIZEOFLONG_BT_SIZEOFINT, 1, [Serves to machine specific data comparison]) else AC_DEFINE(SIZEOFLONG_BT_SIZEOFINT, 0, [Serves to machine specific data comparison]) fi
Danke,
ps: shell kode kann falsch sein.. es geht um den Prinzip
-
Es gibt noch das Makro
AC_RUN_IFELSE (INPUT, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], [ACTION-IF-CROSS-COMPILING])
, welches ein Programm startet und testet (siehe dazu die autoconf info Seite).Aber wie hier schon erwähnt, sollte man das nach Möglichkeit vermeiden, da sich die Anwendungen nicht mehr vernünftig cross-compilieren lassen.
-
ProgChild schrieb:
Es gibt noch das Makro
AC_RUN_IFELSE (INPUT, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], [ACTION-IF-CROSS-COMPILING])
, welches ein Programm startet und testet (siehe dazu die autoconf info Seite).Super Hinweis, danke.
Ich bin gerade dazu gekommen, das Problem zu loesen.ProgChild schrieb:
Aber wie hier schon erwähnt, sollte man das nach Möglichkeit vermeiden, da sich die Anwendungen nicht mehr vernünftig cross-compilieren lassen.
verstehe.. Code ist sowieso stark maschinenabhaengig. Deswegen habe ich auch
nicht vor, sie zu cross-compilieren.Falls jemand das gleiche Problem haben sollte, hier ist wie ich, mit Hilfe
deinem Vorschlag, es geloest habe:dnl std_tcompare.m4 -- Maschine specific standard data type comparison. dnl dnl This m4 macro compares two different std data types with each other. dnl Note that a comparison is only executed between neighbour types. In dnl case of earlier use of AC_CHECK_SIZEOF macro, you can directly use dnl the predefined SIZEOF_* directives. dnl AC_DEFUN([PRJ_LONGINT_COMPARISON], [AC_CACHE_CHECK([long and int data length elationship], [prj_cv_longint_comparison], [AC_RUN_IFELSE([AC_LANG_SOURCE( [[ #include <stdio.h> #include <stdlib.h> int main(){ return (sizeof(long) > sizeof(int))?0:-1; } ]])], [prj_cv_longint_comparison='>'], [prj_cv_longint_comparison='=='], [prj_cv_longint_comparison=undefined])]) if test $prj_cv_longint_comparison = ">" ; then AC_DEFINE([LONGSIZE_BT_INTSIZE], 1, [Machine specific data length comparison between long and int]) elif test $prj_cv_longint_comparison = "==" ; then AC_DEFINE([LONGSIZE_BT_INTSIZE], 0, [Machine specific data length comparison between long and int]) elif test $prj_cv_longint_comparison = undefined ; then AC_MSG_ERROR([Cross compiling is not for this library allowed]) else AC_MSG_ERROR([Return value for cache variable is corrupted]) fi])
Dasselbe kann auch fuer andere Datentypen erweitert werden.
Gruss,
-
Ein paar Hinweise dazu:
Wofür benötigst Du die 2 Header <stdio.h> und <stdlib.h>? Ich die sind wohl überflüssig.
[Cross compiling is not for this library allowed] ist meiner Meinung nach falsch. Besser ist [Cross compiling for this library is not allowed]. Wobei ich nicht wirklich gut englisch kann.
[Return value for cache variable is corrupted] finde ich auch unglücklich formuliert. Ich würde die letzte Abfrage einfach weg lassen, statt nochmal zu prüfen, ob AC_RUN_IFELSE richtig funktioniert. Ansonsten würde ich es etwa so formulieren: [internal error in LONGINT_COMPARISON].
Alternativ könntest Du natürlich auch eine Möglichkeit bieten, den Wert explizit über eine configure-Option zu übergeben. Dadurch wäre ein cross-compile wieder machbar.
-
tntnet schrieb:
Ein paar Hinweise dazu:
Wofür benötigst Du die 2 Header <stdio.h> und <stdlib.h>? Ich die sind wohl überflüssig.
Um sizeof() benutzen zu koennen. Sicherheitshalber habe ich beide inkludiert.
tntnet schrieb:
[Cross compiling is not for this library allowed] ist meiner Meinung nach falsch. Besser ist [Cross compiling for this library is not allowed]. Wobei ich nicht wirklich gut englisch kann.
[Return value for cache variable is corrupted] finde ich auch unglücklich formuliert. Ich würde die letzte Abfrage einfach weg lassen, statt nochmal zu prüfen, ob AC_RUN_IFELSE richtig funktioniert. Ansonsten würde ich es etwa so formulieren: [internal error in LONGINT_COMPARISON].
hoert sich besser an, werde aendern.
tntnet schrieb:
Alternativ könntest Du natürlich auch eine Möglichkeit bieten, den Wert explizit über eine configure-Option zu übergeben. Dadurch wäre ein cross-compile wieder machbar.
Das ist ne feine Idee.. Ich muss allerdings mich in die --enable-* options
und deren Abhaengigkeiten miteinander einarbeiten. Hab da kein grosses Wissen
momentan.Danke && Gruss,
-
jsbach schrieb:
tntnet schrieb:
Ein paar Hinweise dazu:
Wofür benötigst Du die 2 Header <stdio.h> und <stdlib.h>? Ich die sind wohl überflüssig.
Um sizeof() benutzen zu koennen. Sicherheitshalber habe ich beide inkludiert.
Sizeof ist eines der wirklichen Sprachmittel in C++. Dafür brauchst Du keine Header. Ich finde, "sicherheitshalber" ist ein schlechter Grund. Du solltest Dir prinzipiell angewöhnen, so nur die Header einzubinden, die Du wirklich brauchst. Das reduziert langfristig die Abhängigkeiten und dankt auch durch kürzere Compilezeiten.