Some settings are boolean values (i.e. truth values). In a configuration file,
such values must be set to the string *true* or *false*. For the corresponding
environment variables, the semantics are a bit different: a set environment
-variable means ``true'' regardless of the value (even if set to the empty
-string), and an unset environment variable means ``false''. Each boolean
-environment variable also has a negated form starting with *CCACHE_NO*. For
-example, *CCACHE_COMPRESS* can be set to force compression and
-*CCACHE_NOCOMPRESS* can be set to force no compression.
+variable means ``true'' (even if set to the empty string), the following
+case-insensitive negative values are considered an error (rather than surprise
+the user): "0", "false", "disable" and "no", and an unset environment variable
+means ``false''. Each boolean environment variable also has a negated form
+starting with *CCACHE_NO*. For example, *CCACHE_COMPRESS* can be set to force
+compression and *CCACHE_NOCOMPRESS* can be set to force no compression.
Configuration settings
- Added support for nvcc compiler options `--compiler-bindir/-ccbin`,
`--output-directory/-odir` and `--libdevice-directory/-ldir`.
+- Boolean configuration settings no longer accept the following
+ (case-insensitive) values: "0", "false", "disable" and "no". All other values
+ are accepted and taken to mean "true". This is intended to avoid users
+ setting eg CCACHE_DISABLE=0 and expecting the cache to be used.
+
Bug fixes
~~~~~~~~~
-// Copyright (C) 2011-2016 Joel Rosdahl
+// Copyright (C) 2011-2018 Joel Rosdahl
//
// 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
}
if (from_env_variable && item->parser == parse_bool) {
- // Special rule for boolean settings from the environment: any value means
- // true.
+ // Special rule for boolean settings from the environment:
+ // "0", "false", "disable" and "no" (case insensitive) are invalid,
+ // and all other values mean true.
+ //
+ // Previously any value meant true, but this was surprising to
+ // users, who might do something like CCACHE_DISABLE=0 and expect
+ // ccache to be enabled.
+
+ if (!strcmp(value, "0") || !strcasecmp(value, "false") ||
+ !strcasecmp(value, "disable") || !strcasecmp(value, "no")) {
+ fatal("invalid boolean environment variable value \"%s\"", value);
+ }
+
bool *value = (bool *)((char *)conf + item->offset);
*value = !negate_boolean;
goto out;
if [ "$stderr" != "2Pu1Cc" ]; then
test_failed "Unexpected stderr: $stderr != 2Pu1Cc"
fi
+
+ # -------------------------------------------------------------------------
+ TEST "Invalid boolean environment configuration options"
+
+ for invalid_val in 0 false FALSE disable no ; do
+ CCACHE_DISABLE=$invalid_val $CCACHE $COMPILER --version > /dev/null 2>&1
+ if [ $? -eq 0 ] ; then
+ test_failed "'$invalid_val' should be rejected for boolean env vars"
+ fi
+ CCACHE_NODISABLE=$invalid_val $CCACHE $COMPILER --version > /dev/null 2>&1
+ if [ $? -eq 0 ] ; then
+ test_failed "'$invalid_val' should be rejected for boolean env vars"
+ fi
+ done
}
# =============================================================================