File: snapd.mk

package info (click to toggle)
snapd 2.71-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 79,536 kB
  • sloc: ansic: 16,114; sh: 16,105; python: 9,941; makefile: 1,890; exp: 190; awk: 40; xml: 22
file content (228 lines) | stat: -rw-r--r-- 9,016 bytes parent folder | download
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
# This makefile is designed to be invoked from a build tree, not from the
# source tree. This is particularly suited for building RPM packages. The goal
# of this makefile is to *reduce* the duplication, *avoid* unintended
# inconsistency between packaging of snapd across distributions.
#
# -----------------------------------------------------
# Interface between snapd.mk and distribution packaging
# -----------------------------------------------------
#
# Distribution packaging must generate snapd.defines.mk with a set of makefile
# variable definitions that are discussed below. This allows the packaging
# world to define directory layout and build configuration in one place and
# this makefile to simply obey and implement that configuration.

ifeq ($(SNAPD_DEFINES_DIR),)
SNAPD_DEFINES_DIR = $(PWD)
endif
include $(SNAPD_DEFINES_DIR)/snapd.defines.mk

# There are two sets of definitions expected:
# 1) variables defining various directory names
vars += bindir sbindir libexecdir mandir datadir localstatedir sharedstatedir unitdir builddir
# 2) variables defining build options:
#   with_testkeys: set to 1 to build snapd with test key built in
#   with_apparmor: set to 1 to build snapd with apparmor support
#   with_core_bits: set to 1 to build snapd with things needed for the core/snapd snap
#   with_alt_snap_mount_dir: set to 1 to build snapd with alternate snap mount directory
vars += with_testkeys with_apparmor with_core_bits with_alt_snap_mount_dir
# Verify that none of the variables are empty. This may happen if snapd.mk and
# distribution packaging generating snapd.defines.mk get out of sync.

$(foreach var,$(vars),$(if $(value $(var)),,$(error $(var) is empty or unset, check snapd.defines.mk)))

# ------------------------------------------------
# There are no more control knobs after this point
# ------------------------------------------------

# Import path of snapd.
import_path = github.com/snapcore/snapd


# This is usually set by %make_install. It is defined here to avoid warnings or
# errors from referencing undefined variables.
DESTDIR? =

# Decide which of the two snap mount directories to use. This is not
# referencing localstatedir because the code copes with only those two values
# explicitly.
ifeq ($(with_alt_snap_mount_dir),1)
snap_mount_dir = /var/lib/snapd/snap
else
snap_mount_dir = /snap
endif

# The list of go binaries we are expected to build.
go_binaries = $(addprefix $(builddir)/, snap snapctl snap-seccomp snap-update-ns snap-exec snapd snapd-apparmor)

GO_TAGS = nosecboot
ifeq ($(with_testkeys),1)
GO_TAGS += withtestkeys
GO_TAGS += structuredlogging
endif

# Any additional tags common to all targets
GO_TAGS += $(EXTRA_GO_BUILD_TAGS)

GO_MOD=-mod=vendor
ifeq ($(with_vendor),0)
GO_MOD=-mod=readonly
endif

GO_STATIC_BUILDMODE = default
GO_STATIC_EXTLDFLAG = -static
ifeq ($(with_static_pie),1)
# override flags for building static binaries in PIE mode if supported
# by the host system
GO_STATIC_BUILDMODE = pie
GO_STATIC_EXTLDFLAG = -static-pie
endif

# Go -ldflags settings for static build. Can be overridden in snapd.defines.mk.
EXTRA_GO_STATIC_LDFLAGS ?= -linkmode external -extldflags="$(GO_STATIC_EXTLDFLAG)" $(EXTRA_GO_LDFLAGS)

# NOTE: This *depends* on building out of tree. Some of the built binaries
# conflict with directory names in the tree.
.PHONY: all
all: $(go_binaries) 

# FIXME: not all Go toolchains we build with support '-B gobuildid', replace a
# random GNU build ID with something more predictable, use something similar to
# https://pagure.io/go-rpm-macros/c/1980932bf3a21890a9571effaa23fbe034fd388d
$(builddir)/snap: GO_TAGS += nomanagers
$(builddir)/snap $(builddir)/snap-seccomp $(builddir)/snapd-apparmor:
	go build -o $@ $(if $(GO_TAGS),-tags "$(GO_TAGS)") \
		-buildmode=pie \
		-ldflags="$(EXTRA_GO_LDFLAGS)" \
		$(GO_MOD) \
		$(EXTRA_GO_BUILD_FLAGS) \
		$(import_path)/cmd/$(notdir $@)

# Those three need to be built as static binaries. They run on the inside of a
# nearly-arbitrary mount namespace that does not contain anything we can depend
# on (no standard library, for example).
$(builddir)/snap-update-ns $(builddir)/snap-exec $(builddir)/snapctl:
	go build -o $@ -buildmode=$(GO_STATIC_BUILDMODE) \
		$(GO_MOD) \
		$(if $(GO_TAGS),-tags "$(GO_TAGS)") \
		-ldflags="$(EXTRA_GO_STATIC_LDFLAGS)" \
		$(EXTRA_GO_BUILD_FLAGS) \
		$(import_path)/cmd/$(notdir $@)

# XXX see the note about build ID in rule for building 'snap'
# Snapd can be built with test keys. This is only used by the internal test
# suite to add test assertions. Do not enable this in distribution packages.
$(builddir)/snapd:
	go build -o $@ -buildmode=pie \
		-ldflags="$(EXTRA_GO_LDFLAGS)" \
		$(GO_MOD) \
		$(if $(GO_TAGS),-tags "$(GO_TAGS)") \
		$(EXTRA_GO_BUILD_FLAGS) \
		$(import_path)/cmd/$(notdir $@)

# Know how to create certain directories.
$(addprefix $(DESTDIR),$(libexecdir)/snapd $(bindir) $(mandir)/man8 /$(sharedstatedir)/snapd $(localstatedir)/cache/snapd $(snap_mount_dir)):
	install -m 755 -d $@

.PHONY: install

# Install snap into /usr/bin/.
install:: $(builddir)/snap | $(DESTDIR)$(bindir)
	install -m 755 $^ $|

# Install snapctl snapd, snap-{exec,update-ns,seccomp} into /usr/lib/snapd/
install:: $(addprefix $(builddir)/,snapctl snapd snap-exec snap-update-ns snap-seccomp snapd-apparmor) | $(DESTDIR)$(libexecdir)/snapd
	install -m 755 $^ $|

# Ensure /usr/bin/snapctl is a symlink to /usr/lib/snapd/snapctl
install:: | $(DESTDIR)$(bindir)
	ln -s $(libexecdir)/snapd/snapctl $|/snapctl

# Generate and install man page for snap command
install:: $(builddir)/snap | $(DESTDIR)$(mandir)/man8
	$(builddir)/snap help --man > $|/snap.8

# Install the directory structure in /var/lib/snapd
install::
	install -m 755 -d $(DESTDIR)/$(sharedstatedir)/snapd/apparmor/profiles
	install -m 755 -d $(DESTDIR)/$(sharedstatedir)/snapd/apparmor/snap-confine
	install -m 755 -d $(DESTDIR)/$(sharedstatedir)/snapd/assertions
	install -m 755 -d $(DESTDIR)/$(sharedstatedir)/snapd/cache
	install -m 755 -d $(DESTDIR)/$(sharedstatedir)/snapd/cgroup
	install -m 755 -d $(DESTDIR)/$(sharedstatedir)/snapd/cookie
	install -m 755 -d $(DESTDIR)/$(sharedstatedir)/snapd/dbus-1/services
	install -m 755 -d $(DESTDIR)/$(sharedstatedir)/snapd/dbus-1/system-services
	install -m 755 -d $(DESTDIR)/$(sharedstatedir)/snapd/desktop/applications
	install -m 755 -d $(DESTDIR)/$(sharedstatedir)/snapd/device
	install -m 755 -d $(DESTDIR)/$(sharedstatedir)/snapd/environment
	install -m 755 -d $(DESTDIR)/$(sharedstatedir)/snapd/hostfs
	install -m 755 -d $(DESTDIR)/$(sharedstatedir)/snapd/inhibit
	install -m 755 -d $(DESTDIR)/$(sharedstatedir)/snapd/lib/gl
	install -m 755 -d $(DESTDIR)/$(sharedstatedir)/snapd/lib/gl32
	install -m 755 -d $(DESTDIR)/$(sharedstatedir)/snapd/lib/glvnd
	install -m 755 -d $(DESTDIR)/$(sharedstatedir)/snapd/lib/vulkan
	install -m 755 -d $(DESTDIR)/$(sharedstatedir)/snapd/mount
	install -m 755 -d $(DESTDIR)/$(sharedstatedir)/snapd/seccomp/bpf
	install -m 755 -d $(DESTDIR)/$(sharedstatedir)/snapd/sequence
	install -m 755 -d $(DESTDIR)/$(sharedstatedir)/snapd/snaps

# Touch files that are ghosted by the package. Those are _NOT_ installed but
# this way the package manager knows about them belonging to the package.
install:: | $(DESTDIR)/$(sharedstatedir)/snapd
	touch $|/state.json
	touch $|/system-key

install:: | $(DESTDIR)$(localstatedir)/cache/snapd
	touch $|/sections
	touch $|/names
	touch $|/commands

install:: | $(DESTDIR)$(snap_mount_dir)
	touch $|/README


# Install the /snap/bin directory
install::
	install -m 755 -d $(DESTDIR)$(snap_mount_dir)/bin

# Install misc directories: 
install::
	install -m 755 -d $(DESTDIR)$(localstatedir)/cache/snapd
	install -m 755 -d $(DESTDIR)$(datadir)/polkit-1/actions

# Do not ship snap-preseed. It is currently only useful on ubuntu and tailored
# for preseeding of ubuntu cloud images due to certain assumptions about
# runtime environment of the host and of the preseeded image.
install::
	rm -f $(DESTDIR)$(bindir)/snap-preseed

ifeq ($(with_core_bits),0)
# Remove systemd units that are only used on core devices.
install::
	rm -f $(addprefix $(DESTDIR)$(unitdir)/,snapd.autoimport.service snapd.system-shutdown.service snapd.snap-repair.timer snapd.snap-repair.service snapd.core-fixup.service snapd.recovery-chooser-trigger.service)

# Remove fixup script that is only used on core devices.
install::
	rm -f $(DESTDIR)$(libexecdir)/snapd/snapd.core-fixup.sh

# Remove system-shutdown helper that is only used on core devices.
install::
	rm -f $(DESTDIR)$(libexecdir)/snapd/system-shutdown
endif

ifeq ($(with_apparmor),0)
# Don't ship apparmor helper service when AppArmor is not enabled.
install::
	rm -f $(DESTDIR)$(unitdir)/snapd.apparmor.service
	rm -f $(DESTDIR)$(libexecdir)/snapd/snapd-apparmor
endif

# Tests use C.UTF-8 because some some code depend on this for fancy Unicode
# output that unit tests do not mock.
.PHONY: check
check:
	LC_ALL=C.UTF-8 go test $(GO_MOD) $(import_path)/...

.PHONY: clean
clean:
	rm -f $(go_binaries)