diff --git a/doc/guix.texi b/doc/guix.texi
index f313ba5db43e25c4bb7c91ee8cb13dc92e246859..75ce6326029e0a35adf76a782f249c92aac85b84 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -2781,6 +2781,24 @@ the @code{package-derivation} procedure of the @code{(guix packages)}
 module, and to the @code{build-derivations} procedure of the @code{(guix
 store)} module.
 
+In addition to options explicitly passed on the command line,
+@command{guix build} and other @command{guix} commands that support
+building honor the @code{GUIX_BUILD_OPTIONS} environment variable.
+
+@defvr {Environment Variable} GUIX_BUILD_OPTIONS
+Users can define this variable to a list of command line options that
+will automatically be used by @command{guix build} and other
+@command{guix} commands that can perform builds, as in the example
+below:
+
+@example
+$ export GUIX_BUILD_OPTIONS="--no-substitutes -c 2 -L /foo/bar"
+@end example
+
+These options are appended to the ones passed on the command line.
+@end defvr
+
+
 @node Invoking guix download
 @section Invoking @command{guix download}
 
diff --git a/guix/scripts/archive.scm b/guix/scripts/archive.scm
index 84904e29da1bf6f87bfda0996a51bea40b48129f..29a3ad15a746c088512833b44669130542ed0863 100644
--- a/guix/scripts/archive.scm
+++ b/guix/scripts/archive.scm
@@ -293,7 +293,8 @@ (define (read-key)
 (define (guix-archive . args)
   (define (parse-options)
     ;; Return the alist of option values.
-    (args-fold* args %options
+    (args-fold* (append args (environment-build-options))
+                %options
                 (lambda (opt name arg result)
                   (leave (_ "~A: unrecognized option~%") name))
                 (lambda (arg result)
diff --git a/guix/scripts/build.scm b/guix/scripts/build.scm
index b4aa33b3a00f2c47b79ba73a2af07118130c29fa..76a743f0b3574fe456f071af5689d4856411d92a 100644
--- a/guix/scripts/build.scm
+++ b/guix/scripts/build.scm
@@ -401,7 +401,8 @@ (define new-sources
 (define (guix-build . args)
   (define (parse-options)
     ;; Return the alist of option values.
-    (args-fold* args %options
+    (args-fold* (append args (environment-build-options))
+                %options
                 (lambda (opt name arg result)
                   (leave (_ "~A: unrecognized option~%") name))
                 (lambda (arg result)
diff --git a/guix/scripts/environment.scm b/guix/scripts/environment.scm
index 81bad963f6f6bad25349ab38cf6c23e92f73cfa3..a309dfa362f249d0243f670e64786a2f732342aa 100644
--- a/guix/scripts/environment.scm
+++ b/guix/scripts/environment.scm
@@ -213,7 +213,8 @@ (define (build-inputs inputs opts)
 ;; Entry point.
 (define (guix-environment . args)
   (define (parse-options)
-    (args-fold* args %options
+    (args-fold* (append args (environment-build-options))
+                %options
                 (lambda (opt name arg result)
                   (leave (_ "~A: unrecognized option~%") name))
                 (lambda (arg result)
diff --git a/guix/scripts/package.scm b/guix/scripts/package.scm
index 3a72053766a59ef2720f21635cc90a0b625f2110..9ff4d17bf44227221dc32bf3c5264beff5b096ab 100644
--- a/guix/scripts/package.scm
+++ b/guix/scripts/package.scm
@@ -668,7 +668,8 @@ (define (readlink* file)
 (define (guix-package . args)
   (define (parse-options)
     ;; Return the alist of option values.
-    (args-fold* args %options
+    (args-fold* (append args (environment-build-options))
+                %options
                 (lambda (opt name arg result arg-handler)
                   (leave (_ "~A: unrecognized option~%") name))
                 (lambda (arg result arg-handler)
diff --git a/guix/scripts/system.scm b/guix/scripts/system.scm
index 398a5a371ba462007ce615575ab64e7f768f86d9..8ea77e4f3c58c59f231abbb45e3ce71d88d97f21 100644
--- a/guix/scripts/system.scm
+++ b/guix/scripts/system.scm
@@ -467,7 +467,8 @@ (define %default-options
 (define (guix-system . args)
   (define (parse-options)
     ;; Return the alist of option values.
-    (args-fold* args %options
+    (args-fold* (append args (environment-build-options))
+                %options
                 (lambda (opt name arg result)
                   (leave (_ "~A: unrecognized option~%") name))
                 (lambda (arg result)
diff --git a/guix/ui.scm b/guix/ui.scm
index 69b073da50b405866ceb22a9f1f656f7fa9e0f1a..c77e04172ee82f0a383527bbdf6a1ac1d8d67348 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -64,6 +64,7 @@ (define-module (guix ui)
             string->generations
             string->duration
             args-fold*
+            environment-build-options
             run-guix-command
             program-name
             guix-warning-port
@@ -712,6 +713,10 @@ (define (args-fold* options unrecognized-option-proc operand-proc . seeds)
       (leave (_ "invalid argument: ~a~%")
              (apply format #f msg args)))))
 
+(define (environment-build-options)
+  "Return additional build options passed as environment variables."
+  (arguments-from-environment-variable "GUIX_BUILD_OPTIONS"))
+
 (define (show-guix-usage)
   (format (current-error-port)
           (_ "Try `guix --help' for more information.~%"))
diff --git a/guix/utils.scm b/guix/utils.scm
index 9b802b6fb348e882f556ab5591a62e4f221bae2d..d0d2e8a3d446fa4bea03177a689280ea7a245e58 100644
--- a/guix/utils.scm
+++ b/guix/utils.scm
@@ -72,6 +72,7 @@ (define-module (guix utils)
             package-name->name+version
             string-tokenize*
             string-replace-substring
+            arguments-from-environment-variable
             file-extension
             file-sans-extension
             call-with-temporary-output-file
@@ -627,6 +628,15 @@ (define* (string-replace-substring str substr replacement
                        (substring str start index)
                        pieces))))))))
 
+(define (arguments-from-environment-variable variable)
+  "Retrieve value of environment variable denoted by string VARIABLE in the
+form of a list of strings (`char-set:graphic' tokens) suitable for consumption
+by `args-fold', if VARIABLE is defined, otherwise return an empty list."
+  (let ((env (getenv variable)))
+    (if env
+        (string-tokenize env char-set:graphic)
+        '())))
+
 (define (call-with-temporary-output-file proc)
   "Call PROC with a name of a temporary file and open output port to that
 file; close the file and delete it when leaving the dynamic extent of this
diff --git a/test-env.in b/test-env.in
index 39b205dc8a5105ccf059be1724bcbff4ad1f2217..f66a0db555ea7b93efb27cf0b5a27924408afdc6 100644
--- a/test-env.in
+++ b/test-env.in
@@ -99,8 +99,8 @@ unset LANGUAGE
 LC_MESSAGES=C
 export LC_MESSAGES
 
-# Ignore user modules.
-unset GUIX_PACKAGE_PATH
+# Ignore user settings.
+unset GUIX_PACKAGE_PATH GUIX_BUILD_OPTIONS
 
 storedir="@storedir@"
 prefix="@prefix@"
diff --git a/tests/guix-build.sh b/tests/guix-build.sh
index 27b3fdc39e8c1e79f3d43305cee8a89b6d15b38b..836c45e776cf7cded8a0257f52d67c3523d81967 100644
--- a/tests/guix-build.sh
+++ b/tests/guix-build.sh
@@ -84,3 +84,13 @@ guix build -e "(begin
 # Running a gexp.
 guix build -e '#~(mkdir #$output)' -d
 guix build -e '#~(mkdir #$output)' -d | grep 'gexp\.drv'
+
+# Using 'GUIX_BUILD_OPTIONS'.
+GUIX_BUILD_OPTIONS="--dry-run"
+export GUIX_BUILD_OPTIONS
+
+guix build emacs
+
+GUIX_BUILD_OPTIONS="--something-completely-crazy"
+if guix build emacs;
+then false; else true; fi