Jak stworzyć define'a w makefilu

0

Hej
W kernelu w linuxie jest tak, że firmy zewnętrze które dostarczają coś do linuxa dla kernela w wersji 2017.3 wrzucają ci interfejs (headera) do katalogu /inlude/linux/firmware/ti a dla kernela w wersji 2019.2 już do innego np. include/linux. I jak masz implementację external kernel modułu no to musisz zrobić pewną magię w makefilu. Tzn. do makefila przekazujesz maszynę na jaką budujesz (dzięki temu wiesz czy kernel moduł ma być budowany w środowisku kernela 2017.3 czy 2019.2.

Makefile:

ifeq ($(findstring target2017_3, $(MACHINE)), target2017_3) 
    ARCH_2017_3 = 1    
endif
ifeq ($(findstring target2019_2, $(MACHINE)), target2019_2) 
    ARCH_2019_2 = 1
endif

I potem jak mam plik c to daję:

#ifdef ARCH_2017_3
#include <linux/firmware/ti/firmware.h>
#elseif ARCH_2019_2
#include <linux/ti-firmware.h>
#endif

Ale niestety nie działa mi to. Preprocesor podczas budowania nie widzi żadnego define'a na poziomy zabawy z plikiem c (nie widzi żadnego nagłówka w związku z tym). Więc pewnie jakoś inaczej sie tworzy definy w makefilu tak aby potem były widoczne w kodzie c. Ktoś wie jak?
BTW tam musi być findstring bo to ARCH_... to tylko część nazwy maszyny. I mam pewność, że wchodzi w jednego albo drugiego ifa na poziomie makefila, bo debugowałem to. Także pytanie czemu ta zmienna jest niewidoczna w pliku c przez preprocesor.

3

A nie mozesz zrobic cos takiego jak np.

$(CC) $(CFLAGS) -DARCH_2017_3 -DARCH_2019_2

tzn. dodac do opcji kompilacji - do gcc-ka parametry -D<costam>? preprocesor jakos musi te parametry twoje zobaczyc, wiec musisz mu je jakos podac.

0

a dobra OK, zapomniałem że przez -Dnazwa_defina sie przekazuje preprocesorowi to. To inaczej jeszcze to zrobię w makefilu.
Jednak mi to nie działa.
A czym sie różni $(CC) od $(MAKE)? Ja $(MAKE) używam.

2
fvg napisał(a):

a dobra OK, zapomniałem że przez -Dnazwa_defina sie przekazuje preprocesorowi to. To inaczej jeszcze to zrobię w makefilu.
Jednak mi to nie działa.
A czym sie różni $(CC) od $(MAKE)? Ja $(MAKE) używam.

Zmienna CC zawiera nazwę/ścieżkę binarki kompilatora
Zmienna MAKE zawiera nazwę/ścieżkę do binarki make. Jeżeli używasz $(MAKE) to najprawdopodobniej rekurencyjnie wywołujesz make.

Możesz w makefile zrobić:

MYDEFS += -DMOJA_FLAGA1
MYDEFS += -DMOJA_FLAGA2=0   
MYDEFS += -DMOJA_FLAGA3=1   
# a potem dla każdego targetu
%.o: %.c
    $(CC) $(CFLAGS) $(MYDEFS) -c $< -o [email protected]

Najlepiej te definicje w osobny pliku, np options.mk i dołączyć do makefile

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0