M-Option im make-Befehl, Makefile

Lesezeit: 4 Minuten

Benutzer-Avatar
Benutzer1047069

make -C ~/kernel-2.6 M=`pwd` modules

Was bedeutet M=’pwd’ in der obigen Zeile?

Ich konnte die Erklärung nicht verstehen:

Die Option M= bewirkt, dass dieses Makefile zurück in Ihr Modulquellverzeichnis verschoben wird, bevor versucht wird, das Modulziel zu erstellen.

Können Sie das deutlicher machen?

M ist keine Option für make. Beachten Sie, dass der Bindestrich fehlt. M ist eine Variable, die der Ausführung von zugewiesen ist make. Wenn make führt ein Makefile Skript, kann dieses Skript die Variable lesen M und seinen Inhalt verwenden.

In dem von Ihnen angegebenen Beispiel make werde lesen Makefile in ~/kernel-2.6 und weisen Sie der Variablen Ihr aktuelles Arbeitsverzeichnis zu M. In der Regel wird dies ermöglichen make um nach der Verarbeitung zu Ihrem aktuellen Verzeichnis zurückzukehren Makefile.

  • Nicht “nach der Verarbeitung des Makefiles” (das passiert sowieso, nur beim Beenden), sondern “um die Quellen zu finden, wenn das Kernel-Makefile verwendet wird”. Es ist ein Zeiger zurück zu “hier” von “dort” in einem Modulaufbau.

    – Toby Speight

    11. Oktober 2017 um 10:57 Uhr

Benutzer-Avatar
4pie0

Ich hatte ein ähnliches Quiz mit

make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

Hier wird make im Verzeichnis meines Projekts aufgerufen. -C ist Option machen:

-C dir, –directory=dir Wechselt in das Verzeichnis dir, bevor Sie die Makefiles lesen oder irgendetwas anderes tun. Wenn mehrere -C-Optionen angegeben sind, wird jede relativ zur vorherigen interpretiert: -C / -C etc ist äquivalent zu -C /etc. Dies wird normalerweise mit rekursiven Aufrufen von make verwendet.

M ist keine make-Option, sondern ein übergebenes Argument. Seit -C Wenn Sie das make-Verzeichnis ändern, wissen wir, dass make die make-Datei in diesem Verzeichnis lesen wird. Durch Untersuchung der Make-Datei in diesem Verzeichnis habe ich herausgefunden, womit es dann zu tun hat M:

Aus Make-Datei (mit dem Namen Makefile) in dem Verzeichnis, auf das von verwiesen wird -C (übrigens ist es das Kernel-Build-Verzeichnis):

# Use make M=dir to specify directory of external module to build
# Old syntax make ... SUBDIRS=$PWD is still supported
# Setting the environment variable KBUILD_EXTMOD takes precedence
ifdef SUBDIRS
  KBUILD_EXTMOD ?= $(SUBDIRS)
endif

Erläuterung aus Linux Device Drivers, 3rd Edition, Jonathan Corbet et al.:

Dieser Befehl ändert zunächst sein Verzeichnis in das mit der Option -C bereitgestellte (d. h. Ihr Kernel-Quellverzeichnis). Dort findet es das Top-Level-Makefile des Kernels. Die Option M= bewirkt, dass dieses Makefile zurück in Ihr Modulquellverzeichnis verschoben wird, bevor versucht wird, das Modulziel zu erstellen.

Lesen Sie das Handbuch für make:

-C dir, --directory=dir
            Change to directory dir before reading the makefiles or doing anything else.

Ihr Aufruf ändert das Verzeichnis in ~/kernel und effektiv anruft make dort, dh beim Lesen der Makefile aus diesem Verzeichnis. Mit dem M -Variable weiß das Makefile, wo sich Ihre eigentlichen Projektdateien befinden, und kann zu diesem Speicherort zurückkehren.

Der Punkt ist, dass Sie kein eigenes Makefile schreiben, sondern eine einzige, einmalige Version verwenden.

Benutzer-Avatar
yue shangguan

Andere Antworten sind meistens richtig, aber ich möchte Ihnen sagen, wie Sie sie lernen können.

  1. M ist keine Option
  2. M ist eine Variable in Makefile
  3. also sollten wir die lesen Makefile in dem Verzeichnis, das die make -C Änderungen an.

Lesen Sie das Makefile: Es gibt einige Kommentare:

# Use make M=dir to specify directory of external module to build
# Old syntax make ... SUBDIRS=$PWD is still supported
# Setting the environment variable KBUILD_EXTMOD take precedence
ifdef SUBDIRS
  KBUILD_EXTMOD ?= $(SUBDIRS)
endif

ifeq ("$(origin M)", "command line")
  KBUILD_EXTMOD := $(M)
endif

Sie können suchen KBUILD_EXTMOD:

VPATH       := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))
module-dirs := $(addprefix _module_,$(KBUILD_EXTMOD))

So ist der Kernel Makefile können Ihre Out-of-Tree-Quellen erstellen.

Der Befehl zum Erstellen eines externen Moduls lautet:

    $ make -C <path_to_kernel_src> M=$PWD

Das kbuild-System weiß aufgrund der im Befehl angegebenen Option “M=”, dass ein externes Modul erstellt wird.

Um gegen den laufenden Kernel zu bauen, verwenden Sie:

    $ make -C /lib/modules/`uname -r`/build M=$PWD

Benutzer-Avatar
Tim Pierce

Schreiben in einer Unix-Shell `foobar` in der Mitte eines Befehls bedeutet “Befehl ausführen foobar und ersetzen Sie seine Ausgabe hier.”

Also inklusive M=`pwd` in dem make Befehl bedeutet “führe die pwd Befehl, um das aktuelle Arbeitsverzeichnis zu drucken, und setzen Sie die M Variable auf diesen Wert.”

1372300cookie-checkM-Option im make-Befehl, Makefile

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy