.MAIN:	all
PREFIX?=	/usr/local
SHLIB_MAJOR=	1
CC?=		cc
AR?=		ar
RANLIB?=	ranlib

EXPATSRCS=	external/expat/lib/xmlparse.c \
		external/expat/lib/xmlrole.c \
		external/expat/lib/xmltok.c
UCLSRCS=	external/libucl/src/ucl_emitter.c \
		external/libucl/src/ucl_hash.c \
		external/libucl/src/ucl_parser.c \
		external/libucl/src/ucl_util.c \
		external/libucl/src/xxhash.c
SQLITESRCS=	external/sqlite/sqlite3.c \
		external/sqlite/shell.c
YAMLSRCS=	external/libyaml/src/api.c \
		external/libyaml/src/loader.c \
		external/libyaml/src/parser.c \
		external/libyaml/src/reader.c \
		external/libyaml/src/scanner.c
LIBPKGSRCS=	libpkg/pkg.pc \
		libpkg/pkg.h \
		libpkg/backup.c \
		libpkg/dns_utils.c \
		libpkg/elfhints.c \
		libpkg/fetch.c \
		libpkg/packing.c \
		libpkg/pkg.c \
		libpkg/pkg_add.c \
		libpkg/pkg_attributes.c \
		libpkg/pkg_config.c \
		libpkg/pkg_create.c \
		libpkg/pkg_delete.c \
		libpkg/pkg_elf.c \
		libpkg/pkg_event.c \
		libpkg/pkg_jobs.c \
		libpkg/pkg_manifest.c \
		libpkg/pkg_old.c \
		libpkg/pkg_ports.c \
		libpkg/pkg_printf.c \
		libpkg/pkg_repo.c \
		libpkg/pkg_status.c \
		libpkg/pkg_version.c \
		libpkg/pkgdb.c \
		libpkg/pkgdb_repo.c \
		libpkg/plugins.c \
		libpkg/rcscripts.c \
		libpkg/rsa.c \
		libpkg/scripts.c \
		libpkg/ssh.c \
		libpkg/update.c \
		libpkg/utils.c

PKGSRCS=	pkg/add.c \
		pkg/annotate.c \
		pkg/audit.c \
		pkg/autoremove.c \
		pkg/backup.c \
		pkg/check.c \
		pkg/clean.c \
		pkg/config.c \
		pkg/convert.c \
		pkg/create.c \
		pkg/delete.c \
		pkg/event.c \
		pkg/fetch.c \
		pkg/info.c \
		pkg/install.c \
		pkg/lock.c \
		pkg/main.c \
		pkg/plugins.c \
		pkg/progressmeter.c \
		pkg/query.c \
		pkg/register.c \
		pkg/repo.c \
		pkg/rquery.c \
		pkg/search.c \
		pkg/set.c \
		pkg/shell.c \
		pkg/shlib.c \
		pkg/ssh.c \
		pkg/stats.c \
		pkg/update.c \
		pkg/updating.c \
		pkg/upgrade.c \
		pkg/utils.c \
		pkg/version.c \
		pkg/which.c

LIBSRCS=	${EXPATSRCS} ${UCLSRCS} ${SQLITESRCS} ${YAMLSRCS} ${LIBPKGSRCS}
LIBOBJS=	${LIBSRCS:.c=.o}
LIBSOBJS=	${LIBSRCS:.c=.So}
LIBSOBJS:=	${LIBSOBJS:M*.So}
PKGOBJS=	${PKGSRCS:.c=.o}

CFLAGS+=	-Wall -Werror
CCV!=		${CC} --version
.if ${CCV:M*clang*}
USING_CLANG=	yes
.endif

EXPATCFLAGS=	-I${.CURDIR}/external/expat/ \
		-DHAVE_EXPAT_CONFIG_H

.if defined(USING_CLANG)
EXPATCFLAGS+=	-Wno-enum-conversion
.endif

UCLCFLAGS=	-I${.CURDIR}/external/libucl/include \
		-I${.CURDIR}/external/libucl/src \
		-I${.CURDIR}/external/libucl/uthash \
		-Wno-pointer-sign \
		-Wno-strict-aliasing \
		-Wno-unused-function
.if exists(/usr/include/edit/readline/readline.h)
SQLITECFLAGS+=	-DHAVE_READLINE=1 \
		-I/usr/include/edit
.endif
OSNAME!=	uname -s
.if ${OSNAME} == FreeBSD
SQLITECFLAGS+=	-DHAVE_POSIX_FALLOCATE=1
.endif
SQLITECFLAGS+=	-DSTDC_HEADERS=1 \
		-DHAVE_SYS_TYPES_H=1 \
		-DHAVE_SYS_STAT_H=1 \
		-DHAVE_STDLIB_H=1 \
		-DHAVE_STRING_H=1 \
		-DHAVE_MEMORY_H=1 \
		-DHAVE_STRINGS_H=1 \
		-DHAVE_INTTYPES_H=1 \
		-DHAVE_STDINT_H=1 \
		-DHAVE_UNISTD_H=1 \
		-DHAVE_DLFCN_H=1 \
		-DHAVE_USLEEP=1 \
		-DHAVE_LOCALTIME_R=1 \
		-DHAVE_GMTIME_R=1 \
		-DHAVE_DECL_STRERROR_R=1 \
		-DHAVE_STRERROR_R=1 \
		-Wno-unused-variable \
		-Wno-unused-function \
		-Wno-strict-aliasing
# http://www.sqlite.org/compile.html
SQLITECFLAGS+=	-DSQLITE_OMIT_AUTOVACUUM \
		-DSQLITE_OMIT_BLOB_LITERAL \
		-DSQLITE_OMIT_DECLTYPE \
		-DSQLITE_OMIT_EXPLAIN \
		-DSQLITE_OMIT_DEPRECATED \
		-DSQLITE_OMIT_LOAD_EXTENSION \
		-DSQLITE_OMIT_PROGRESS_CALLBACK \
		-DSQLITE_OMIT_TCL_VARIABLE \
		-DSQLITE_OMIT_UTF16 \
		-DSQLITE_OMIT_CAT \
		-DSQLITE_OMIT_CHECK \
		-DSQLITE_OMIT_AUTOINIT \
		-DSQLITE_OMIT_COMPILEOPTION_DIAGS \
		-DSQLITE_OMIT_INTEGRITY_CHECK \
		-DSQLITE_OMIT_BUILTIN_TEST \
		-DSQLITE_OMIT_SHARED_CACHE \
		-DSQLITE_ENABLE_UNLOCK_NOTIFY=1 \
		-DUSE_PREAD \
		-DSQLITE_THREADSAFE=1 \
		-DSQLITE_TEMP_STORE=3 \
		-Dmain=sqlite3_shell \
		-DNDEBUG
YAMLCFLAGS=	-I${.CURDIR}/external/libyaml/include \
		-I${.CURDIR}/external/libyaml \
		-DHAVE_CONFIG_H \
		-Wno-strict-aliasing
DEFAULT_MIRROR_TYPE?=	1
LIBPKGCFLAGS=	-DDEFAULT_MIRROR_TYPE=${DEFAULT_MIRROR_TYPE} \
		-std=gnu99 \
		-Ilibpkg \
		-I${.CURDIR}/libpkg \
		-I${.CURDIR}/external/sqlite \
		-I${.CURDIR}/external/uthash \
		-I${.CURDIR}/external/libucl/include \
		-I${.CURDIR}/external/libyaml/include \
		-DPREFIX=\"${PREFIX}\" \
		-Wno-pointer-sign

PKGCFLAGS=	-Ilibpkg \
		-I${.CURDIR}/external/uthash \
		-I${.CURDIR}/external/expat/lib

TARGET_ARCH?=	uname -m
.if ${TARGET_ARCH} == sparc64
PICFLAG=	-fPIC
.else
PICFLAG=	-fpic
.endif

.for c in ${UCLSRCS}
CFLAGS.${c}+=	${UCLCFLAGS}
.endfor

.for c in ${EXPATSRCS}
CFLAGS.${c}+=	${EXPATCFLAGS}
.endfor

.for c in ${SQLITESRCS}
CFLAGS.${c}+=	${SQLITECFLAGS}
.endfor

.for c in ${YAMLSRCS}
CFLAGS.${c}+=	${YAMLCFLAGS}
.endfor

.for c in ${LIBPKGSRCS}
CFLAGS.${c}+=	${LIBPKGCFLAGS}
.endfor

.for c in ${PKGSRCS}
CFLAGS.${c}+=	${PKGCFLAGS}
.endfor

NEWVERS=	${.CURDIR}/newvers.sh
PKGVERSION!=	sh ${NEWVERS} pkg
PORTVERSION!=	sh ${NEWVERS} port

libpkg/libpkg.so: libpkg/libpkg.so.${SHLIB_MAJOR}
	ln -sf libpkg.so.${SHLIB_MAJOR} ${.TARGET}

libpkg/libpkg.so.${SHLIB_MAJOR}: ${LIBSOBJS}
	${CC} -o ${.TARGET} ${LIBSOBJS} -Wl,-soname=${.TARGET:T} -shared ${LDFLAGS} 

libpkg/libpkg.a: ${LIBOBJS}
	${AR} cq ${.TARGET} `lorder ${LIBOBJS:M*.o} | tsort -q`
	${RANLIB} ${.TARGET}

pkg/pkg: libpkg/libpkg.so ${PKGOBJS}
	${CC} -o ${.TARGET} ${PKGOBJS:M*.o} -Llibpkg -lpkg -lsbuf -larchive -ljail -ledit -lutil -lfetch -lelf -pthread

pkg/pkg-static: libpkg/libpkg.a ${PKGOBJS}
	${CC} -static -o ${.TARGET} ${PKGOBJS:M*.o} -Llibpkg -lpkg -lsbuf -larchive -ljail -ledit -lutil -lfetch -lelf -pthread -lssl -lcrypto -lbz2 -llzma -lz -lncurses

all: pkg/pkg pkg/pkg-static

.SUFFIXES: .o .h.in .h .pc.in .pc .So
.PHONY:	${_snapshot} clean

clean:
	rm -f ${LIBOBJS} ${LIBSOBJS}

.c.o: libpkg/pkg.h
	${CC} -o ${.TARGET} ${CFLAGS} ${CFLAGS.${.IMPSRC}} -c ${.IMPSRC}

.c.So: libpkg/pkg.h
	${CC} -o ${.TARGET} ${CFLAGS} ${PICFLAG} -DPIC ${CFLAGS.${.IMPSRC}} -c ${.IMPSRC}

.h.in.h: ${NEWVERS} ${_snapshot}
	sed -e 's,%%PKGVERSION%%,$(PKGVERSION),' \
	    -e 's,%%PORTVERSION%%,$(PORTVERSION),' \
	    ${.IMPSRC} > ${.TARGET}

.pc.in.pc: ${NEWVERS} ${_snapshot}
	sed -e 's,%%PKGVERSION%%,$(PKGVERSION),' \
	    -e 's,%%PORTVERSION%%,$(PORTVERSION),' \
	    ${.IMPSRC} > ${.TARGET}
