blob: 891c9ced7f329f7b9e358d14c9a565c245890f2b
1 | # ========================================================================== |
2 | # Build system |
3 | # ========================================================================== |
4 | |
5 | busybox.links: $(srctree)/applets/busybox.mkll $(objtree)/include/autoconf.h include/applets.h |
6 | $(Q)-$(SHELL) $^ > $@ |
7 | |
8 | busybox.cfg.suid: $(srctree)/applets/busybox.mksuid $(objtree)/include/autoconf.h include/applets.h |
9 | $(Q)-SUID="yes" $(SHELL) $^ > $@ |
10 | busybox.cfg.nosuid: $(srctree)/applets/busybox.mksuid $(objtree)/include/autoconf.h include/applets.h |
11 | $(Q)-SUID="DROP" $(SHELL) $^ > $@ |
12 | |
13 | .PHONY: install |
14 | ifeq ($(CONFIG_INSTALL_APPLET_SYMLINKS),y) |
15 | INSTALL_OPTS:= --symlinks |
16 | endif |
17 | ifeq ($(CONFIG_INSTALL_APPLET_HARDLINKS),y) |
18 | INSTALL_OPTS:= --hardlinks |
19 | endif |
20 | ifeq ($(CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS),y) |
21 | ifeq ($(CONFIG_INSTALL_SH_APPLET_SYMLINK),y) |
22 | INSTALL_OPTS:= --sw-sh-sym |
23 | endif |
24 | ifeq ($(CONFIG_INSTALL_SH_APPLET_HARDLINK),y) |
25 | INSTALL_OPTS:= --sw-sh-hard |
26 | endif |
27 | ifeq ($(CONFIG_INSTALL_SH_APPLET_SCRIPT_WRAPPER),y) |
28 | INSTALL_OPTS:= --scriptwrapper |
29 | endif |
30 | endif |
31 | ifeq ($(CONFIG_FEATURE_INDIVIDUAL),y) |
32 | INSTALL_OPTS:= --binaries |
33 | LIBBUSYBOX_SONAME:= 0_lib/libbusybox.so.$(BB_VER) |
34 | endif |
35 | install: $(srctree)/applets/install.sh busybox busybox.links |
36 | $(Q)DO_INSTALL_LIBS="$(strip $(LIBBUSYBOX_SONAME) $(DO_INSTALL_LIBS))" \ |
37 | $(SHELL) $< $(CONFIG_PREFIX) $(INSTALL_OPTS) |
38 | ifeq ($(strip $(CONFIG_FEATURE_SUID)),y) |
39 | @echo |
40 | @echo |
41 | @echo -------------------------------------------------- |
42 | @echo You will probably need to make your busybox binary |
43 | @echo setuid root to ensure all configured applets will |
44 | @echo work properly. |
45 | @echo -------------------------------------------------- |
46 | @echo |
47 | endif |
48 | |
49 | uninstall: busybox.links |
50 | rm -f $(CONFIG_PREFIX)/bin/busybox |
51 | for i in `cat busybox.links` ; do rm -f $(CONFIG_PREFIX)$$i; done |
52 | ifneq ($(strip $(DO_INSTALL_LIBS)),n) |
53 | for i in $(LIBBUSYBOX_SONAME) $(DO_INSTALL_LIBS); do \ |
54 | rm -f $(CONFIG_PREFIX)$$i; \ |
55 | done |
56 | endif |
57 | |
58 | # Not very elegant: copies testsuite to objdir... |
59 | # (cp -pPR is POSIX-compliant (cp -dpR or cp -a would not be)) |
60 | .PHONY: check |
61 | .PHONY: test |
62 | ifeq ($(CONFIG_UNIT_TEST),y) |
63 | UNIT_CMD = ./busybox unit |
64 | endif |
65 | check test: busybox busybox.links |
66 | $(UNIT_CMD) |
67 | test -d $(objtree)/testsuite || cp -pPR $(srctree)/testsuite $(objtree) |
68 | bindir=$(objtree) srcdir=$(srctree)/testsuite \ |
69 | $(SHELL) -c "cd $(objtree)/testsuite && $(srctree)/testsuite/runtest $(if $(KBUILD_VERBOSE:0=),-v)" |
70 | |
71 | .PHONY: release |
72 | release: distclean |
73 | cd ..; \ |
74 | rm -r -f busybox-$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION); \ |
75 | cp -pPR busybox busybox-$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) && { \ |
76 | find busybox-$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)/ -type d \ |
77 | -name .svn \ |
78 | -print \ |
79 | -exec rm -r -f {} \; ; \ |
80 | find busybox-$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)/ -type d \ |
81 | -name .git \ |
82 | -print \ |
83 | -exec rm -r -f {} \; ; \ |
84 | find busybox-$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)/ -type f \ |
85 | -name .gitignore \ |
86 | -print \ |
87 | -exec rm -f {} \; ; \ |
88 | find busybox-$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)/ -type f \ |
89 | -name .\#* \ |
90 | -print \ |
91 | -exec rm -f {} \; ; \ |
92 | tar -czf busybox-$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION).tar.gz \ |
93 | busybox-$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)/ ; } |
94 | |
95 | .PHONY: checkhelp |
96 | checkhelp: |
97 | $(Q)$(srctree)/scripts/checkhelp.awk \ |
98 | $(patsubst %,$(srctree)/%,$(wildcard $(patsubst %,%/Config.in,$(busybox-dirs) ./))) |
99 | |
100 | .PHONY: sizes |
101 | sizes: busybox_unstripped |
102 | $(NM) --size-sort $(<) |
103 | |
104 | .PHONY: bloatcheck |
105 | bloatcheck: busybox_old busybox_unstripped |
106 | @$(srctree)/scripts/bloat-o-meter busybox_old busybox_unstripped |
107 | @$(CROSS_COMPILE)size busybox_old busybox_unstripped |
108 | |
109 | .PHONY: baseline |
110 | baseline: busybox_unstripped |
111 | @mv busybox_unstripped busybox_old |
112 | |
113 | .PHONY: objsizes |
114 | objsizes: busybox_unstripped |
115 | $(srctree)/scripts/objsizes |
116 | |
117 | .PHONY: stksizes |
118 | stksizes: busybox_unstripped |
119 | $(CROSS_COMPILE)objdump -d busybox_unstripped | $(srctree)/scripts/checkstack.pl $(ARCH) | uniq |
120 | |
121 | .PHONY: bigdata |
122 | bigdata: busybox_unstripped |
123 | $(CROSS_COMPILE)nm --size-sort busybox_unstripped | grep -vi ' [trw] ' |
124 | |
125 | # Documentation Targets |
126 | .PHONY: doc |
127 | doc: docs/busybox.pod docs/BusyBox.txt docs/busybox.1 docs/BusyBox.html |
128 | |
129 | # FIXME: Doesn't belong here |
130 | cmd_doc = |
131 | quiet_cmd_doc = $(Q)echo " DOC $(@F)" |
132 | silent_cmd_doc = |
133 | disp_doc = $($(quiet)cmd_doc) |
134 | |
135 | # sed adds newlines after "Options:" etc, |
136 | # this is needed in order to get good BusyBox.{1,txt,html} |
137 | docs/busybox.pod: $(srctree)/docs/busybox_header.pod \ |
138 | include/usage.h \ |
139 | $(srctree)/docs/busybox_footer.pod \ |
140 | applets/usage_pod |
141 | $(disp_doc) |
142 | $(Q)-mkdir -p docs |
143 | $(Q)-( \ |
144 | cat $(srctree)/docs/busybox_header.pod; \ |
145 | echo; \ |
146 | applets/usage_pod | sed 's/^[A-Za-z][A-Za-z ]*[a-z]:$$/&\n/'; \ |
147 | cat $(srctree)/docs/busybox_footer.pod; \ |
148 | ) > docs/busybox.pod |
149 | |
150 | docs/BusyBox.txt: docs/busybox.pod |
151 | $(disp_doc) |
152 | $(Q)-mkdir -p docs |
153 | $(Q)-pod2text $< > $@ |
154 | |
155 | docs/busybox.1: docs/busybox.pod |
156 | $(disp_doc) |
157 | $(Q)-mkdir -p docs |
158 | $(Q)-pod2man --center=busybox --release="version $(KERNELVERSION)" $< > $@ |
159 | |
160 | docs/BusyBox.html: docs/busybox.net/BusyBox.html |
161 | $(disp_doc) |
162 | $(Q)-mkdir -p docs |
163 | $(Q)-rm -f docs/BusyBox.html |
164 | $(Q)-cp docs/busybox.net/BusyBox.html docs/BusyBox.html |
165 | |
166 | docs/busybox.net/BusyBox.html: docs/busybox.pod |
167 | $(Q)-mkdir -p docs/busybox.net |
168 | $(Q)-pod2html --noindex $< > $@ |
169 | $(Q)-rm -f pod2htm* |
170 | |
171 | # documentation, cross-reference |
172 | # Modern distributions already ship synopsis packages (e.g. debian) |
173 | # If you have an old distribution go to http://synopsis.fresco.org/ |
174 | syn_tgt = $(wildcard $(patsubst %,%/*.c,$(busybox-alldirs))) |
175 | syn = $(patsubst %.c, %.syn, $(syn_tgt)) |
176 | |
177 | comma:= , |
178 | brace_open:= ( |
179 | brace_close:= ) |
180 | |
181 | SYN_CPPFLAGS := $(strip $(CPPFLAGS) $(EXTRA_CPPFLAGS)) |
182 | SYN_CPPFLAGS := $(subst $(brace_open),\$(brace_open),$(SYN_CPPFLAGS)) |
183 | SYN_CPPFLAGS := $(subst $(brace_close),\$(brace_close),$(SYN_CPPFLAGS)) |
184 | #SYN_CPPFLAGS := $(subst ",\",$(SYN_CPPFLAGS)) |
185 | #") |
186 | #SYN_CPPFLAGS := [$(patsubst %,'%'$(comma),$(SYN_CPPFLAGS))''] |
187 | |
188 | %.syn: %.c |
189 | synopsis -p C -l Comments.SSDFilter,Comments.Previous -Wp,preprocess=True,cppflags="'$(SYN_CPPFLAGS)'" -o $@ $< |
190 | |
191 | .PHONY: html |
192 | html: $(syn) |
193 | synopsis -f HTML -Wf,title="'BusyBox Documentation'" -o $@ $^ |
194 | |
195 | -include $(srctree)/Makefile.local |
196 |