Как указать компилятор в makefile, когда переменная CC не использовалась?

#linux #makefile #gnu-make

#linux #makefile #gnu-make

Вопрос:

Обычно, когда я хочу make и устанавливаю для своего компилятора значение uclibc вместо gcc , я могу просто сделать make CC=/path/to/uclibc , поскольку файлы makefile должны использовать эту переменную, или я могу использовать configure скрипт. Пакет, который я создаю в данный момент, не реализует CC или не имеет configure скрипта, и хотя я пытался настроить компилятор, я не могу заставить его работать, есть идеи? Вот исходный makefile.

 # Determination of the target system
target = $(shell uname)
sysdir = Lx

ifdef target
 ifeq ("$(target)","QNX")
  sysdir = Qx
 endif
endif

M = for i in $(ALLDIRS); do make -C $$i/$(sysdir)
N = || exit 1; done

ifeq ("$(target)","QNX")
install:
    cp CgosDump/$(sysdir)/cgosdump /usr/bin
    cp CgosMon/$(sysdir)/cgosmon /usr/bin
    cp CgosLib/$(sysdir)/libcgos.so /usr/lib
    cp CgosDrv/$(sysdir)/cgosdrv /usr/lib
    cp CgosTest/$(sysdir)/cgostest /usr/lib
else

default:
    $(M) $(N)

install:
    install -m 755 -o root -g root CgosDump/$(sysdir)/cgosdump /usr/bin
    install -m 755 -o root -g root CgosMon/$(sysdir)/cgosmon /usr/bin
    install -m 755 -o root -g root CgosTest/$(sysdir)/cgostest /usr/bin
    install -m 755 -o root -g root CgosLib/$(sysdir)/libcgos.so /usr/lib
    install -m 644 -o root -g root CgosDrv/$(sysdir)/cgosdrv.ko /lib/modules/`uname -r`/kernel/drivers/misc
    depmod -a

# copy the udev rules to /lib/udev/rules.d - but only if the file does not already exist
    @if ! [ -e /lib/udev/rules.d/99-cgos.rules ]; 
    then 
        cp 99-cgos.rules /lib/udev/rules.d/99-cgos.rules; 
        echo "Copied CGOS udev rule to /lib/udev/rules.d."; 
    fi

# copy the configuration file for module insertion at startup to /usr/lib/modules-load.d - but only if the file does not already exist
    @if ! [ -e /usr/lib/modules-load.d/cgos.conf ]; 
    then 
        cp cgos.conf /usr/lib/modules-load.d/cgos.conf; 
        echo "Added cgos.conf to /usr/lib/modules-load.d for cgosdrv module insertion at system startup."; 
    fi

clean:
    $(M) $@ $(N)

endif
  

./CgosLib/Lx/Makefile:

 PROJECT_INC = -I. -I.. -I../.. -I../../CgosLib
PROJECT_LIB =
C_source = LibOsaLx.c ../LibOsaM.c
C_source_p = ../Cgos.c
DEF = -DUNIX
OPT = -Wall -fPIC

default: $(C_source) libcgosp.o
    gcc -shared -o libcgos.so $(OPT) $(DEF) $(PROJECT_INC) $(C_source) libcgosp.o

libcgosp.o:
    gcc -Wl,-r -no-pie -nostdlib -o libcgosp.o $(OPT) $(DEF) $(PROJECT_INC) $(C_source_p)

clean:
    rm -f *.so *.o
  

./CgosDrv/Lx/Makefile:

 # Kernel-Makefile for building cgos for kernel version 2.6.x, 3.x and 4.x
#

# by default, the kernel source is assumed to be in
# /lib/modules/`uname -r`/build

# ATTENTION: use the install option with care: it`s assumed that the
# driver was build for the currently running kernel.

KERNELDIR ?= /lib/modules/`uname -r`/build
CONFIG_CGOS ?= m

C_source = DrvLx.c DrvOsaLx.c ../CgosDrv.c ../Cgeb.c

make26_pre16 = $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
make26 = $(MAKE) -C $(KERNELDIR) M=$(PWD)

sublevel = $(shell sed -n s/SUBLEVEL = *//p $(KERNELDIR)/Makefile)
patchlevel = $(shell sed -n s/PATCHLEVEL = *//p $(KERNELDIR)/Makefile)

mkcmd = $(shell if [ "$(version)" -lt 3 amp;amp; "$(patchlevel)" == 6 amp;amp; "$(sublevel)" -lt 16 ]; then echo $(make26_pre16); 
    else echo $(make26); fi; )

ifdef KERNELRELEASE

    EXTRA_CFLAGS  = -I$(obj)/. -I$(obj)/.. -I$(obj)/../../CgosLib
    EXTRA_CFLAGS  = -I$(obj)/../../CgosLib/Lx
#   EXTRA_CFLAGS  = -O2 -mcmodel=kernel -DAMD64 -fno-strict-aliasing
#   EXTRA_CFLAGS  = -O2 -DAMD64 -fno-strict-aliasing
    EXTRA_CFLAGS  = -O2 -fno-strict-aliasing
    EXTRA_CFLAGS  = -I$(obj)/../..
    obj-$(CONFIG_CGOS)  = cgosdrv.o 

    cgosdrv-objs := DrvLx.o DrvOsaLx.o ../Cgeb.o ../CgosDrv.o 
    clean-files := *.o
else
    PWD := $(shell pwd)
    obj := $(PWD)

    DEF = -DUNIX -D__KERNEL__ -Dlinux -DMODULE
    EXTRA_CFLAGS = $(DEF) -O2 -Wall -Wl,-r -nostdlib
    EXTRA_CFLAGS  = -I. -I.. -I../.. -I$(KERNELDIR)/include -I../../CgosLib
#   EXTRA_CFLAGS  = -mcmodel=kernel -DAMD64 -fno-strict-aliasing
#   EXTRA_CFLAGS  = -DAMD64 -fno-strict-aliasing
    EXTRA_CFLAGS  = -fno-strict-aliasing

default:
    $(call mkcmd)

emu:
    gcc -o cgosdrv.o -D CGEBEMU $(EXTRA_CFLAGS) $(C_source) ../CgebEmu.c

endif

clean:
    rm -rf *~ *.ko *.mod.* .*.cmd .tmp* .*.tmp* .*.mk .*Drv*.o cgosdrv.o
    rm -rf DrvLx.o DrvOsaLx.o built-in.o
    rm -rf .*.flags
    rm -rf Module.symvers modules.order
    rm -rf ../*.o* ../.*.o*

install:
    install -m 644 -o root -g root cgosdrv.ko /lib/modules/`uname -r`/kernel/drivers/misc
  

./CgosMon/Lx/Makefile

 PROJECT_INC = -I. -I.. -I../.. -I../../CgosLib
PROJECT_LIB = -lcgos -L../../CgosLib/Lx
C_source = ../CgosMon.c
OPT = -Wall

default:
    gcc $(C_source) -o cgosmon $(OPT) $(DEF) $(PROJECT_INC) $(PROJECT_LIB)

clean:
    rm -f cgosmon

cleanall: clean

buildmaster@x86build:~/cgoslx-x64-1.03.029$ 
buildmaster@x86build:~/cgoslx-x64-1.03.029$ cat ./CgosMon/Lx/Makefile
PROJECT_INC = -I. -I.. -I../.. -I../../CgosLib
PROJECT_LIB = -lcgos -L../../CgosLib/Lx
C_source = ../CgosMon.c
OPT = -Wall

default:
    gcc $(C_source) -o cgosmon $(OPT) $(DEF) $(PROJECT_INC) $(PROJECT_LIB)

clean:
    rm -f cgosmon

cleanall: clean
  

./CgosMon/Lx/Makefile:

 PROJECT_INC = -I. -I.. -I../.. -I../../CgosLib
PROJECT_LIB = -lcgos -L../../CgosLib/Lx
C_source = ../CgosMon.c
OPT = -Wall

default:
    gcc $(C_source) -o cgosmon $(OPT) $(DEF) $(PROJECT_INC) $(PROJECT_LIB)

clean:
    rm -f cgosmon

cleanall: clean

buildmaster@x86build:~/cgoslx-x64-1.03.029$ cat 
^C
buildmaster@x86build:~/cgoslx-x64-1.03.029$ cat ./CgosDump/Lx/Makefile
PROJECT_INC = -I. -I.. -I../.. -I../../CgosLib
PROJECT_LIB = -lcgos -L../../CgosLib/Lx
C_source = ../CgosDump.c
OPT = -Wall

default:
    gcc $(C_source) -o cgosdump $(OPT) $(DEF) $(PROJECT_INC) $(PROJECT_LIB)

clean:
    rm -f cgosdump

cleanall: clean
  

./CgosTest/Lx/Makefile:

 PROJECT_INC = -I. -I.. -I../.. -I../../CgosLib
PROJECT_LIB = -lcgos -L../../CgosLib/Lx
C_source = ../cgostest.c ../generic.c
OPT = -Wall

default:
    gcc $(C_source) -o cgostest $(OPT) $(DEF) $(PROJECT_INC) $(PROJECT_LIB)

clean:
    rm -f cgostest

cleanall: clean
  

РЕДАКТИРОВАТЬ: кажется, это было жестко запрограммировано в subdirs, я могу изменить это на свой путь к компилятору.

Комментарии:

1. насколько я вижу, makefile просто рекурсивно вызывает make в ALLDIRS каталогах, нужно посмотреть эти makefile, возможно, они используют переменную CC

2. @igagis Ах да, глядя на них, теперь они жестко кодируют gcc, добавленный выше.

3. Похоже, что все вызовы компилятора жестко запрограммированы. Вам нужно будет использовать gcc скрипт-оболочку в $PATH , который преобразует gcc командную строку в uclibc командную строку.

4. @StefanBecker Спасибо, определенно лучшее решение. Поскольку мне нужно, чтобы это было создано только один раз, я пошел дальше и изменил файлы, чтобы они ссылались на мой путь uclibc, и удалил -no-pie , поскольку это вызвало ошибку.