#
# Makefile for slurm API library

AUTOMAKE_OPTIONS = foreign

AM_CPPFLAGS = -I$(top_srcdir)

if WITH_GNU_LD
VERSION_SCRIPT = \
	version.map
OTHER_FLAGS = \
	-Wl,--version-script=$(VERSION_SCRIPT)
FULL_VERSION_SCRIPT = \
	full_version.map
FULL_OTHER_FLAGS = \
	-Wl,--version-script=$(FULL_VERSION_SCRIPT)
SLURM_PMI_OTHER_FLAGS = \
	-Wl,--version-script=$(VERSION_SCRIPT)
endif

# libslurm version information :
#
# Update META file information before a public release only!
#
# Note that libtool builds libslurm.so.<major>.<age>.<rev>
# where major = API_MAJOR = (API_CURRENT - API_AGE)
# and   age   = API_AGE
# and   rev   = API_REVISION
#
# The following examples are based upon initial values of API_CURRENT = 6,
# API_AGE = 4, API_REVISION = 6.
#
# If any interfaces have been added: increment API_CURRENT, increment API_AGE,
# and set API_REVISION = 0 (e.g. libslurm.so.2.4.6 -> libslurm.so.2.5.0)
#
# If any interfaces have been removed: increment API_CURRENT, set API_AGE = 0,
# and set API_REVISION = 0 (e.g. libslurm.so.2.4.6 -> libslurm.so.7.0.0)
#
# If any interfaces have changed: increment API_CURRENT only
# (e.g. libslurm.so.2.4.6 -> libslurm.so.3.4.6)
#
# If the interfaces have not changed, but underlying code has changed at all:
# increment API_REVISION only (e.g. libslurm.so.2.4.6 -> libslurm.so.2.4.7)
#
current = $(SLURM_API_CURRENT)
age     = $(SLURM_API_AGE)
rev     = $(SLURM_API_REVISION)

lib_LTLIBRARIES = libslurm.la

# The ABI of libslurmfull can easily change from 1 micro version to another.
# To avoid issue we will install this lib alongside the plugins to protect
# from version issues.
#
# The unversioned libslurm_pmi is hidden there as well.
pkglib_LTLIBRARIES = libslurmfull.la libslurm_pmi.la

# BUILT_SOURCES tells automake that when "make" is called, these targets
# need to be built before anything else.
BUILT_SOURCES = $(VERSION_SCRIPT) $(FULL_VERSION_SCRIPT) libslurm.la

# Note that libslurmhelper is mostly the same as libslurm, except that
# it exports ALL symbols used by the process, libcommon, etc.
# Only link with libslurmhelper if you are sure you are not going to be
# loading a plugin that could use something you yourself are not
# calling from here.
# libslurm.o only contains all the api symbols and will export
# them to plugins that are loaded.
# Also, libslurmhelper, libslurm.o are for convenience, they are not installed.
noinst_LTLIBRARIES = libslurmhelper.la
noinst_PROGRAMS = libslurm.o

slurmdbapi_src =	\
	account_functions.c \
	archive_functions.c \
	assoc_functions.c \
	cluster_functions.c \
	cluster_report_functions.c \
	coord_functions.c \
	connection_functions.c \
	extra_get_functions.c \
	federation_functions.c \
	job_functions.c \
	job_report_functions.c \
	qos_functions.c \
	resource_functions.c \
	tres_functions.c \
	usage_functions.c \
	user_functions.c \
	user_report_functions.c \
	wckey_functions.c

slurmapi_src =           \
	allocate.c       \
	allocate_msg.c   \
	burst_buffer_info.c \
	assoc_mgr_info.c    \
	cancel.c         \
	cluster_info.c   \
	complete.c       \
	config_info.c    \
	crontab.c        \
	federation_info.c \
	init.c           \
	init_msg.c       \
	job_info.c       \
	job_step_info.c  \
	license_info.c   \
	node_info.c      \
	partition_info.c \
	pmi_server.c     \
	pmi_server.h     \
	reservation_info.c \
	signal.c         \
	slurm_get_statistics.c \
	slurm_pmi.c      \
	slurm_pmi.h	 \
	step_io.c        \
	step_io.h        \
	step_launch.c    \
	step_launch.h    \
	submit.c         \
	suspend.c        \
	token.c          \
	topo_info.c      \
	triggers.c       \
	reconfigure.c    \
	update_config.c \
	$(slurmdbapi_src)

common_dir = $(top_builddir)/src/common

slurmapi_add = 			 \
	$(common_dir)/libcommon.la	\
	$(top_builddir)/src/interfaces/libcommon_interfaces.la \
	$(top_builddir)/src/conmgr/libconmgr.la \
	-lpthread

libslurmhelper_la_SOURCES = $(slurmapi_src)
libslurmhelper_la_LIBADD = $(slurmapi_add)
libslurmhelper_la_LDFLAGS = $(LIB_LDFLAGS)

convenience_libs = \
	$(top_builddir)/src/api/libslurmhelper.la

libslurm_la_SOURCES =
libslurm_la_LIBADD = $(convenience_libs)
libslurm_la_LDFLAGS        = \
        $(LIB_LDFLAGS) \
        -version-info $(current):$(rev):$(age) \
        $(OTHER_FLAGS)

libslurmfull_la_SOURCES =
libslurmfull_la_LIBADD = $(convenience_libs)
libslurmfull_la_LDFLAGS        = \
        $(LIB_LDFLAGS) \
	-avoid-version \
        $(FULL_OTHER_FLAGS)

libslurm_pmi_la_SOURCES =
libslurm_pmi_la_LIBADD = $(convenience_libs)
libslurm_pmi_la_LDFLAGS        = \
        $(LIB_LDFLAGS) \
	-avoid-version \
        $(SLURM_PMI_OTHER_FLAGS)

# This was made so we could export all symbols from libcommon
# on multiple platforms
libslurm_o_SOURCES =

libslurm_o_LDADD =				\
	$(top_builddir)/src/common/libcommon.o \
	$(top_builddir)/src/interfaces/libcommon_interfaces.o \
	$(top_builddir)/src/conmgr/libconmgr.o

libslurm.o$(EXEEXT): $(libslurmhelper_la_OBJECTS) $(libslurm_o_LDADD)
	$(LINK) $(libslurmhelper_la_OBJECTS) $(libslurm_o_LDADD)

force:
$(libslurm_o_LDADD) $(convenience_libs) $(slurmapi_add) : force
	@cd `dirname $@` && $(MAKE) `basename $@`

$(VERSION_SCRIPT) :
	(echo "{ global:";   \
	 echo "   islurm_*;"; \
	 echo "   sack_*;"; \
	 echo "   slurm_*;"; \
	 echo "   slurmdb_*;"; \
	 echo "   working_cluster_rec;"; \
	 echo "   node_record_count;"; \
	 echo "   active_node_record_count;"; \
	 echo "   node_record_table_ptr;"; \
	 echo "  local: *;"; \
	 echo "};") > $(VERSION_SCRIPT)

$(FULL_VERSION_SCRIPT) :
	(echo "{ global: *; };") > $(FULL_VERSION_SCRIPT)

CLEANFILES = \
	$(VERSION_SCRIPT) $(FULL_VERSION_SCRIPT)

DISTCLEANFILES = \
	$(VERSION_SCRIPT) $(FULL_VERSION_SCRIPT)
