Условный CCOPT не передается в subMakefile при компиляции драйвера - PullRequest
0 голосов
/ 25 июня 2019

В драйвере устройства стороннего производителя я бы хотел "определить" флаг, различающий make release и make debug.

Я использую эту конструкцию все время с обычным кодом, но это не такработает при компиляции этого драйвера устройства.

Минимальный Makefile выглядит следующим образом:

KERNEL_VERSION := $(shell uname -r)
KERNEL_DIR := /lib/modules/$(KERNEL_VERSION)/build
INSTALL_MOD_DIR := kernel/drivers/misc
PWD := $(shell pwd)

EXTRA_CFLAGS := -I$(M)/someDir
ccflags-y    := -std=gnu99 -Wno-declaration-after-statement

CCOPT   += -DmyOptA
CCOPT   += -DmyOptB 

## CONDITIONAL HERE ##

ifeq ($(MAKECMDGOALS),debug)
  $(info Compiling for debug)
  CCOPT += -DmyOptC
endif

CCOPT += -DmyOptD

EXTRA_CFLAGS += $(CCOPT)
WARNINGFLAGS = -fdiagnostics-color=auto
obj-m := driverModule.o

debug release: 
    @echo ; echo "Building '$(MAKECMDGOALS)'..."
    @echo CCOPT=$(CCOPT)
    @echo EXTRA_CFLAGS=$(EXTRA_CFLAGS)
    $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules

Так что myOptA, myOptB и myOptD всегда должны быть установлены и myOptC долженбыть установленным только для make debug.

myOptC фактически установлен в этом Makefile, но не распространяется в make-файл ядра.Но передаются myOptA,C,D.

Вывод make debug ясно показывает myOptC, включенный с CCOPT и EXTRA_CFLAGS, но он просто не отображается в следующей строке компиляции.

Почему бы и нет?

$ make debug V=1
Compiling for debug

Building 'debug'...
CCOPT=-DmyOptA -DmyOptB -DmyOptC -DmyOptD
EXTRA_CFLAGS=-I/someDir -DmyOptA -DmyOptB -DmyOptC -DmyOptD
make -C /lib/modules/4.4.127-1.el6.elrepo.i686/build M=/xfiles modules
make[1]: Entering directory `/usr/src/kernels/4.4.127-1.el6.elrepo.i686'
test -e include/generated/autoconf.h -a -e include/config/auto.conf || (        \
    echo >&2;                           \
    echo >&2 "  ERROR: Kernel configuration is invalid.";       \
    echo >&2 "         include/generated/autoconf.h or include/config/auto.conf are missing.";\
    echo >&2 "         Run 'make oldconfig && make prepare' on kernel src to fix it.";  \
    echo >&2 ;                          \
    /bin/false)
mkdir -p /xfiles/.tmp_versions ; rm -f /xfiles/.tmp_versions/*
make -f ./scripts/Makefile.build obj=/xfiles
  gcc -Wp,-MD,/xfiles/.driverModule.o.d  -nostdinc
  -isystem /usr/lib/gcc/i686-redhat-linux/4.4.7/include
  -I./arch/x86/include -Iarch/x86/include/generated/uapi
  -Iarch/x86/include/generated  -Iinclude
  -I./arch/x86/include/uapi
  -Iarch/x86/include/generated/uapi -I./include/uapi
  -Iinclude/generated/uapi -include
  ./include/linux/kconfig.h -D__KERNEL__ -Wall -Wundef
  -Wstrict-prototypes -Wno-trigraphs
  -fno-strict-aliasing -fno-common
  -Werror-implicit-function-declaration
  -Wno-format-security -std=gnu89 -fno-PIE -mno-sse
  -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -m32
  -msoft-float -mregparm=3 -freg-struct-return -fno-pic
  -mpreferred-stack-boundary=2 -march=i686
  -mtune=generic -maccumulate-outgoing-args
  -Wa,-mtune=generic32 -ffreestanding -DCONFIG_AS_CFI=1
  -DCONFIG_AS_CFI_SIGNAL_FRAME=1
  -DCONFIG_AS_CFI_SECTIONS=1 -DCONFIG_AS_SSSE3=1
  -DCONFIG_AS_CRC32=1 -DCONFIG_AS_AVX=1
  -DCONFIG_AS_AVX2=1 -pipe -Wno-sign-compare
  -fno-asynchronous-unwind-tables
  -fno-delete-null-pointer-checks -O2 -DCC_HAVE_ASM_GOTO
  -Wframe-larger-than=2048 -fstack-protector
  -Wno-unused-but-set-variable -fno-omit-frame-pointer
  -fno-optimize-sibling-calls
  -fno-var-tracking-assignments -pg
  -fno-inline-functions-called-once
  -Wdeclaration-after-statement -Wno-pointer-sign
  -fno-strict-overflow -fno-merge-all-constants
  -fmerge-constants -fno-stack-check -fconserve-stack
  -Werror=implicit-int -Werror=strict-prototypes
  -std=gnu99 -Wno-declaration-after-statement
  -I/xfiles/someDir -DmyOptA -DmyOptB -DmyOptD  -DMODULE
   -D"KBUILD_STR(s)=#s"
  -D"KBUILD_BASENAME=KBUILD_STR(driverModule)" 
  -D"KBUILD_MODNAME=KBUILD_STR(driverModule)" -c -o
  /xfiles/.tmp_driverModule.o /xfiles/driverModule.c

Файл "driverModule.c" может содержать любой контент, не относящийся к этой проблеме ...

1 Ответ

0 голосов
/ 26 июня 2019

Переменные make по умолчанию не отображаются в подмейках (кроме MAKEFLAGS).Вы должны либо экспортировать их в среду (чтобы они стали видимыми в любом дочернем процессе), либо передать их в командной строке, например: $(MAKE) -C $(KERNEL_DIR) M=$(PWD) EXTRA_CFLAGS=$(EXTRA_CFLAGS) modules

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...