1
# Author: Peter M. Petrakis <peter.petrakis@canonical.com>,
2
# Christopher Townsend <christopher.townsend@canonical.com>
4
# Descriptiom: rules to create a dkms and fish package from scratch
5
# for a collection of linux kernel versions.
6
# vim:set syntax=make noexpandtab tabstop=8 shiftwidth=8:
8
# This is the Ubuntu codename, ie, maverick, natty, etc.
11
# If the distribution is not filled out, then it will get the currently running release.
12
ifeq (,$(DISTRIBUTION))
13
DISTRIBUTION = $(shell lsb_release -cs)
16
# XXX Need to fill in package name, package version, and FISH version.
17
# dashes only in here (DKMS constraint)
20
# XXX no dashes or underscores allowed, less is more (DKMS constraint)
23
# XXX (Optional) Fill in the FISH package version number, ie, fish1, fish2, etc.
26
# XXX (Optional) Fill in the obsolete by field
29
# build against all installed headers
30
TARGS = $(shell cd /lib/modules; for i in *; do echo $$i; done)
31
MKDEB_TARGS = $(shell cd /lib/modules; for i in *; do echo -k $$i; done)
33
# only used during development "driver" and "clean" targets
36
ifeq (,$(KBUILD_TARGET))
37
KBUILD_TARGET = $(firstword $(TARGS))
44
# XXX Need to add path to the src directory of the module(s) which is relative to this Makefile.
45
# SRC points to the actual directory where the module(s) reside(s)
46
# Note: This may be a subdirectory under the src directory.
49
# we need several dir trees to build dkms packages as non-root. these amount to
50
# var, source, and build, all parented by buildroot.
51
LOCAL_BUILD = $(TOP)/buildroot
52
DKMS_TREE_ROOT = $(LOCAL_BUILD)/build
53
DKMS_SRC_ROOT = $(LOCAL_BUILD)/src
54
DKMS_INSTALL_ROOT = $(LOCAL_BUILD)/install
55
DKMS_NAME = $(PACKAGE_NAME)-$(PACKAGE_VERSION)
56
DKMS_SRC = $(DKMS_SRC_ROOT)/$(DKMS_NAME)
58
# necessary switches for dkms to build locally
59
DKMS_LOCAL = --dkmstree $(DKMS_TREE_ROOT) --sourcetree $(DKMS_SRC_ROOT) \
60
--installtree $(DKMS_INSTALL_ROOT)
62
# without this, dkms may ruin your kernel-headers when you build as root
63
DKMS_SETUP = --no-prepare-kernel --no-clean-kernel $(DKMS_LOCAL)
64
DKMS_ARGS = $(DKMS_SETUP) -m $(PACKAGE_NAME) -v $(PACKAGE_VERSION)
66
# Use a custom mkdeb/mkdsc template included in the framework package
67
DKMS_MKDEB_TEMPLATE = dkms-mkdeb-template
68
DKMS_MKDEB_DIR = $(PACKAGE_NAME)-dkms-mkdeb
69
DKMS_MKDSC_DIR = $(PACKAGE_NAME)-dkms-mkdsc
71
# Set options for either creating or modifying the Debian changelog
72
DEBIAN_CHANGELOG = $(DKMS_MKDEB_TEMPLATE)/debian/changelog
74
have_changelog := $(wildcard $(DEBIAN_CHANGELOG))
76
ifeq ($(strip $(have_changelog)),)
77
DCH_OPTIONS = --create --package $(PACKAGE_NAME)-dkms --newversion $(PACKAGE_VERSION)
79
DCH_OPTIONS = --append
82
# XXX dkms template, I want to be able to auto-generate the whole thing
83
# including the KOs in it's redundant manifest
86
# XXX (Optional) Add post install and post remove scripts here if needed
90
# XXX (Optional) Add the name of the patch file in the SRC/patches directory.
91
# This will override the automatic scanning for patch files.
94
# Automatically find any patch files if the user hasn't specified any.
96
PATCHES = $(shell cd $(SRC_DIR)/patches; for j in *; do echo $$j; done)
98
PATCHES = $(PATCH_FILE)
101
# for FISH packaging we have the following layout
107
# `-- 10-fish-installme.sh
109
FISH_BUILD = $(LOCAL_BUILD)/fish
110
FISH_DEBS = $(FISH_BUILD)/debs
111
FISH_SCRIPTS = $(FISH_BUILD)/scripts/chroot-scripts/fish
113
# This is to quiet all of the makefile recipe spew.
114
# Remove the '@' to see all of the spew.
117
.PHONY: dkms-clean dkms-prep dkms-add dkms-build dkms-mkdeb dkms-mkdeb-source-only dkms-mkdsc dkms-mkdsc-source-only driver clean fish help
119
source-only-dsc: driver dkms-conf mrproper dkms-add dkms-mkdsc-source-only
120
@echo "Finished DKMS .dsc source only packaging: $(shell date)"
122
all: driver dkms-conf mrproper dkms-add dkms-build dkms-mkdeb fish
123
@echo "Finished build: $(shell date)"
125
source-only: driver dkms-conf mrproper dkms-add dkms-mkdeb-source-only
126
@echo "Finished DKMS .deb source only packaging: $(shell date)"
128
pre-built: driver dkms-conf mrproper dkms-add dkms-build dkms-mkdeb
129
@echo "Finished DKMS .deb pre-built binaries packaging: $(shell date)"
131
pre-built-dsc: driver dkms-conf mrproper dkms-add dkms-build dkms-mkdsc
132
@echo "Finished DKMS .dsc pre-built binaries packaging: $(shell date)"
135
$(Q)rm -rf $(LOCAL_BUILD)
138
$(Q)mkdir -p $(LOCAL_BUILD)
139
$(Q)mkdir -p $(DKMS_TREE_ROOT)
140
$(Q)mkdir -p $(DKMS_SRC_ROOT)
141
$(Q)mkdir -p $(DKMS_INSTALL_ROOT)
142
$(Q)cp /var/lib/dkms/dkms_dbversion $(DKMS_TREE_ROOT)
143
$(Q)dch $(DCH_OPTIONS) --changelog $(DEBIAN_CHANGELOG) --distribution $(DISTRIBUTION)
147
echo "# This file is automatically generated by the DKMS framework" > dkms.conf; \
148
echo "PACKAGE_NAME=\"$(PACKAGE_NAME)\"" >> dkms.conf; \
149
echo "PACKAGE_VERSION=\"$(PACKAGE_VERSION)\"" >> dkms.conf; \
150
echo "AUTOINSTALL=\"$(AUTOINSTALL_MK)\"" >> dkms.conf; \
151
echo "OBSOLETE_BY=\"$(OBSOLETE_BY)\"" >> dkms.conf; \
152
echo "POST_INSTALL=\"$(INSTALL_SCRIPT)\"" >> dkms.conf; \
153
echo "POST_REMOVE=\"$(REMOVE_SCRIPT)\"" >> dkms.conf; \
154
if [ "$(PATCHES)" != "*" ]; then \
156
for j in $(PATCHES); do \
157
echo "PATCH[$$a]=\"$$j\"" >> dkms.conf; \
162
echo 'MAKE="make KVER=$$kernelver"' >> dkms.conf; \
163
echo 'CLEAN="make KVER=$$kernelver clean"' >> dkms.conf; \
165
$(TOP)/scripts/dkms_module_gen >> dkms.conf;
167
dkms-add: dkms-clean dkms-prep
168
$(Q)mkdir $(DKMS_SRC)
169
$(Q)cp -r $(SRC_DIR)/* $(DKMS_SRC)
170
$(Q)cp -r $(DKMS_MKDEB_TEMPLATE) $(DKMS_SRC)/$(DKMS_MKDEB_DIR)
171
$(Q)ln -s $(DKMS_MKDEB_DIR) $(DKMS_SRC)/$(DKMS_MKDSC_DIR)
172
$(Q)$(DKMS) add $(DKMS_ARGS)
175
$(Q)for i in $(TARGS); do \
176
echo Prepare to build $(DKMS_NAME) against target $$i; \
177
$(DKMS) build $(DKMS_ARGS) --kernelsourcedir=/lib/modules/$$i/build -k $$i; \
181
$(Q)$(DKMS) mkdeb $(DKMS_ARGS) $(MKDEB_TARGS)
182
$(Q)cp -f $(DKMS_TREE_ROOT)/$(PACKAGE_NAME)/$(PACKAGE_VERSION)/deb/*.deb $(TOP)/..
184
dkms-mkdeb-source-only:
185
$(Q)$(DKMS) mkdeb --source-only $(DKMS_ARGS) $(MKDEB_TARGS)
186
$(Q)cp -f $(DKMS_TREE_ROOT)/$(PACKAGE_NAME)/$(PACKAGE_VERSION)/deb/*.deb $(TOP)/..
189
$(Q)$(DKMS) mkdsc $(DKMS_ARGS) $(MKDEB_TARGS)
190
$(Q)cp -f $(DKMS_TREE_ROOT)/$(PACKAGE_NAME)/$(PACKAGE_VERSION)/dsc/* $(TOP)/..
192
dkms-mkdsc-source-only:
193
$(Q)$(DKMS) mkdsc --source-only $(DKMS_ARGS) $(MKDEB_TARGS)
194
$(Q)cp -f $(DKMS_TREE_ROOT)/$(PACKAGE_NAME)/$(PACKAGE_VERSION)/dsc/* $(TOP)/..
197
# for development cycle
199
$(Q)make -C /lib/modules/$(KBUILD_TARGET)/build M=$(SRC) modules
202
$(Q)make -C /lib/modules/$(KBUILD_TARGET)/build M=$(SRC) clean
203
$(Q)rm -f $(TOP)/Module.symvers $(TOP)/modules.order
207
@echo Creating FISH package...
208
$(Q)mkdir -p $(FISH_BUILD)
209
$(Q)mkdir -p $(FISH_DEBS)
210
$(Q)mkdir -p $(FISH_SCRIPTS)
212
$(Q)cp $(DKMS_TREE_ROOT)/$(PACKAGE_NAME)/$(PACKAGE_VERSION)/deb/*.deb $(FISH_DEBS)
214
$(Q)# I pulled the number 12 out of thin air, if this position is a problem
215
$(Q)# for you just change it. This driver script will go away once we start
216
$(Q)# generating modalias packages and make use of jockey.
217
$(Q)rm -f $(FISH_SCRIPTS)/12-$(PACKAGE_NAME)-$(PACKAGE_VERSION).sh
218
$(Q)touch $(FISH_SCRIPTS)/12-$(PACKAGE_NAME)-$(PACKAGE_VERSION).sh
219
$(Q)echo "#!/bin/bash" >> $(FISH_SCRIPTS)/12-$(PACKAGE_NAME)-$(PACKAGE_VERSION).sh
220
$(Q)echo ". /usr/share/dell/scripts/fifuncs" >> $(FISH_SCRIPTS)/12-$(PACKAGE_NAME)-$(PACKAGE_VERSION).sh
221
$(Q)echo "apt-get install --allow-unauthenticated $(PACKAGE_NAME)-dkms" >> \
222
$(FISH_SCRIPTS)/12-$(PACKAGE_NAME)-$(PACKAGE_VERSION).sh
224
$(Q)chmod +x $(FISH_SCRIPTS)/*.sh
226
$(Q)cd $(FISH_BUILD); \
227
tar czf $(TOP)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)_$(FISH_VERSION).tar.gz *; \
228
mv $(TOP)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)_$(FISH_VERSION).tar.gz $(TOP)/../
231
mrproper: clean dkms-clean
234
@echo "This tree provides for $(PACKAGE_NAME) $(PACKAGE_VERSION)"
235
@echo "make help this text"
236
@echo "make pre-built build dkms binaries against all targets and generate a binary Debian package"
237
@echo "make source-only build dkms source-only binary Debian package"
238
@echo "make source-only-dsc build dkms source-only source Debian package"
239
@echo "make pre-built-dsc build dkms binaries against all tagets and generate a source Debian package"
240
@echo "make driver KBUILD_TARGET=... build driver against any version"
241
@echo "make clean compliment of driver target, for development"
242
@echo "Note: add "fish" at the end of the make command to also make a FISH package"