all: CType/Native.pm parser-perlxs

clean:
	rm -f typegen.c typegen CType/Native.pm
	-$(MAKE) -C ext/CParse-Parser-PerlXS clean
	rm -f ext/CParse-Parser-PerlXS/Makefile.old

prefix=/usr
DESTDIR=

INSTALL_bin_FILES = icheck
INSTALL_perl_FILES = \
	CDecl.pm CExpr.pm CParse.pm CType.pm \
	CDecl/Enumerator.pm \
	CExpr/Add.pm \
	CExpr/Alignof.pm \
	CExpr/ArraySubscript.pm \
	CExpr/Assign/Add.pm \
	CExpr/Assign/BitAnd.pm \
	CExpr/Assign/BitOr.pm \
	CExpr/Assign/BitXor.pm \
	CExpr/Assign/Divide.pm \
	CExpr/Assign/Modulus.pm \
	CExpr/Assign/Multiply.pm \
	CExpr/Assign/ShiftLeft.pm \
	CExpr/Assign/ShiftRight.pm \
	CExpr/Assign/Subtract.pm \
	CExpr/BitAnd.pm \
	CExpr/BitOr.pm \
	CExpr/BitXor.pm \
	CExpr/BoolAnd.pm \
	CExpr/BoolOr.pm \
	CExpr/Cast.pm \
	CExpr/Conditional.pm \
	CExpr/Divide.pm \
	CExpr/Equal.pm \
	CExpr/Greater.pm \
	CExpr/GreaterEqual.pm \
	CExpr/Integer.pm \
	CExpr/Less.pm \
	CExpr/LessEqual.pm \
	CExpr/Member.pm \
	CExpr/MemberIndirect.pm \
	CExpr/Modulus.pm \
	CExpr/Multiply.pm \
	CExpr/NotEqual.pm \
	CExpr/Postdec.pm \
	CExpr/Postinc.pm \
	CExpr/Predec.pm \
	CExpr/Preinc.pm \
	CExpr/Ref.pm \
	CExpr/SeqExpression.pm \
	CExpr/ShiftLeft.pm \
	CExpr/ShiftRight.pm \
	CExpr/Sizeof.pm \
	CExpr/SizeofExpr.pm \
	CExpr/Subtract.pm \
	CExpr/Unary/AddressOf.pm \
	CExpr/Unary/BitNot.pm \
	CExpr/Unary/BoolNot.pm \
	CExpr/Unary/Deref.pm \
	CExpr/Unary/Negative.pm \
	CExpr/Unary/Positive.pm \
	CParse/Attribute.pm \
	CParse/AttributeList.pm \
	CParse/Char.pm \
	CParse/Declaration.pm \
	CParse/Declarator.pm \
	CParse/Declarator/Array.pm \
	CParse/Declarator/Direct.pm \
	CParse/Declarator/Function.pm \
	CParse/Enum.pm \
	CParse/EnumRef.pm \
	CParse/Enumerator.pm \
	CParse/Extension.pm \
	CParse/Float.pm \
	CParse/Function.pm \
	CParse/FunctionSpecifier.pm \
	CParse/Identifier.pm \
	CParse/Integer.pm \
	CParse/Namespace.pm \
	CParse/Op.pm \
	CParse/Op/Add.pm \
	CParse/Op/Alignof.pm \
	CParse/Op/ArraySubscript.pm \
	CParse/Op/Assign.pm \
	CParse/Op/Assign/Add.pm \
	CParse/Op/Assign/BitAnd.pm \
	CParse/Op/Assign/BitOr.pm \
	CParse/Op/Assign/BitXor.pm \
	CParse/Op/Assign/Divide.pm \
	CParse/Op/Assign/Modulus.pm \
	CParse/Op/Assign/Multiply.pm \
	CParse/Op/Assign/ShiftLeft.pm \
	CParse/Op/Assign/ShiftRight.pm \
	CParse/Op/Assign/Subtract.pm \
	CParse/Op/BitAnd.pm \
	CParse/Op/BitOr.pm \
	CParse/Op/BitXor.pm \
	CParse/Op/BoolAnd.pm \
	CParse/Op/BoolOr.pm \
	CParse/Op/Call.pm \
	CParse/Op/Cast.pm \
	CParse/Op/Conditional.pm \
	CParse/Op/Divide.pm \
	CParse/Op/Equal.pm \
	CParse/Op/Expression.pm \
	CParse/Op/Member.pm \
	CParse/Op/MemberIndirect.pm \
	CParse/Op/Modulus.pm \
	CParse/Op/Multiply.pm \
	CParse/Op/NotEqual.pm \
	CParse/Op/Postdec.pm \
	CParse/Op/Postfix.pm \
	CParse/Op/Postinc.pm \
	CParse/Op/Predec.pm \
	CParse/Op/Preinc.pm \
	CParse/Op/Relation.pm \
	CParse/Op/Relation/Greater.pm \
	CParse/Op/Relation/GreaterEqual.pm \
	CParse/Op/Relation/Less.pm \
	CParse/Op/Relation/LessEqual.pm \
	CParse/Op/Shift.pm \
	CParse/Op/Shift/Left.pm \
	CParse/Op/Shift/Right.pm \
	CParse/Op/Sizeof.pm \
	CParse/Op/SizeofExpr.pm \
	CParse/Op/Subtract.pm \
	CParse/Op/Unary.pm \
	CParse/Op/Unary/AddressOf.pm \
	CParse/Op/Unary/BitNot.pm \
	CParse/Op/Unary/BoolNot.pm \
	CParse/Op/Unary/Deref.pm \
	CParse/Op/Unary/Negative.pm \
	CParse/Op/Unary/Positive.pm \
	CParse/ParameterDeclaration.pm \
	CParse/Parser/Perl.pm \
	CParse/Parser/Token/Character.pm \
	CParse/Parser/Token/Float.pm \
	CParse/Parser/Token/Identifier.pm \
	CParse/Parser/Token/Integer.pm \
	CParse/Parser/Token/Keyword.pm \
	CParse/Parser/Token/Punctuator.pm \
	CParse/Parser/Token/String.pm \
	CParse/Pointer.pm \
	CParse/StorageClass.pm \
	CParse/String.pm \
	CParse/Struct.pm \
	CParse/StructDeclaration.pm \
	CParse/StructDeclarator.pm \
	CParse/StructRef.pm \
	CParse/TypeName.pm \
	CParse/TypeQualifier.pm \
	CParse/TypeSpecifier.pm \
	CParse/Union.pm \
	CParse/UnionRef.pm \
	CType/Array.pm \
	CType/BitField.pm \
	CType/Builtin.pm \
	CType/Enum.pm \
	CType/Function.pm \
	CType/Fundamental.pm \
	CType/Native.pm \
	CType/Pointer.pm \
	CType/Ref.pm \
	CType/Struct.pm \
	CType/Union.pm

INSTALL_arch_perl_FILES = CType/Native.pm

install:
	mkdir -p "$(DESTDIR)$(prefix)/bin"
	for i in $(INSTALL_bin_FILES); \
	do \
		cp $$i "$(DESTDIR)$(prefix)/bin/$$i"; \
	done
	for i in $(INSTALL_perl_FILES); \
	do \
		mkdir -p `dirname "$(DESTDIR)$(prefix)/share/icheck/perl5/$$i"`; \
		cp $$i "$(DESTDIR)$(prefix)/share/icheck/perl5/$$i"; \
	done
	for i in $(INSTALL_arch_perl_FILES); \
	do \
		mkdir -p `dirname "$(DESTDIR)$(prefix)/lib/icheck/perl5/$$i"`; \
		cp $$i "$(DESTDIR)$(prefix)/lib/icheck/perl5/$$i"; \
	done
	$(MAKE) -C ext/CParse-Parser-PerlXS install

test:
	./test.pl t

gen-tests:
	./make_tests.pl t

typegen.c: typegen.pl
	./typegen.pl > typegen.c.new
	mv typegen.c.new typegen.c

typegen: typegen.c
	gcc -std=gnu99 -o typegen typegen.c

CType/Native.pm: typegen
	./typegen > CType/Native.pm.new
	mv CType/Native.pm.new CType/Native.pm

parser-perlxs:
	(cd ext/CParse-Parser-PerlXS && perl Makefile.PL INSTALLSITELIB=$(DESTDIR)$(prefix)/share/icheck/perl5/ INSTALLSITEARCH=$(DESTDIR)$(prefix)/lib/icheck/perl5 OPTIMIZE="-O2 -Wall -g")
	$(MAKE) -C ext/CParse-Parser-PerlXS
