IlPuntoTecnico

Hardware e Software => Programmazione => Topic aperto da: hitech95 - 06 Maggio 2019, 23:46

Titolo: [Makefile] Converitre file annidati in unica cartella
Inserito 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:


Codice: [Seleziona]
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:

Codice: [Seleziona]
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.
Titolo: Re:[Makefile] Converitre file annidati in unica cartella
Inserito da: DoRaeMoN - 07 Maggio 2019, 03:28
ti consiglio di modificare il makefile appendendo -I<percorso_da_includere> che la soluzione standard a questo tipo di problema
ti faccio un esempio

Codice: [Seleziona]
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)
Titolo: Re:[Makefile] Converitre file annidati in unica cartella
Inserito da: hitech95 - 07 Maggio 2019, 18:35
Purtroppo anche la wildcard non funziona.
Non sono proprio in grado di comprendere questi makefile...
 :facepalm:
Titolo: Re:[Makefile] Converitre file annidati in unica cartella
Inserito da: DoRaeMoN - 09 Maggio 2019, 21:59
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