~townsend/+junk/dell-laptop-natty-dkms-framework

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
# Author: Peter M. Petrakis <peter.petrakis@canonical.com>,
#         Christopher Townsend <christopher.townsend@canonical.com>
# License: GPL2
# Descriptiom:  rules to create a dkms and fish package from scratch
#		for a collection of linux kernel versions.
# vim:set syntax=make noexpandtab tabstop=8 shiftwidth=8:

# This is the Ubuntu codename, ie, maverick, natty, etc.
DISTRIBUTION =

# If the distribution is not filled out, then it will get the currently running release.
ifeq (,$(DISTRIBUTION))
DISTRIBUTION = $(shell lsb_release -cs)
endif

# XXX Need to fill in package name, package version, and FISH version.
# dashes only in here (DKMS constraint)
PACKAGE_NAME =

# XXX no dashes or underscores allowed, less is more (DKMS constraint)
PACKAGE_VERSION =

# XXX (Optional) Fill in the FISH package version number, ie, fish1, fish2, etc.
FISH_VERSION = fish

# XXX (Optional) Fill in the obsolete by field
OBSOLETE_BY =

# build against all installed headers
TARGS = $(shell cd /lib/modules; for i in *; do echo $$i; done) 
MKDEB_TARGS = $(shell cd /lib/modules; for i in *; do echo -k $$i; done)

# only used during development "driver" and "clean" targets
KBUILD_TARGET =

ifeq (,$(KBUILD_TARGET))
KBUILD_TARGET = $(firstword $(TARGS))
endif

TOP := $(shell pwd)
DKMS = /usr/sbin/dkms

SRC_DIR =$(TOP)/src
# XXX Need to add path to the src directory of the module(s) which is relative to this Makefile.
#   SRC points to the actual directory where the module(s) reside(s)
#   Note: This may be a subdirectory under the src directory.
SRC = $(SRC_DIR)

# we need several dir trees to build dkms packages as non-root. these amount to
# var, source, and build, all parented by buildroot.
LOCAL_BUILD	    = $(TOP)/buildroot
DKMS_TREE_ROOT	    = $(LOCAL_BUILD)/build
DKMS_SRC_ROOT	    = $(LOCAL_BUILD)/src
DKMS_INSTALL_ROOT   = $(LOCAL_BUILD)/install
DKMS_NAME	    = $(PACKAGE_NAME)-$(PACKAGE_VERSION)
DKMS_SRC	    = $(DKMS_SRC_ROOT)/$(DKMS_NAME)

# necessary switches for dkms to build locally
DKMS_LOCAL = --dkmstree $(DKMS_TREE_ROOT) --sourcetree $(DKMS_SRC_ROOT) \
 --installtree $(DKMS_INSTALL_ROOT)

# without this, dkms may ruin your kernel-headers when you build as root
DKMS_SETUP = --no-prepare-kernel --no-clean-kernel $(DKMS_LOCAL)
DKMS_ARGS = $(DKMS_SETUP) -m $(PACKAGE_NAME) -v $(PACKAGE_VERSION)

# Use a custom mkdeb/mkdsc template included in the framework package
DKMS_MKDEB_TEMPLATE = dkms-mkdeb-template
DKMS_MKDEB_DIR = $(PACKAGE_NAME)-dkms-mkdeb
DKMS_MKDSC_DIR = $(PACKAGE_NAME)-dkms-mkdsc

# Set options for either creating or modifying the Debian changelog
DEBIAN_CHANGELOG = $(DKMS_MKDEB_TEMPLATE)/debian/changelog

have_changelog := $(wildcard $(DEBIAN_CHANGELOG))

ifeq ($(strip $(have_changelog)),)
DCH_OPTIONS = --create --package $(PACKAGE_NAME)-dkms --newversion $(PACKAGE_VERSION)
else
DCH_OPTIONS = --append
endif

# XXX dkms template, I want to be able to auto-generate the whole thing
# including the KOs in it's redundant manifest
AUTOINSTALL_MK = yes

# XXX (Optional) Add post install and post remove scripts here if needed
INSTALL_SCRIPT =
REMOVE_SCRIPT =

# XXX (Optional) Add the name of the patch file in the SRC/patches directory.
# This will override the automatic scanning for patch files.
PATCH_FILE =

# Automatically find any patch files if the user hasn't specified any.
ifeq (,$(PATCH_FILE))
PATCHES = $(shell cd $(SRC_DIR)/patches; for j in *; do echo $$j; done)
else
PATCHES = $(PATCH_FILE)
endif

# for FISH packaging we have the following layout
# |-- debs
# |   `-- mydeb.deb
# `-- scripts
#    `-- chroot-scripts
#        `-- fish
#            `-- 10-fish-installme.sh

FISH_BUILD   = $(LOCAL_BUILD)/fish
FISH_DEBS    = $(FISH_BUILD)/debs
FISH_SCRIPTS = $(FISH_BUILD)/scripts/chroot-scripts/fish

# This is to quiet all of the makefile recipe spew.
# Remove the '@' to see all of the spew.
Q = @

.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

source-only-dsc: driver dkms-conf mrproper dkms-add dkms-mkdsc-source-only
	@echo "Finished DKMS .dsc source only packaging: $(shell date)"

all: driver dkms-conf mrproper dkms-add dkms-build dkms-mkdeb fish
	@echo "Finished build: $(shell date)"

source-only: driver dkms-conf mrproper dkms-add dkms-mkdeb-source-only
	@echo "Finished DKMS .deb source only packaging: $(shell date)"

pre-built: driver dkms-conf mrproper dkms-add dkms-build dkms-mkdeb
	@echo "Finished DKMS .deb pre-built binaries packaging: $(shell date)"

pre-built-dsc: driver dkms-conf mrproper dkms-add dkms-build dkms-mkdsc
	@echo "Finished DKMS .dsc pre-built binaries packaging: $(shell date)"

dkms-clean:
	$(Q)rm  -rf $(LOCAL_BUILD)

dkms-prep:
	$(Q)mkdir -p $(LOCAL_BUILD)
	$(Q)mkdir -p $(DKMS_TREE_ROOT)
	$(Q)mkdir -p $(DKMS_SRC_ROOT)
	$(Q)mkdir -p $(DKMS_INSTALL_ROOT)
	$(Q)cp /var/lib/dkms/dkms_dbversion $(DKMS_TREE_ROOT)
	$(Q)dch $(DCH_OPTIONS) --changelog $(DEBIAN_CHANGELOG) --distribution $(DISTRIBUTION)

dkms-conf:
	$(Q)cd $(SRC_DIR); \
	echo "# This file is automatically generated by the DKMS framework" > dkms.conf; \
	echo "PACKAGE_NAME=\"$(PACKAGE_NAME)\"" >> dkms.conf; \
	echo "PACKAGE_VERSION=\"$(PACKAGE_VERSION)\"" >> dkms.conf; \
	echo "AUTOINSTALL=\"$(AUTOINSTALL_MK)\"" >> dkms.conf; \
	echo "OBSOLETE_BY=\"$(OBSOLETE_BY)\"" >> dkms.conf; \
	echo "POST_INSTALL=\"$(INSTALL_SCRIPT)\"" >> dkms.conf; \
	echo "POST_REMOVE=\"$(REMOVE_SCRIPT)\"" >> dkms.conf; \
	if [ "$(PATCHES)" != "*" ]; then \
	    a=0; \
	    for j in $(PATCHES); do \
		echo "PATCH[$$a]=\"$$j\"" >> dkms.conf; \
		a=$$(($$a+1)); \
	    done; \
	fi; \
	echo >> dkms.conf; \
	echo 'MAKE="make KVER=$$kernelver"' >> dkms.conf; \
	echo 'CLEAN="make KVER=$$kernelver clean"' >> dkms.conf; \
	echo >> dkms.conf; \
	$(TOP)/scripts/dkms_module_gen >> dkms.conf;

dkms-add: dkms-clean dkms-prep
	$(Q)mkdir $(DKMS_SRC)
	$(Q)cp -r $(SRC_DIR)/* $(DKMS_SRC)
	$(Q)cp -r $(DKMS_MKDEB_TEMPLATE) $(DKMS_SRC)/$(DKMS_MKDEB_DIR)
	$(Q)ln -s $(DKMS_MKDEB_DIR) $(DKMS_SRC)/$(DKMS_MKDSC_DIR)
	$(Q)$(DKMS) add $(DKMS_ARGS)

dkms-build:
	$(Q)for i in $(TARGS); do \
	    echo Prepare to build $(DKMS_NAME) against target $$i; \
	    $(DKMS) build $(DKMS_ARGS) --kernelsourcedir=/lib/modules/$$i/build  -k $$i; \
	done

dkms-mkdeb:
	$(Q)$(DKMS) mkdeb $(DKMS_ARGS) $(MKDEB_TARGS)
	$(Q)cp -f $(DKMS_TREE_ROOT)/$(PACKAGE_NAME)/$(PACKAGE_VERSION)/deb/*.deb $(TOP)/..

dkms-mkdeb-source-only:
	$(Q)$(DKMS) mkdeb --source-only $(DKMS_ARGS) $(MKDEB_TARGS)
	$(Q)cp -f $(DKMS_TREE_ROOT)/$(PACKAGE_NAME)/$(PACKAGE_VERSION)/deb/*.deb $(TOP)/..

dkms-mkdsc:
	$(Q)$(DKMS) mkdsc $(DKMS_ARGS) $(MKDEB_TARGS)
	$(Q)cp -f $(DKMS_TREE_ROOT)/$(PACKAGE_NAME)/$(PACKAGE_VERSION)/dsc/* $(TOP)/..

dkms-mkdsc-source-only:
	$(Q)$(DKMS) mkdsc --source-only $(DKMS_ARGS) $(MKDEB_TARGS)
	$(Q)cp -f $(DKMS_TREE_ROOT)/$(PACKAGE_NAME)/$(PACKAGE_VERSION)/dsc/* $(TOP)/..


# for development cycle
driver:
	$(Q)make -C /lib/modules/$(KBUILD_TARGET)/build M=$(SRC) modules

clean:
	$(Q)make -C /lib/modules/$(KBUILD_TARGET)/build M=$(SRC) clean
	$(Q)rm -f $(TOP)/Module.symvers  $(TOP)/modules.order

# for packaging
fish:
	@echo Creating FISH package...
	$(Q)mkdir -p $(FISH_BUILD)
	$(Q)mkdir -p $(FISH_DEBS)
	$(Q)mkdir -p $(FISH_SCRIPTS)

	$(Q)cp $(DKMS_TREE_ROOT)/$(PACKAGE_NAME)/$(PACKAGE_VERSION)/deb/*.deb  $(FISH_DEBS)

	$(Q)# I pulled the number 12 out of thin air, if this position is a problem
	$(Q)# for you just change it. This driver script will go away once we start
	$(Q)# generating modalias packages and make use of jockey.
	$(Q)rm -f $(FISH_SCRIPTS)/12-$(PACKAGE_NAME)-$(PACKAGE_VERSION).sh
	$(Q)touch $(FISH_SCRIPTS)/12-$(PACKAGE_NAME)-$(PACKAGE_VERSION).sh
	$(Q)echo "#!/bin/bash" >> $(FISH_SCRIPTS)/12-$(PACKAGE_NAME)-$(PACKAGE_VERSION).sh
	$(Q)echo ". /usr/share/dell/scripts/fifuncs" >> $(FISH_SCRIPTS)/12-$(PACKAGE_NAME)-$(PACKAGE_VERSION).sh
	$(Q)echo "apt-get install --allow-unauthenticated $(PACKAGE_NAME)-dkms"  >> \
	$(FISH_SCRIPTS)/12-$(PACKAGE_NAME)-$(PACKAGE_VERSION).sh

	$(Q)chmod +x $(FISH_SCRIPTS)/*.sh

	$(Q)cd $(FISH_BUILD); \
	tar czf $(TOP)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)_$(FISH_VERSION).tar.gz *; \
	mv $(TOP)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)_$(FISH_VERSION).tar.gz $(TOP)/../
	@echo "Done."

mrproper: clean dkms-clean

help:
	@echo "This tree provides for $(PACKAGE_NAME) $(PACKAGE_VERSION)"
	@echo "make help            this text"
	@echo "make pre-built       build dkms binaries against all targets and generate a binary Debian package"
	@echo "make source-only     build dkms source-only binary Debian package"
	@echo "make source-only-dsc build dkms source-only source Debian package"
	@echo "make pre-built-dsc   build dkms binaries against all tagets and generate a source Debian package"
	@echo "make driver KBUILD_TARGET=...  build driver against any version"
	@echo "make clean           compliment of driver target, for development"
	@echo "Note: add "fish" at the end of the make command to also make a FISH package"