jw-pkg/make/swig.mk
Jan Lindemann 837f8f97bb swig.mk: Fix multiple file location issues
This commit fixes multiple issues with locating Perl and Python directories and
files. It was driven by the need to have it work on Yocto, and isn't tested
anywhere else. It also fixes __pycache__/%.pyc issues from the Python 2 -> 3
transition.

Signed-off-by: Jan Lindemann <jan@janware.com>
2019-06-24 12:34:43 +00:00

206 lines
8.2 KiB
Makefile

include $(MODDIR)/make/defs.mk
include $(MODDIR)/make/defs-cpp.mk
include $(MODDIR)/make/dev-utils.mk
ifeq ($(SWIG_TARGET),php)
SWIG_LANG ?= php
SWIG_TARGET_EXT ?= php
ifeq ($(OS_NAME),ubuntu)
PHP_MAJOR ?= 5
else
PHP_MAJOR ?= $(shell php-config --version | cut -d. -f1)
endif
PHP ?= php$(PHP_MAJOR)
#PHP ?= $(firstword $(notdir $(wildcard /usr/share/php*)))
SWIG_OPTS ?= -$(PHP) -DJW_PHP_MAJOR=$(PHP_MAJOR)
SWIG_MODULE_TARGET_DIR = $(ENV_PREFIX)/usr/share/$(PHP)
#SWIG_PHP_INCLUDE_DIR = /usr/include/$(PHP)
#SWIG_PHP_INCLUDE_SUBDIRS = . main TSRM Zend
SWIG_PHP_MODULE_INI = $(SWIG_MODULE).ini
SWIG_PHP_MODULE_INI_DIR = $(ENV_PREFIX)/etc/$(PHP)/conf.d
#SWIG_PHP_NAMESPACE ?= $(SWIG_MODULE)
SWIG_GENERATED_EXTRA += $(SWIG_PHP_MODULE_INI)
SWIG_INSTALLED_EXTRA = $(SWIG_PHP_MODULE_INI_DIR)/$(SWIG_PHP_MODULE_INI)
ifneq ($(SWIG_PHP_NAMESPECE),)
SWIG_POSTPROCESS += sed -i -e "s/^<?php/<?php namespace $(SWIG_PHP_NAMESPACE);/" $(SWIG_MODULE_TARGET)
endif
SWIG_CLEAN += php_$(SWIG_MODULE_H) $(SWIG_PHP_MODULE_INI)
BUILD_INCLUDE += $(shell php-config --includes)
INSTALL_LIBDIR = $(ENV_PREFIX)/usr/$(SYSTEM_LIBDIR_NAME)/$(PHP)/extensions
BUILD_CFLAGS += -Wno-unused-label -Wno-unused-function
BUILD_CXXFLAGS += -Wno-unused-label -Wno-unused-function
all:
$(SWIG_PHP_MODULE_INI_DIR)/%.ini: %.ini
mkdir -p $(dir $@)
$(INSTALL) -p -o $(APACHE_CONFOWNER) -g $(APACHE_CONFGROUP) -m $(APACHE_CONFMODE) $< $@
%.ini:
echo extension=$*.so > $@.tmp
mv $@.tmp $@
else ifeq ($(SWIG_TARGET),android)
SWIG_LANG ?= android
SWIG_TARGET_EXT ?= java
SWIG_OPTS ?= -android
else ifeq ($(SWIG_TARGET),python)
include $(MODDIR)/make/py-defs.mk # for $(PYTHON), $(PY_SITE_PACKAGES_PATH)
PYTHON_FULL_VERSION ?= $(basename $(lastword $(shell $(PYTHON) --version 2>&1)))
PYTHON_MAJOR_VERSION ?= $(basename $(PYTHON_FULL_VERSION))
PYTHON_MINOR_VERSION ?= $(patsubst .%,%,$(suffix $(PYTHON_FULL_VERSION)))
SWIG_LANG ?= python
SWIG_TARGET_EXT ?= py
SWIG_OPTS ?= -python
#SWIG_MODULE_TARGET_DIR = $(ENV_PREFIX)$(SYSTEM_LIBDIR)/python$(PYTHON_MAJOR_VERSION).$(PYTHON_MINOR_VERSION)/site-packages
SWIG_MODULE_TARGET_DIR = $(ENV_PREFIX)$(PY_SITE_PACKAGES_PATH)
SWIG_MODULE_SO ?= _$(SWIG_MODULE).so
ifneq ($(PYTHON_VERSION),3)
SWIG_CLEAN += $(wildcard *.pyc)
SWIG_PY_MODULE_PYC ?= $(patsubst %.py,%.pyc,$(SWIG_MODULE_TARGET))
else
SWIG_CLEAN += $(wildcard __pycache__)
SWIG_PY_MODULE_PYC ?= $(patsubst %.py,__pycache__/%.$(PY_CPYTHON_PREFIX).pyc,$(SWIG_MODULE_TARGET))
endif
SWIG_GENERATED_EXTRA += $(SWIG_PY_MODULE_PYC)
SWIG_INSTALLED_EXTRA += $(SWIG_MODULE_TARGET_DIR)/$(SWIG_PY_MODULE_PYC)
BUILD_INCLUDE += $(shell pkg-config --cflags python$(PYTHON_VERSION))
BUILD_LDFLAGS += $(shell pkg-config --libs python$(PYTHON_VERSION))
INSTALL_LIBDIR = $(SWIG_MODULE_TARGET_DIR)
all:
ifneq ($(PYTHON_VERSION),3)
%.pyc: %.py
else
__pycache__/%.$(PY_CPYTHON_PREFIX).pyc: %.py
endif
$(PYTHON) -c "import py_compile; py_compile.compile(\"$<\", doraise=True)"
ifeq ($(PYTHON_VERSION),3)
$(SWIG_MODULE_TARGET_DIR)/__pycache__/%.$(PY_CPYTHON_PREFIX).pyc: __pycache__/%.$(PY_CPYTHON_PREFIX).pyc
mkdir -p $(dir $@)
else
$(SWIG_MODULE_TARGET_DIR)/%.pyc: %.pyc
endif
$(INSTALL) -p -m $(SWIG_TARGETMODE) -o $(SWIG_TARGETOWNER) -g $(SWIG_TARGETGROUP) $< $@
else ifeq ($(SWIG_TARGET),java)
JAVA_VERSION ?= $(basename $(lastword $(shell java -version 2>&1 | sed '/version/ !d')))
JAVA_MAJOR_VERSION ?= $(basename $(JAVA_VERSION))
JAVA_MINOR_VERSION ?= $(patsubst .%,%,$(suffix $(JAVA_VERSION)))
SWIG_LANG ?= java
SWIG_TARGET_EXT ?= java
SWIG_OPTS ?= -java
SWIG_MODULE_TARGET_DIR = /usr/share/java
SWIG_MODULE_SO ?= $(SWIG_MODULE).so
SWIG_CLEAN += $(wildcard *.java)
#SWIG_PY_MODULE_PYC ?= $(patsubst %.py,%.pyc,$(SWIG_MODULE_TARGET))
#SWIG_GENERATED_EXTRA += $(SWIG_PY_MODULE_PYC)
#SWIG_INSTALLED_EXTRA += $(SWIG_MODULE_TARGET_DIR)/$(SWIG_PY_MODULE_PYC)
BUILD_INCLUDE += -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
#BUILD_LDFLAGS +=
INSTALL_LIBDIR = $(SWIG_MODULE_TARGET_DIR)
else ifeq ($(SWIG_TARGET),perl)
PERL ?= perl
SWIG_LANG ?= perl
SWIG_TARGET_EXT ?= pm
SWIG_OPTS ?= -perl
PERL_VERSION ?= $(patsubst v%,%,$(shell $(PERL) -e 'print $$^V;'))
# /usr/lib/perl is a symlink to /usr/lib/perl5 for yocto, so give this a preference
PERL_BASE_DIR ?= $(firstword $(wildcard $(addprefix $(BUILD_LIBS_PREFIX),/usr/lib64/perl5 /usr/lib/perl /usr/lib/perl5 /usr/lib/perl-native/perl)))
PERL_CORE_DIR ?= $(firstword $(wildcard $(addprefix $(PERL_BASE_DIR)/,$(PERL_VERSION)/$(ARCH)-linux-thread-multi/CORE $(PERL_VERSION)/CORE CORE)))
PERL_VENDOR_DIR ?= $(PERL_BASE_DIR)/vendor_perl/$(PERL_VERSION)/$(ARCH)-linux-thread-multi
BUILD_INCLUDE += -I$(PERL_CORE_DIR)
SWIG_CLEAN += $(wildcard *.$(SWIG_TARGET_EXT))
INSTALL_LIBDIR = $(ENV_PREFIX)$(PERL_VENDOR_DIR)/auto/$(SWIG_MODULE)
SWIG_MODULE_TARGET_DIR = $(ENV_PREFIX)$(PERL_VENDOR_DIR)
else
$(error SWIG_TARGET=$(SWIG_TARGET) undefined or unknown)
endif
SWIG_INCLUDE ?= $(filter-out -iquote .,$(BUILD_INCLUDE))
SWIG_USE_CPP ?= true
ifeq ($(SWIG_USE_CPP),true)
SWIG_SOURCE_EXT ?= cpp
SWIG_OPTS += -c++
else
SWIG_SOURCE_EXT ?= c
endif
SWIG ?= swig
SWIG_INTERFACE_I ?= $(wildcard *.i)
#SWIG_MODULE ?= $(SWIG_TARGET_EXT)_$(firstword $(shell sed '/^%module/ !d; s/^ *%module *//' $(SWIG_INTERFACE_I)))
SWIG_MODULE ?= $(firstword $(shell sed '/^%module/ !d; s/^ *%module *//' $(SWIG_INTERFACE_I)))
SWIG_MODULE_SO ?= $(SWIG_MODULE).so
SWIG_MODULE_H ?= $(SWIG_MODULE).h
SWIG_MODULE_WRAP_C ?= $(SWIG_MODULE)_wrap.$(SWIG_SOURCE_EXT)
SWIG_MODULE_TARGET ?= $(SWIG_MODULE).$(SWIG_TARGET_EXT)
SWIG_SRC_C ?= $(sort $(SWIG_MODULE_WRAP_C) $(wildcard *.c *.cpp))
SWIG_OBJ ?= $(patsubst %.cpp,%.o,$(patsubst %.c,%.o,$(sort $(SWIG_SRC_C))))
SWIG_TARGETOWNER ?= root
SWIG_TARGETGROUP ?= root
SWIG_TARGETMODE ?= 0644
SWIG_WRAPPER_DEP_MK = swig.dep.mk
SWIG_INSTALLED_SO = $(addprefix $(INSTALL_LIBDIR)/,$(SWIG_MODULE_SO))
SWIG_INSTALLED_MODULE_TARGET = $(addprefix $(SWIG_MODULE_TARGET_DIR)/,$(SWIG_MODULE_TARGET))
SWIG_DEFINES += -DNON_C_BINDING
SWIG_OPTS += $(SWIG_DEFINES)
BUILD_CFLAGS += $(SWIG_DEFINES)
BUILD_CXXFLAGS += $(SWIG_DEFINES)
# for depend.mk
BUILD_OBJ = $(SWIG_OBJ)
DEPEND_MK += $(SWIG_WRAPPER_DEP_MK)
all: $(SWIG_MODULE_SO) $(SWIG_GENERATED_EXTRA)
install: $(SWIG_INSTALLED_SO) $(SWIG_INSTALLED_MODULE_TARGET) $(SWIG_INSTALLED_EXTRA)
clean: clean.generated
distclean: clean
$(SWIG_WRAPPER_DEP_MK): $(SWIG_INTERFACE_I)
$(SWIG) -M -oh $(SWIG_MODULE_H) -module $(SWIG_MODULE) $(SWIG_INCLUDE) $(SWIG_OPTS) -MT $(SWIG_MODULE_WRAP_C) $< > $@.tmp
mv $@.tmp $@
$(SWIG_MODULE_WRAP_C): $(SWIG_INTERFACE_I)
$(SWIG) -oh $(SWIG_MODULE_H) -module $(SWIG_MODULE) $(SWIG_INCLUDE) $(SWIG_OPTS) -o $@ $<
$(SWIG_POSTPROCESS)
$(SWIG_MODULE_SO): $(SWIG_OBJ)
$(CXX) $^ -shared $(BUILD_LDFLAGS) -o $@
$(SWIG_MODULE_TARGET_DIR):
mkdir -p $@
$(SWIG_MODULE_TARGET_DIR)/%: % | $(SWIG_MODULE_TARGET_DIR)
$(INSTALL) -p -o $(SWIG_TARGETOWNER) -g $(SWIG_TARGETGROUP) -m $(SWIG_TARGETMODE) $< $@
clean.generated:
$(RM) -rf $(SWIG_MODULE_WRAP_C) $(SWIG_OBJ) $(SWIG_MODULE_SO) $(SWIG_MODULE_TARGET) $(SWIG_CLEAN) $(SWIG_WRAPPER_DEP_MK)
include $(MODDIR)/make/rules.mk
include $(MODDIR)/make/depend.mk