]> git.sesse.net Git - vlc/blob - bootstrap
- Use a common rule to build plugins (refs #297)
[vlc] / bootstrap
1 #! /bin/sh
2
3 ##  bootstrap file for the VLC media player
4 ##  $Id$
5 ##
6 ## Copyright (C) 2005 the VideoLAN team
7 ##
8 ##  Initial author: Sam Hocevar <sam@zoy.org>
9
10 if test "$#" != "0"; then
11   echo "Usage: $0"
12   echo "  Calls automake, autoconf, autoheader, autopoint and other auto* to generate"
13   echo "  m4 macros and prepare Makefiles."
14   exit 1
15 fi
16
17 ###
18 ###  Get a sane environment, just in case
19 ###
20 LANG=C
21 export LANG
22 CYGWIN=binmode
23 export CYGWIN
24
25 set -e
26 set -x
27
28 ##
29 ## Check for various tools
30 ##
31 AUTOMAKESUCKS=no
32 INSTALLSUCKS=no
33
34 ACLOCAL_ARGS="-I m4"
35
36 # Check for contrib directory
37 if test -d extras/contrib/bin; then
38   export PATH=./extras/contrib/bin:$PATH
39   ACLOCAL_ARGS="${ACLOCAL_ARGS} -I extras/contrib/share/aclocal"
40   if test ".`uname -s`" = ".Darwin"; then
41     export LD_LIBRARY_PATH=./extras/contrib/lib:$LD_LIBRARY_PATH
42     export DYLD_LIBRARY_PATH=./extras/contrib/lib:$DYLD_LIBRARY_PATH
43   elif test ".`uname -s`" = ".BeOS"; then
44     export LIBRARY_PATH=./extras/contrib/lib:$LIBRARY_PATH
45     export BELIBRARIES=./extras/contrib/lib:$BELIBRARIES
46   fi
47 fi
48
49 # Check for automake
50 amvers="none"
51 if automake-1.8 --version >/dev/null 2>&1; then
52   amvers="-1.8"
53   # If we also have 1.6 (>> 1.6.1), use it instead because it is faster
54   if automake-1.6 --version >/dev/null 2>&1; then
55     if expr "`automake-1.6 --version | sed -e '1s/[^0-9]*//' -e q`" ">" "1.6.1" > /dev/null 2>&1; then
56       amvers="-1.6"
57     fi
58   fi
59 elif automake-1.9 --version >/dev/null 2>&1; then
60   amvers="-1.9"
61   # If we also have 1.6 (>> 1.6.1), use it instead because it is faster
62   if automake-1.6 --version >/dev/null 2>&1; then
63     if expr "`automake-1.6 --version | sed -e '1s/[^0-9]*//' -e q`" ">" "1.6.1" > /dev/null 2>&1; then
64       amvers="-1.6"
65     fi
66   fi
67 elif automake-1.7 --version >/dev/null 2>&1; then
68   amvers="-1.7"
69   # If we also have 1.6 (>> 1.6.1), use it instead because it is faster
70   if automake-1.6 --version >/dev/null 2>&1; then
71     if expr "`automake-1.6 --version | sed -e '1s/[^0-9]*//' -e q`" ">" "1.6.1" > /dev/null 2>&1; then
72       amvers="-1.6"
73     fi
74   fi
75 elif automake-1.6 --version >/dev/null 2>&1; then
76   amvers="-1.6"
77   if expr "`automake-1.6 --version | sed -e '1s/[^0-9]*//' -e q`" "<=" "1.6.1" > /dev/null 2>&1; then
78     AUTOMAKESUCKS=yes
79   fi
80 elif automake-1.5 --version >/dev/null 2>&1; then
81   INSTALLSUCKS=yes
82   amvers="-1.5"
83 elif automake --version > /dev/null 2>&1; then
84   amvers=""
85   case "`automake --version | sed -e '1s/[^0-9]*//' -e q`" in
86     0|0.*|1|1.[01234]|1.[01234][-.]*)
87       amvers="none" ;;
88     1.5|1.5.*)
89       INSTALLSUCKS=yes ;;
90     1.6|1.6.0|1.6.1)
91       AUTOMAKESUCKS=yes ;;
92     1.9|1.9.2)
93       ;;
94   esac
95 fi
96
97 if test "${amvers}" = "none"; then
98   set +x
99   echo "you need automake version 1.5 or later"
100   exit 1
101 fi
102
103 # Check for gettext
104 if gettextize --version >/dev/null 2>&1; then
105 # Autopoint is available from 0.11.3, but we need 0.11.5
106 if expr `gettextize --version | sed -e '1s/[^0-9]*//' -e q` \
107         '>=' 0.11.5 >/dev/null 2>&1; then
108   # We have gettext, and a recent version! Everything is cool.
109   autopoint=autopoint
110   GETTEXT=yes
111 else
112   # User's gettext is too old. try to continue anyway.
113   autopoint=:
114   GETTEXT=old
115 fi;else
116   # we don't have gettext. grmbl. try to continue anyway.
117   autopoint=:
118   GETTEXT=no
119 fi
120
121 # Check for pkg-config
122 if pkg-config --version >/dev/null 2>&1; then
123   # We have pkg-config, everything is cool.
124   PKGCONFIG=yes
125 else
126   PKGCONFIG=no
127 fi
128
129 aclocal=aclocal${amvers}
130 automake=automake${amvers}
131 autoconf=autoconf
132 autoheader=autoheader
133
134 ##
135 ## Generate the modules makefile, by parsing modules/**/Modules.am
136 ##
137
138 set +x
139 echo "generating modules/**/Makefile.am and m4/private.m4"
140
141 # Prepare m4/private.m4
142 rm -f m4/private.m4 && cat > m4/private.m4 << EOF
143 dnl  Private VLC macros - generated by bootstrap
144
145 EOF
146
147 if [ "${PKGCONFIG}" = "no" ]; then cat >> m4/private.m4 << EOF
148 dnl  User does not have pkg-config, so this is a no-op
149 AC_DEFUN([PKG_CHECK_MODULES], [:], [], [], [])
150
151 EOF
152 fi
153
154 if [ "${GETTEXT}" != "yes" ]; then cat >> m4/private.m4 << EOF
155 dnl  User does not have gettext, so this is a no-op
156 AC_DEFUN([AM_GNU_GETTEXT_VERSION], [])
157
158 EOF
159 fi
160
161 rm -f m4/private.m4-tmp1 && cat > m4/private.m4-tmp1 << EOF
162 dnl  The required AM_CONDITIONAL calls
163 dnl  XXX: too many conditionals make the build very slow, disabled them
164 AC_DEFUN([VLC_CONDITIONALS], [
165 EOF
166 rm -f m4/private.m4-tmp2 && cat > m4/private.m4-tmp2 << EOF
167 dnl  The required AC_SUBST calls
168 AC_DEFUN([VLC_SUBSTS], [
169 EOF
170 rm -f m4/private.m4-tmp3 && cat > m4/private.m4-tmp3 << EOF
171 dnl  The required AC_OUTPUT calls
172 dnl  XXX: this feature is only supported starting from automake-1.7
173 AC_DEFUN([VLC_MAKEFILES], [AC_OUTPUT([
174 EOF
175 rm -f m4/private.m4-tmp4 && cat > m4/private.m4-tmp4 << EOF
176 dnl  Helper macro for vlc-config generation
177 AC_DEFUN([VLC_CONFIG_HELPER], [
178   cat >> vlc-config.in << BLAH
179 EOF
180
181 modules=""
182
183 rm -f modules/Makefile.am && cat > modules/Makefile.am << EOF
184 # Autogenerated by bootstrap - DO NOT EDIT
185 EXTRA_DIST = LIST
186 SUBDIRS = `sed -ne 's,modules/\([^/]*\)/Makefile,\1,p' configure.ac | xargs`
187 EOF
188
189 for dir in `sed -ne 's,modules/\(.*\)/Makefile,\1,p' configure.ac`
190 do
191   printf "."
192   modf="modules/${dir}/Modules.am"
193   makf="modules/${dir}/Makefile.am"
194   basedir="`echo "${dir}" | cut -f1 -d/`"
195   # automake will not recurse for make dist if we don't define SUBDIRS = .
196   subdirs="`sed -ne 's,'modules/${dir}'/\([^/]*\)/Makefile,\1,p' configure.ac | xargs`"
197   mods="`sed -n -e 's/^ *SOURCES_\([^ ]*\).*/\1/p' < "${modf}" | xargs`"
198   extra_libs=""
199   for mod in $mods
200   do
201     extra_libs="${extra_libs} lib${mod}_plugin.a"
202     extra_libs="${extra_libs} lib${mod}.a lib${mod}_pic.a"
203   done
204   rm -f "${makf}" && cat > "${makf}" << EOF
205
206 # ${makf} automatically generated from ${modf} by bootstrap
207 # DO NOT EDIT - edit Modules.am or \$(top_srcdir)/bootstrap instead
208
209 basedir = ${basedir}
210 mods = ${mods}
211
212 NULL =
213 libvlc_LIBRARIES =
214 noinst_LIBRARIES =
215 noinst_HEADERS =
216 EXTRA_DIST = Modules.am
217 BUILT_SOURCES =
218 SUBDIRS = ${subdirs}
219 SUFFIXES = _plugin\$(LIBEXT) _plugin.a
220
221 libvlcdir = \$(libdir)/vlc/\$(basedir)
222
223 EXTRA_LIBRARIES = ${extra_libs}
224 include Modules.am
225
226 if !BUILD_MOZILLA
227 pic = no
228 else
229 if HAVE_WIN32
230 ### There's no need for pic code on win32 so get rid of this to substantially
231 ### reduce the compilation time.
232 pic = no
233 endif
234 endif
235
236 all: all-modules
237
238 # Find out which modules were enabled and tell make to build them
239 all-modules:
240         @set fnord \$\$MAKEFLAGS; amf=\$\$2; targets=\`\\
241         if test "\$(plugin)" != "no"; then z=\$\$(\$(VLC_CONFIG) --list plugin); for mod in \$(mods); do case "\$\$z " in *\ \$\${mod}\ *) echo lib\$\${mod}_plugin\$(LIBEXT);; esac; done; fi; \\
242         if test "\$(builtin)" != "no"; then z=\$\$(\$(VLC_CONFIG) --list builtin); for mod in \$(mods); do case "\$\$z " in *\ \$\${mod}\ *) echo lib\$\${mod}.a;; esac; done; fi; \\
243         if test "\$(pic)" != "no"; then z=\$\$(\$(VLC_CONFIG) --list builtin); for mod in \$(mods); do case "\$\$z " in *\ \$\${mod}\ *) echo lib\$\${mod}_pic.a;; esac; done; fi; \\
244         \`; case "\$\$targets" in *lib*) \$(MAKE) \$(AM_MAKEFLAGS) \$\$targets || case "\$\$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; ;; esac; \\
245         test -z "\$\$fail"
246
247 # Build a plugin with the adequate linker and linker's flags
248 _plugin.a_plugin\$(LIBEXT):
249         @mod="\$*" ; mod=\$\${mod:3} ; \
250         ldfl="\`\$(VLC_CONFIG) --libs plugin \$\$mod\` -u vlc_entry__0_8_2" ; \
251         case \`\$(VLC_CONFIG) --linkage \$\$mod\` in \\
252           c++)  ld="\$(CXXLINK)" ;; \
253           objc) ld="\$(OBJCLINK)" ;; \
254           c|*)  ld="\$(LINK)" ;; \
255         esac ; \
256         echo \$\$ld \$< \$\$ldfl ; \
257         \$\$ld \$< \$\$ldfl
258
259 \$(srcdir)/Makefile.am: \$(srcdir)/Modules.am \$(top_srcdir)/bootstrap
260         cd \$(top_srcdir) && \$(SHELL) ./bootstrap
261
262 mostlyclean-local:
263         -rm -f *.a *\$(LIBEXT)
264
265 ### automake creates libvlcdir after running install-*-local
266 ### so we have to create it ourselves first
267 install-exec-local: all-modules
268         \$(mkdir_p) "\$(DESTDIR)\$(libvlcdir)"
269         @z=\$\$(\$(VLC_CONFIG) --list plugin); \
270         for mod in \$(mods); do \
271           case "\$\$z " \
272             in *\ \$\${mod}\ *) \
273               echo \$(INSTALL_PROGRAM) -m 755 "lib\$\${mod}_plugin\$(LIBEXT)" "\$(DESTDIR)\$(libvlcdir)/" ; \
274               \$(INSTALL_PROGRAM) -m 755 "lib\$\${mod}_plugin\$(LIBEXT)" "\$(DESTDIR)\$(libvlcdir)/" || exit \$\$?; \
275               ;; \
276           esac; \
277         done
278         @z=\$\$(\$(VLC_CONFIG) --list builtin); \
279         for mod in \$(mods); do \
280           case "\$\$z " \
281             in *\ \$\${mod}\ *) \
282               echo \$(INSTALL_DATA) -m 644 "lib\$\${mod}.a" "\$(DESTDIR)\$(libdir)/vlc/" ; \
283               \$(INSTALL_DATA) -m 644 "lib\$\${mod}.a" "\$(DESTDIR)\$(libvlcdir)/" || exit \$\$?; \
284               ;; \
285           esac; \
286         done
287 if BUILD_MOZILLA
288         @z=\$\$(\$(VLC_CONFIG) --list builtin); \
289         for mod in \$(mods); do \
290           case "\$\$z " \
291             in *\ \$\${mod}\ *) \
292               echo \$(INSTALL_DATA) -m 644 "lib\$\${mod}_pic.a" "\$(DESTDIR)\$(libdir)/vlc/" ; \
293               \$(INSTALL_DATA) -m 644 "lib\$\${mod}_pic.a" "\$(DESTDIR)\$(libvlcdir)/" || exit \$\$?; \
294               ;; \
295           esac; \
296         done
297 endif
298
299 uninstall-local:
300         @z=\$\$(\$(VLC_CONFIG) --list plugin); \
301         for mod in \$(mods); do \
302           case "\$\$z " \
303             in *\ \$\${mod}\ *) \
304               echo rm -f "\$(DESTDIR)\$(libvlcdir)/lib\$\${mod}_plugin\$(LIBEXT)" ; \
305               rm -f "\$(DESTDIR)\$(libvlcdir)/lib\$\${mod}_plugin\$(LIBEXT)" || true; \
306               ;; \
307           esac; \
308         done
309         @z=\$\$(\$(VLC_CONFIG) --list builtin); \
310         for mod in \$(mods); do \
311           case "\$\$z " \
312             in *\ \$\${mod}\ *) \
313               echo rm -f "\$(DESTDIR)\$(libdir)/vlc/lib\$\${mod}.a" ; \
314               rm -f "\$(DESTDIR)\$(libdir)/vlc/lib\$\${mod}.a" || true; \
315               ;; \
316           esac; \
317         done
318 if BUILD_MOZILLA
319         @z=\$\$(\$(VLC_CONFIG) --list builtin); \
320         for mod in \$(mods); do \
321           case "\$\$z " \
322             in *\ \$\${mod}\ *) \
323               echo rm -f "\$(DESTDIR)\$(libdir)/vlc/lib\$\${mod}_pic.a" ; \
324               rm -f "\$(DESTDIR)\$(libdir)/vlc/lib\$\${mod}_pic.a" || true; \
325               ;; \
326           esac; \
327         done
328 endif
329
330 EOF
331   for mod in $mods
332   do
333     if grep '^nodist_SOURCES_'${mod}'' < "${modf}" >/dev/null 2>&1; then
334         NODIST=''; else
335         NODIST='#'; fi
336     cat >> m4/private.m4-tmp4 << EOF
337     ${mod}) list="\\\${list} ${dir}/lib${mod}" ;;
338 EOF
339 # Generation of modules/**/Makefile.am
340 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
341 # - L_ is for LIBRARIES_, D_ for DATA_, B_ for BUILT_SOURCES_, F_ for LDFLAGS_,
342 #   S_ for SOURCES_, _p is for _plugin, _b is for _builtin. This is to reduce
343 #   the resulting file size.
344 # - *_CFLAGS, *_CXXFLAGS etc. because per-object CPPFLAGS does not seem to
345 #   work properly with any automake version I tested.
346     cat >> "${makf}" << EOF
347 # The ${mod} plugin
348
349 EOF
350     if [ "${NODIST}" != "#" ]; then cat >> "${makf}" << EOF
351 clean-local: clean-${mod}
352 clean-${mod}:
353         -test -z "\$(nodist_SOURCES_${mod})" || rm -f \$(nodist_SOURCES_${mod})
354
355 EOF
356     fi
357     if [ "${NODIST}" != "#" ]; then cat >> "${makf}" << EOF
358 BUILT_SOURCES += \$(B${mod})
359 EOF
360     fi
361     cat >> "${makf}" << EOF
362 lib${mod}_plugin_a_SOURCES = \$(SOURCES_${mod})
363 EOF
364     if [ "${NODIST}" != "#" ]; then cat >> "${makf}" << EOF
365 nodist_lib${mod}_plugin_a_SOURCES = \$(nodist_SOURCES_${mod})
366 EOF
367     fi
368     cat >> "${makf}" << EOF
369 lib${mod}_plugin_a_CFLAGS = \`\$(VLC_CONFIG) --cflags plugin ${mod}\`
370 lib${mod}_plugin_a_CXXFLAGS = \`\$(VLC_CONFIG) --cxxflags plugin ${mod}\`
371 lib${mod}_plugin_a_OBJCFLAGS = \`\$(VLC_CONFIG) --objcflags plugin ${mod}\`
372
373 lib${mod}_pic_a_SOURCES = \$(SOURCES_${mod})
374 EOF
375     if [ "${NODIST}" != "#" ]; then cat >> "${makf}" << EOF
376 nodist_lib${mod}_pic_a_SOURCES = \$(nodist_SOURCES_${mod})
377 EOF
378     fi
379     cat >> "${makf}" << EOF
380 lib${mod}_pic_a_CFLAGS = \`\$(VLC_CONFIG) --cflags builtin pic ${mod}\`
381 lib${mod}_pic_a_CXXFLAGS = \`\$(VLC_CONFIG) --cxxflags builtin pic ${mod}\`
382 lib${mod}_pic_a_OBJCFLAGS = \`\$(VLC_CONFIG) --objcflags builtin pic ${mod}\`
383
384 lib${mod}_a_SOURCES = ${PRIVATE}\$(SOURCES_${mod})
385 EOF
386     if [ "${NODIST}" != "#" ]; then cat >> "${makf}" << EOF
387 nodist_lib${mod}_a_SOURCES = ${PRIVATE}\$(nodist_SOURCES_${mod})
388 EOF
389     fi
390     cat >> "${makf}" << EOF
391 lib${mod}_a_CFLAGS = \`\$(VLC_CONFIG) --cflags builtin ${mod}\`
392 lib${mod}_a_CXXFLAGS = \`\$(VLC_CONFIG) --cxxflags builtin ${mod}\`
393 lib${mod}_a_OBJCFLAGS = \`\$(VLC_CONFIG) --objcflags builtin ${mod}\`
394
395 EOF
396   done
397 done
398
399 cat >> m4/private.m4-tmp1 << EOF
400 ])
401 EOF
402 cat m4/private.m4-tmp1 >> m4/private.m4 && rm -f m4/private.m4-tmp1
403 cat >> m4/private.m4-tmp2 << EOF
404 ])
405 EOF
406 cat m4/private.m4-tmp2 >> m4/private.m4 && rm -f m4/private.m4-tmp2
407 cat >> m4/private.m4-tmp3 << EOF
408 ])])
409 EOF
410 cat m4/private.m4-tmp3 >> m4/private.m4 && rm -f m4/private.m4-tmp3
411 cat >> m4/private.m4-tmp4 << EOF
412 BLAH
413 ])
414 EOF
415 cat m4/private.m4-tmp4 >> m4/private.m4 && rm -f m4/private.m4-tmp4
416
417 echo " done."
418
419 ###
420 ###  classic bootstrap stuff
421 ###
422 set -x
423
424 # remove autotools cruft
425 rm -f aclocal.m4 configure config.log config.h config.h.in
426 rm -Rf autom4te.cache
427 # remove old autotools extra cruft
428 rm -f config.guess config.sub missing mkinstalldirs compile depcomp install-sh
429 # remove new autotools extra cruft
430 rm -Rf autotools
431 mkdir autotools
432 # remove libtool cruft
433 rm -f ltmain.sh libtool ltconfig
434 # remove gettext cruft
435 rm -f ABOUT-NLS
436 rm -Rf intl
437 # remove old vlc cruft
438 rm -f m4/oldgettext.m4 stamp-pic configure.ac.in Modules.am
439 # remove new vlc cruft
440 rm -f stamp-builtin stamp-h* mozilla/stamp-pic
441
442 # Automake complains if these are not present
443 rm -f vlc-config.in && printf "" > vlc-config.in
444 if [ "$GETTEXT" != "yes" ]; then
445   test -d intl || mkdir intl
446   printf "" > intl/Makefile.am
447   printf "" > ABOUT-NLS
448 fi
449
450 # Do the rest
451 ${autopoint} -f
452 ${aclocal} ${ACLOCAL_ARGS}
453 ${autoconf}
454 ${autoheader}
455 ${automake} --add-missing --copy
456
457 ##
458 ##  files which need to be regenerated
459 ##
460 rm -f vlc-config.in vlc-config
461 rm -f src/misc/modules_builtin.h
462 rm -f mozilla/vlcintf.h
463
464 # Shut up
465 set +x
466
467 ##
468 ##  Tell the user about gettext, pkg-config and sed
469 ##
470 case "${GETTEXT}" in
471   yes) ;;
472   no) cat << EOF
473
474 ===========================================================
475 IMPORTANT NOTE: you do not have gettext installed on your
476 system. The vlc build will work, but you will not have
477 internationalization support. We suggest installing gettext.
478 EOF
479   ;;
480   old) cat << EOF
481
482 ==========================================================
483 NOTE: you have an old version of gettext installed on your
484 system. The vlc build will work, but if your system does not
485 have libintl you will not have internationalization support.
486 We suggest upgrading to gettext 0.11.5 or later.
487 EOF
488   ;;
489 esac
490
491 case "$PKGCONFIG" in
492   yes) ;;
493   no) cat << EOF
494
495 ==============================================================
496 NOTE: you do not have the "pkg-config" utility on your system;
497 detection of the Gtk-2.0 and GNOME 2.0 libraries will not be
498 reliable.
499 EOF
500   ;;
501 esac
502
503 case "$AUTOMAKESUCKS" in
504   no) ;;
505   yes) cat << EOF
506
507 =============================================================
508 IMPORTANT NOTE: your version of automake has a bug which will
509 prevent proper plugin compilation. Either compile VLC with
510 the --disable-plugins flag, or use a version of automake newer
511 than 1.6.1 (1.6.2 is OK, and so are the 1.5 series).
512 EOF
513   ;;
514 esac
515
516 case "$INSTALLSUCKS" in
517   no) ;;
518   yes) cat << EOF
519
520 =============================================================
521 IMPORTANT NOTE: your version of automake has a bug which will
522 prevent proper installation. Do not use "make install" with this
523 version of automake, or use a version of automake newer than 1.5
524 (such as 1.6 or 1.7).
525 EOF
526   ;;
527 esac
528