1
0
mirror of https://github.com/KastnerRG/riffa.git synced 2024-12-24 22:58:54 +08:00
riffa/driver/linux/Makefile
Adrien Prost-Boucle 326c7105ca
Fix compilation of Linux driver (#64)
* Fix typo in #elif

* Fix Makefile to compile the Linux kernel module
2024-06-11 16:10:01 +02:00

156 lines
5.6 KiB
Makefile

# ----------------------------------------------------------------------
# Copyright (c) 2016, The Regents of the University of California All
# rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
#
# * Neither the name of The Regents of the University of California
# nor the names of its contributors may be used to endorse or
# promote products derived from this software without specific
# prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL REGENTS OF THE
# UNIVERSITY OF CALIFORNIA BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
# DAMAGE.
# ----------------------------------------------------------------------
# Filename: Makefile
# Version: 2.0
# Description: Makefile for Linux PCIe device driver for RIFFA.
# Author: Matthew Jacobsen
# History: @mattj: Initial release. Version 2.0.
# You must specify the following variables. You can leave the defaults if you
# like, but make sure they will work in your system.
# The VENDOR_ID _must_ match what is configured on your FPGA's PCIe endpoint
# header. Xilinx has a VENDOR_ID = 10EE.
NAME := riffa
VENDOR_ID0 := 10EE
VENDOR_ID1 := 1172
MAJNUM := 100
# Build variables
KVER := $(shell uname -r)
KDIR := /lib/modules/`uname -r`/build
RHR := /etc/redhat-release
LIB_SRCS := riffa.c
LIB_OBJS := $(patsubst %.c,%.o,$(LIB_SRCS))
LIB_HDR := riffa.h
LIB_VER_MAJ := 1
LIB_VER_MIN := 0
LIB_VER := $(LIB_VER_MAJ).$(LIB_VER_MIN)
DRVR_HDR := riffa_driver.h
DBUGVAL := DBUG
obj-m += $(NAME).o
$(NAME)-y := riffa_driver.o circ_queue.o
# Helper functions
define assert
$(if $1,,$(error Assertion failed: $2))
endef
define assert-not-null
$(call assert,$($1),The variable "$1" is null, please specify it.)
endef
define assert-variables
$(call assert-not-null,NAME)
$(call assert-not-null,MAJNUM)
$(call assert-not-null,VENDOR_ID0)
$(call assert-not-null,VENDOR_ID1)
@printf "Compiling driver for kernel: %s with the following values\n" $(KVER)
@printf " NAME: '%s'\n" $(NAME)
@printf " MAJNUM: '%s'\n" $(MAJNUM)
@printf "VENDOR_ID0: '%s'\n" $(VENDOR_ID0)
@printf "VENDOR_ID1: '%s'\n" $(VENDOR_ID1)
@printf "\n"
endef
all: builddvr
debug: CC += -DDEBUG -g
debug: DBUGVAL = DEBUG
debug: builddvr
builddvr: $(NAME).ko $(NAME).so.$(LIB_VER)
$(NAME).ko: *.c *.h
$(call assert-variables)
sed -i 's/#define MAJOR_NUM [^\n]*/#define MAJOR_NUM $(MAJNUM)/g' $(DRVR_HDR)
sed -i 's/#define DEVICE_NAME [^\n]*/#define DEVICE_NAME "$(NAME)"/g' $(DRVR_HDR)
sed -i 's/#define VENDOR_ID0 [^\n]*/#define VENDOR_ID0 0x$(VENDOR_ID0)/g' $(DRVR_HDR)
sed -i 's/#define VENDOR_ID1 [^\n]*/#define VENDOR_ID1 0x$(VENDOR_ID1)/g' $(DRVR_HDR)
sed -i 's/#define DEBUG [^\n]*/#define DBUG 1/g' $(DRVR_HDR)
sed -i 's/#define DBUG [^\n]*/#define $(DBUGVAL) 1/g' $(DRVR_HDR)
make -C $(KDIR) M=$(shell pwd) modules
rm -rf $(LIB_OBJS)
$(NAME).so.$(LIB_VER): $(LIB_OBJS)
$(CC) -shared -Wl,-soname,lib$(NAME).so.$(LIB_VER_MAJ) -o lib$@ $^
$(LIB_OBJS): $(LIB_SRCS)
$(CC) -g -Wall -fPIC -c $^
load: $(NAME).ko
insmod $(NAME).ko
unload:
rmmod $(NAME)
clean:
rm -Rf *.ko *.cmd *.o *.so *.so.* .*.cmd Module.symvers Module.markers modules.order *.mod.c .tmp_versions
setup:
if [ -f "$(RHR)" ]; then yum install kernel-devel-`uname -r`;\
else apt-get install linux-headers-`uname -r`; fi
install: $(NAME).so.$(LIB_VER) $(NAME).ko
mkdir -p /lib/modules/$(KVER)/kernel/drivers/$(NAME)
cp $(NAME).ko /lib/modules/$(KVER)/kernel/drivers/$(NAME)/
if [ -f "$(RHR)" ]; then\
printf "%b\n" "#!/bin/sh\nexec /sbin/modprobe $(NAME) >/dev/null 2>&1" > /etc/sysconfig/modules/$(NAME).modules;\
chmod 755 /etc/sysconfig/modules/$(NAME).modules;\
else\
if ! grep -Fxq "$(NAME)" /etc/modules; then echo "$(NAME)" >> /etc/modules; fi;\
fi
printf "%b\n" "KERNEL==\"$(NAME)\", MODE=\"777\", GROUP=\"root\"" > /etc/udev/rules.d/99-$(NAME).rules
printf "/usr/local/lib\n" > $(NAME).conf
mv $(NAME).conf /etc/ld.so.conf.d/
cp $(DRVR_HDR) /usr/local/include/
cp $(LIB_HDR) /usr/local/include/
mv lib$(NAME).so.1.0 /usr/local/lib
ln -sf /usr/local/lib/lib$(NAME).so.$(LIB_VER) /usr/local/lib/lib$(NAME).so.$(LIB_VER_MAJ)
ln -sf /usr/local/lib/lib$(NAME).so.$(LIB_VER) /usr/local/lib/lib$(NAME).so
ldconfig
depmod
uninstall:
rm -f /usr/local/lib/lib$(NAME).so*
rm -f /usr/local/include/$(LIB_HDR)
rm -f /usr/local/include/$(DRVR_HDR)
rm -f /etc/ld.so.conf.d/$(NAME).conf
rm -rf /lib/modules/$(KVER)/kernel/drivers/$(NAME)
rm -f /etc/udev/rules.d/99-$(NAME).rules
if [ -f "$(RHR)" ]; then rm -f /etc/sysconfig/modules/$(NAME).modules;\
else cp /etc/modules ./etc.modules.bak; sed -i '/$(NAME)/d' /etc/modules; fi
ldconfig
depmod