Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
# helper tools
Chris PeBenito 17de1b7
AWK ?= gawk
Chris PeBenito 17de1b7
INSTALL ?= install
Chris PeBenito 17de1b7
M4 ?= m4
Chris PeBenito 17de1b7
SED ?= sed
Chris PeBenito 17de1b7
EINFO ?= echo
Chris PeBenito 17de1b7
PYTHON ?= python
Chris PeBenito dde00d4
CUT ?= cut
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
NAME ?= $(shell $(AWK) -F= '/^SELINUXTYPE/{ print $$2 }' /etc/selinux/config)
Chris PeBenito 17de1b7
SHAREDIR ?= /usr/share/selinux
Chris PeBenito 17de1b7
HEADERDIR ?= $(SHAREDIR)/$(NAME)/include
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
include $(HEADERDIR)/build.conf
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
# executables
Chris PeBenito 17de1b7
PREFIX := /usr
Chris PeBenito 17de1b7
BINDIR := $(PREFIX)/bin
Chris PeBenito 17de1b7
SBINDIR := $(PREFIX)/sbin
Chris PeBenito 17de1b7
CHECKMODULE := $(BINDIR)/checkmodule
Chris PeBenito 17de1b7
SEMODULE := $(SBINDIR)/semodule
Chris PeBenito 17de1b7
SEMOD_PKG := $(BINDIR)/semodule_package
Chris PeBenito 17de1b7
XMLLINT := $(BINDIR)/xmllint
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
# set default build options if missing
Chris PeBenito 350b6ab
TYPE ?= standard
Chris PeBenito 17de1b7
DIRECT_INITRC ?= n
Chris PeBenito 17de1b7
POLY ?= n
Chris PeBenito 17de1b7
QUIET ?= y
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
genxml := $(PYTHON) $(HEADERDIR)/support/segenxml.py
Chris PeBenito 17de1b7
Chris PeBenito 96fc0a4
docs := doc
Chris PeBenito 96fc0a4
polxml := $(docs)/policy.xml
Chris PeBenito 96fc0a4
xmldtd := $(HEADERDIR)/support/policy.dtd
Chris PeBenito 96fc0a4
metaxml := metadata.xml
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
globaltun = $(HEADERDIR)/global_tunables.xml
Chris PeBenito 17de1b7
globalbool = $(HEADERDIR)/global_booleans.xml
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
# enable MLS if requested.
Chris PeBenito 350b6ab
ifeq "$(TYPE)" "mls"
Chris PeBenito 17de1b7
	M4PARAM += -D enable_mls
Chris PeBenito 17de1b7
	CHECKPOLICY += -M
Chris PeBenito 17de1b7
	CHECKMODULE += -M
Chris PeBenito 17de1b7
endif
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
# enable MLS if MCS requested.
Chris PeBenito 350b6ab
ifeq "$(TYPE)" "mcs"
Chris PeBenito 17de1b7
	M4PARAM += -D enable_mcs
Chris PeBenito 17de1b7
	CHECKPOLICY += -M
Chris PeBenito 17de1b7
	CHECKMODULE += -M
Chris PeBenito 17de1b7
endif
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
# enable distribution-specific policy
Chris PeBenito 17de1b7
ifneq ($(DISTRO),)
Chris PeBenito 17de1b7
	M4PARAM += -D distro_$(DISTRO)
Chris PeBenito 17de1b7
endif
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
ifeq ($(DIRECT_INITRC),y)
Chris PeBenito 17de1b7
	M4PARAM += -D direct_sysadm_daemon
Chris PeBenito 17de1b7
endif
Chris PeBenito 17de1b7
Chris PeBenito 296273a
ifeq "$(UBAC)" "y"
Chris PeBenito 296273a
	M4PARAM += -D enable_ubac
Chris PeBenito 296273a
endif
Chris PeBenito 296273a
Chris PeBenito e070dd2
# default MLS/MCS sensitivity and category settings.
Chris PeBenito e070dd2
MLS_SENS ?= 16
2968e06
MLS_CATS ?= 1024
2968e06
MCS_CATS ?= 1024
Chris PeBenito e070dd2
Chris PeBenito 17de1b7
ifeq ($(QUIET),y)
Chris PeBenito 17de1b7
	verbose := @
Chris PeBenito 17de1b7
endif
Chris PeBenito 17de1b7
Chris PeBenito e070dd2
M4PARAM += -D hide_broken_symptoms -D mls_num_sens=$(MLS_SENS) -D mls_num_cats=$(MLS_CATS) -D mcs_num_cats=$(MCS_CATS)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
# policy headers
Chris PeBenito 17de1b7
m4support = $(wildcard $(HEADERDIR)/support/*.spt)
Chris PeBenito 56e1b3d
Chris PeBenito 96fc0a4
header_layers := $(filter-out $(HEADERDIR)/support,$(shell find $(wildcard $(HEADERDIR)/*) -maxdepth 0 -type d))
Chris PeBenito 96fc0a4
header_xml := $(addsuffix .xml,$(header_layers))
Chris PeBenito 96fc0a4
header_interfaces := $(foreach layer,$(header_layers),$(wildcard $(layer)/*.if))
Chris PeBenito 17de1b7
Chris PeBenito 96fc0a4
rolemap := $(HEADERDIR)/rolemap
Chris PeBenito 56e1b3d
Chris PeBenito 96fc0a4
local_layers := $(filter-out CVS tmp $(docs),$(shell find $(wildcard *) -maxdepth 0 -type d))
Chris PeBenito 96fc0a4
local_xml := $(addprefix tmp/, $(addsuffix .xml,$(local_layers)))
Chris PeBenito 56e1b3d
Chris PeBenito 96fc0a4
all_layer_names := $(sort $(notdir $(header_layers) $(local_layers)))
Chris PeBenito 56e1b3d
Chris PeBenito 96fc0a4
3rd_party_mods := $(wildcard *.te)
Chris PeBenito 96fc0a4
detected_mods := $(3rd_party_mods) $(foreach layer,$(local_layers),$(wildcard $(layer)/*.te))
Chris PeBenito 17de1b7
Chris PeBenito 96fc0a4
detected_ifs := $(detected_mods:.te=.if)
Chris PeBenito 96fc0a4
detected_fcs := $(detected_mods:.te=.fc)
Chris PeBenito 96fc0a4
all_packages := $(notdir $(detected_mods:.te=.pp))
Chris PeBenito 56e1b3d
Chris PeBenito dde00d4
# figure out what modules we may want to reload
Chris PeBenito dde00d4
loaded_mods = $(addsuffix .pp,$(shell $(SEMODULE) -l | $(CUT) -f1))
Chris PeBenito dde00d4
sys_mods = $(wildcard $(SHAREDIR)/$(NAME)/*.pp)
Chris PeBenito dde00d4
match_sys = $(filter $(addprefix $(SHAREDIR)/$(NAME)/,$(loaded_mods)),$(sys_mods))
Chris PeBenito dde00d4
match_loc = $(filter $(all_packages),$(loaded_mods))
Chris PeBenito dde00d4
Chris PeBenito 96fc0a4
vpath %.te $(local_layers)
Chris PeBenito 96fc0a4
vpath %.if $(local_layers)
Chris PeBenito 96fc0a4
vpath %.fc $(local_layers)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
########################################
Chris PeBenito 17de1b7
#
Chris PeBenito 17de1b7
# Functions
Chris PeBenito 17de1b7
#
Chris PeBenito 17de1b7
Chris PeBenito bbcd3c9
# parse-rolemap-compat modulename,outputfile
Chris PeBenito bbcd3c9
define parse-rolemap-compat
Chris PeBenito bbcd3c9
	$(verbose) $(M4) $(M4PARAM) $(rolemap) | \
Chris PeBenito bbcd3c9
		$(AWK) '/^[[:blank:]]*[A-Za-z]/{ print "gen_require(type " $$3 "; role " $$1 ";)\n$1_per_userdomain_template(" $$2 "," $$3 "," $$1 ")" }' >> $2
Chris PeBenito bbcd3c9
endef
Chris PeBenito bbcd3c9
Chris PeBenito 17de1b7
# parse-rolemap modulename,outputfile
Chris PeBenito 17de1b7
define parse-rolemap
Chris PeBenito 17de1b7
	$(verbose) $(M4) $(M4PARAM) $(rolemap) | \
Chris PeBenito bbcd3c9
		$(AWK) '/^[[:blank:]]*[A-Za-z]/{ print "gen_require(type " $$3 "; role " $$1 ";)\n$1_per_role_template(" $$2 "," $$3 "," $$1 ")" }' >> $2
Chris PeBenito 17de1b7
endef
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
# peruser-expansion modulename,outputfile
Chris PeBenito 17de1b7
define peruser-expansion
Chris PeBenito bbcd3c9
	$(verbose) echo "ifdef(\`""$1""_per_role_template',\`" > $2
Chris PeBenito 17de1b7
	$(call parse-rolemap,$1,$2)
Chris PeBenito 17de1b7
	$(verbose) echo "')" >> $2
Chris PeBenito bbcd3c9
Chris PeBenito bbcd3c9
	$(verbose) echo "ifdef(\`""$1""_per_userdomain_template',\`" >> $2
Chris PeBenito bbcd3c9
	$(verbose) echo "errprint(\`Warning: per_userdomain_templates have been renamed to per_role_templates (""$1""_per_userdomain_template)'__endline__)" >> $2
Chris PeBenito bbcd3c9
	$(call parse-rolemap-compat,$1,$2)
Chris PeBenito bbcd3c9
	$(verbose) echo "')" >> $2
Chris PeBenito 17de1b7
endef
Chris PeBenito 17de1b7
Chris PeBenito 59f8539
.PHONY: clean all xml load reload
Chris PeBenito 17de1b7
.SUFFIXES:
Chris PeBenito 17de1b7
.SUFFIXES: .pp
Chris PeBenito 17de1b7
# broken in make 3.81:
Chris PeBenito 17de1b7
#.SECONDARY:
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
########################################
Chris PeBenito 17de1b7
#
Chris PeBenito 17de1b7
# Main targets
Chris PeBenito 17de1b7
#
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
all: $(all_packages)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
xml: $(polxml)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
########################################
Chris PeBenito 17de1b7
#
Chris PeBenito dde00d4
# Attempt to reinstall all installed packages
Chris PeBenito dde00d4
#
Chris PeBenito dde00d4
refresh:
Chris PeBenito dde00d4
	@$(EINFO) "Refreshing $(NAME) modules"
Chris PeBenito dde00d4
	$(verbose) $(SEMODULE) -b $(SHAREDIR)/$(NAME)/base.pp $(foreach mod,$(match_sys) $(match_loc),-i $(mod))
Chris PeBenito dde00d4
Chris PeBenito dde00d4
########################################
Chris PeBenito dde00d4
#
Chris PeBenito d508474
# Load module packages
Chris PeBenito d508474
#
Chris PeBenito 76bac89
Chris PeBenito 76bac89
load: tmp/loaded
Chris PeBenito 59f8539
tmp/loaded: $(all_packages)
Chris PeBenito 59f8539
	@$(EINFO) "Loading $(NAME) modules: $(basename $(notdir $?))"
Chris PeBenito 59f8539
	$(verbose) $(SEMODULE) $(foreach mod,$?,-i $(mod))
Chris PeBenito 59f8539
	@mkdir -p tmp
Chris PeBenito 59f8539
	@touch tmp/loaded
Chris PeBenito 76bac89
Chris PeBenito 59f8539
reload: $(all_packages)
Chris PeBenito 59f8539
	@$(EINFO) "Loading $(NAME) modules: $(basename $(notdir $^))"
Chris PeBenito d508474
	$(verbose) $(SEMODULE) $(foreach mod,$^,-i $(mod))
Chris PeBenito 76bac89
	@mkdir -p tmp
Chris PeBenito 76bac89
	@touch tmp/loaded
Chris PeBenito d508474
Chris PeBenito d508474
########################################
Chris PeBenito d508474
#
Chris PeBenito 17de1b7
# Build module packages
Chris PeBenito 17de1b7
#
Chris PeBenito 17de1b7
tmp/%.mod: $(m4support) tmp/all_interfaces.conf %.te
Chris PeBenito 17de1b7
	@$(EINFO) "Compiling $(NAME) $(basename $(@F)) module"
Chris PeBenito 96fc0a4
	@test -d $(@D) || mkdir -p $(@D)
Chris PeBenito 17de1b7
	$(call peruser-expansion,$(basename $(@F)),$@.role)
Chris PeBenito 17de1b7
	$(verbose) $(M4) $(M4PARAM) -s $^ $@.role > $(@:.mod=.tmp)
Chris PeBenito 17de1b7
	$(verbose) $(CHECKMODULE) -m $(@:.mod=.tmp) -o $@
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
tmp/%.mod.fc: $(m4support) %.fc
Chris PeBenito 17de1b7
	$(verbose) $(M4) $(M4PARAM) $^ > $@
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
%.pp: tmp/%.mod tmp/%.mod.fc
Chris PeBenito 17de1b7
	@echo "Creating $(NAME) $(@F) policy package"
Chris PeBenito 17de1b7
	$(verbose) $(SEMOD_PKG) -o $@ -m $< -f $<.fc
Chris PeBenito 17de1b7
Chris PeBenito 96fc0a4
tmp/all_interfaces.conf: $(m4support) $(header_interfaces) $(detected_ifs)
Chris PeBenito 96fc0a4
	@test -d $(@D) || mkdir -p $(@D)
Chris PeBenito 96fc0a4
	@echo "ifdef(\`__if_error',\`m4exit(1)')" > tmp/iferror.m4
Chris PeBenito 96fc0a4
	@echo "divert(-1)" > $@
Chris PeBenito 96fc0a4
	$(verbose) $(M4) $^ tmp/iferror.m4 | sed -e s/dollarsstar/\$$\*/g >> $@
Chris PeBenito 96fc0a4
	@echo "divert" >> $@
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
# so users dont have to make empty .fc and .if files
Chris PeBenito 96fc0a4
$(detected_fcs):
Chris PeBenito 17de1b7
	@touch $@
Chris PeBenito 96fc0a4
	
Chris PeBenito 96fc0a4
$(detected_ifs):
Chris PeBenito 96fc0a4
	@echo "## <summary>$(basename $(@D))</summary>" > $@
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
########################################
Chris PeBenito 17de1b7
#
Chris PeBenito 17de1b7
# Documentation generation
Chris PeBenito 17de1b7
#
Chris PeBenito 96fc0a4
tmp/%.xml: %/*.te %/*.if
Chris PeBenito 96fc0a4
	@test -d $(@D) || mkdir -p $(@D)
Chris PeBenito 96fc0a4
	$(verbose) test -f $(HEADERDIR)/$*.xml || cat $*/$(metaxml) > $@
Chris PeBenito 96fc0a4
	$(verbose) $(genxml) -w -m $(sort $(basename $^)) >> $@
Chris PeBenito 17de1b7
Chris PeBenito 96fc0a4
vars: $(local_xml)
Chris PeBenito 56e1b3d
Chris PeBenito 96fc0a4
$(polxml): $(header_xml) $(local_xml) $(globaltun) $(globalbool) $(detected_mods) $(detected_ifs)
Chris PeBenito 56e1b3d
	@echo "Creating $(@F)"
Chris PeBenito 96fc0a4
	@test -d $(@D) || mkdir -p $(@D)
Chris PeBenito 17de1b7
	$(verbose) echo '' > $@
Chris PeBenito 56e1b3d
	$(verbose) echo '' >> $@
Chris PeBenito 56e1b3d
	$(verbose) echo '<policy>' >> $@
Chris PeBenito 96fc0a4
	$(verbose) for i in $(all_layer_names); do \
Chris PeBenito 96fc0a4
		echo "<layer name=\"$$i\">" >> $@ ;\
Chris PeBenito 96fc0a4
		test -f $(HEADERDIR)/$$i.xml && cat $(HEADERDIR)/$$i.xml >> $@ ;\
Chris PeBenito 96fc0a4
		test -f tmp/$$i.xml && cat tmp/$$i.xml >> $@ ;\
Chris PeBenito 96fc0a4
		echo "</layer>" >> $@ ;\
Chris PeBenito 96fc0a4
	done
Chris PeBenito 96fc0a4
ifneq "$(strip $(3rd_party_mods))" ""
Chris PeBenito 96fc0a4
	$(verbose) echo "<layer name=\"third_party\">" >> $@
Chris PeBenito 96fc0a4
	$(verbose) echo "<summary>These are all third-party modules.</summary>" >> $@
Chris PeBenito 96fc0a4
	$(verbose) $(genxml) -w -m $(addprefix ./,$(basename $(3rd_party_mods))) >> $@
Chris PeBenito 96fc0a4
	$(verbose) echo "</layer>" >> $@
Chris PeBenito 96fc0a4
endif
Chris PeBenito 96fc0a4
	$(verbose) cat $(globaltun) $(globalbool) >> $@
Chris PeBenito 56e1b3d
	$(verbose) echo '</policy>' >> $@
Chris PeBenito 17de1b7
	$(verbose) if test -x $(XMLLINT) && test -f $(xmldtd); then \
Chris PeBenito 56e1b3d
		$(XMLLINT) --noout --path $(dir $(xmldtd)) --dtdvalid $(xmldtd) $@ ;\
Chris PeBenito 17de1b7
	fi
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
########################################
Chris PeBenito 17de1b7
#
Chris PeBenito 17de1b7
# Clean the environment
Chris PeBenito 17de1b7
#
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
clean:
Chris PeBenito 17de1b7
	rm -fR tmp
Chris PeBenito 17de1b7
	rm -f *.pp