2 # ===========================================================================
5 # build.sh - extract, configure, build and install the X Window System
8 # build.sh [options] [prefix]
12 # The script ultimate goal is to build all of the X Window and some of its
13 # dependencies from source.
15 # X.Org Modular Tree Developer's Guide
17 # Please consult the guide at http://www.x.org/wiki/ModularDevelopersGuide
18 # It provides detailed instructions on the build tools to install, where to
19 # find the script and how to invoke it.
21 # The X Window System Source Code
23 # The source code is hosted by freedesktop.org and is composed of over 200
24 # modules under the git source code management system. X.Org releases are
25 # available at http://www.x.org/releases/ in the form of software packages.
29 # The script goes through its list of modules to build. If the source code is
30 # not on disk, it attempts to obtain it from git if the --clone option is
31 # specified. If not, it looks for a package archive file on disk. If it is
32 # still not found, the module is skipped.
34 # The script then runs the appropriate configure script, either autogen.sh
35 # for git modules or the autoconf generated configure script for package
39 # Over time, functionality have been added to help building a large
40 # number modules. Progress report, handling build breaks, supporting the
41 # GNU Build System features, final build report, and so on.
43 # Building from a Custom Modules List
45 # Starting from the list generated using the -L option, remove unwanted
46 # modules. You may also add your own module or add specific configure
47 # options for some modules to meet your configuration needs. Using the
48 # --modfile option, your list replaces the built-in list of the script.
50 # Resuming Build After a Break
52 # The script can resume building at the last point of failure. This saves a
53 # lot of build time as the modules already built are skipped. The --autoresume
54 # option can be used with --modfile such that only the modules you care about
55 # are built and revisited until successful completion.
57 # Specifying Custom Build Commands
59 # By default, the script invokes the make program with the target "all" and
60 # "install". Some options like -c, -D, or -d alter the targets the make
61 # program builds, but you can specify your own command instead. Using the
62 # --cmd option, provide a different make or git command.
64 # Specifying Configuration Options to Specific Modules
66 # In the modulesfile used by the --modfile option, add any configuration
67 # options you want to pass to the modules as it gets configures by autoconf.
68 # Write the configure options next to the module name in the file.
69 # It could be something like --enable-strict-compilation for example.
72 # -a Do NOT run auto config tools (autogen.sh, configure)
73 # -b Use .build.unknown build directory
74 # -c Run make clean in addition to "all install"
75 # -D Run make dist in addition to "all install"
76 # -d Run make distcheck in addition "all install"
77 # -g Compile and link with debug information
78 # -L Just list modules to build
79 # -m Do NOT run any of the make targets
80 # -h, --help Display this help and exit successfully
81 # -n Do not quit after error; just print error message
83 # Build just this module/component
84 # -p Update source code before building (git pull --rebase)
85 # -s sudo The command name providing superuser privilege
86 # --autoresume resumefile
87 # Append module being built to, and autoresume from, resumefile
88 # --check Run make check in addition "all install"
89 # --clone Clone non-existing repositories (uses \$GITROOT if set)
91 # Execute arbitrary git, gmake, or make command
93 # Pass options to autgen.sh/configure of all modules
94 # --modfile modulesfile
95 # Only process the module/components specified in modulesfile
96 # Any text after, and on the same line as, the module/component
97 # is assumed to be configuration options for the configuration
98 # of each module/component specifically
99 # --retry-v1 Remake 'all' on failure with Automake silent rules disabled
102 # An absolute filename where GNU "make" will install binaries, libraries and
103 # other installable files. The value is passed to Autoconf through the
108 # When using --autoresume, the script reads and skips modules tagged with
109 # "PASS" and resume building at the module tagged with "FAIL". The resumefile
110 # file is not intended to be user edited.
113 # When using --modfile, the script replaces its internal modules list with
114 # the list contained in the file. This allows you to build only the modules
115 # you care about and to add third party modules or modules you create.
116 # It is helpful to initialized the file using the -L option.#
119 # Environment variables specific to build.sh:
121 # PREFIX Install architecture-independent files in PREFIX [/usr/local]
122 # Each module/components is invoked with --prefix
123 # EPREFIX Install architecture-dependent files in EPREFIX [PREFIX]
124 # Each module/components is invoked with --exec-prefix
125 # BINDIR Install user executables [EPREFIX/bin]
126 # Each module/components is invoked with --bindir
127 # DATAROOTDIR Install read-only arch-independent data root [PREFIX/share]
128 # Each module/components is invoked with --datarootdir
129 # DATADIR Install read-only architecture-independent data [DATAROOTDIR]
130 # Each module/components is invoked with --datadir
131 # LIBDIR Install object code libraries [EPREFIX/lib]
132 # Each module/components is invoked with --libdir
134 # Modifiable single-machine data [PREFIX/var]
135 # Each module/components is invoked with --localstatedir
136 # QUIET Do not print messages saying which checks are being made
137 # Each module/components is invoked with --quite
138 # GITROOT Source code repository path [git://anongit.freedesktop.org/git]
139 # Optional when using --clone to update source code before building
140 # GITCLONEOPTS Options passed to git clone.
141 # Optional when using --clone to update source code before building
142 # CONFFLAGS Configure options to pass to all Autoconf configure scripts
143 # Refer to 'configure --help' from any module/components
145 # Environment variables defined by the GNU Build System:
147 # ACLOCAL The aclocal cmd name [aclocal -I ${DESTDIR}/${DATADIR}/aclocal]
148 # DESTDIR Path to the staging area where installed objects are relocated
149 # MAKE The name of the make command [make]
150 # MAKEFLAGS Options to pass to all $(MAKE) invocations
151 # CC C compiler command
152 # CFLAGS C compiler flags
153 # LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
154 # nonstandard directory <lib dir>
155 # CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
156 # you have headers in a nonstandard directory <include dir>
159 # Environment variables defined by the shell:
160 # PATH List of directories that the shell searches for commands
161 # $DESTDIR/$BINDIR is prepended
163 # Environment variables defined by the dynamic linker:
165 # List directories that the linker searches for shared objects
166 # $DESTDIR/$LIBDIR is prepended
168 # Environment variables defined by the pkg-config system:
171 # List directories that pkg-config searches for libraries
172 # $DESTDIR/$DATADIR/pkgconfig and
173 # $DESTDIR/$LIBDIR/pkgconfig are prepended
176 # This script is intended to run on any platform supported by X.Org.
177 # The script must be able to run in a Bourne shell.
179 # ===========================================================================
183 Environment variables specific to build.sh:
184 PREFIX Install architecture-independent files in PREFIX [/usr/local]
185 Each module/components is invoked with --prefix
186 EPREFIX Install architecture-dependent files in EPREFIX [PREFIX]
187 Each module/components is invoked with --exec-prefix
188 BINDIR Install user executables [EPREFIX/bin]
189 Each module/components is invoked with --bindir
190 DATAROOTDIR Install read-only arch-independent data root [PREFIX/share]
191 Each module/components is invoked with --datarootdir
192 DATADIR Install read-only architecture-independent data [DATAROOTDIR]
193 Each module/components is invoked with --datadir
194 LIBDIR Install object code libraries [EPREFIX/lib]
195 Each module/components is invoked with --libdir
197 Modifiable single-machine data [PREFIX/var]
198 Each module/components is invoked with --localstatedir
199 QUIET Do not print messages saying which checks are being made
200 Each module/components is invoked with --quite
201 GITROOT Source code repository path [git://anongit.freedesktop.org/git]
202 Optional when using --clone to update source code before building
203 CONFFLAGS Configure options to pass to all Autoconf configure scripts
204 Refer to 'configure --help' from any module/components
206 Environment variables defined by the GNU Build System:
207 ACLOCAL The aclocal cmd name [aclocal -I \${DESTDIR}/\${DATADIR}/aclocal]
208 DESTDIR Path to the staging area where installed objects are relocated
209 MAKE The name of the make command [make]
210 MAKEFLAGS Options to pass to all \$(MAKE) invocations
211 CC C compiler command
212 CFLAGS C compiler flags
213 LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
214 nonstandard directory <lib dir>
215 CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
216 you have headers in a nonstandard directory <include dir>
219 Environment variables defined by the shell:
220 PATH List of directories that the shell searches for commands
221 \$DESTDIR/\$BINDIR is prepended
223 Environment variables defined by the dynamic linker:
225 List directories that the linker searches for shared objects
226 \$DESTDIR/\$LIBDIR is prepended
228 Environment variables defined by the pkg-config system:
230 List directories that pkg-config searches for libraries
231 \$DESTDIR/\$DATADIR/pkgconfig and
232 \$DESTDIR/\$LIBDIR/pkgconfig are prepended
238 # Remember if the user had supplied a value through env var or cmd line
239 # A value from cmd line takes precedence of the shell environment
240 PREFIX_USER
=${PREFIX:+yes}
241 EPREFIX_USER
=${EPREFIX:+yes}
242 BINDIR_USER
=${BINDIR:+yes}
243 DATAROOTDIR_USER
=${DATAROOTDIR:+yes}
244 DATADIR_USER
=${DATADIR:+yes}
245 LIBDIR_USER
=${LIBDIR:+yes}
246 LOCALSTATEDIR_USER
=${LOCALSTATEDIR:+yes}
248 # Assign a default value if no value was supplied by the user
249 PREFIX
=${PREFIX:-/usr/local}
250 EPREFIX
=${EPREFIX:-$PREFIX}
251 BINDIR
=${BINDIR:-$EPREFIX/bin}
252 DATAROOTDIR
=${DATAROOTDIR:-$PREFIX/share}
253 DATADIR
=${DATADIR:-$DATAROOTDIR}
254 LIBDIR
=${LIBDIR:-$EPREFIX/lib}
255 LOCALSTATEDIR
=${LOCALSTATEDIR:-$PREFIX/var}
257 # Support previous usage of LIBDIR which was a subdir relative to PREFIX
258 # We use EPREFIX as this is what PREFIX really meant at the time
259 if [ X
"$LIBDIR" != X
]; then
260 if [ X
"`expr $LIBDIR : "\
(.\
)"`" != X
/ ]; then
262 echo "Warning: this usage of \$LIBDIR is deprecated. Use a full path name."
263 echo "The supplied value \"$LIBDIR\" has been replaced with $EPREFIX/$LIBDIR."
265 LIBDIR
=$EPREFIX/$LIBDIR
269 # All directories variables must be full path names
270 check_full_path
$PREFIX PREFIX
271 check_full_path
$EPREFIX EPREFIX
272 check_full_path
$BINDIR BINDIR
273 check_full_path
$DATAROOTDIR DATAROOTDIR
274 check_full_path
$DATADIR DATADIR
275 check_full_path
$LIBDIR LIBDIR
276 check_full_path
$LOCALSTATEDIR LOCALSTATEDIR
278 # This will catch the case where user forgets to set PREFIX
279 # and does not have write permission in the /usr/local default location
280 check_writable_dir
${DESTDIR}${PREFIX} PREFIX
282 # Must create local aclocal dir or aclocal fails
283 ACLOCAL_LOCALDIR
="${DESTDIR}${DATADIR}/aclocal"
284 $SUDO mkdir
-p ${ACLOCAL_LOCALDIR}
286 # The following is required to make aclocal find our .m4 macros
287 ACLOCAL
=${ACLOCAL:="aclocal"}
288 ACLOCAL
="${ACLOCAL} -I ${ACLOCAL_LOCALDIR}"
291 # The following is required to make pkg-config find our .pc metadata files
292 PKG_CONFIG_PATH
=${DESTDIR}${DATADIR}/pkgconfig:${DESTDIR}${LIBDIR}/pkgconfig${PKG_CONFIG_PATH+:$PKG_CONFIG_PATH}
293 export PKG_CONFIG_PATH
295 # Set the library path so that locally built libs will be found by apps
296 LD_LIBRARY_PATH
=${DESTDIR}${LIBDIR}${LD_LIBRARY_PATH+:$LD_LIBRARY_PATH}
297 export LD_LIBRARY_PATH
299 # Set the path so that locally built apps will be found and used
300 PATH
=${DESTDIR}${BINDIR}${PATH+:$PATH}
303 # Choose which make program to use
306 # Create the log file directory
307 $SUDO mkdir
-p ${DESTDIR}${LOCALSTATEDIR}/log
310 # explain where a failure occurred
311 # if you find this message in the build output it can help tell you where the failure occurred
313 # $1 - which command failed
322 echo "build.sh: \"$cmd\" failed on $module${component:+/}$component"
323 failed_components
="$failed_components $module${component:+/}$component"
326 # print a pretty title to separate the processing of each module
330 # $3 - configuration options
338 if [ X
"$module" = X
]; then
343 echo "======================================================================"
344 echo "== Processing: \"$module${component:+/}$component\""
345 echo "== configuration options: $CONFFLAGS $confopts"
348 # Search for tarballs in either cwd or under a module directory
349 # The tarball is always extracted in either one of these locations:
350 # - modules with components: under the module subdir (e.g lib/libX11-1.4.0)
351 # - modules without components: under cwd (e.g xserver-1.14.0)
352 # The tarballs are expected to be under one of the locations described above
353 # The location of the tarball does not dictate where it is extracted
358 # 0 - good (either no tarballs or successful extract)
364 # The package stem is the part of the tar file name that identifies
365 # the git module archived source. Ex: xclock, pixman, libX11
366 # For modules without components, the module name is used by default.
367 pkg_stem
=${component:-$module}
369 # Handle special cases where the module or component directory
370 # does not match the package name and/or the package root dir
374 "cursors") pkg_stem
="xcursor-themes" ;;
375 "bitmaps") pkg_stem
="xbitmaps" ;;
379 if [ X
"$component" != X
"encodings" ]; then
380 pkg_stem
="font-$component"
385 "libXRes") pkg_stem
="libXres" ;;
386 "libxtrans") pkg_stem
="xtrans" ;;
391 "x11proto") pkg_stem
="xproto" ;;
396 "cf") pkg_stem
="xorg-cf-files" ;;
397 "macros") pkg_stem
="util-macros" ;;
406 pkg_stem
="libpthread-stubs"
412 pkg_stem
="xcb-$component"
427 pkg_stem
="xorg-server"
431 # Search for tarballs in both the module and the src top directory
432 for ii
in $module .
; do
433 for jj
in bz2 gz xz
; do
435 # Select from the list the last tarball with a specific pkg_stem
436 pkg_tarfile
=`ls -1rt $ii/$pkg_stem-[0-9]*.tar.$jj 2> /dev/null | tail -n 1`
438 # Extract the tarball under the module directory
439 # For modules without components, extract in top level dir
440 if [ X
"$pkg_tarfile" != X
]; then
442 # Get the package version and archived toplevel directory
443 pkg_version
=`echo $pkg_tarfile | sed 's,.*'$pkg_stem'-\(.*\)\.tar\.'$jj',\1,'`
444 pkg_root_dir
="$pkg_stem-$pkg_version"
445 pkg_root_dir
=`echo $pkg_root_dir | sed 's,MesaLib,Mesa,'`
447 # Find where to extract the tar file
449 if [ X
"$component" = X
]; then
450 # For modules with no components (i.e xserver)
454 # For modules with components (i.e xcb/proto or lib/libXi)
455 pkg_extract_dir
=$module
456 SRCDIR
=$module/$pkg_root_dir
459 if [ ! -d $SRCDIR ]; then
472 tar $pkg_tar_opts $pkg_tarfile -C $pkg_extract_dir
473 if [ $?
-ne 0 ]; then
475 echo "Unable to extract $pkg_tarfile for $module module"
476 failed
tar $module $component
488 # perform a clone of a git repository
489 # this function provides the mapping between module/component names
490 # and their location in the fd.o repository
493 # $2 - component (optional)
501 if [ X
"$module" = X
]; then
502 echo "clone() required first argument is missing"
530 DIR
="$module${component:+/}$component"
531 GITROOT
=${GITROOT:="git://anongit.freedesktop.org/git"}
533 if [ ! -d "$DIR" ]; then
534 git clone
$GITCLONEOPTS "$GITROOT/$BASEDIR$DIR" "$DIR"
535 if [ $?
-ne 0 ]; then
536 echo "Failed to clone $module${component:+/}$component. Ignoring."
537 clonefailed_components
="$clonefailed_components $module${component:+/}$component"
542 if [ $?
-ne 0 ]; then
543 echo "Failed to cd to $module${component:+/}$component. Ignoring."
544 clonefailed_components
="$clonefailed_components $module${component:+/}$component"
549 if [ $?
-ne 0 ]; then
550 echo "Failed to initialize $module${component:+/}$component submodule. Ignoring."
551 clonefailed_components
="$clonefailed_components $module${component:+/}$component"
555 if [ $?
-ne 0 ]; then
556 echo "Failed to update $module${component:+/}$component submodule. Ignoring."
557 clonefailed_components
="$clonefailed_components $module${component:+/}$component"
562 echo "git cannot clone into an existing directory $module${component:+/}$component"
569 # perform processing of each module/component
573 # $3 - configure options
582 if [ X
"$module" = X
]; then
583 echo "process() required first argument is missing"
587 module_title
$module "$component" "$confopts"
590 local use_configure
=0
595 if [ -f $module${component:+/}$component/autogen.sh
]; then
596 SRCDIR
="$module${component:+/}$component"
598 elif [ -f $module${component:+/}$component/meson.build
]; then
599 SRCDIR
="$module${component:+/}$component"
601 elif [ X
"$CLONE" != X
]; then
602 clone
$module $component
603 if [ $?
-eq 0 ]; then
604 SRCDIR
="$module${component:+/}$component"
605 if [ -f $module${component:+/}$component/autogen.sh
]; then
607 elif [ -f $module${component:+/}$component/meson.build
]; then
610 echo "Cannot find autogen.sh or meson.build"
615 checkfortars
$module $component
616 if [ $?
-eq 0 ]; then
617 if [ X
"$SRCDIR" = X
]; then
618 echo "$module${component:+/}$component does not exist, skipping."
619 nonexistent_components
="$nonexistent_components $module${component:+/}$component"
628 if [ $use_autogen != 0 ]; then
629 CONFCMD
="${DIR_CONFIG}/autogen.sh"
630 elif [ $use_configure != 0 ]; then
631 CONFCMD
="${DIR_CONFIG}/configure"
632 elif [ $use_meson != 0 ]; then
634 confopts
="$confopts builddir"
639 if [ $?
-ne 0 ]; then
640 failed cd1
$module $component
644 if [ X
"$GITCMD" != X
]; then
649 if [ $rtn -ne 0 ]; then
650 failed
"$GITCMD" $module $component
656 if [ X
"$PULL" != X
]; then
658 if [ $?
-ne 0 ]; then
659 failed
"git pull" $module $component
663 # The parent module knows which commit the submodule should be at
665 if [ $?
-ne 0 ]; then
666 failed
"git submodule update" $module $component
671 # Build outside source directory
672 if [ X
"$DIR_ARCH" != X
] ; then
674 if [ $?
-ne 0 ]; then
675 failed mkdir
$module $component
680 if [ $?
-ne 0 ]; then
681 failed cd2
$module $component
687 # If the builddir already exists, just run ninja, not meson
688 if [ $use_meson != 0 ] && [ -e ${DIR_CONFIG}/builddir
]; then
690 elif [ X
"$NOAUTOGEN" = X
]; then
692 ${PREFIX_USER:+--prefix="$PREFIX"} \
693 ${EPREFIX_USER:+--exec-prefix="$EPREFIX"} \
694 ${BINDIR_USER:+--bindir="$BINDIR"} \
695 ${DATAROOTDIR_USER:+--datarootdir="$DATAROOTDIR"} \
696 ${DATADIR_USER:+--datadir="$DATADIR"} \
697 ${LIBDIR_USER:+--libdir="$LIBDIR"} \
698 ${LOCALSTATEDIR_USER:+--localstatedir="$LOCALSTATEDIR"} \
700 ${CONFFLAGS} $confopts
701 if [ $?
-ne 0 ]; then
702 failed
${CONFCMD} $module $component
707 echo "build.sh: Skipping autogen/configure"
710 # A custom 'make' target list was supplied through --cmd option
711 # This does not work for ninja atm
712 if [ X
"$MAKECMD" != X
]; then
713 ${MAKE} $MAKEFLAGS $MAKECMD
717 if [ $rtn -ne 0 ]; then
718 failed
"$MAKE $MAKEFLAGS $MAKECMD" $module $component
724 if [ X
"$NOMAKE" != X
]; then
725 echo "build.sh: Skipping make targets"
731 if [ $use_autogen != 0 ] ||
[ $use_configure != 0 ]; then
732 BUILDCMD
="${MAKE} $MAKEFLAGS"
733 BUILDCMD_VERBOSE
="${BUILDCMD} V=1"
734 BUILDCMD_CHECK
="${BUILDCMD} check"
735 BUILDCMD_CLEAN
="${BUILDCMD} clean"
736 BUILDCMD_DIST
="${BUILDCMD} dist"
737 BUILDCMD_DISTCHECK
="${BUILDCMD} distcheck"
738 BUILDCMD_INSTALL
="${BUILDCMD} install"
740 BUILDCMD
="ninja -C builddir"
741 BUILDCMD_VERBOSE
="${BUILDCMD_VERBOSE} -v"
742 BUILDCMD_CHECK
="${BUILDCMD} test"
743 BUILDCMD_CLEAN
="${BUILDCMD} clean"
744 BUILDCMD_DIST
="${BUILDCMD} dist"
745 BUILDCMD_DISTCHECK
="${BUILDCMD} distcheck"
746 BUILDCMD_INSTALL
="${BUILDCMD} install"
751 if [ $?
-ne 0 ]; then
752 # Rerun with Automake silent rules disabled to see failing gcc statement
753 if [ X
"$RETRY_VERBOSE" != X
]; then
755 echo "build.sh: Rebuilding $component with Automake silent rules disabled"
758 failed
"$BUILDCMD" $module $component
763 if [ X
"$CHECK" != X
]; then
765 if [ $?
-ne 0 ]; then
766 failed
"$BUILDCMD_CHECK" $module $component
772 if [ X
"$CLEAN" != X
]; then
774 if [ $?
-ne 0 ]; then
775 failed
"$BUILDCMD_CLEAN" $module $component
781 if [ X
"$DIST" != X
]; then
783 if [ $?
-ne 0 ]; then
784 failed
"$BUILDCMD_DIST" $module $component
790 if [ X
"$DISTCHECK" != X
]; then
792 if [ $?
-ne 0 ]; then
793 failed
"$BUILDCMD_DISTCHECK" $module $component
799 $SUDO env LD_LIBRARY_PATH
=$LD_LIBRARY_PATH $BUILDCMD_INSTALL
800 if [ $?
-ne 0 ]; then
801 failed
"$SUDO env LD_LIBRARY_PATH=$LD_LIBRARY_PATH $BUILDCMD_INSTALL" $module $component
811 # process each module/component and handle:
812 # LISTONLY, RESUME, NOQUIT, and BUILD_ONE
816 # $3 - configure options
824 if [ X
"$LISTONLY" != X
]; then
825 echo "$module${component:+/}$component"
829 if [ X
"$RESUME" != X
]; then
830 if [ X
"$RESUME" = X
"$module${component:+/}$component" ]; then
832 # Resume build at this module
834 echo "Skipping $module${component:+/}$component..."
839 process
$module "$component" "$confopts"
841 if [ X
"$BUILT_MODULES_FILE" != X
]; then
842 if [ $process_rtn -ne 0 ]; then
843 echo "FAIL: $module${component:+/}$component" >> $BUILT_MODULES_FILE
845 echo "PASS: $module${component:+/}$component" >> $BUILT_MODULES_FILE
849 if [ $process_rtn -ne 0 ]; then
850 echo "build.sh: error processing: \"$module${component:+/}$component\""
851 if [ X
"$NOQUIT" = X
]; then
857 if [ X
"$BUILD_ONE" != X
]; then
858 echo "Single-component build complete"
864 # just process the sub-projects supplied in the given file ($MODFILE)
865 # in the order in which they are found in the list
866 # (prerequisites and ordering are the responsibility of the user)
868 # $MODFILE - readable file containing list of modules to process
869 # and their optional configuration options
875 process_module_file
() {
877 if [ X
"$MODFILE" = X
]; then
878 echo "internal process_module_file() error, \$MODFILE is empty"
881 if [ ! -r "$MODFILE" ]; then
882 echo "module file '$MODFILE' is not readable or does not exist"
886 # read from input file, skipping blank and comment lines
889 if [ X
"$line" = X
]; then
894 echo "$line" |
grep "^#" > /dev
/null
895 if [ $?
-eq 0 ]; then
899 # parse each line to extract module, component and options name
900 field1
=`echo $line | cut -d' ' -f1`
901 module
=`echo $field1 | cut -d'/' -f1`
902 component
=`echo $field1 | cut -d'/' -s -f2`
903 confopts
=`echo $line | cut -d' ' -s -f2-`
905 build
$module "$component" "$confopts"
913 basename="`expr "//$0" : '.*/\([^/]*\)'`"
914 echo "Usage: $basename [options] [prefix]"
916 echo " -a Do NOT run auto config tools (autogen.sh, configure)"
917 echo " -b Use .build.unknown build directory"
918 echo " -c Run make clean in addition to \"all install\""
919 echo " -D Run make dist in addition to \"all install\""
920 echo " -d Run make distcheck in addition \"all install\""
921 echo " -g Compile and link with debug information"
922 echo " -h, --help Display this help and exit successfully"
923 echo " -m Do NOT run any of the make targets"
924 echo " -n Do not quit after error; just print error message"
925 echo " -o module/component"
926 echo " Build just this module/component"
927 echo " -p Update source code before building (git pull --rebase)"
928 echo " -s sudo The command name providing superuser privilege"
929 echo " --autoresume resumefile"
930 echo " Append module being built to, and autoresume from, <file>"
931 echo " --check Run make check in addition \"all install\""
932 echo " --clone Clone non-existing repositories (uses \$GITROOT if set)"
933 echo " --cmd command"
934 echo " Execute arbitrary git, gmake, or make command"
935 echo " --confflags options"
936 echo " Pass options to autogen.sh/configure of all modules"
937 echo " --modfile modulefile"
938 echo " Only process the module/components specified in modulefile"
939 echo " Any text after, and on the same line as, the module/component"
940 echo " is assumed to be configuration options for the configuration"
941 echo " of each module/component specifically"
942 echo " --retry-v1 Remake 'all' on failure with Automake silent rules disabled"
944 echo "Usage: $basename -L"
945 echo " -L Just list modules to build"
950 # Ensure the named variable value contains a full path name
952 # $1 - the variable value (the path to examine)
953 # $2 - the name of the variable
955 # returns nothing or exit on error with message
959 if [ X
"`expr $path : "\
(.\
)"`" != X
/ ]; then
960 echo "The path \"$path\" supplied by \"$varname\" must be a full path name"
967 # Ensure the named variable value contains a writable directory
969 # $1 - the variable value (the path to examine)
970 # $2 - the name of the variable
972 # returns nothing or exit on error with message
973 check_writable_dir
() {
976 if [ X
"$SUDO" = X
]; then
977 if [ ! -d "$path" ] ||
[ ! -w "$path" ]; then
978 echo "The path \"$path\" supplied by \"$varname\" must be a writable directory"
986 # perform sanity checks on cmdline args which require arguments
988 # $1 - the option being examined
989 # $2 - the argument to the option
991 # if it returns, everything is good
992 # otherwise it exit's
997 if [ X
"$option" = X
]; then
998 echo "internal required_arg() error, missing first argument"
1002 # check for an argument
1003 if [ X
"$arg" = X
]; then
1004 echo "the '$option' option is missing its required argument"
1010 # does the argument look like an option?
1011 echo $arg |
grep "^-" > /dev
/null
1012 if [ $?
-eq 0 ]; then
1013 echo "the argument '$arg' of option '$option' looks like an option itself"
1020 #==============================================================================
1028 #==============================================================================
1029 build_all_modules
() {
1033 build doc xorg-sgml-doctools
1035 build proto xorgproto
1040 build xcb pthread-stubs
1043 build xcb util-image
1044 build xcb util-keysyms
1045 build xcb util-renderutil
1050 Darwin
) build lib libAppleWM
;;
1051 CYGWIN
*) build lib libWindowsWM
;;
1054 build lib libfontenc
1064 build lib libXcomposite
1065 build lib libXrender
1066 build lib libXdamage
1067 build lib libXcursor
1071 build lib libXinerama
1072 build lib libxkbfile
1075 build lib libXScrnSaver
1078 build lib libxshmfence
1084 build lib libXxf86dga
1085 build lib libXxf86vm
1086 build lib libpciaccess
1093 build app beforelight
1096 build app fonttosfnt
1103 build app mkcomposecache
1104 build app mkfontscale
1107 build app rendercheck
1118 build app xbacklight
1121 build app xclipboard
1125 build app xcursorgen
1152 build app xlsclients
1185 build driver xf86-input-evdev
1186 build driver xf86-input-joystick
1187 build driver xf86-input-libinput
1189 FreeBSD | NetBSD | OpenBSD | Dragonfly | GNU
/kFreeBSD
)
1190 build driver xf86-input-joystick
1194 i
*86 | amd64 | x86_64 | i86pc
)
1195 build driver xf86-input-vmmouse
1202 build driver xf86-input-keyboard
1203 build driver xf86-input-mouse
1204 build driver xf86-input-synaptics
1205 build driver xf86-input-void
1210 build driver xf86-video-sunffb
1215 build driver xf86-video-wsfb
1216 build driver xf86-video-sunffb
1219 build driver xf86-video-sisusb
1220 build driver xf86-video-sunffb
1221 build driver xf86-video-v4l
1222 build driver xf86-video-xgixp
1225 # AMD Geode CPU. Driver contains 32 bit assembler code
1226 build driver xf86-video-geode
1233 build driver xf86-video-suncg14
1234 build driver xf86-video-suncg3
1235 build driver xf86-video-suncg6
1236 build driver xf86-video-sunleo
1237 build driver xf86-video-suntcx
1239 i
*86 | amd64 | x86_64 | i86pc
)
1240 build driver xf86-video-i740
1241 build driver xf86-video-intel
1244 build driver xf86-video-amdgpu
1245 build driver xf86-video-apm
1246 build driver xf86-video-ark
1247 build driver xf86-video-ast
1248 build driver xf86-video-ati
1249 build driver xf86-video-chips
1250 build driver xf86-video-cirrus
1251 build driver xf86-video-dummy
1252 build driver xf86-video-fbdev
1253 build driver xf86-video-glint
1254 build driver xf86-video-i128
1255 build driver xf86-video-mach64
1256 build driver xf86-video-mga
1257 build driver xf86-video-neomagic
1258 build driver xf86-video-nested
1259 build driver xf86-video-nv
1260 build driver xf86-video-rendition
1261 build driver xf86-video-r128
1262 build driver xf86-video-s3
1263 build driver xf86-video-s3virge
1264 build driver xf86-video-savage
1265 build driver xf86-video-siliconmotion
1266 build driver xf86-video-sis
1267 build driver xf86-video-tdfx
1268 build driver xf86-video-tga
1269 build driver xf86-video-trident
1270 build driver xf86-video-tseng
1271 build driver xf86-video-vesa
1272 build driver xf86-video-vmware
1273 build driver xf86-video-voodoo
1277 build font encodings
1278 build font adobe-100dpi
1279 build font adobe-75dpi
1280 build font adobe-utopia-100dpi
1281 build font adobe-utopia-75dpi
1282 build font adobe-utopia-type1
1283 build font arabic-misc
1284 build font bh-100dpi
1286 build font bh-lucidatypewriter-100dpi
1287 build font bh-lucidatypewriter-75dpi
1290 build font bitstream-100dpi
1291 build font bitstream-75dpi
1292 build font bitstream-type1
1293 build font cronyx-cyrillic
1294 build font cursor-misc
1295 build font daewoo-misc
1297 build font ibm-type1
1298 build font isas-misc
1300 build font micro-misc
1301 build font misc-cyrillic
1302 build font misc-ethiopic
1303 build font misc-meltho
1304 build font misc-misc
1305 build font mutt-misc
1306 build font schumacher-misc
1307 build font screen-cyrillic
1308 build font sony-misc
1310 build font winitzki-cyrillic
1311 build font xfree86-type1
1315 build util gccmakedep
1317 build util makedepend
1318 build xkeyboard-config
""
1323 #------------------------------------------------------------------------------
1325 #------------------------------------------------------------------------------
1327 # Initialize variables controlling end of run reports
1328 failed_components
=""
1329 nonexistent_components
=""
1330 clonefailed_components
=""
1332 # Set variables supporting multiple binaries for a single source tree
1333 HAVE_ARCH
="`uname -i`"
1337 # Set variables for conditionally building some components
1343 # Process command line args
1351 DIR_ARCH
=".build.$HAVE_ARCH"
1364 CFLAGS
="${CFLAGS} -g3 -O0"
1381 if [ -n "$BUILT_MODULES_FILE" ]; then
1382 echo "The '-o' and '--autoresume' options are mutually exclusive."
1388 RESUME
=`echo $1 | sed "s,/$,,"`
1400 if [ -n "$BUILD_ONE" ]; then
1401 echo "The '-o' and '--autoresume' options are mutually exclusive."
1407 BUILT_MODULES_FILE
=$1
1418 cmd1
=`echo $1 | cut -d' ' -f1`
1419 cmd2
=`echo $1 | cut -d' ' -f2`
1421 # verify the command exists
1422 which $cmd1 > /dev
/null
2>&1
1423 if [ $?
-ne 0 ]; then
1424 echo "The specified command '$cmd1' does not appear to exist"
1438 echo "The script can only process 'make', 'gmake', or 'git' commands"
1439 echo "It can't process '$cmd1' commands"
1453 if [ ! -r "$1" ]; then
1454 echo "can't find/read file '$1'"
1463 if [ X
"$too_many" = Xyes
]; then
1464 echo "unrecognized and/or too many command-line arguments"
1465 echo " PREFIX: $PREFIX"
1466 echo " Extra arguments: $1"
1472 # check that 'prefix' doesn't look like an option
1473 echo $1 |
grep "^-" > /dev
/null
1474 if [ $?
-eq 0 ]; then
1475 echo "'prefix' appears to be an option"
1489 # All user input has been obtained, set-up the user shell variables
1490 if [ X
"$LISTONLY" = X
]; then
1492 echo "Building to run $HOST_OS / $HOST_CPU ($HOST)"
1496 # if there is a BUILT_MODULES_FILE
1497 # then start off by checking for and trying to build any modules which failed
1498 # and aren't the last line
1499 if [ X
"$BUILT_MODULES_FILE" != X
-a -r "$BUILT_MODULES_FILE" ]; then
1500 built_lines
=`cat $BUILT_MODULES_FILE | wc -l | sed 's:^ *::'`
1501 built_lines_m1
=`expr $built_lines - 1`
1502 orig_BUILT_MODULES_FILE
=$BUILT_MODULES_FILE
1503 unset BUILT_MODULES_FILE
1506 built_status
=`echo $line | cut -c-6`
1507 if [ X
"$built_status" = X
"FAIL: " ]; then
1508 line
=`echo $line | cut -c7-`
1509 field1
=`echo $line | cut -d' ' -f1`
1510 module
=`echo $field1 | cut -d'/' -f1`
1511 component
=`echo $field1 | cut -d'/' -s -f2`
1512 confopts
=`echo $line | cut -d' ' -s -f2-`
1516 # quick check for the module in $MODFILE (if present)
1517 if [ X
"$MODFILE" = X
]; then
1518 build
$module "$component" "$confopts"
1519 if [ $?
-eq 0 ]; then
1523 cat $MODFILE |
grep "$module${component:+/}$component" > /dev
/null
1524 if [ $?
-eq 0 ]; then
1525 build
$module "$component" "$confopts"
1526 if [ $?
-eq 0 ]; then
1532 if [ X
"$build_ret" = X
"PASS" ]; then
1534 if [ $?
-ne 0 ]; then
1535 echo "can't create tmp file, $orig_BUILT_MODULES_FILE not modified"
1537 head -n `expr $curline - 1` $orig_BUILT_MODULES_FILE > $built_temp
1538 echo "PASS: $module${component:+/}$component" >> $built_temp
1539 tail -n `expr $built_lines - $curline` $orig_BUILT_MODULES_FILE >> $built_temp
1540 mv $built_temp $orig_BUILT_MODULES_FILE
1544 if [ $curline -eq $built_lines_m1 ]; then
1547 curline
=`expr $curline + 1`
1548 done <"$orig_BUILT_MODULES_FILE"
1550 BUILT_MODULES_FILE
=$orig_BUILT_MODULES_FILE
1551 RESUME
=`tail -n 1 $BUILT_MODULES_FILE | cut -c7-`
1553 # remove last line of $BUILT_MODULES_FILE
1554 # to avoid a duplicate entry
1556 if [ $?
-ne 0 ]; then
1557 echo "can't create tmp file, last built item will be duplicated"
1559 head -n $built_lines_m1 $BUILT_MODULES_FILE > $built_temp
1560 mv $built_temp $BUILT_MODULES_FILE
1564 if [ X
"$MODFILE" = X
]; then
1570 if [ X
"$LISTONLY" != X
]; then
1574 # Print the end date/time to compare with the start date/time
1577 # Report about components that failed for one reason or another
1578 if [ X
"$nonexistent_components" != X
]; then
1580 echo "***** Skipped components (not available) *****"
1581 echo "Could neither find a git repository (at the <module/component> paths)"
1582 echo "or a tarball (at the <module/> paths or ./) for:"
1583 echo " <module/component>"
1584 for mod
in $nonexistent_components; do
1587 echo "You may want to provide the --clone option to build.sh"
1588 echo "to automatically git-clone the missing components"
1592 if [ X
"$failed_components" != X
]; then
1594 echo "***** Failed components *****"
1595 for mod
in $failed_components; do
1601 if [ X
"$CLONE" != X
] && [ X
"$clonefailed_components" != X
]; then
1603 echo "***** Components failed to clone *****"
1604 for mod
in $clonefailed_components; do