2016-04-05 5 views
0

Ich habe ein Makefile mit einer Zeile enthält eine Liste von Komponenten auf der rechten Seite. Ich möchte Makro $^verwenden, um die Liste in einem anderen Verzeichnis zu archivieren. Die folgende Zeile verwendet nur die erste Komponente in anderem Verzeichnis und den Rest im aktuellen Verzeichnis verarbeitet, die falsch ist:

libExApp.a: xapp_e.o xsage_e.o users.o id.o prog.o 
    ar rc [email protected] ia32/$^ 

Wenn ich geschweifte Klammer verwenden {}, dann gibt es kein Komma zwischen Dateien in der zu bearbeitenden dasselbe Verzeichnis.

Also, wie kann ich mehrere Komponenten alle in einem Verzeichnis verarbeitet verwenden.

+1

Sie sollten die Dateien, die Sie als Abhängigkeiten verwenden, auflisten und einfach 'ar rc $ @ $ ^' als Rezept verwenden. Berücksichtigen Sie auch den Versuch, Rezepte zu verwenden, die Dateien in einem Verzeichnis aus Dateien in einem anderen erstellen; 'make' wurde nicht wirklich mit diesem Gedanken entworfen, und obwohl es möglich ist, bevorzuge ich die traditionelle Vorgehensweise, nämlich alle Dateien an Ort und Stelle zu erstellen und ein' install'-Ziel zum Kopieren zu verwenden sie zu ihren Zielen. – reinierpost

+0

@reinierpost make * kann * absolut * Ziele und Voraussetzungen in beliebigen Verzeichnissen behandeln. Obwohl sicherlich einige Teile davon komplizierter werden können. Das ist aber überhaupt nicht dasselbe, wenn Ziele an * installierten * Standorten gebaut werden. Das sollte nicht getan werden. –

+0

@Etan Reisner: Sicher kann es, ich rate nur dagegen. – reinierpost

Antwort

3

Tun Sie dies nicht. Mach es richtig. Sagen Sie, wo die tatsächlichen Voraussetzungen sind und dann einfach $^ normal verwenden.

libExApp.a: ia32/xapp_e.o ia32/xsage_e.o ia32/users.o ia32/id.o ia32/prog.o 
     ar rc [email protected] $^ 

Oder zu vermeiden, dass die ia32 Präfix Wiederholen Sie die addprefix Funktion nutzen zu können.

libExApp.a: $(addprefix ia32/,xapp_e.o xsage_e.o users.o id.o prog.o) 
     ar rc [email protected] $^ 
+0

Die zweite Option ist gut und kurz, aber das einzige Problem besteht darin, dass die Zielnamen geändert werden, z. B. xapp_e.o xsage_e.o users.o id.o prog.o. Ich habe viele ähnliche Zeilen und möchte die Zielnamen nicht ändern. Gibt es eine Möglichkeit, das Makro $^zu ändern? – Masood

+1

Sie * können * $ (addprefix) 'auf' $^'auch im Rezept verwenden, aber Sie * sollten * nicht * wie * verwirren make und Dinge werden ** nicht ** richtig funktionieren. Wenn Sie das tun, sagen Sie zum Beispiel, dass Sie die Objekte "xapp_e.o" usw. im aktuellen Verzeichnis erstellen (und diese für die Überprüfung der Frische von "libExApp.a" verwenden), aber dann das * tatsächlich * verknüpfen * Kopien * dieser Dateien aus dem 'ia32'-Verzeichnis, die miteinander verwandt sein können oder auch nicht. Das heißt, Sie ** brechen explizit die Operationsmechanismen von make. Also noch einmal, tu es nicht. –

Verwandte Themen