-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathMakefile
165 lines (120 loc) · 4.45 KB
/
Makefile
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
include env-vars
# Functions:
# Download a file
define gen_dl
$(GEN_DATA_DIR)/$(strip $(1)).gen:
wget --no-verbose --output-document $$@ $(2)
endef
OBJECTS := $(wildcard $(SRCDIR)/*.in $(SRCDIR)/*.sh-in $(SRCDIR)/*.opensearch-in)
# Files converted to .gen-in first, and then .elvis
GEN_OBJECTS :=
MEDIAWIKI_OBJ := $(wildcard $(SRCDIR)/*.mediawiki-in)
GEN_OBJECTS += $(MEDIAWIKI_OBJ:.mediawiki-in=.gen-in)
OBJECTS += $(GEN_OBJECTS)
OUTPUTS := $(OBJECTS:%.in=%)
OUTPUTS := $(OUTPUTS:%.sh-in=%)
OUTPUTS := $(OUTPUTS:%.gen-in=%)
OUTPUTS := $(OUTPUTS:%.opensearch-in=%)
OBJECTS := $(sort $(OBJECTS))
GEN_OBJECTS := $(sort $(GEN_OBJECTS))
OUTPUTS := $(addprefix $(ELVI_DIR)/, $(notdir $(sort $(OUTPUTS))))
.PRECIOUS: $(GEN_OBJECTS)
.PHONY: all
.DEFAULT_GOAL := all
all: elvi
.PHONY: elvi
elvi: $(OUTPUTS)
.PHONY: check
check:
./opts.sh | ./lint.sh
# Include submakefiles that process the data files to generate certain elvi
$(foreach makefile,$(wildcard $(INCLUDE_DIR)/*.mk),$(eval include $(makefile)))
# Data files that each build multiple elvi
# `github`-related elvi:
$(eval $(call gen_dl, github-search.html, https://github.com/search/advanced))
$(GEN_DATA_DIR)/github-languages.gen: $(GEN_DATA_DIR)/github-search.html.gen
hxclean $< | \
hxselect -cs '\n' '#search_language > optgroup > option::attr(value)' | \
hxunent | \
awk -v OFS='\t' '\
{ \
search_term = $$0; \
$$0 = tolower($$0); \
gsub(/#/, "-sharp"); \
gsub(/\*/, "-star"); \
gsub(/ /, "-"); \
# strip out parens, periods, and single quotes \
gsub(/[.)('\'']/, ""); \
# format: enum value, string to go in search query \
print $$0, search_term; \
}' | \
sort -k1 -t' ' | \
awk -v OFS="\t" '\
# 'any' language should be the first option shown \
BEGIN {print "any", ""} \
{print}' >$@
# They all depend on the same file
$(ELVI_DIR)/github $(ELVI_DIR)/ghrepos $(ELVI_DIR)/ghissues: $(GEN_DATA_DIR)/github-languages.gen
# General rules:
# I'm not sure how to have a rule match with the basename of something
# Line comments are permitted
$(ELVI_DIR)/%: $(SRCDIR)/%.in
grep -v '^[[:space:]]*\#' $< | xargs mkelvis $(notdir $(basename $@)) -o $@
$(ELVI_DIR)/%: $(SRCDIR)/%.sh-in
./$< | grep -v '^[[:space:]]*\#' | xargs mkelvis $(notdir $(basename $@)) -o $@
# Generated input files
$(ELVI_DIR)/%: $(SRCDIR)/%.gen-in
grep -v '^[[:space:]]*\#' $< | xargs mkelvis $(notdir $(basename $@)) -o $@
# Nothing too special to do here
# Format of .mediawiki-in files:
# First line: domain
# Second line: search url
# Third line: description
$(SRCDIR)/%.gen-in: $(SRCDIR)/%.mediawiki-in
$(GEN_SCRIPTS_DIR)/mediawiki2in $< $@
# OpenSearch data files should remain on disk.
# Can't use patterns since GNU Make doesn't handle *these* patterns properly.
.PRECIOUS: $(foreach OS_elvis, $(wildcard $(SRCDIR)/*.opensearch-in), $(addprefix $(GEN_DATA_DIR)/$(notdir $(basename $(OS_elvis))).opensearch., url.gen xml.gen))
# We touch the tempfiles since wget does some funky things with timestamps.
# Retrieve OpenSearch url of site (refresh with `touch *.opensearch-in`)
$(GEN_DATA_DIR)/%.opensearch.url.gen: $(SRCDIR)/%.opensearch-in
rm -f $@ $@.tmp
opensearch-discover $(file <$<) >$@.tmp
touch $@.tmp
mv $@.tmp $@
# Retrieve OpenSearch description (refresh with `touch *.opensearch.url.gen`)
$(GEN_DATA_DIR)/%.opensearch.xml.gen: $(GEN_DATA_DIR)/%.opensearch.url.gen
rm -f $@ $@.tmp
wget --no-verbose --output-document $@.tmp $(file <$<)
touch $@.tmp
mv $@.tmp $@
# Make the elvis
$(ELVI_DIR)/%: $(GEN_DATA_DIR)/%.opensearch.xml.gen
opensearch2elvis $(notdir $(basename $@)) $< -o $@
# For installing
XDG_CONFIG_HOME ?= $(HOME)/.config
LOCAL_ELVI_DIR := $(XDG_CONFIG_HOME)/surfraw/elvi
MANUAL_ELVI := $(file <manual-elvi.list)
.PHONY: install
install:
install -D -t $(LOCAL_ELVI_DIR) -m 755 -- $(OUTPUTS) $(addprefix $(MANUAL_ELVI_DIR)/, $(MANUAL_ELVI))
.PHONY: uninstall
uninstall:
-cd $(LOCAL_ELVI_DIR) && rm -f -- $(notdir $(basename $(OUTPUTS))) $(MANUAL_ELVI)
.PHONY: clean
clean:
-cd $(ELVI_DIR) && rm -f -- $(notdir $(wildcard $(ELVI_DIR)/*))
.PHONY: clean-gen-in
clean-gen-in:
-rm -f -- $(GEN_OBJECTS)
.PHONY: clean-mediawiki-elvi
clean-mediawiki-elvi:
-cd $(ELVI_DIR) && rm -f -- $(notdir $(MEDIAWIKI_OBJ:%.mediawiki-in=%))
# Clean non-elvis generator files
.PHONY: clean-gen
clean-gen:
-cd $(GEN_DATA_DIR) && rm -f -- $(notdir $(wildcard $(GEN_DATA_DIR)/*.gen))
.PHONY: clean-gen-all
clean-gen-all: clean-gen clean-gen-in
.PHONY: clean-all
clean-all: clean clean-gen-all