File: Makefile.sharedlibrary

package info (click to toggle)
duktape 2.7.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 21,160 kB
  • sloc: ansic: 215,359; python: 5,961; javascript: 4,555; makefile: 477; cpp: 205
file content (107 lines) | stat: -rw-r--r-- 4,292 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#
#  Example of how to build and install locally as a shared library
#
#  Usage:
#
#    $ make -f Makefile.sharedlibrary
#    $ sudo make -f Makefile.sharedlibrary install
#    $ make -f Makefile.sharedlibrary duk  # --> example 'duk' linked to shared libduktape
#
#    $ ls -l duk
#    -rwxrwxr-x 1 duktape duktape 19407 Nov 30 15:48 duk
#
#    $ ldd ./duk
#            linux-vdso.so.1 =>  (0x00007ffd5ed3c000)
#            libduktape.so.104 => /usr/local/lib/libduktape.so.104 (0x00007fb2f9753000)
#            libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb2f944d000)
#            libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb2f9088000)
#            /lib64/ld-linux-x86-64.so.2 (0x00007fb2f9991000)
#
#  Based on: http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

# Soname version must be bumped whenever a binary compatibility change occurs
# (and should not be bumped when the library is compatible).  A simple Duktape
# convention is to set soname version to (100*MAJOR + MINOR), e.g. 104 for
# Duktape 1.4.x, so that it gets automatically bumped for major and minor
# releases (potentially binary incompatible), but not for patch releases.
# The formatted version is used for the pkg-config file.
DUK_VERSION = 20700
DUK_VERSION_FORMATTED = 2.7.0
SONAME_VERSION = 207
REAL_VERSION = $(SONAME_VERSION).$(DUK_VERSION)

# Mac has an unusual .so naming convention
ifeq ($(OS),Windows_NT)
    DETECTED_OS := Windows
else
    DETECTED_OS := $(shell uname -s)
endif
ifeq ($(DETECTED_OS),Darwin)
    LD_SONAME_ARG=-install_name
    SO_SONAME_SUFFIX=$(SONAME_VERSION).so
    SO_REALNAME_SUFFIX=$(REAL_VERSION).so
else
    LD_SONAME_ARG=-soname
    SO_SONAME_SUFFIX=so.$(SONAME_VERSION)
    SO_REALNAME_SUFFIX=so.$(REAL_VERSION)
endif

# Change to actual path for actual distribution packaging.
INSTALL_PREFIX ?= ./tmp-build
INSTALL_PREFIX := $(INSTALL_PREFIX)
DESTDIR ?=
DESTDIR := $(DESTDIR)
LIBDIR ?= /lib
LIBDIR := $(LIBDIR)

# The 'noline' variant may be more appropriate for some distributions; it
# doesn't have #line directives in the combined source.
DUKTAPE_SRCDIR = ./src
#DUKTAPE_SRCDIR = ./src-noline

CC ?= gcc
CC := $(CC)

.PHONY: all
all: libduktape.$(SO_SONAME_SUFFIX) libduktaped.$(SO_SoNAME_SUFFIX) duktape.pc

# If the default duk_config.h is not suitable for the distribution, modify it
# before compiling the shared library and copy the same, edited duk_config.h
# to $INSTALL_PREFIX/include on installation.

libduktape.$(SO_SONAME_SUFFIX):
	$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -shared -fPIC -g -Wall -Wextra -Os -Wl,$(LD_SONAME_ARG),libduktape.$(SO_SONAME_SUFFIX) \
		-D_FORTIFY_SOURCE=2 -z relro -z now \
		-o $@ $(DUKTAPE_SRCDIR)/duktape.c

libduktaped.$(SO_SONAME_SUFFIX):
	$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -shared -fPIC -g -Wall -Wextra -Os -Wl,$(LD_SONAME_ARG),libduktaped.$(SO_SONAME_SUFFIX) \
		-D_FORTIFY_SOURCE=2 -z relro -z now \
		-o $@ $(DUKTAPE_SRCDIR)/duktape.c

duktape.pc:
	sed -e "s|@PREFIX@|$(INSTALL_PREFIX)|" \
		-e "s|@LIBDIR@|$(LIBDIR)|" \
		-e "s|@VERSION@|$(DUK_VERSION_FORMATTED)|" \
		duktape.pc.in \
		> duktape.pc

# Symlinks depend on platform conventions.
.PHONY: install
install: libduktape.$(SO_SONAME_SUFFIX) libduktaped.$(SO_SONAME_SUFFIX) duktape.pc
	mkdir -p $(DESTDIR)$(INSTALL_PREFIX)$(LIBDIR)/pkgconfig
	cp $+ $(DESTDIR)$(INSTALL_PREFIX)$(LIBDIR)/
	rm -f $(INSTALL_PREFIX)/lib/libduktape.so
	ln -s libduktape.$(SO_SONAME_SUFFIX) $(INSTALL_PREFIX)/lib/libduktape.so
#	ln -s libduktape.$(SO_REALNAME_SUFFIX) $(INSTALL_PREFIX)/lib/libduktape.$(SO_SONAME_SUFFIX)

	rm -f $(DESTDIR)$(INSTALL_PREFIX)$(LIBDIR)/libduktaped.so $(DESTDIR)$(INSTALL_PREFIX)$(LIBDIR)/libduktaped.$(SO_SONAME_SUFFIX)
	ln -s libduktaped.$(SO_SONAME_SUFFIX) $(INSTALL_PREFIX)/lib/libduktaped.so
#	ln -s libduktaped.$(SO_REALNAME_SUFFIX) $(INSTALL_PREFIX)/lib/libduktaped.$(SO_SONAME_SUFFIX)
	mv $(DESTDIR)$(INSTALL_PREFIX)$(LIBDIR)/duktape.pc $(DESTDIR)$(INSTALL_PREFIX)$(LIBDIR)/pkgconfig/
	mkdir -p $(DESTDIR)$(INSTALL_PREFIX)/include/
	cp $(DUKTAPE_SRCDIR)/duktape.h $(DUKTAPE_SRCDIR)/duk_config.h $(DESTDIR)$(INSTALL_PREFIX)/include/

CCOPTS = -I./examples/cmdline
duk:
	$(CC) $(CCOPTS) -I$(INSTALL_PREFIX)/include -L$(INSTALL_PREFIX)$(LIBDIR) -Wall -Wextra -Os -o $@ ./examples/cmdline/duk_cmdline.c -lduktape -lm