-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
111 lines (86 loc) · 3.07 KB
/
Makefile
File metadata and controls
111 lines (86 loc) · 3.07 KB
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
# fuse-ods2 - read-only FUSE driver for ODS-2 (Files-11)
UNAME_S := $(shell uname -s)
CC ?= cc
AR ?= ar
RANLIB ?= ranlib
CSTD := -std=c99
WARN := -Wall -Wextra -Wno-unused-parameter -Wno-unused-function \
-Wno-sign-compare -Wno-missing-field-initializers
# _DEFAULT_SOURCE is needed alongside _POSIX_C_SOURCE on glibc so that
# realpath() (used by ods2lib/compat.c) and pread() get declared.
DEFS := -D_FILE_OFFSET_BITS=64 -D_POSIX_C_SOURCE=200809L -D_DEFAULT_SOURCE
OPT ?= -O2 -g
CFLAGS ?= $(CSTD) $(WARN) $(OPT)
CFLAGS += $(DEFS) -Iods2lib -Isrc
# Pick the right FUSE flavour for the host.
ifeq ($(UNAME_S),Linux)
FUSE_PKG := fuse3
endif
ifeq ($(UNAME_S),Darwin)
# macFUSE ships a libfuse-compatible API. Prefer fuse3 if it is
# registered with pkg-config (recent macFUSE), otherwise fall back
# to the libfuse2-style 'fuse' package.
FUSE_PKG := $(shell pkg-config --exists fuse3 && echo fuse3 || echo fuse)
# _DARWIN_C_SOURCE is the libc feature switch on macOS; do NOT
# define _DEFAULT_SOURCE here, that's a glibc-only knob.
DEFS := $(filter-out -D_DEFAULT_SOURCE,$(DEFS)) -D_DARWIN_C_SOURCE
endif
FUSE_PKG ?= fuse3
FUSE_CFLAGS := $(shell pkg-config --cflags $(FUSE_PKG) 2>/dev/null)
FUSE_LIBS := $(shell pkg-config --libs $(FUSE_PKG) 2>/dev/null)
BUILD := build
LIB_SRCS := \
ods2lib/access.c \
ods2lib/cache.c \
ods2lib/compat.c \
ods2lib/device.c \
ods2lib/direct.c \
ods2lib/vmstime.c
LIB_OBJS := $(LIB_SRCS:%.c=$(BUILD)/%.o)
# Wrapper sources split by whether they pull in <fuse.h>. The standalone
# pieces always compile, so 'make objs' is a useful sanity check on hosts
# without libfuse3 installed.
NO_FUSE_SRCS := \
src/compat_glue.c \
src/phyfuse.c \
src/lookup.c \
src/recfmt.c
FUSE_SRCS := \
src/fuse_ods2.c \
src/ops.c
NO_FUSE_OBJS := $(NO_FUSE_SRCS:%.c=$(BUILD)/%.o)
FUSE_OBJS := $(FUSE_SRCS:%.c=$(BUILD)/%.o)
APP_OBJS := $(NO_FUSE_OBJS) $(FUSE_OBJS)
LIBODS2 := $(BUILD)/libods2.a
BIN := fuse-ods2
CATVMS := catvms
# catvms is a self-contained CLI: no libfuse, no ods2lib, just stdlib.
CATVMS_SRCS := src/catvms.c
CATVMS_OBJS := $(CATVMS_SRCS:%.c=$(BUILD)/%.o)
.PHONY: all clean lib objs bin
all: $(BIN) $(CATVMS)
lib: $(LIBODS2)
# objs builds only the FUSE-independent wrapper code so it is useful
# even on hosts without libfuse3 installed (e.g. macOS without macFUSE).
objs: $(NO_FUSE_OBJS)
bin: $(BIN)
$(BIN): $(APP_OBJS) $(LIBODS2)
ifeq ($(strip $(FUSE_LIBS)),)
@echo "*** $(FUSE_PKG) not found via pkg-config; install libfuse3-dev"
@echo " (or macFUSE on macOS) and re-run make."
@false
else
$(CC) $(CFLAGS) $(FUSE_CFLAGS) -o $@ $(APP_OBJS) $(LIBODS2) $(FUSE_LIBS)
endif
$(CATVMS): $(CATVMS_OBJS)
$(CC) $(CFLAGS) -o $@ $(CATVMS_OBJS)
$(LIBODS2): $(LIB_OBJS)
@mkdir -p $(dir $@)
$(AR) rcs $@ $(LIB_OBJS)
$(RANLIB) $@
$(BUILD)/%.o: %.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) $(FUSE_CFLAGS) -MMD -MP -c $< -o $@
clean:
rm -rf $(BUILD) fuse-ods2 catvms
-include $(LIB_OBJS:.o=.d) $(APP_OBJS:.o=.d) $(CATVMS_OBJS:.o=.d)