Module Name: xsrc Committed By: mrg Date: Wed Apr 27 07:23:01 UTC 2016
Modified Files: xsrc/external/mit/xkbcomp/dist: expr.c xsrc/external/mit/xrandr/dist: xrandr.c Added Files: xsrc/external/mit/xrandr/dist: compile Log Message: merge xkbcomp 1.3.1 and xrandr 1.5.0. To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 xsrc/external/mit/xkbcomp/dist/expr.c cvs rdiff -u -r0 -r1.3 xsrc/external/mit/xrandr/dist/compile cvs rdiff -u -r1.12 -r1.13 xsrc/external/mit/xrandr/dist/xrandr.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: xsrc/external/mit/xkbcomp/dist/expr.c diff -u xsrc/external/mit/xkbcomp/dist/expr.c:1.2 xsrc/external/mit/xkbcomp/dist/expr.c:1.3 --- xsrc/external/mit/xkbcomp/dist/expr.c:1.2 Wed Jul 22 08:39:03 2015 +++ xsrc/external/mit/xkbcomp/dist/expr.c Wed Apr 27 07:23:01 2016 @@ -729,9 +729,8 @@ ExprResolveString(ExprDef * expr, val_rtrn->str = XkbAtomGetString(NULL, expr->value.str); if (val_rtrn->str == NULL) { - static char empty_char = '\0'; - char *empty = &empty_char; - val_rtrn->str = empty; + static char empty_char = '\0'; + val_rtrn->str = &empty_char; } return True; case ExprIdent: Index: xsrc/external/mit/xrandr/dist/xrandr.c diff -u xsrc/external/mit/xrandr/dist/xrandr.c:1.12 xsrc/external/mit/xrandr/dist/xrandr.c:1.13 --- xsrc/external/mit/xrandr/dist/xrandr.c:1.12 Wed Jul 22 08:47:22 2015 +++ xsrc/external/mit/xrandr/dist/xrandr.c Wed Apr 27 07:23:01 2016 @@ -153,7 +153,11 @@ usage(void) " --delmode <output> <name>\n" " --listproviders\n" " --setprovideroutputsource <prov-xid> <source-xid>\n" - " --setprovideroffloadsink <prov-xid> <sink-xid>\n"); + " --setprovideroffloadsink <prov-xid> <sink-xid>\n" + " --listmonitors\n" + " --listactivemonitors\n" + " --setmonitor <name> {auto|<w>/<mmw>x<h>/<mmh>+<x>+<y>} {none|<output>,<output>,...}\n" + " --delmonitor <name>\n"); } static void _X_NORETURN _X_ATTRIBUTE_PRINTF(1,2) @@ -304,6 +308,8 @@ typedef struct _transform transform_t; typedef struct _umode umode_t; typedef struct _output_prop output_prop_t; typedef struct _provider provider_t; +typedef struct _monitors monitors_t; +typedef struct _umonitor umonitor_t; struct _transform { XTransform transform; @@ -397,6 +403,22 @@ struct _provider { XRRProviderInfo *info; }; +struct _monitors { + int n; + XRRMonitorInfo *monitors; +}; + +struct _umonitor { + struct _umonitor *next; + char *name; + Bool set; + Bool primary; + int x, y, width, height; + int mmwidth, mmheight; + int noutput; + name_t *outputs; +}; + static const char *connection[3] = { "connected", "disconnected", @@ -431,7 +453,10 @@ static int minWidth, maxWidth, minHeight static Bool has_1_2 = False; static Bool has_1_3 = False; static Bool has_1_4 = False; +static Bool has_1_5 = False; static name_t provider_name, output_source_provider_name, offload_sink_provider_name; +static monitors_t *monitors; +static umonitor_t *umonitors; static int mode_height (XRRModeInfo *mode_info, Rotation rotation) @@ -541,7 +566,7 @@ mode_geometry (XRRModeInfo *mode_info, R /* v refresh frequency in Hz */ static double -mode_refresh (XRRModeInfo *mode_info) +mode_refresh (const XRRModeInfo *mode_info) { double rate; double vTotal = mode_info->vTotal; @@ -567,7 +592,7 @@ mode_refresh (XRRModeInfo *mode_info) /* h sync frequency in Hz */ static double -mode_hsync (XRRModeInfo *mode_info) +mode_hsync (const XRRModeInfo *mode_info) { double rate; @@ -579,6 +604,30 @@ mode_hsync (XRRModeInfo *mode_info) } static void +print_verbose_mode (const XRRModeInfo *mode, Bool current, Bool preferred) +{ + int f; + + printf (" %s (0x%x) %6.3fMHz", + mode->name, (int)mode->id, + (double)mode->dotClock / 1000000.0); + for (f = 0; mode_flags[f].flag; f++) + if (mode->modeFlags & mode_flags[f].flag) + printf (" %s", mode_flags[f].string); + if (current) + printf (" *current"); + if (preferred) + printf (" +preferred"); + printf ("\n"); + printf (" h: width %4d start %4d end %4d total %4d skew %4d clock %6.2fKHz\n", + mode->width, mode->hSyncStart, mode->hSyncEnd, + mode->hTotal, mode->hSkew, mode_hsync (mode) / 1000); + printf (" v: height %4d start %4d end %4d total %4d clock %6.2fHz\n", + mode->height, mode->vSyncStart, mode->vSyncEnd, mode->vTotal, + mode_refresh (mode)); +} + +static void init_name (name_t *name) { name->kind = name_none; @@ -2194,6 +2243,8 @@ static void pick_crtcs (void) { output_t *output; + int saved_crtc_noutput[num_crtcs]; + int n; /* * First try to match up newly enabled outputs with spare crtcs @@ -2225,7 +2276,18 @@ pick_crtcs (void) */ for (output = all_outputs; output; output = output->next) output->current_crtc_info = output->crtc_info; + + /* Mark all CRTC as currently unused */ + for (n = 0; n < num_crtcs; n++) { + saved_crtc_noutput[n] = crtcs[n].crtc_info->noutput; + crtcs[n].crtc_info->noutput = 0; + } + pick_crtcs_score (all_outputs); + + for (n = 0; n < num_crtcs; n++) + crtcs[n].crtc_info->noutput = saved_crtc_noutput[n]; + for (output = all_outputs; output; output = output->next) { if (output->mode_info && !output->crtc_info) @@ -2262,12 +2324,24 @@ property_values_from_string(const char * { char *token, *tmp; void *returned_bytes = NULL; - int nitems = 0, bytes_per_item = format / 8; + int nitems = 0, bytes_per_item; - if ((type != XA_INTEGER && type != XA_CARDINAL) || - (format != 8 && format != 16 && format != 32)) - { + if (type != XA_INTEGER && type != XA_CARDINAL) return NULL; + + /* compute memory needed for Xlib datatype (sigh) */ + switch (format) { + case 8: + bytes_per_item = sizeof(char); + break; + case 16: + bytes_per_item = sizeof(short); + break; + case 32: + bytes_per_item = sizeof(long); + break; + default: + return NULL; } tmp = strdup (str); @@ -2286,33 +2360,33 @@ property_values_from_string(const char * if (type == XA_INTEGER && format == 8) { - int8_t *ptr = returned_bytes; - ptr[nitems] = (int8_t) val; + signed char *ptr = returned_bytes; + ptr[nitems] = (char) val; } else if (type == XA_INTEGER && format == 16) { - int16_t *ptr = returned_bytes; - ptr[nitems] = (int16_t) val; + short *ptr = returned_bytes; + ptr[nitems] = (short) val; } else if (type == XA_INTEGER && format == 32) { - int32_t *ptr = returned_bytes; - ptr[nitems] = (int32_t) val; + long *ptr = returned_bytes; + ptr[nitems] = (long) val; } else if (type == XA_CARDINAL && format == 8) { - uint8_t *ptr = returned_bytes; - ptr[nitems] = (uint8_t) val; + unsigned char *ptr = returned_bytes; + ptr[nitems] = (unsigned char) val; } else if (type == XA_CARDINAL && format == 16) { - uint16_t *ptr = returned_bytes; - ptr[nitems] = (uint16_t) val; + unsigned short *ptr = returned_bytes; + ptr[nitems] = (unsigned short) val; } else if (type == XA_CARDINAL && format == 32) { - uint32_t *ptr = returned_bytes; - ptr[nitems] = (uint32_t) val; + unsigned long *ptr = returned_bytes; + ptr[nitems] = (unsigned long) val; } else { @@ -2352,20 +2426,20 @@ print_output_property_value(int value_fo { if (value_format == 8) { - const int8_t *val = value_bytes; - printf ("%" PRId8, *val); + const signed char *val = value_bytes; + printf ("%d", *val); return; } if (value_format == 16) { - const int16_t *val = value_bytes; - printf ("%" PRId16, *val); + const short *val = value_bytes; + printf ("%d", *val); return; } if (value_format == 32) { - const int32_t *val = value_bytes; - printf ("%" PRId32, *val); + const long *val = value_bytes; + printf ("%ld", *val); return; } } @@ -2374,20 +2448,20 @@ print_output_property_value(int value_fo { if (value_format == 8) { - const uint8_t *val = value_bytes; - printf ("%" PRIu8, *val); + const unsigned char *val = value_bytes; + printf ("%u", *val); return; } if (value_format == 16) { - const uint16_t *val = value_bytes; - printf ("%" PRIu16, *val); + const unsigned short *val = value_bytes; + printf ("%u", *val); return; } if (value_format == 32) { - const uint32_t *val = value_bytes; - printf ("%" PRIu32, *val); + const unsigned long *val = value_bytes; + printf ("%lu", *val); return; } } @@ -2441,9 +2515,22 @@ print_output_property(const char *atom_n int nitems, const unsigned char *prop) { - int bytes_per_item = value_format / 8; + int bytes_per_item; int k; + switch (value_format) { + case 8: + bytes_per_item = sizeof(char); + break; + case 16: + bytes_per_item = sizeof(short); + break; + case 32: + bytes_per_item = sizeof(long); + break; + default: + return; + } /* * Check for properties that need special formatting. */ @@ -2531,6 +2618,22 @@ find_provider (name_t *name) exit (1); } +static void +get_monitors(Bool get_active) +{ + XRRMonitorInfo *m; + int n; + + if (!has_1_5 || monitors) + return; + + m = XRRGetMonitors(dpy, root, get_active, &n); + if (n == -1) + fatal("get monitors failed\n"); + monitors = calloc(1, sizeof (monitors_t)); + monitors->n = n; + monitors->monitors = m; +} int main (int argc, char **argv) @@ -2570,6 +2673,9 @@ main (int argc, char **argv) Bool list_providers = False; Bool provsetoutsource = False; Bool provsetoffsink = False; + Bool monitorit = False; + Bool list_monitors = False; + Bool list_active_monitors = False; int major, minor; Bool current = False; Bool toggle_x = False; @@ -2936,7 +3042,7 @@ main (int argc, char **argv) if (!config_output) argerr ("%s must be used after --output\n", argv[i]); set_name_xid (&config_output->mode, None); set_name_xid (&config_output->crtc, None); - config_output->changes |= changes_mode; + config_output->changes |= changes_mode | changes_crtc; continue; } if (!strcmp ("--fb", argv[i])) { @@ -3105,6 +3211,72 @@ main (int argc, char **argv) provsetoffsink = True; continue; } + if (!strcmp("--listmonitors", argv[i])) + { + list_monitors = True; + action_requested = True; + continue; + } + if (!strcmp("--listactivemonitors", argv[i])) + { + list_active_monitors = True; + action_requested = True; + continue; + } + if (!strcmp("--setmonitor", argv[i])) + { + umonitor_t *m = calloc(1, sizeof (umonitor_t)), **l; + char *t; + char *o; + char *n; + char *geom; + + if (i+3 >= argc) argerr("%s requires three argument\n", argv[i]); + n = argv[++i]; + if (*n == '*') { + m->primary = True; + n++; + } + m->name = n; + m->set = True; + geom = argv[++i]; + + if (strncmp (geom, "auto", 4) != 0) { + if (sscanf(geom, "%d/%dx%d/%d+%d+%d", + &m->width, &m->mmwidth, &m->height, &m->mmheight, &m->x, &m->y) != 6) + argerr ("failed to parse '%s' as monitor geometry\n", argv[i]); + } + + o = argv[++i]; + if (strcmp(o, "none") != 0) { + printf ("output list %s\n", o); + for (; (t = strtok(o, ",")) != NULL; o = NULL) { + m->outputs = realloc(m->outputs, (m->noutput + 1) * sizeof (name_t)); + printf ("add monitor %s\n", t); + set_name(&m->outputs[m->noutput++], t, name_string|name_xid|name_index); + printf ("output name %s\n", m->outputs[m->noutput-1].string); + } + } + for (l = &umonitors; *l; l = &((*l)->next)); + *l = m; + action_requested = True; + monitorit = True; + continue; + } + if (!strcmp("--delmonitor", argv[i])) + { + umonitor_t *m = calloc(1, sizeof (umonitor_t)), **l; + + if (++i >= argc) argerr("%s requires an argument\n", argv[i-1]); + + m->name = argv[i]; + m->set = False; + for (l = &umonitors; *l; l = &((*l)->next)); + *l = m; + action_requested = True; + monitorit = True; + continue; + } argerr ("unrecognized option '%s'\n", argv[i]); } @@ -3147,12 +3319,13 @@ main (int argc, char **argv) has_1_3 = True; if (major > 1 || (major == 1 && minor >= 4)) has_1_4 = True; - + if (major > 1 || (major == 1 && minor >= 5)) + has_1_5 = True; if (has_1_2 && modeit) { umode_t *m; - get_screen (current); + get_screen (True); get_crtcs(); get_outputs(); @@ -3191,7 +3364,7 @@ main (int argc, char **argv) break; } } - if (!setit_1_2) + if (!propit && !setit_1_2 && !monitorit) { XSync (dpy, False); exit (0); @@ -3201,7 +3374,7 @@ main (int argc, char **argv) { output_t *output; - get_screen (current); + get_screen (True); get_crtcs(); get_outputs(); @@ -3292,7 +3465,7 @@ main (int argc, char **argv) if (!has_1_4) fatal ("--setprovideroutputsource requires RandR 1.4\n"); - get_screen (current); + get_screen (True); get_providers (); provider = find_provider (&provider_name); @@ -3307,7 +3480,7 @@ main (int argc, char **argv) if (!has_1_4) fatal ("--setprovideroffloadsink requires RandR 1.4\n"); - get_screen (current); + get_screen (True); get_providers (); provider = find_provider (&provider_name); @@ -3317,7 +3490,7 @@ main (int argc, char **argv) } if (setit_1_2) { - get_screen (current); + get_screen (True); get_crtcs (); get_outputs (); set_positions (); @@ -3402,6 +3575,73 @@ main (int argc, char **argv) */ apply (); + if (!monitorit) { + XSync (dpy, False); + exit (0); + } + } + if (monitorit) { + umonitor_t *u; + Atom name; + + if (!has_1_5) { + printf("RandR 1.5 not supported\n"); + exit(0); + } + + get_screen(True); + get_monitors(True); + get_crtcs(); + get_outputs(); + + for (u = umonitors; u; u = u->next) { + if (u->set) { + XRRMonitorInfo *m; + int o; + + name = XInternAtom(dpy, u->name, False); + m = XRRAllocateMonitor(dpy, u->noutput); + + m->name = name; + m->primary = u->primary; + m->x = u->x; + m->y = u->y; + m->width = u->width; + m->height = u->height; + m->mwidth = u->mmwidth; + m->mheight = u->mmheight; + for (o = 0; o < u->noutput; o++) { + output_t *output = find_output(&u->outputs[o]); + if (!output) + fatal("cannot find output\n"); + m->outputs[o] = output->output.xid; + } + + XRRSetMonitor(dpy, root, m); + + XRRFreeMonitors(m); + } else { + int m; + + name = XInternAtom(dpy, u->name, True); + if (!name) { + printf("No monitor named '%s'\n", u->name); + } else { + if (!monitors) + printf ("No monitors\n"); + else { + for (m = 0; m < monitors->n; m++) { + if (monitors->monitors[m].name == name) + break; + } + if (m == monitors->n) + printf("No monitor named '%s'\n", u->name); + else + XRRDeleteMonitor(dpy, root, name); + } + } + } + } XSync (dpy, False); exit (0); } @@ -3633,25 +3873,9 @@ main (int argc, char **argv) for (j = 0; j < output_info->nmode; j++) { XRRModeInfo *mode = find_mode_by_xid (output_info->modes[j]); - int f; - - printf (" %s (0x%x) %6.3fMHz", - mode->name, (int)mode->id, - (double)mode->dotClock / 1000000.0); - for (f = 0; mode_flags[f].flag; f++) - if (mode->modeFlags & mode_flags[f].flag) - printf (" %s", mode_flags[f].string); - if (mode == output->mode_info) - printf (" *current"); - if (j < output_info->npreferred) - printf (" +preferred"); - printf ("\n"); - printf (" h: width %4d start %4d end %4d total %4d skew %4d clock %6.2fKHz\n", - mode->width, mode->hSyncStart, mode->hSyncEnd, - mode->hTotal, mode->hSkew, mode_hsync (mode) / 1000); - printf (" v: height %4d start %4d end %4d total %4d clock %6.2fHz\n", - mode->height, mode->vSyncStart, mode->vSyncEnd, mode->vTotal, - mode_refresh (mode)); + + print_verbose_mode (mode, mode == output->mode_info, + j < output_info->npreferred); mode->modeFlags |= ModeShown; } } @@ -3696,17 +3920,7 @@ main (int argc, char **argv) XRRModeInfo *mode = &res->modes[m]; if (!(mode->modeFlags & ModeShown)) - { - printf (" %s (0x%x) %6.3fMHz\n", - mode->name, (int)mode->id, - (double)mode->dotClock / 1000000.0); - printf (" h: width %4d start %4d end %4d total %4d skew %4d clock %6.2fKHz\n", - mode->width, mode->hSyncStart, mode->hSyncEnd, - mode->hTotal, mode->hSkew, mode_hsync (mode) / 1000); - printf (" v: height %4d start %4d end %4d total %4d clock %6.2fHz\n", - mode->height, mode->vSyncStart, mode->vSyncEnd, mode->vTotal, - mode_refresh (mode)); - } + print_verbose_mode(mode, False, False); } exit (0); } @@ -3739,6 +3953,46 @@ main (int argc, char **argv) } } } + if (list_monitors || list_active_monitors) { + + if (!has_1_5) { + printf("RandR 1.5 not supported\n"); + exit(0); + } + + get_screen(current); + get_monitors(list_active_monitors ? True : False); + get_crtcs(); + get_outputs(); + + if (monitors) { + int m, o; + + printf("Monitors: %d\n", monitors->n); + + for (m = 0; m < monitors->n; m++) { + printf (" %d: %s%s%s %d/%dx%d/%d+%d+%d ", + m, + monitors->monitors[m].automatic ? "+" : "", + monitors->monitors[m].primary ? "*" : "", + XGetAtomName(dpy, monitors->monitors[m].name), + monitors->monitors[m].width, + monitors->monitors[m].mwidth, + monitors->monitors[m].height, + monitors->monitors[m].mheight, + monitors->monitors[m].x, + monitors->monitors[m].y); + for (o = 0; o < monitors->monitors[m].noutput; o++) { + output_t *output = find_output_by_xid(monitors->monitors[m].outputs[o]); + if (output) + printf (" %s", output->output.string); + else + printf (" unknown output 0x%x\n", (CARD32) monitors->monitors[m].outputs[o]); + } + printf ("\n"); + } + } + } sc = XRRGetScreenInfo (dpy, root); Added files: Index: xsrc/external/mit/xrandr/dist/compile diff -u /dev/null xsrc/external/mit/xrandr/dist/compile:1.3 --- /dev/null Wed Apr 27 07:23:01 2016 +++ xsrc/external/mit/xrandr/dist/compile Wed Apr 27 07:23:01 2016 @@ -0,0 +1,347 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2012-10-14.11; # UTC + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Written by Tom Tromey <tro...@cygnus.com>. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to <bug-autom...@gnu.org> or send patches to +# <automake-patc...@gnu.org>. + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to <bug-autom...@gnu.org>. +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: