gcc Makefile

#4589878
Lesenswert?

Hallo,

ich habe zwei unterschiedliche Projekte:

1. Projekt: Hier nutze ich can4linux und mysql mit folgendem Makefile 
(TARGET=LINUX_X86): http://db.vivus.org/Makefile

2. Projekt: Hier nutze ich MQTT und kompiliere über die Konsole:
1
#gcc stdoutsub.c -I src -I src/linux -I MQTTPacket/src MQTTClient.c src/linux/MQTTLinux.c MQTTPacket/src/MQTTFormat.c  MQTTPacket/src/MQTTPacket.c MQTTPacket/src/MQTTDeserializePublish.c MQTTPacket/src/MQTTConnectClient.c MQTTPacket/src/MQTTSubscribeClient.c MQTTPacket/src/MQTTSerializePublish.c -o stdoutsub MQTTPacket/src/MQTTConnectServer.c MQTTPacket/src/MQTTSubscribeServer.c MQTTPacket/src/MQTTUnsubscribeServer.c MQTTPacket/src/MQTTUnsubscribeClient.c

Nun würde ich gerne beide Projekte zusammenführen sprich can4linxu, 
mysql und MQTT in einem Projekt nutzen.

Mein Problem ist, wie bekomme ich den Konsolenbefehl ins Makefile (Ich 
habe es hier: http://db.vivus.org/Makefile2 mal versucht, bekomme aber 
nicht alles unter)

Welche Files er genau kompilieren soll ist klar. Auch wo die -I Paramter 
hinkommen. Sprich -I src -I src/linux -I MQTTPacket/src aber wo muss der 
Rest hin? (also die Pfade mit Datei dh: MQTTClient.c 
src/linux/MQTTLinux.c MQTTPacket/src/MQTTFormat.c 
MQTTPacket/src/MQTTPacket.c MQTTPacket/src/MQTTDeserializePublish.c 
MQTTPacket/src/MQTTConnectClient.c MQTTPacket/src/MQTTSubscribeClient.c 
MQTTPacket/src/MQTTSerializePublish.c) Laut dem Manual von GCC darf 
hinter -I nur ein Ornder... (Hier der Versuch: 
http://db.vivus.org/Makefile2)

Und dann noch der hintere Teil, welchen ich überhaupt nicht unter 
bekomme:
-o stdoutsub MQTTPacket/src/MQTTConnectServer.c 
MQTTPacket/src/MQTTSubscribeServer.c 
MQTTPacket/src/MQTTUnsubscribeServer.c 
MQTTPacket/src/MQTTUnsubscribeClient.c

Wo genau müssen Pfade zu C-Files in dieses Makefile?

(Bitte beachtet, dass ich zwei Makefiles gepostet habe: Makefile und 
Makefile2)

Würde mich freuen, wenn mir jemand beim zusammenführen des Makefiles und 
dem Konsolenbefehl behilflich sein könnte.
Gast #4589925
Lesenswert?

"divide et impera" - teile und herrsche

Besser als alles in eins zu wurschteln, betrachte die bisherigen 
Projekte als Subsysteme des neuen Gesamtprojektes.

Setze also Quell- u. Objektfilelisten, Pfadlisten (-I), Verzeichnisse 
(Quell-, Libs-, Objekt-), Kompiler- u. Linkoptionen usw. separat fuer 
die verschiedenen Buildabschnitte - z.B. in Abschnittspezifische 
Variablen.
Erst in den jeweiligen Abschnitte weist Du die fuer diesen Abschnitt 
gültigen Variablen den Standard-Makevariablen.
Ev. passt Du die einzelnen Wekzeugaufrufe welche als generische 
Variablen (z.B. CC, LD, usw.) vorliegen halt deinem allg.gültigen Muster 
an (also mit zus. Platzhaltervariablen welche Deinen Bedürfnisse 
dienen).

Achtung: rekursive Aufrufe von make (z.B. Aus einem übergeordneten 
Makefile) gehen, birgt aber spezifische Probleme.
Eines davon ist dass die erste aufgerufene make-Instanz nicht alle 
Abhängikeiten bis in die Tiefe "zu Gesicht" bekommt, sodass es seine 
Hauptaufgabe "Abhängigkeiten auflösen" nicht erfüllen kann. Negative 
Auswirkung davon sind auch Änderungen nicht mitbekommen und nicht 
passend (genug) nachkompilieren/linken UND nicht parallelisieren können 
(make option "-j"). Bei stundenlangen Builds IST dies relevant, oder 
nicht alle Kerne die man hat bekommen soviel zu tun wie es möglich wäre.

Jetzt sind die unabhängigen Projekte noch richtig unabhängig 
voneinander (der Systemarchitekt sagt "lose gekoppelt").
Nur weil man sie in einem Projekt gemeinsam benutzt, heisst dies nicht 
dass diese lose Koppelung zu verwerfen ist und durch enge Koppelung 
alles in eine Presswurscht kommen muss.
Behalte also die Modularisierung und die internen Schnittstellen im 
neuen Gesamtprojekt im Auge: diese Aufteilung wiederspiegelt sich in der 
#include-Hierarchie und auch in der Makefilegestaltung.

Hilfreich dies zu bewerten, ist dazu Doxygen auf den Code loszulassen 
und Diagramme zur Importhierarchie generieren zu lassen: auf diesen 
Bilder erkennt man gut wenn von "Weither" ganz "Lowlevel" Includes 
geholt werden und sonstwie "Pfeile kreuz und quer" gehen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren