Non-working fix and test. Closes #8361.
diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py
index b12728b..7bcdfea 100644
--- a/mesonbuild/environment.py
+++ b/mesonbuild/environment.py
@@ -823,11 +823,20 @@
                         for lang in compilers.compilers.LANGUAGES_USING_CPPFLAGS:
                             key = key.evolve(lang=lang)
                             v = mesonlib.listify(self.options.get(key, []))
-                            self.options.setdefault(key, v + p_list)
+                            if self.is_cross_build():
+                                # Only "build." options come from environment variables.
+                                if key.machine is MachineChoice.BUILD:
+                                    self.options.setdefault(key, v + p_list)
+                            else:
+                                self.options[key] = v + p_list
                     else:
                         key = OptionKey.from_string(keyname).evolve(machine=for_machine)
                         v = mesonlib.listify(self.options.get(key, []))
-                        self.options.setdefault(key, v + p_list)
+                        if self.is_cross_build():
+                            if key.machine is MachineChoice.BUILD:
+                                self.options.setdefault(key, v + p_list)
+                        else:
+                            self.options[key] = v + p_list
 
     def _set_default_binaries_from_env(self) -> None:
         """Set default binaries from the environment.
diff --git a/run_unittests.py b/run_unittests.py
index 8083342..b43bd99 100755
--- a/run_unittests.py
+++ b/run_unittests.py
@@ -5476,6 +5476,14 @@
         projinfo = self.introspect('--projectinfo')
         self.assertEqual(projinfo['version'], '1.0.0')
 
+    def test_cflags_cppflags(self):
+        envs = {'CPPFLAGS': '-DCPPFLAG',
+                'CFLAGS': '-DCFLAG',
+                'CXXFLAGS': '-DCXXFLAG'}
+        srcdir = os.path.join(self.unit_test_dir, '90 multiple envvars')
+        self.init(srcdir, override_envvars=envs)
+        self.build()
+
 
 class FailureTests(BasePlatformTests):
     '''
diff --git a/test cases/unit/90 multiple envvars/meson.build b/test cases/unit/90 multiple envvars/meson.build
new file mode 100644
index 0000000..ac57611
--- /dev/null
+++ b/test cases/unit/90 multiple envvars/meson.build
@@ -0,0 +1,4 @@
+project('multienv', 'c', 'cpp')
+
+executable('cexe', 'prog.c')
+executable('cppexe', 'prog.cpp')
diff --git a/test cases/unit/90 multiple envvars/prog.c b/test cases/unit/90 multiple envvars/prog.c
new file mode 100644
index 0000000..38d3c12
--- /dev/null
+++ b/test cases/unit/90 multiple envvars/prog.c
@@ -0,0 +1,18 @@
+#include<stdio.h>
+
+#ifndef CPPFLAG
+#error CPPFLAG not set
+#endif
+
+#ifndef CFLAG
+#error CFLAGS not set
+#endif
+
+#ifdef CXXFLAG
+#error CXXFLAG is set
+#endif
+
+int main(int argc, char **argv) {
+    printf("%d %s\n", argc, argv[0]);
+    return 0;
+}
diff --git a/test cases/unit/90 multiple envvars/prog.cpp b/test cases/unit/90 multiple envvars/prog.cpp
new file mode 100644
index 0000000..61ccf3a
--- /dev/null
+++ b/test cases/unit/90 multiple envvars/prog.cpp
@@ -0,0 +1,18 @@
+#include<cstdio>
+
+#ifndef CPPFLAG
+#error CPPFLAG not set
+#endif
+
+#ifdef CFLAG
+#error CFLAG is set
+#endif
+
+#ifndef CXXFLAG
+#error CXXFLAG not set
+#endif
+
+int main(int argc, char **argv) {
+    printf("%d %s\n", argc, argv[0]);
+    return 0;
+}