IlPuntoTecnico
Hardware e Software => Programmazione => Topic aperto da: hitech95 - 06 Maggio 2019, 23:46
-
Ciao,
sono poco ferrato co i makefile.
Sto sviluppando un driver linux (https://www.ilpuntotecnico.com/forum/index.php/topic,80573.0.html) ma ho diversi problemi nel realizzare il makefile.
Questo è quello che ho fatto, ma (ovviamente) non funziona. :headbang:
CONFIG_MODULE_SIG=n
CFILES:= $(notdir $(wildcard $M/src/mylib/.*c)) \
$(notdir $(wildcard $M/src/mylib/device_drivers/chip1/.*c)) \
$(notdir $(wildcard $M/src/mylib/device_drivers/chip2/.*c)) \
$(notdir $(wildcard $M/src/mylib/device_drivers/chip3/.*c)) \
$(notdir $(wildcard $M/src/mylib/device_drivers/chip4/.*c)) \
OBJS := $(CFILES:.c=.o)
KSRC := /lib/modules/$(shell uname -r)/build
obj-m += mylib_api.o
proslic_api-y := $(OBJS)
all:
$(MAKE) -C $(KSRC) M=$(PWD) modules
clean:
$(MAKE) -C $(KSRC) M=$(PWD) clean
.PHONY: clean
Vi spiego un com'è fatta la struttura del progetto:
basedir:
|- Makefile
|- src
|- main.c
|- main.h
|- vendor_lib
|- Makefile (Questo è il makefile che mi sta dando diverse noie)
|- lots_of_files.h
|- lots_of_files.c
|- vendor_subdir
|- vendror_subdir_nested
|- vendror_subdir_file.h
|- vendror_subdir_file.c
Il problema si presenta quando nei file lots_of_files.c vengono importati dei file .h che sono in realtà nelle cartelle sottostanti. ( Senza il percorso, #include "example.h", example.h è sotto ./vendor_subdir/vendror_subdir_nested/example.h)
L'idea è quella di copiare tutti i file della vendor lib in una unica cartella "build" da cui poi compilare i vari file con la wildcard.
Essendo la libreria di terze parti vorrei evitare il più possibile di modificare il codice visto che effettua un sacco di operazioni abbastanza sconoscute.
Se qualcuno ha qualche suggerimento, è ben accetto.
-
ti consiglio di modificare il makefile appendendo -I<percorso_da_includere> che è la soluzione standard a questo tipo di problema
ti faccio un esempio
CONFIG_MODULE_SIG=n
ccflags-y := -Isrc/vendor_libs/ -Isrc/vendor_libs/vendor_subdir/ -I...
CFILES:= $(notdir $(wildcard $M/src/mylib/.*c)) \
$(notdir $(wildcard $M/src/mylib/device_drivers/chip1/.*c)) \
$(notdir $(wildcard $M/src/mylib/device_drivers/chip2/.*c)) \
$(notdir $(wildcard $M/src/mylib/device_drivers/chip3/.*c)) \
$(notdir $(wildcard $M/src/mylib/device_drivers/chip4/.*c)) \
OBJS := $(CFILES:.c=.o)
KSRC := /lib/modules/$(shell uname -r)/build
obj-m += mylib_api.o
proslic_api-y := $(OBJS)
all:
$(MAKE) -C $(KSRC) M=$(PWD) modules
clean:
$(MAKE) -C $(KSRC) M=$(PWD) clean
.PHONY: clean
ovviamente metti solo le include dir necessarie, che non saranno tutte le sottocartelle
EDIT: in base alla versione del kernel che stai compilando, è possibile che la variabile non sia "ccflags-y" ma "EXTRA_CFLAGS" (che è deprecata ma dovrebbe funzionare tuttora)
-
Purtroppo anche la wildcard non funziona.
Non sono proprio in grado di comprendere questi makefile...
:facepalm:
-
quello che ti consiglio è di mettere i file .c con il loro persorso relativo nel makefile. puoi usare "find ." per avere una lista ricorsiva dei file, la formatti un attimo e la metti nel makefile