LINUX.ORG.RU

Кросскомпиляция

 , ,


0

1

Есть вот такой Makefile


obj-m += readfile.o

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


Как указать что бы компилировал другим компилятором?

★★

Последнее исправление: tyamur (всего исправлений: 2)

это ты модуль ядра?

Harald ★★★★★
()
Ответ на: комментарий от tyamur

ARCH=«arm»
CROSS_COMPILE=some-prefix-

когда-то простой скриптик наваял, для смены компиляторов:

sbauer@metabook ~$ cat /home/sbauer/bin/arm-gnueabihf-env
#!/bin/bash

if [ "$ARCH" = "arm" ]; then
        echo unsetting ARCH=${ARCH}
        [ ! "x$OLDPATH" = "x" ] && export PATH=$OLDPATH
        [ ! "x$OLDPS1" = "x" ] && export PS1=$OLDPS1
        unset CROSS_COMPILE LOADADDR OLDPATH CFLAGS CFLAGS_MODULE
        ARCH=""
        ARCHB=""
else
        export OLDPATH=$PATH
        OLDPWD2=$OLDPWD
        export OLDPS1=$PS1
        export ARCH="arm"
        export ARCHB="[${ARCH}]"
        export CROSS_COMPILE=arm-linux-gnueabihf-
        export LOADADDR=0x8000
        export CFLAGS=-fno-pic
        export CFLAGS_MODULE=-fno-pic

        export PS1="\[\033[00;36m\]${ARCHB}${PS1}"
        export PATH=/opt/gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf/bin:/home/sbauer/devel/qt-everywhere-opensource-src-5.4.2/qtbase/bin:${PATH}
        echo setting ARCH=${ARCH}
        cd
        cd - > /dev/null 2>&1
        export OLDPWD=$OLDPWD2
        . ~/.bashrc
fi



p.s. разные ненужности типа LOADADDR можно и опустить, но на armhf они были существенны

p.p.s. соответственно, есть мнение, что если ARCH и CROSS_COMPILE пристроить к твоему make, то тоже получится

metawishmaster ★★★★★
()
Последнее исправление: metawishmaster (всего исправлений: 3)

С твоим Makefile никак, а с таким

obj-m := readfile.o

KDIR ?= /lib/modules/`uname -r`/build

all:
        $(MAKE) -C $(KDIR) M=$$PWD
clean:
        $(MAKE) -C $(KDIR) M=$$PWD clean

так

export KDIR=/home/vasyan/linux_source_build_for_arm_dir
export ARCH=arm
export CROSS_COMPILE=/usr/bin/arm-linux-gnueabi-

make
anonymous
()
CC=gcc-11 make

или

make CC=gcc-11

внутри мейкфайл должен понимать $CC

anonymous
()
Ответ на: комментарий от tyamur

Под другую архитектуру.

Пользуй ifeq. Пример:

ifeq ($(OS),Windows_NT)
CC = ...
endif
anonymous
()
Ответ на: комментарий от metawishmaster

Нашел инструкцию но теперь не находит файлы.

cat Makefile

PWD = $(shell pwd)
KVERSION = $(shell uname -r)
K_DIR = /usr/src/linux-headers-$(KVERSION)/

MODULE_NAME = hello
obj-m = hello.o

all:
	make -C $(K_DIR) M=$(PWD) modules
clean:
	make -C $(K_DIR) M=$(PWD) clean
	

запускаю так 

make CC=/usr/bin/arm-linux-gnueabi-gcc ARCH=arm

./include/uapi/asm-generic/int-ll64.h:12:10: fatal error: asm/bitsperlong.h: Нет такого файла или каталога
   12 | #include <asm/bitsperlong.h>
      |          ^~~~~~~~~~~~~~~~~~~
compilation terminated.


// а если так 

make CC=/usr/bin/arm-linux-gnueabi-gcc ARCH=arm64

./include/uapi/linux/types.h:5:10: fatal error: asm/types.h: Нет такого файла или каталога
    5 | #include <asm/types.h>
      |          ^~~~~~~~~~~~~
compilation terminated.

// не совсем понятно где этот файл должен быть. 
// и почему его нет.




tyamur ★★
() автор топика
Последнее исправление: tyamur (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.