В драйвере устройства стороннего производителя я бы хотел "определить" флаг, различающий 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" может содержать любой контент, не относящийся к этой проблеме ...