2016-04-25 7 views
0

Angenommen, eine triviale configure.ac:m4_include erweitert sein Argument nicht?

AC_INIT([foobar], 1.0) 
m4_define([foobar_m4], [foobar.m4]) 
m4_include(foobar_m4) 

mit einem trivialen foobar.m4:

AS_ECHO(["foobar.m4 was included"]) 

Lauf autoreconf produziert:

aclocal: error: configure.ac:10: file 'foobar_m4' does not exist 
autoreconf-2.69: aclocal failed with exit status: 1 

Wie umfassen m4 schäumten Dateinamen in einem configure.ac?

Antwort

2

Der Schuldige ist das aclocal Dienstprogramm, nicht m4. Die m4 Erweiterung funktioniert einwandfrei, aber bevor m4 aufgerufen wird, scannt aclocalconfigure.ac für Abhängigkeiten und verarbeitet blind das m4_include Makro, als ob es immer mit einem literalen Dateiargument aufgerufen wurde.

Es gibt zwei Lösungen:

  1. Verwenden Sie die integrierte Makro include:

    m4_builtin([include], foobar_m4) 
    

Dies wird das autoconf-bereitgestellt m4_include Makro vollständig umgehen, die gegen wiederholte Einschlüsse schützt der gleichen Datei.

  1. Ihr eigenes Makro definieren, m4_include ruft:

    m4_define([my_include], [m4_include][([$1])])dnl 
    my_include(foobar_m4) 
    

Warum die seltsame zitieren? Wir müssen m4_include in der obigen Definition angeben, so dass es während der Definition von my_include nicht erweitert wird, aber die gesamte m4_include([$1]) Aufruf würde weiterhin aclocal in der gleichen Weise wie in der Frage auslösen.

Soweit ich weiß, gibt es keine integrierte Möglichkeit zu verhindern, aclocal von speziell behandelt die m4_include Makro. Dieses Verhalten von aclocal ist essentiell für die Abhängigkeitsverfolgung, sodass das Einschließen von Dateien auf diese Weise wahrscheinlich aufgrund nicht definierter Makros fehlschlägt, die in enthaltenen Dateien verwendet werden (dies wird auch erläutert here).