-
Notifications
You must be signed in to change notification settings - Fork 1
/
GNUmakefile
139 lines (110 loc) · 4.13 KB
/
GNUmakefile
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# chez-ncurses GNUmakefile.
# Written by Jerry 2019-2024.
# SPDX-License-Identifier: Unlicense
# Path to chez scheme executable.
OS = $(shell uname)
ifeq ($(OS),FreeBSD)
# FreeBSD pkg installs to /usr/local
SCHEME = /usr/local/bin/chez-scheme
else
SCHEME = /usr/bin/chez-scheme
endif
SCHEMEVERSION = $(shell $(SCHEME) --version 2>&1)
# Install destination directory. This should be an object directory contained in (library-directories).
# eg, set in CHEZSCHEMELIBDIRS environment variable.
PREFIX = $(HOME)
LIBDIR = $(PREFIX)/lib/csv$(SCHEMEVERSION)
BUILDDIR = BUILD-csv$(SCHEMEVERSION)
# Scheme compile flags.
SFLAGS = -q
# Path to install executable.
INSTALL = /usr/bin/install
## Should be no need to edit anything below here.
# Scheme compilation is handled by building TOPSRC (for local builds) or ITOPSRC (for
# the install directory) and letting Chez scheme automatically manage dependents.
PROJ = ncurses
# Top level (ie, root) library sources.
# These are the scheme libs that are included from client apps.
TOPSRC = $(PROJ).chezscheme.sls $(addprefix $(PROJ)/,panel.chezscheme.sls posix.chezscheme.sls util.sls)
# Source files, shared objects, and whole program optimisations for the library subdirectory.
SUBSRC = $(addprefix $(PROJ)/,common.chezscheme.sls)
# Setup shared object and whole program optimisation extensions.
TOPOBJ = $(TOPSRC:.sls=.so)
TOPWPO = $(TOPSRC:.sls=.wpo)
SUBOBJ = $(SUBSRC:.sls=.so)
SUBWPO = $(SUBSRC:.sls=.wpo)
# Local build versions.
BTOPOBJ = $(addprefix $(BUILDDIR)/,$(TOPOBJ))
BTOPWPO = $(addprefix $(BUILDDIR)/,$(TOPWPO))
BSUBOBJ = $(addprefix $(BUILDDIR)/,$(SUBOBJ))
BSUBWPO = $(addprefix $(BUILDDIR)/,$(SUBWPO))
# Installed versions of all the above.
ITOPSRC = $(addprefix $(LIBDIR)/,$(TOPSRC))
ITOPOBJ = $(addprefix $(LIBDIR)/,$(TOPOBJ))
ITOPWPO = $(addprefix $(LIBDIR)/,$(TOPWPO))
ISUBSRC = $(addprefix $(LIBDIR)/,$(SUBSRC))
ISUBOBJ = $(addprefix $(LIBDIR)/,$(SUBOBJ))
ISUBWPO = $(addprefix $(LIBDIR)/,$(SUBWPO))
# Tell GNU make about the files generated as a "side-effect" of building TOPWPO,
# otherwise make will raise an error that it doesn't know how to build these.
.SECONDARY: $(TOPOBJ)
# Default to just a local build.
all: build
# In-place local development test compile. This is built in a separate
# directory BUILDDIR so as to keep build files out of the way.
# $(basename $*) extracts the useful library name.
# eg, (import (proj $(basename proj/libname.chezscheme.sls))) => (import (proj libname))
$(BUILDDIR)/$(PROJ)/%.wpo: $(PROJ)/%.sls
echo \
"(reset-handler abort)" \
"(compile-imported-libraries #t)" \
"(generate-wpo-files #t)" \
"(library-directories" \
' (list (cons "." "$(BUILDDIR)")))' \
'(import ($(PROJ) $(basename $*)))' \
| $(SCHEME) $(SFLAGS)
$(BUILDDIR)/%.wpo: %.sls
echo \
"(reset-handler abort)" \
"(compile-imported-libraries #t)" \
"(generate-wpo-files #t)" \
"(library-directories" \
' (list (cons "." "$(BUILDDIR)")))' \
'(import ($(basename $*)))' \
| $(SCHEME) $(SFLAGS)
# Installed compile. Source files must be copied to destination LIBDIR first
# (via make rules) where this recipe compiles in the remote location.
$(LIBDIR)/$(PROJ)/%.wpo: $(PROJ)/%.sls
echo \
"(reset-handler abort)" \
"(compile-imported-libraries #t)" \
"(generate-wpo-files #t)" \
"(library-directories" \
' (list (cons "." "$(LIBDIR)")))' \
'(import ($(PROJ) $(basename $*)))' \
| $(SCHEME) $(SFLAGS)
$(LIBDIR)/%.wpo: %.sls
echo \
"(reset-handler abort)" \
"(compile-imported-libraries #t)" \
"(generate-wpo-files #t)" \
"(library-directories" \
' (list (cons "." "$(LIBDIR)")))' \
'(import ($(basename $*)))' \
| $(SCHEME) $(SFLAGS)
# Creating the dest dir first works for both BSD and GNU install.
$(LIBDIR)/%: %
@$(INSTALL) -d "$(dir $@)"
$(INSTALL) -m u=rw,go=r,a-s -p "$<" "$@"
build: $(BTOPWPO)
install: install-build
install-build: install-src $(ITOPWPO)
install-src: $(ITOPSRC) $(ISUBSRC)
clean:
$(RM) $(BTOPOBJ) $(BTOPWPO) $(BSUBOBJ) $(BSUBWPO)
$(RM) -d $(BUILDDIR)/$(PROJ)
$(RM) -d $(BUILDDIR)
clean-install:
$(RM) $(ITOPOBJ) $(ITOPWPO) $(ITOPSRC) $(ISUBSRC) $(ISUBOBJ) $(ISUBWPO)
$(RM) -d $(LIBDIR)/$(PROJ)
clean-all: clean clean-install