2 # mdadm - manage Linux "md" devices aka RAID arrays.
4 # Copyright (C) 2001-2002 Neil Brown <neilb@cse.unsw.edu.au>
5 # Copyright (C) 2013 Neil Brown <neilb@suse.de>
8 # This program is free software; you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 2 of the License, or
11 # (at your option) any later version.
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with this program; if not, write to the Free Software
20 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 # Email: <neilb@cse.unsw.edu.au>
25 # School of Computer Science and Engineering
26 # The University of New South Wales
31 # define "CXFLAGS" to give extra flags to CC.
32 # e.g. make CXFLAGS=-O to optimise
35 UCLIBC_GCC
= $(shell for nm in i386-uclibc-linux-gcc i386-uclibc-gcc
; do which
$$nm > /dev
/null
&& { echo
$$nm ; exit
; } ; done
; echo false No uclibc found
)
37 # sorry, but diet-libc doesn't know about posix_memalign,
38 # so we cannot use it any more.
39 DIET_GCC
= gcc
-DHAVE_STDINT_H
41 KLIBC
=/home
/src
/klibc
/klibc-0.77
43 KLIBC_GCC
= gcc
-nostdinc
-iwithprefix
include -I
$(KLIBC
)/klibc
/include -I
$(KLIBC
)/linux
/include -I
$(KLIBC
)/klibc
/arch
/i386
/include -I
$(KLIBC
)/klibc
/include/bits32
46 COVERITY_FLAGS
=-include coverity-gcc-hack.h
49 ifeq ($(origin CC
),default
)
50 CC
:= $(CROSS_COMPILE
)gcc
53 CWFLAGS
= -Wall
-Werror
-Wstrict-prototypes
-Wextra
-Wno-unused-parameter
55 CWFLAGS
+= -Wp
,-D_FORTIFY_SOURCE
=2 -O3
58 FALLTHROUGH
:= $(shell gcc
-v
--help
2>&1 | grep
"implicit-fallthrough" | wc
-l
)
59 ifneq "$(FALLTHROUGH)" "0"
60 CWFLAGS
+= -Wimplicit-fallthrough
=0
66 ifdef DEFAULT_OLD_METADATA
67 CPPFLAGS
+= -DDEFAULT_OLD_METADATA
72 CPPFLAGS
+= -DBINDIR
=\"$(BINDIR
)\"
74 PKG_CONFIG ?
= pkg-config
77 CONFFILE
= $(SYSCONFDIR
)/mdadm.conf
78 CONFFILE2
= $(SYSCONFDIR
)/mdadm
/mdadm.conf
79 MAILCMD
=/usr
/sbin
/sendmail
-t
80 CONFFILEFLAGS
= -DCONFFILE
=\"$(CONFFILE
)\" -DCONFFILE2
=\"$(CONFFILE2
)\"
81 # Both MAP_DIR and MDMON_DIR should be somewhere that persists across the
82 # pivotroot from early boot to late boot.
83 # /run is best, but for distros that don't support that.
84 # /dev can work, in which case you probably want /dev/.mdadm
89 MAP_PATH
= $(MAP_DIR
)/$(MAP_FILE
)
90 MDMON_DIR
= $(RUN_DIR
)
91 # place for autoreplace cookies
92 FAILED_SLOTS_DIR
= $(RUN_DIR
)/failed-slots
93 SYSTEMD_DIR
=/lib
/systemd
/system
94 LIB_DIR
=/usr
/libexec
/mdadm
96 COROSYNC
:=$(shell [ -d
/usr
/include/corosync
] || echo
-DNO_COROSYNC
)
97 DLM
:=$(shell [ -f
/usr
/include/libdlm.h
] || echo
-DNO_DLM
)
99 DIRFLAGS
= -DMAP_DIR
=\"$(MAP_DIR
)\" -DMAP_FILE
=\"$(MAP_FILE
)\"
100 DIRFLAGS
+= -DMDMON_DIR
=\"$(MDMON_DIR
)\"
101 DIRFLAGS
+= -DFAILED_SLOTS_DIR
=\"$(FAILED_SLOTS_DIR
)\"
102 CFLAGS
= $(CWFLAGS
) $(CXFLAGS
) -DSendmail
=\""$(MAILCMD)"\" $(CONFFILEFLAGS
) $(DIRFLAGS
) $(COROSYNC
) $(DLM
)
104 VERSION
= $(shell [ -d .git
] && git describe HEAD | sed
's/mdadm-//')
105 VERS_DATE
= $(shell [ -d .git
] && date
--iso-8601
--date
="`git log -n1 --format=format:%cd --date=iso --date=short`")
106 DVERS
= $(if
$(VERSION
),-DVERSION
=\"$(VERSION
)\",)
107 DDATE
= $(if
$(VERS_DATE
),-DVERS_DATE
="\"$(VERS_DATE)\"",)
108 DEXTRAVERSION
= $(if
$(EXTRAVERSION
),-DEXTRAVERSION
="\" - $(EXTRAVERSION)\"",)
109 CFLAGS
+= $(DVERS
) $(DDATE
) $(DEXTRAVERSION
)
111 # The glibc TLS ABI requires applications that call clone(2) to set up
112 # TLS data structures, use pthreads until mdmon implements this support
115 CFLAGS
+= -DUSE_PTHREADS
116 MON_LDFLAGS
+= -pthread
119 # If you want a static binary, you might uncomment these
124 # To explicitly disable libudev, set -DNO_LIBUDEV in CXFLAGS
125 ifeq (, $(findstring -DNO_LIBUDEV
, $(CXFLAGS
)))
129 INSTALL
= /usr
/bin
/install
132 MANDIR
= /usr
/share
/man
133 MAN4DIR
= $(MANDIR
)/man4
134 MAN5DIR
= $(MANDIR
)/man5
135 MAN8DIR
= $(MANDIR
)/man8
137 UDEVDIR
:= $(shell $(PKG_CONFIG
) --variable
=udevdir udev
2>/dev
/null
)
142 ifeq (,$(findstring s
,$(MAKEFLAGS
)))
148 OBJS
= mdadm.o config.o policy.o mdstat.o ReadMe.o uuid.o util.o maps.o lib.o \
149 Manage.o Assemble.o Build.o \
150 Create.o Detail.o Examine.o Grow.o Monitor.o dlink.o Kill.o Query.o \
151 Incremental.o Dump.o \
152 mdopen.o super0.o super1.o super-ddf.o super-intel.o bitmap.o \
153 super-mbr.o super-gpt.o \
154 restripe.o sysfs.o sha1.o mapfile.o crc32.o sg_io.o msg.o xmalloc.o \
155 platform-intel.o probe_roms.o crc32c.o
157 CHECK_OBJS
= restripe.o uuid.o sysfs.o maps.o lib.o xmalloc.o dlink.o
159 SRCS
= $(patsubst %.o
,%.c
,$(OBJS
))
161 INCL
= mdadm.h part.h bitmap.h
163 MON_OBJS
= mdmon.o monitor.o managemon.o uuid.o util.o maps.o mdstat.o sysfs.o \
165 Kill.o sg_io.o dlink.o ReadMe.o super-intel.o \
166 super-mbr.o super-gpt.o \
167 super-ddf.o sha1.o crc32.o msg.o bitmap.o xmalloc.o \
168 platform-intel.o probe_roms.o crc32c.o
170 MON_SRCS
= $(patsubst %.o
,%.c
,$(MON_OBJS
))
176 man
: mdadm.man md.man mdadm.conf.man mdmon.man raid6check.man
179 @if
[ ! -d
"$(dir $(RUN_DIR))" -a
"$(CHECK_RUN_DIR)" = 1 ]; then \
180 echo
"***** Parent of $(RUN_DIR) does not exist. Maybe set different RUN_DIR="; \
181 echo
"***** e.g. make RUN_DIR=/dev/.mdadm" ; \
182 echo
"***** or set CHECK_RUN_DIR=0"; exit
1; \
185 everything
: all swap_super test_stripe raid6check \
186 mdadm.Os mdadm.O2 man
187 everything-test
: all swap_super test_stripe \
188 mdadm.Os mdadm.O2 man
189 # mdadm.uclibc doesn't work on x86-64
190 # mdadm.tcc doesn't work..
193 $(CC
) $(CFLAGS
) $(CPPFLAGS
) $(COVERITY_FLAGS
) -o
$@
-c
$<
195 mdadm
: $(OBJS
) | check_rundir
196 $(CC
) $(CFLAGS
) $(LDFLAGS
) -o mdadm
$(OBJS
) $(LDLIBS
)
198 mdadm.static
: $(OBJS
) $(STATICOBJS
)
199 $(CC
) $(CFLAGS
) $(LDFLAGS
) -static
-o mdadm.static
$(OBJS
) $(STATICOBJS
) $(LDLIBS
)
201 mdadm.tcc
: $(SRCS
) $(INCL
)
202 $(TCC
) -o mdadm.tcc
$(SRCS
)
204 mdadm.klibc
: $(SRCS
) $(INCL
)
206 $(CC
) -nostdinc
-iwithprefix
include -I
$(KLIBC
)/klibc
/include -I
$(KLIBC
)/linux
/include -I
$(KLIBC
)/klibc
/arch
/i386
/include -I
$(KLIBC
)/klibc
/include/bits32
$(CFLAGS
) $(SRCS
)
208 mdadm.Os
: $(SRCS
) $(INCL
)
209 $(CC
) -o mdadm.Os
$(CFLAGS
) $(CPPFLAGS
) $(LDFLAGS
) -DHAVE_STDINT_H
-Os
$(SRCS
) $(LDLIBS
)
211 mdadm.O2
: $(SRCS
) $(INCL
) mdmon.O2
212 $(CC
) -o mdadm.O2
$(CFLAGS
) $(CPPFLAGS
) $(LDFLAGS
) -DHAVE_STDINT_H
-O2
-D_FORTIFY_SOURCE
=2 $(SRCS
) $(LDLIBS
)
214 mdmon.O2
: $(MON_SRCS
) $(INCL
) mdmon.h
215 $(CC
) -o mdmon.O2
$(CFLAGS
) $(CPPFLAGS
) $(LDFLAGS
) $(MON_LDFLAGS
) -DHAVE_STDINT_H
-O2
-D_FORTIFY_SOURCE
=2 $(MON_SRCS
) $(LDLIBS
)
217 # use '-z now' to guarantee no dynamic linker interactions with the monitor thread
218 mdmon
: $(MON_OBJS
) | check_rundir
219 $(CC
) $(CFLAGS
) $(LDFLAGS
) $(MON_LDFLAGS
) -Wl
,-z
,now
-o mdmon
$(MON_OBJS
) $(LDLIBS
)
222 test_stripe
: restripe.c xmalloc.o mdadm.h
223 $(CC
) $(CFLAGS
) $(CXFLAGS
) $(LDFLAGS
) -o test_stripe xmalloc.o
-DMAIN restripe.c
225 raid6check
: raid6check.o mdadm.h
$(CHECK_OBJS
)
226 $(CC
) $(CXFLAGS
) $(LDFLAGS
) -o raid6check raid6check.o
$(CHECK_OBJS
)
229 sed
-e
's/{DEFAULT_METADATA}/$(DEFAULT_METADATA)/g' \
230 -e
's,{MAP_PATH},$(MAP_PATH),g' -e
's,{CONFFILE},$(CONFFILE),g' \
231 -e
's,{CONFFILE2},$(CONFFILE2),g' mdadm
.8.in
> mdadm
.8
233 mdadm.conf
.5 : mdadm.conf
.5.in
234 sed
-e
's,{CONFFILE},$(CONFFILE),g' \
235 -e
's,{CONFFILE2},$(CONFFILE2),g' mdadm.conf
.5.in
> mdadm.conf
.5
238 man
-l mdadm
.8 > mdadm.man
241 man
-l mdmon
.8 > mdmon.man
246 mdadm.conf.man
: mdadm.conf
.5
247 man
-l mdadm.conf
.5 > mdadm.conf.man
249 raid6check.man
: raid6check
.8
250 man
-l raid6check
.8 > raid6check.man
252 $(OBJS
) : $(INCL
) mdmon.h
253 $(MON_OBJS
) : $(INCL
) mdmon.h
255 sha1.o
: sha1.c sha1.h md5.h
256 $(CC
) $(CFLAGS
) -DHAVE_STDINT_H
-o sha1.o
-c sha1.c
258 install : install-bin install-man install-udev
260 install-static
: mdadm.static install-man
261 $(INSTALL
) -D
$(STRIP
) -m
755 mdadm.static
$(DESTDIR
)$(BINDIR
)/mdadm
263 install-tcc
: mdadm.tcc install-man
264 $(INSTALL
) -D
$(STRIP
) -m
755 mdadm.tcc
$(DESTDIR
)$(BINDIR
)/mdadm
266 install-uclibc
: mdadm.uclibc install-man
267 $(INSTALL
) -D
$(STRIP
) -m
755 mdadm.uclibc
$(DESTDIR
)$(BINDIR
)/mdadm
269 install-klibc
: mdadm.klibc install-man
270 $(INSTALL
) -D
$(STRIP
) -m
755 mdadm.klibc
$(DESTDIR
)$(BINDIR
)/mdadm
272 install-man
: mdadm
.8 md
.4 mdadm.conf
.5 mdmon
.8
273 $(INSTALL
) -D
-m
644 mdadm
.8 $(DESTDIR
)$(MAN8DIR
)/mdadm
.8
274 $(INSTALL
) -D
-m
644 mdmon
.8 $(DESTDIR
)$(MAN8DIR
)/mdmon
.8
275 $(INSTALL
) -D
-m
644 md
.4 $(DESTDIR
)$(MAN4DIR
)/md
.4
276 $(INSTALL
) -D
-m
644 mdadm.conf
.5 $(DESTDIR
)$(MAN5DIR
)/mdadm.conf
.5
278 install-udev
: udev-md-raid-arrays.rules udev-md-raid-assembly.rules udev-md-raid-creating.rules \
279 udev-md-clustered-confirm-device.rules
280 @for file in
01-md-raid-creating.rules
63-md-raid-arrays.rules
64-md-raid-assembly.rules \
281 69-md-clustered-confirm-device.rules
; \
282 do sed
-e
's,BINDIR,$(BINDIR),g' udev-
$${file
#??-} > .install.tmp.1 && \
283 $(ECHO
) $(INSTALL
) -D
-m
644 udev-
$${file
#??-} $(DESTDIR)$(UDEVDIR)/rules.d/$$file ; \
284 $(INSTALL
) -D
-m
644 .
install.tmp
.1 $(DESTDIR
)$(UDEVDIR
)/rules.d
/$$file ; \
285 rm -f .
install.tmp
.1; \
288 install-systemd
: systemd
/mdmon@.service
289 @for file in mdmon@.service mdmonitor.service mdadm-last-resort@.timer \
290 mdadm-last-resort@.service mdadm-grow-continue@.service \
291 mdcheck_start.timer mdcheck_start.service \
292 mdcheck_continue.timer mdcheck_continue.service \
293 mdmonitor-oneshot.timer mdmonitor-oneshot.service \
295 do sed
-e
's,BINDIR,$(BINDIR),g' systemd
/$$file > .
install.tmp
.2 && \
296 $(ECHO
) $(INSTALL
) -D
-m
644 systemd
/$$file $(DESTDIR
)$(SYSTEMD_DIR
)/$$file ; \
297 $(INSTALL
) -D
-m
644 .
install.tmp
.2 $(DESTDIR
)$(SYSTEMD_DIR
)/$$file ; \
298 rm -f .
install.tmp
.2; \
300 @for file in mdadm.shutdown
; \
301 do sed
-e
's,BINDIR,$(BINDIR),g' systemd
/$$file > .
install.tmp
.3 && \
302 $(ECHO
) $(INSTALL
) -D
-m
755 systemd
/$$file $(DESTDIR
)$(SYSTEMD_DIR
)-shutdown
/$$file ; \
303 $(INSTALL
) -D
-m
755 .
install.tmp
.3 $(DESTDIR
)$(SYSTEMD_DIR
)-shutdown
/$$file ; \
304 rm -f .
install.tmp
.3; \
306 if
[ -f
/etc
/SuSE-release
-o
-n
"$(SUSE)" ] ;then
$(INSTALL
) -D
-m
755 systemd
/SUSE-mdadm_env.sh
$(DESTDIR
)$(LIB_DIR
)/mdadm_env.sh
;fi
308 install-bin
: mdadm mdmon
309 $(INSTALL
) -D
$(STRIP
) -m
755 mdadm
$(DESTDIR
)$(BINDIR
)/mdadm
310 $(INSTALL
) -D
$(STRIP
) -m
755 mdmon
$(DESTDIR
)$(BINDIR
)/mdmon
313 rm -f
$(DESTDIR
)$(MAN8DIR
)/mdadm
.8 $(DESTDIR
)$(MAN8DIR
)/mdmon
.8 $(DESTDIR
)$(MAN4DIR
)/md
.4 $(DESTDIR
)$(MAN5DIR
)/mdadm.conf
.5 $(DESTDIR
)$(BINDIR
)/mdadm
315 test: mdadm mdmon test_stripe swap_super raid6check
316 @echo
"Please run './test' as root"
319 rm -f mdadm mdmon
$(OBJS
) $(MON_OBJS
) $(STATICOBJS
) core
*.man \
320 mdadm.tcc mdadm.uclibc mdadm.static
*.orig
*.porig
*.rej
*.alt \
321 .merge_file_
* mdadm.Os mdadm.O2 mdmon.O2 swap_super init.cpio.gz \
322 mdadm.uclibc.static test_stripe raid6check raid6check.o mdmon mdadm
.8
328 testdist
: everything-test
clean
334 DISTRO_MAKEFILE
:= $(wildcard distropkg
/Makefile
)
335 ifdef DISTRO_MAKEFILE
336 include $(DISTRO_MAKEFILE
)