diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py
index 2105d42..7381eb5 100644
--- a/mesonbuild/backend/backends.py
+++ b/mesonbuild/backend/backends.py
@@ -532,10 +532,10 @@
         # Add buildtype args: optimization level, debugging, etc.
         commands += compiler.get_buildtype_args(self.get_option_for_target('buildtype', target))
         # Add compile args added using add_project_arguments()
-        commands += self.build.get_project_args(compiler, target.subproject)
+        commands += self.build.get_project_args(compiler, target.subproject, target.is_cross)
         # Add compile args added using add_global_arguments()
         # These override per-project arguments
-        commands += self.build.get_global_args(compiler)
+        commands += self.build.get_global_args(compiler, target.is_cross)
         if not target.is_cross:
             # Compile args added from the env: CFLAGS/CXXFLAGS, etc. We want these
             # to override all the defaults, but not the per-target compile args.
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py
index 913830f..cea548c 100644
--- a/mesonbuild/backend/ninjabackend.py
+++ b/mesonbuild/backend/ninjabackend.py
@@ -853,8 +853,8 @@
 
         for dep in target.get_external_deps():
             commands.extend_direct(dep.get_link_args())
-        commands += self.build.get_project_args(compiler, target.subproject)
-        commands += self.build.get_global_args(compiler)
+        commands += self.build.get_project_args(compiler, target.subproject, target.is_cross)
+        commands += self.build.get_global_args(compiler, target.is_cross)
 
         elem = NinjaBuildElement(self.all_outputs, outputs, 'cs_COMPILER', rel_srcs)
         elem.add_dep(deps)
@@ -867,8 +867,8 @@
         deps = [os.path.join(self.get_target_dir(l), l.get_filename()) for l in target.link_targets]
         args = []
         args += compiler.get_buildtype_args(self.get_option_for_target('buildtype', target))
-        args += self.build.get_global_args(compiler)
-        args += self.build.get_project_args(compiler, target.subproject)
+        args += self.build.get_global_args(compiler, target.is_cross)
+        args += self.build.get_project_args(compiler, target.subproject, target.is_cross)
         args += target.get_java_args()
         args += compiler.get_output_args(self.get_target_private_dir(target))
         args += target.get_classpath_args()
@@ -1242,8 +1242,8 @@
         os.makedirs(self.get_target_private_dir_abs(target), exist_ok=True)
         compile_args = swiftc.get_compile_only_args()
         compile_args += swiftc.get_module_args(module_name)
-        compile_args += self.build.get_project_args(swiftc, target.subproject)
-        compile_args += self.build.get_global_args(swiftc)
+        compile_args += self.build.get_project_args(swiftc, target.subproject, target.is_cross)
+        compile_args += self.build.get_global_args(swiftc, target.is_cross)
         for i in reversed(target.get_include_dirs()):
             basedir = i.get_curdir()
             for d in i.get_incdirs():
@@ -1255,8 +1255,8 @@
                 sargs = swiftc.get_include_args(srctreedir)
                 compile_args += sargs
         link_args = swiftc.get_output_args(os.path.join(self.environment.get_build_dir(), self.get_target_filename(target)))
-        link_args += self.build.get_project_link_args(swiftc, target.subproject)
-        link_args += self.build.get_global_link_args(swiftc)
+        link_args += self.build.get_project_link_args(swiftc, target.subproject, target.is_cross)
+        link_args += self.build.get_global_link_args(swiftc, target.is_cross)
         rundir = self.get_target_private_dir(target)
         out_module_name = self.swift_module_file_name(target)
         in_module_files = self.determine_swift_dep_modules(target)
@@ -2389,10 +2389,10 @@
 
         if not isinstance(target, build.StaticLibrary):
             # Add link args added using add_project_link_arguments()
-            commands += self.build.get_project_link_args(linker, target.subproject)
+            commands += self.build.get_project_link_args(linker, target.subproject, target.is_cross)
             # Add link args added using add_global_link_arguments()
             # These override per-project link arguments
-            commands += self.build.get_global_link_args(linker)
+            commands += self.build.get_global_link_args(linker, target.is_cross)
             if not target.is_cross:
                 # Link args added from the env: LDFLAGS. We want these to
                 # override all the defaults but not the per-target link args.
diff --git a/mesonbuild/build.py b/mesonbuild/build.py
index a3cd993..54bb050 100644
--- a/mesonbuild/build.py
+++ b/mesonbuild/build.py
@@ -104,9 +104,13 @@
         self.compilers = OrderedDict()
         self.cross_compilers = OrderedDict()
         self.global_args = {}
+        self.global_cross_args = {}
         self.projects_args = {}
+        self.projects_cross_args = {}
         self.global_link_args = {}
+        self.global_cross_link_args = {}
         self.projects_link_args = {}
+        self.projects_cross_link_args = {}
         self.tests = []
         self.benchmarks = []
         self.headers = []
@@ -167,20 +171,30 @@
     def get_install_subdirs(self):
         return self.install_dirs
 
-    def get_global_args(self, compiler):
+    def get_global_args(self, compiler, is_cross):
+        if is_cross:
+            return self.global_cross_args.get(compiler.get_language(), [])
         return self.global_args.get(compiler.get_language(), [])
 
-    def get_project_args(self, compiler, project):
-        args = self.projects_args.get(project)
+    def get_project_args(self, compiler, project, is_cross):
+        if is_cross:
+            args = self.projects_cross_args.get(project)
+        else:
+            args = self.projects_args.get(project)
         if not args:
             return []
         return args.get(compiler.get_language(), [])
 
-    def get_global_link_args(self, compiler):
+    def get_global_link_args(self, compiler, is_cross):
+        if is_cross:
+            return self.global_cross_link_args.get(compiler.get_language(), [])
         return self.global_link_args.get(compiler.get_language(), [])
 
-    def get_project_link_args(self, compiler, project):
-        link_args = self.projects_link_args.get(project)
+    def get_project_link_args(self, compiler, project, is_cross):
+        if is_cross:
+            link_args = self.projects_cross_link_args.get(project)
+        else:
+            link_args = self.projects_link_args.get(project)
         if not link_args:
             return []
 
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 95fc408..a823f53 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -3630,25 +3630,38 @@
                                                              timeout_multiplier=timeout_multiplier,
                                                              env=env)
 
+    def use_cross_list(self, kwargs):
+        if 'native' in kwargs:
+            b = kwargs['native']
+            if not isinstance(b, bool):
+                raise InterpreterException('Native keyword must be boolean.')
+            return not b
+        else:
+            return self.environment.is_cross_build()
+
     @permittedKwargs(permitted_kwargs['add_global_arguments'])
     @stringArgs
     def func_add_global_arguments(self, node, args, kwargs):
-        self.add_global_arguments(node, self.build.global_args, args, kwargs)
+        arg_obj = self.build.global_cross_args if self.use_cross_list(kwargs) else self.build.global_args
+        self.add_global_arguments(node, arg_obj, args, kwargs)
 
     @permittedKwargs(permitted_kwargs['add_global_link_arguments'])
     @stringArgs
     def func_add_global_link_arguments(self, node, args, kwargs):
-        self.add_global_arguments(node, self.build.global_link_args, args, kwargs)
+        arg_obj = self.build.global_cross_link_args if self.use_cross_list(kwargs) else self.build.global_link_args
+        self.add_global_arguments(node, arg_obj, args, kwargs)
 
     @permittedKwargs(permitted_kwargs['add_project_arguments'])
     @stringArgs
     def func_add_project_arguments(self, node, args, kwargs):
-        self.add_project_arguments(node, self.build.projects_args, args, kwargs)
+        arg_obj = self.build.projects_cross_args if self.use_cross_list(kwargs) else self.build.projects_args
+        self.add_project_arguments(node, arg_obj, args, kwargs)
 
     @permittedKwargs(permitted_kwargs['add_project_link_arguments'])
     @stringArgs
     def func_add_project_link_arguments(self, node, args, kwargs):
-        self.add_project_arguments(node, self.build.projects_link_args, args, kwargs)
+        arg_obj = self.build.projects_cross_link_args if self.use_cross_list(kwargs) else self.build.projects_link_args
+        self.add_project_arguments(node, arg_obj, args, kwargs)
 
     def add_global_arguments(self, node, argsdict, args, kwargs):
         if self.is_subproject():
