Hier ist mein Makefile, das ist für's CrossCompiling nutze. Ich entwickle und kompiliere meistens auf dem Arbeitsrechner und das Ergebnis wird per SCP auf die Zielplattform übertragen.

Lange Version:

# Set this variable with the path to your kernel.
# Don't use /usr/src/linux if you're cross-compiling...
MYY_KERNEL_DIR ?= ../linux

# If you're compiling for ARM64, this will be arm64
ARCH ?= arm

# This is the prefix attached to your cross-compiling gcc/ld/... tools
# In my case, gcc is armv7a-hardfloat-linux-gnueabi-gcc
# If you've installed cross-compiling tools and don't know your 
# prefix, just type "arm" in a shell, hit <TAB> twice
#
# If you're compiling from ARM system with the same architecture
# (arm on arm or arm64 on arm64) delete the characters after "?="
CROSS_COMPILE ?= armv7a-hardfloat-linux-gnueabi-

# The modules will be installed in $(INSTALL_MOD_PATH)/lib/...
# That might not be needed at all, if you're replacing the "install"
# command, see below.
INSTALL_MOD_PATH ?= /tmp/RockMyy-Build
INSTALL_PATH     ?= $(INSTALL_MOD_PATH)/boot
INSTALL_HDR_PATH ?= $(INSTALL_MOD_PATH)/usr

# Determine the CFLAGS specific to this compilation unit.
# This will define the MY_SPECIAL_MACRO_NAME variable that can checked
# with #ifdef in the C code to include specific code.
ccflags-y += -I${src}/include -DMY_SPECIAL_MACRO_NAME=1

# Determine what's needed to compile my-driver.o
# Every '.o' file corresponds to a '.c' file.
my-driver-objs := my_source_file.o my_other_source_file.o
my-driver-objs += yet_another_source_file.o

# Replace m by y if you want to integrate it or
# replace it by a configuration option that should be enabled when
# configuring the kernel like obj-$(CONFIG_MY_MODULE)
#
# obj-m will generate the my-driver.ko
# obj-y will integrate the code into the kernel.
obj-m += my-driver.o

all:
	make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD) -C $(MYY_KERNEL_DIR) modules

clean:
	make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD) -C $(MYY_KERNEL_DIR) clean

# This does a normal installation...
# You could replace this by a scp command that sends the module to
# your ARM system.
install:
	make INSTALL_MOD_PATH=$(INSTALL_MOD_PATH) INSTALL_PATH=$(INSTALL_PATH) INSTALL_HDR_PATH=$(INSTALL_HDR_PATH) M=$(PWD) -C $(MYY_KERNEL_DIR) modules_install
#	scp my-driver.ko 10.100.0.55:/tmp

Bevor man es nutzen kann, muss man einpaar Einstellungen vornehmen:

  • Zeile 3: MYY_KERNEL_DIR: hier soll das Verzeichnis angegeben werden, in dem die Kernel-Sourcen liegen, zum Beispiel /opt/mainline_4.14
  • Zeile 6: ARCH: hier wird die Architektur angegeben, arm, arm64, ...
  • Zeile 15: CROSS_COMPILE: hier wird angegeben welcher Compiler verwendet wird
  • Zeile 20 bis 22: hier werden die Zielpfade festgelegt, die später verwendet werden
  • Zeile 27: hier kommen die Extra-Flags rein, zum Beispiel -DDEBUG um mehr Infos in dmesg zu haben (schaltet pr_devel und pr_debug frei)
  • Zeile 31 und 32: hier kommt die Liste der .o Dateien rein, die mitkompiliert werden sollen
  • Zeile 40: hier ist die Liste der Dateien, die beim Kompilieren erzeugt werden
  • Zeile 42, 45 und 51: hier sind die sog. Build-Targets definiert, die Befehle die ausgeführt werden

Kurze Version:

# The same Makefile without the comments
MYY_KERNEL_DIR ?= ../linux
ARCH ?= arm
CROSS_COMPILE ?= armv7a-hardfloat-linux-gnueabi-

INSTALL_MOD_PATH ?= /tmp/RockMyy-Build
INSTALL_PATH     ?= $(INSTALL_MOD_PATH)/boot
INSTALL_HDR_PATH ?= $(INSTALL_MOD_PATH)/usr

ccflags-y += -I${src}/include -DMY_SPECIAL_MACRO_NAME=1

my-driver-objs := my_source_file.o my_other_source_file.o
my-driver-objs += yet_another_source_file.o

obj-m += my-driver.o

all:
	make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD) -C $(MYY_KERNEL_DIR) modules

clean:
	make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD) -C $(MYY_KERNEL_DIR) clean

install:
	scp my-driver.ko 10.100.0.55:/tmp