Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 2 Mar 2014 06:23:02 +0000 (UTC)
From:      Bryan Drewery <bdrewery@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r346739 - in head/devel/ccache: . files
Message-ID:  <201403020623.s226N238093791@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bdrewery
Date: Sun Mar  2 06:23:02 2014
New Revision: 346739
URL: http://svnweb.freebsd.org/changeset/ports/346739
QAT: https://qat.redports.org/buildarchive/r346739/

Log:
  - Add COLORS option to enable contributed colors patch that uses colors
    when possible
  
  PR:		ports/186851
  Submitted by:	Olivier <software-freebsd@interfasys.ch>
  Obtained from:	https://groups.google.com/forum/#!topic/ccache/-Zehp1Zs3Lg [*]
  [*] Backported to 3.1.9 by me and CC_IS_CLANG and CC_IS_GCC support added.

Added:
  head/devel/ccache/files/extra-patch-colors   (contents, props changed)
Modified:
  head/devel/ccache/Makefile

Modified: head/devel/ccache/Makefile
==============================================================================
--- head/devel/ccache/Makefile	Sun Mar  2 05:47:53 2014	(r346738)
+++ head/devel/ccache/Makefile	Sun Mar  2 06:23:02 2014	(r346739)
@@ -3,7 +3,7 @@
 
 PORTNAME=	ccache
 PORTVERSION=	3.1.9
-PORTREVISION=	5
+PORTREVISION=	6
 CATEGORIES=	devel
 MASTER_SITES=	http://www.samba.org/ftp/ccache/ \
 		CRITICAL
@@ -21,17 +21,30 @@ SUB_FILES=	${HOWTO} world-ccache pkg-mes
 
 PORTDOCS=	ccache-howto-freebsd.txt MANUAL.html
 
-OPTIONS_DEFINE=	CLANGLINK LLVMLINK STATIC DOCS TINDERBOX
+OPTIONS_DEFINE=	CLANGLINK LLVMLINK STATIC DOCS TINDERBOX COLORS
 
+COLORS_DESC=	Support compiler colors
 CLANGLINK_DESC=	Create clang compiler links if clang is installed
 LLVMLINK_DESC=	Create llvm compiler links if llvm is installed
 TINDERBOX_DESC=	Create tarball for tinderbox usage
 
+COLORS_EXTRA_PATCHES=	${FILESDIR}/extra-patch-colors
+COLORS_USES=		compiler
+
 OPTIONS_SUB=	yes
 
 STATIC_LDFLAGS=	-static
 
 .include <bsd.port.options.mk>
+.include <bsd.port.pre.mk>
+
+.if ${PORT_OPTIONS:MCOLORS}
+.  if ${COMPILER_TYPE} == clang
+CPPFLAGS+=	-DCC_IS_CLANG
+.  elif ${COMPILER_TYPE} = gcc
+CPPFLAGS+=	-DCC_IS_GCC
+.  endif
+.endif
 
 PLIST_SUB+=	CCLINKDIR="${CCLINKDIR}"
 

Added: head/devel/ccache/files/extra-patch-colors
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/devel/ccache/files/extra-patch-colors	Sun Mar  2 06:23:02 2014	(r346739)
@@ -0,0 +1,199 @@
+CC_IS_CLANG and CC_IS_GCC added by me. Adapated from 3.2 patch. - bdrewery
+
+Original author:
+
+From cacb14929748ae93eacefcfa194aa93689d217eb Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Lubo=C5=A1=20Lu=C5=88=C3=A1k?= <l.lunak@centrum.cz>
+Date: Fri, 29 Nov 2013 12:14:03 +0100
+Subject: [PATCH] support compiler color diagnostics if possible
+
+Clang and GCC (starting with 4.9) support color output if possible,
+but since ccache redirects stderr to a file, they detect the output
+is not a terminal and do not enable colors. Try to detect if colors
+would be used and force colors explicitly.
+
+Caveats:
+- Compiles with and without colors are considered different from each
+  other (so they are "duplicated").
+- GCC decided to roll its own name for the option, so it's necessary
+  to guess which compiler is actually used.
+
+--- ccache.c.orig	2014-03-02 00:16:33.335546870 -0600
++++ ccache.c	2014-03-02 00:16:35.888546332 -0600
+@@ -849,14 +849,42 @@ hash_compiler(struct mdfour *hash, struc
+ 		if (!hash_multicommand_output(hash, compilercheck, orig_args->argv[0])) {
+ 			fatal("Failure running compiler check command: %s", compilercheck);
+ 		}
+ 	}
+ }
+ 
+ /*
++ * Note that these compiler checks are unreliable, so nothing should hard-depend on them.
++ */
++
++static bool compiler_is_clang()
++{
++	const char* name = strrchr( orig_args->argv[ 0 ], '/' );
++	name = name ? name + 1 : orig_args->argv[ 0 ];
++#ifdef CC_IS_CLANG
++	if (strcmp(name, "cc") == 0 || strcmp(name, "CC") == 0 ||
++	    strcmp(name, "c++") == 0)
++	        return true;
++#endif
++	return strstr( name, "clang" ) != NULL;
++}
++
++static bool compiler_is_gcc()
++{
++	const char* name = strrchr(orig_args->argv[ 0 ], '/' );
++#ifdef CC_IS_GCC
++	if (strcmp(name, "cc") == 0 || strcmp(name, "CC") == 0 ||
++	    strcmp(name, "c++") == 0)
++	        return true;
++#endif
++	name = name ? name + 1 : orig_args->argv[ 0 ];
++	return strstr(name, "gcc") != NULL || strstr(name, "g++") != NULL;
++}
++
++/*
+  * Update a hash sum with information common for the direct and preprocessor
+  * modes.
+  */
+ static void
+ calculate_common_hash(struct args *args, struct mdfour *hash)
+ {
+ 	struct stat st;
+@@ -913,14 +941,23 @@ calculate_common_hash(struct args *args,
+ 				stats_update(STATS_BADEXTRAFILE);
+ 				failed();
+ 			}
+ 			q = NULL;
+ 		}
+ 		free(p);
+ 	}
++
++	/* Possibly hash GCC_COLORS (for color diagnostics). */
++	if (compiler_is_gcc()) {
++		const char* gcc_colors = getenv("GCC_COLORS");
++		if (gcc_colors != NULL) {
++			hash_delimiter(hash,"gcccolors");
++			hash_string(hash, gcc_colors);
++		}
++	}
+ }
+ 
+ /*
+  * Update a hash sum with information specific to the direct and preprocessor
+  * modes and calculate the object hash. Returns the object hash on success,
+  * otherwise NULL. Caller frees.
+  */
+@@ -1273,14 +1310,21 @@ find_compiler(int argc, char **argv)
+ 
+ bool
+ is_precompiled_header(const char *path)
+ {
+ 	return str_eq(get_extension(path), ".gch");
+ }
+ 
++static bool color_output_possible()
++{
++	const char* term_env = getenv("TERM");
++
++	return isatty(STDERR_FILENO) && term_env && strcasecmp(term_env, "DUMB") != 0;
++}
++
+ /*
+  * Process the compiler options into options suitable for passing to the
+  * preprocessor and the real compiler. The preprocessor options don't include
+  * -E; this is added later. Returns true on success, otherwise false.
+  */
+ bool
+ cc_process_args(struct args *orig_args, struct args **preprocessor_args,
+@@ -1301,14 +1345,15 @@ cc_process_args(struct args *orig_args, 
+ 	bool dependency_filename_specified = false;
+ 	/* is the dependency makefile target name specified with -MT or -MQ? */
+ 	bool dependency_target_specified = false;
+ 	struct args *stripped_args = NULL, *dep_args = NULL;
+ 	int argc = orig_args->argc;
+ 	char **argv = orig_args->argv;
+ 	bool result = true;
++	bool found_color_diagnostics = false;
+ 
+ 	stripped_args = args_init(0, NULL);
+ 	dep_args = args_init(0, NULL);
+ 
+ 	args_add(stripped_args, argv[0]);
+ 
+ 	for (i = 1; i < argc; i++) {
+@@ -1551,14 +1596,34 @@ cc_process_args(struct args *orig_args, 
+ 
+ 		/* Input charset needs to be handled specially. */
+ 		if (str_startswith(argv[i], "-finput-charset=")) {
+ 			input_charset = argv[i];
+ 			continue;
+ 		}
+ 
++		if (str_eq(argv[i], "-fcolor-diagnostics")
++		    || str_eq(argv[i], "-fno-color-diagnostics")
++		    || str_eq(argv[i], "-fdiagnostics-color")
++		    || str_eq(argv[i], "-fdiagnostics-color=always")
++		    || str_eq(argv[i], "-fno-diagnostics-color")
++		    || str_eq(argv[i], "-fdiagnostics-color=never")) {
++			args_add(stripped_args, argv[i]);
++			found_color_diagnostics = true;
++			continue;
++		}
++		if (str_eq(argv[i], "-fdiagnostics-color=auto")) {
++			if (color_output_possible()) {
++				/* Output is redirected, so color output must be forced. */
++				args_add(stripped_args, "-fdiagnostics-color=always");
++				cc_log("Automatically forcing colors");
++			}
++			found_color_diagnostics = true;
++			continue;
++		}
++
+ 		/*
+ 		 * Options taking an argument that that we may want to rewrite
+ 		 * to relative paths to get better hit rate. A secondary effect
+ 		 * is that paths in the standard error output produced by the
+ 		 * compiler will be normalized.
+ 		 */
+ 		if (compopt_takes_path(argv[i])) {
+@@ -1765,14 +1830,36 @@ cc_process_args(struct args *orig_args, 
+ 		cc_log("Not a regular file: %s", output_obj);
+ 		stats_update(STATS_DEVICE);
+ 		result = false;
+ 		goto out;
+ 	}
+ 
+ 	/*
++	 * Since output is redirected, compilers will not color their output by default,
++	 * so force it explicitly if it would be otherwise done.
++	 */
++	if (!found_color_diagnostics && color_output_possible()) {
++		if (compiler_is_clang()) {
++			args_add(stripped_args, "-fcolor-diagnostics");
++			cc_log("Automatically enabling colors");
++		} else if (compiler_is_gcc()) {
++			/*
++			 * GCC has it since 4.9, but that'd require detecting what GCC
++			 * version is used for the actual compile. However it requires
++			 * also GCC_COLORS to be set (and not empty), so use that
++			 * for detecting if GCC would use colors.
++			 */
++			if (getenv("GCC_COLORS") != NULL && getenv("GCC_COLORS")[ 0 ] != '\0') {
++				args_add(stripped_args, "-fdiagnostics-color");
++				cc_log("Automatically enabling colors");
++			}
++		}
++	}
++
++	/*
+ 	 * Some options shouldn't be passed to the real compiler when it compiles
+ 	 * preprocessed code:
+ 	 *
+ 	 * -finput-charset=XXX (otherwise conversion happens twice)
+ 	 * -x XXX (otherwise the wrong language is selected)
+ 	 */
+ 	*preprocessor_args = args_copy(stripped_args);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201403020623.s226N238093791>