openpmix-src 0.1.0

Vendored build of OpenPMIx, developed for use by the Lamellar runtime.
#
# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
#                         University Research and Technology
#                         Corporation.  All rights reserved.
# Copyright (c) 2004-2005 The University of Tennessee and The University
#                         of Tennessee Research Foundation.  All rights
#                         reserved.
# Copyright (c) 2004-2009 High Performance Computing Center Stuttgart,
#                         University of Stuttgart.  All rights reserved.
# Copyright (c) 2004-2005 The Regents of the University of California.
#                         All rights reserved.
# Copyright (c) 2006-2010 Cisco Systems, Inc.  All rights reserved.
# Copyright (c) 2012-2013 Los Alamos National Security, Inc.  All rights reserved.
# Copyright (c) 2013-2019 Intel, Inc.  All rights reserved.
# Copyright (c) 2018      Research Organization for Information Science
#                         and Technology (RIST).  All rights reserved.
# Copyright (c) 2021      IBM Corporation.  All rights reserved.
# Copyright (c) 2022      Nanook Consulting.  All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
#
# $HEADER$
#

# We do NOT want picky compilers down here
CFLAGS = $(PMIX_CFLAGS_BEFORE_PICKY)

helpers = \
        setup.py \
        construct.py

src_files = \
        pmix.pxi \
        pmix.pyx

EXTRA_DIST = $(helpers) $(src_files)

if WANT_PYTHON_BINDINGS

harvested_headers = \
        $(top_srcdir)/include/pmix.h \
        $(top_builddir)/include/pmix_common.h \
        $(top_srcdir)/include/pmix_deprecated.h \
        $(top_srcdir)/include/pmix_server.h \
        $(top_srcdir)/include/pmix_tool.h

constants_files = \
        pmix_constants.pxd \
        pmix_constants.pxi

# Create pmix_constants.pxd and pmix_constants.pxi by harvesting a
# bunch of PMIx header files These will be generated in the PMIx build
# dir.
$(constants_files): construct.py $(harvested_headers)
	$(PYTHON) $(top_srcdir)/bindings/python/construct.py --src="$(top_builddir)/include" --include-dir="$(top_srcdir)/include"

# Cython does not natively understand VPATH builds.  Specifically,
# Cython will build things in the same tree where it finds
# pmix.[pxi|pyx] (which is the PMIx source tree).
#
# Cython's "setup.py build_ext
# --build-lib=SOMEWHERE_IN_THE_BUILD_TREE" *almost* does what we want.
# But even though it makes the build/install trees in the directory we
# tell it (vs. the source tree), it still writes pmix.c in the source
# tree, which is definitely not what we want.
#
# We want to properly support VPATH builds, so we fake out Cython and
# force it to build in the PMIx build tree by making sym links for
# pmix.[pxi|pyx] from the source tree to the build tree.  Cython can
# then find these files in the build tree, and build everything there
# (including pmix.c).
#
# This is a little gross, but it works. :-/
$(PMIX_TOP_BUILDDIR)/bindings/python/pmix.pxi:
	$(LN_S) $(PMIX_TOP_SRCDIR)/bindings/python/pmix.pxi $(PMIX_TOP_BUILDDIR)/bindings/python/pmix.pxi
$(PMIX_TOP_BUILDDIR)/bindings/python/pmix.pyx:
	$(LN_S) $(PMIX_TOP_SRCDIR)/bindings/python/pmix.pyx $(PMIX_TOP_BUILDDIR)/bindings/python/pmix.pyx

# When we run "setup.pu build_ext ...", several files/directories are
# created.  The exact files / directory names may be system-dependent,
# so we don't try to check for most of them.  Instead, we just check
# for one sentinel file that is always created during this step:
# pmix.c, and use that as a proxy for all the other things that were
# created during this step.
SENTINEL_FILE = pmix.c

# Create $(SENTINEL_FILE) from its sources and the constants we
# harvested from various PMIx header files.  Ensure to depend on the
# pmix.[pxi|pyx] in the build tree so that those rules get triggered
# and we get sym links over to the source tree, if necessary.
$(SENTINEL_FILE): $(PMIX_TOP_BUILDDIR)/bindings/python/pmix.pxi
$(SENTINEL_FILE): $(PMIX_TOP_BUILDDIR)/bindings/python/pmix.pyx
$(SENTINEL_FILE): $(constants_files)
	PMIX_BINDINGS_TOP_SRCDIR=$(PMIX_TOP_SRCDIR) PMIX_BINDINGS_TOP_BUILDDIR=$(PMIX_TOP_BUILDDIR) \
		$(PYTHON) $(top_srcdir)/bindings/python/setup.py build_ext --library-dirs="$(PMIX_TOP_BUILDDIR)/src/.libs" --user

BUILT_SOURCES = $(constants_files)

# We don't put $(SENTINEL_FILE) BUILT_SOURCES because then "make dist"
# will fail if it can't be created (e.g., if no suitable Python +
# Cython + etc. is available) -- because the files in BUILT_SOURCES
# are dependencies of "distdir".
#
# More specifically: $(SENTINEL_FILE) isn't shipped in the tarball, so
# it doesn't seem right to require it to be able to be built for "make
# dist" to succeed.  Hence, we (slightly) abuse Automake's "noinst"
# and "DATA" to force $(SENTINEL_FILE) to be built during "make all"
# when WANT_PYTHON_BINDINGS is true.
noinst_DATA = $(SENTINEL_FILE)

install-exec-local:
	$(MKDIR_P) $(DESTDIR)$(pythondir)
	PYTHONPATH=$$PYTHONPATH:$(DESTDIR)$(pythondir):$(DESTDIR)$(pyexecdir) \
		PMIX_BINDINGS_TOP_SRCDIR=$(PMIX_TOP_SRCDIR) PMIX_BINDINGS_TOP_BUILDDIR=$(PMIX_TOP_BUILDDIR) \
		$(PYTHON) $(top_srcdir)/bindings/python/setup.py install --quiet --prefix="$(DESTDIR)$(prefix)"

# Be careful with easy-install.pth -- we may not be the only entity
# that put things in there.  Therefore, carefully remove the pmix
# entry from it, and then remove the file altogether if is then
# otherwise empty.  Finally, remove the installed pypmix Python egg.
uninstall-hook:
	-@file=$(pythondir)/easy-install.pth; \
	tmpfile=$(pythondir)/easy-install.pth.$$; \
	if test -r $$file; then \
	    grep -v /pypmix- $$file > $$tmpfile; \
	    diff -q $$file $$tmpfile 2>&1 >/dev/null; \
	    if test $$? -ne 0; then \
	        cp $$tmpfile $$file; \
	    fi; \
	    rm -f $$tmpfile; \
	    if test ! -s $$file; then \
	        rm -f $$file; \
	    fi; \
	fi
	rm -rf $(pythondir)/pypmix*

CLEANFILES += $(constants_files)

# Also delete the other files and dirs that Cython creates during its
# "setup.py build_ext ..." step.  We need to use clean-local because
# the names in CLEANFILE are not "rm -rf"'ed.
clean-local:
	rm -rf $(SENTINEL_FILE) build dist pypmix.egg-info

endif # WANT_PYTHON_BINDINGS