From patchwork Mon Jul 7 09:31:18 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhenqiang Chen X-Patchwork-Id: 367459 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 8E1C21400BE for ; Mon, 7 Jul 2014 19:31:30 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:date:message-id:subject:from:to:content-type; q= dns; s=default; b=GNrnBbhYh+ubdTCINw4NaBRL1HQqNkOx1So3bmHVmyY7lL wB1xfRisF9qrLPuGIEIIGT5GRQ/f2aApoZfu5ItnLhUGBRCERlWC3CyPrIcDNUk1 k20QFiw81tWNMZtb5WC4yUR1mZWkzd/eu0jw9VO/qq3xewM0qNqiToN/sguxU= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:date:message-id:subject:from:to:content-type; s= default; bh=HZz67pDu+rXtdAhcu5dD2pTh/5k=; b=qX8iQeaUC073H2AjO0kO zShJCXWkBYdPN76WVoA3I56hSTLJIck7/5hls8dTYaiMHHASwzfMJ9vBBaMgAu6i ZyLKXrIxrDKb/v5i3vR0y5D/MR6UETzXoi2T/QZnRk2qqUIIMZOWUXhebwfQLkRk ip2rO/PZ6hfmdDvY0rP2Ndo= Received: (qmail 24940 invoked by alias); 7 Jul 2014 09:31:24 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 24921 invoked by uid 89); 7 Jul 2014 09:31:23 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.5 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-lb0-f174.google.com Received: from mail-lb0-f174.google.com (HELO mail-lb0-f174.google.com) (209.85.217.174) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Mon, 07 Jul 2014 09:31:22 +0000 Received: by mail-lb0-f174.google.com with SMTP id u10so2622699lbd.5 for ; Mon, 07 Jul 2014 02:31:18 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to :content-type; bh=6Ekbui5YT/WrOo3AuTgJAcqwGHry7S4DPxWiySJfwX0=; b=BQVH7g6xP3QD1TkVvqmdgkNqhPNjshhAxpviGVtvid3yBzSZ3Ww4g7AS1ZNU2F2KjR F8BDukb0jzPlXGxjLhEb/xcVRnNobIHSSTtqq5nywyUiSR7J6iKWrKVdcFJQzMajEfcQ EJ56v8vgBkqoJJW3WFfo/QAuAKNObcI5cqCEntpvkYI8AiIiq6e7UNiRR5ikh9Sys2wR dYGj6/j9eqhV6P9BYm2IhZ75HgcL29h9Zhy2RTGWnXZ4DuRDoJklCcd45sodDKjqtLih iEr8bnrJhspVoq3TaybfKst3u9voEKrjqx7oHO3v7/Prl0FQteB0cwcorJ4iQUY8ko/k Ct/g== X-Gm-Message-State: ALoCoQk+AKH9XHnEMIMLpE6wQEXYNXuiNIp/XFXkeSRam6RZTDjbmgcOGwJl2aQC1rz2Rx/9NLqn MIME-Version: 1.0 X-Received: by 10.112.63.65 with SMTP id e1mr855545lbs.81.1404725478744; Mon, 07 Jul 2014 02:31:18 -0700 (PDT) Received: by 10.112.136.66 with HTTP; Mon, 7 Jul 2014 02:31:18 -0700 (PDT) Date: Mon, 7 Jul 2014 17:31:18 +0800 Message-ID: Subject: [PATCH, NLS] try to search relative dir From: Zhenqiang Chen To: "gcc-patches@gcc.gnu.org" X-IsSubscribed: yes Hi, LOCALEDIR seams a build-time constant, which is an absolute path. But * When releasing gcc binaries as a tarball, users can put it at any dir. * For "Canadian" build, the dir layout on the build machine might be different from the host machine. For such cases, gcc most likely can not find the gcc.mo. The patch tries to search relative dir "../share/locale" from gcc. Although it can not cover all cases, I think it can cover most cases. Bootstrap and no make check regression on X86-64. OK for trunk? Thanks! -Zhenqiang ChangeLog: 2014-07-07 Zhenqiang Chen * gcc.c (main): Call gcc_init_libintl_program. * intl.c (gcc_init_libintl): Likewise. (gcc_init_libintl_program): New function. * intl.h (gcc_init_libintl_program): New prototype. diff --git a/gcc/gcc.c b/gcc/gcc.c index 6cd08ea..0addc0c5 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -6409,7 +6409,7 @@ main (int argc, char **argv) /* Unlock the stdio streams. */ unlock_std_streams (); - gcc_init_libintl (); + gcc_init_libintl_program (argv[0]); diagnostic_initialize (global_dc, 0); diff --git a/gcc/intl.c b/gcc/intl.c index 2509c1a..6d1a45c 100644 --- a/gcc/intl.c +++ b/gcc/intl.c @@ -48,6 +48,14 @@ bool locale_utf8 = false; void gcc_init_libintl (void) { + gcc_init_libintl_program ("gcc"); +} + +#define LIBINTL_RELATIVE_DIR "../share/locale" + +void +gcc_init_libintl_program (const char * program_name) +{ #ifdef HAVE_LC_MESSAGES setlocale (LC_CTYPE, ""); setlocale (LC_MESSAGES, ""); @@ -55,7 +63,32 @@ gcc_init_libintl (void) setlocale (LC_ALL, ""); #endif - (void) bindtextdomain ("gcc", LOCALEDIR); + if (!access (LOCALEDIR, X_OK)) + { + /* If LOCALEDIR exists, use LOCALEDIR. */ + (void) bindtextdomain ("gcc", LOCALEDIR); + } + else + { + /* Try relative dir, i.e. .../bin/../share/locale. */ + int len1, len2; + char *prefix_dir, *locale_dir; + prefix_dir = make_relative_prefix (program_name, ".", "."); + len1 = strlen (prefix_dir); + len2 = strlen (LIBINTL_RELATIVE_DIR); + locale_dir = (char*) xmalloc (len1 + len2 + 1); + if (locale_dir != NULL) + { + strcpy (locale_dir, prefix_dir); + strcpy (locale_dir + len1, LIBINTL_RELATIVE_DIR); + (void) bindtextdomain ("gcc", locale_dir); + } + else + (void) bindtextdomain ("gcc", LOCALEDIR); + + free (prefix_dir); + } + (void) textdomain ("gcc"); /* Opening quotation mark. */ diff --git a/gcc/intl.h b/gcc/intl.h index 91e7440..84b9d58 100644 --- a/gcc/intl.h +++ b/gcc/intl.h @@ -30,6 +30,7 @@ #include extern void gcc_init_libintl (void); extern size_t gcc_gettext_width (const char *); +extern void gcc_init_libintl_program (const char *); #else /* Stubs. */ # undef textdomain @@ -41,6 +42,7 @@ extern size_t gcc_gettext_width (const char *); # define ngettext(singular,plural,n) fake_ngettext (singular, plural, n) # define gcc_init_libintl() /* nothing */ # define gcc_gettext_width(s) strlen (s) +# define gcc_init_libintl_program (s) /* Nothing. */ extern const char *fake_ngettext (const char *singular, const char *plural, unsigned long int n);