#
# Copyright (c) 1994,1999, 2000 The University of Utah and the Flux Group.
# All rights reserved.
# 
# Contributed by the Computer Security Research division,
# INFOSEC Research and Technology Office, NSA.
# 
# This file is part of the Flux OSKit.  The OSKit is free software, also known
# as "open source;" you can redistribute it and/or modify it under the terms
# of the GNU General Public License (GPL), version 2, as published by the Free
# Software Foundation (FSF).  To explore alternate licensing terms, contact
# the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271.
# 
# The OSKit is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.  See the GPL for more details.  You should have
# received a copy of the GPL along with the OSKit; see the file COPYING.  If
# not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA.
#

ifndef _oskit_security_makerules_
_oskit_security_makerules_ = yes

TARGET	= liboskit_security.a

SRCDIRS += $(OSKIT_SRCDIR)/security

OBJFILES += y.tab.o lex.yy.o ext.tab.o lex.ext.o

# Include the makefile containing the generic rules.
include $(OSKIT_SRCDIR)/GNUmakerules-lib

CFLAGS += -include $(OSKIT_SRCDIR)/security/sym.h -D__KERNEL__

CLEAN_FILES +=	checkpolicy policy $(CP_OBJECTS) y.tab.c y.tab.h lex.yy.c ext.tab.c ext.tab.h lex.ext.c

CP_OBJECTS = y.tab.cp.o lex.yy.cp.o main.cp.o avtab.cp.o trtab.cp.o hashtab.cp.o symtab.cp.o queue.cp.o services.cp.o sidtab.cp.o ebitmap.cp.o policydb.cp.o context.cp.o avdeftab.cp.o prvavtab.cp.o extavtab.cp.o ext.tab.cp.o lex.ext.cp.o exttrtab.cp.o

POLICYFILES = $(addprefix $(OSKIT_SRCDIR)/flask/,security_classes initial_sids access_vectors) \
              $(addprefix $(OSKIT_SRCDIR)/security/policydb/,mls te rbac \
		constraints users initial_sid_contexts)

all:  $(_LIBS) policy # checkpolicy

install: $(addprefix $(INSTALL_LIBDIR)/,$(_LIBS)) $(INSTALL_LIBDIR)/boot/policy # $(INSTALL_BINDIR)/checkpolicy

$(INSTALL_LIBDIR)/boot/%: %
	-mkdir -p $(@D)
	$(INSTALL) $< $@

policy: $(POLICYFILES)
	$(M4) $(M4FLAGS) $^ > policy

checkpolicy: $(CP_OBJECTS)
	$(CC) -o checkpolicy $(CP_OBJECTS) -lfl

#
# .o files built for the native OS "checkpolicy" test program
#
%.cp.o: %.c
	$(CC) -g -c -o $@ -I. -I$(OSKIT_SRCDIR)/security -I- -I.. -I$(OSKIT_SRCDIR) -include $(OSKIT_SRCDIR)/security/sym.h $<


y.tab.o: y.tab.c y.tab.h
	$(CC) -c -o $@ $(OSKIT_CFLAGS) $(CFLAGS) -include $(OSKIT_SRCDIR)/security/yysym.h y.tab.c

# Using a pattern rule here tells GNU make that both targets
# are made by running the commands just once.  That lets
# it to do the right thing when parallelism is enabled (-j).
%.tab.c %.tab.h: $(OSKIT_SRCDIR)/security/policy_parse.%
	$(YACC) -d $<
	sed -e "/#include </d" -e "/extern void \*realloc/d" y.tab.c > y.tab.c.new
	mv y.tab.c.new y.tab.c

lex.yy.o: lex.yy.c y.tab.h
	$(CC) -c -o $@ $(OSKIT_CFLAGS) $(CFLAGS) -include $(OSKIT_SRCDIR)/security/yysym.h lex.yy.c

lex.yy.c: $(OSKIT_SRCDIR)/security/policy_scan.l
	$(LEX) $<
	sed -e "/#include </d" -e "s/#ifndef yytext_ptr/#if 1/" lex.yy.c > lex.yy.c.new
	mv lex.yy.c.new lex.yy.c

# See comment above.
%.tab.c %.tab.h: $(OSKIT_SRCDIR)/security/%ension_parse.y
	$(YACC) -b ext -p ext -d $<
	sed -e "/#include </d" -e "/extern void \*realloc/d" ext.tab.c > ext.tab.c.new
	mv ext.tab.c.new ext.tab.c

lex.ext.o: ext.tab.h

lex.ext.c: $(OSKIT_SRCDIR)/security/extension_scan.l
	$(LEX) -Pext $<
	sed -e "/#include </d" -e "s/#ifndef yytext_ptr/#if 1/" lex.ext.c > lex.ext.c.new
	mv lex.ext.c.new lex.ext.c

endif
