#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, возможно, они используют переменную CC2. @igagis Ах да, глядя на них, теперь они жестко кодируют gcc, добавленный выше.
3. Похоже, что все вызовы компилятора жестко запрограммированы. Вам нужно будет использовать
gcc
скрипт-оболочку в$PATH
, который преобразуетgcc
командную строку вuclibc
командную строку.4. @StefanBecker Спасибо, определенно лучшее решение. Поскольку мне нужно, чтобы это было создано только один раз, я пошел дальше и изменил файлы, чтобы они ссылались на мой путь uclibc, и удалил
-no-pie
, поскольку это вызвало ошибку.