Makefiles: Position target-wide link flags consistently with other generators

In particular, the `LINK_OPTIONS` target property was not placed
on link lines consistently with other generators.

Fixes: #27326
diff --git a/Source/cmMakefileLibraryTargetGenerator.cxx b/Source/cmMakefileLibraryTargetGenerator.cxx
index 9493dc9..54074f9 100644
--- a/Source/cmMakefileLibraryTargetGenerator.cxx
+++ b/Source/cmMakefileLibraryTargetGenerator.cxx
@@ -176,7 +176,6 @@
   }
 
   std::string extraFlags;
-  this->GetTargetLinkFlags(extraFlags, linkLanguage);
   this->LocalGenerator->AppendTargetCreationLinkFlags(
     extraFlags, this->GeneratorTarget, linkLanguage);
   this->LocalGenerator->AddConfigVariableFlags(
@@ -195,6 +194,8 @@
   this->UseLWYU = this->LocalGenerator->AppendLWYUFlags(
     extraFlags, this->GeneratorTarget, linkLanguage);
 
+  this->GetTargetLinkFlags(extraFlags, linkLanguage);
+
   this->WriteLibraryRules(linkRuleVar, extraFlags, relink);
 }
 
@@ -214,7 +215,6 @@
     cmStrCat("CMAKE_", linkLanguage, "_CREATE_SHARED_MODULE");
 
   std::string extraFlags;
-  this->GetTargetLinkFlags(extraFlags, linkLanguage);
   this->LocalGenerator->AppendTargetCreationLinkFlags(
     extraFlags, this->GeneratorTarget, linkLanguage);
   this->LocalGenerator->AddConfigVariableFlags(
@@ -233,6 +233,8 @@
   this->UseLWYU = this->LocalGenerator->AppendLWYUFlags(
     extraFlags, this->GeneratorTarget, linkLanguage);
 
+  this->GetTargetLinkFlags(extraFlags, linkLanguage);
+
   this->WriteLibraryRules(linkRuleVar, extraFlags, relink);
 }
 
@@ -244,12 +246,12 @@
     cmStrCat("CMAKE_", linkLanguage, "_CREATE_MACOSX_FRAMEWORK");
 
   std::string extraFlags;
-  this->GetTargetLinkFlags(extraFlags, linkLanguage);
   this->LocalGenerator->AppendTargetCreationLinkFlags(
     extraFlags, this->GeneratorTarget, linkLanguage);
   this->LocalGenerator->AddConfigVariableFlags(
     extraFlags, "CMAKE_MACOSX_FRAMEWORK_LINKER_FLAGS", this->GeneratorTarget,
     cmBuildStep::Link, linkLanguage, this->GetConfigName());
+  this->GetTargetLinkFlags(extraFlags, linkLanguage);
 
   this->WriteLibraryRules(linkRuleVar, extraFlags, relink);
 }
diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt
index e63bf42..35ce7e2 100644
--- a/Tests/RunCMake/CMakeLists.txt
+++ b/Tests/RunCMake/CMakeLists.txt
@@ -1014,7 +1014,8 @@
                                                       -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID}
                                                       -DCMAKE_C_COMPILER_FRONTEND_VARIANT=${CMAKE_C_COMPILER_FRONTEND_VARIANT})
 add_RunCMake_test(add_link_options -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID})
-add_RunCMake_test(target_link_options -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID}
+add_RunCMake_test(target_link_options -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}
+                                      -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID}
                                       -DCMake_TEST_CUDA=${CMake_TEST_CUDA})
 set_property(TEST RunCMake.target_link_options APPEND
   PROPERTY LABELS "CUDA")
diff --git a/Tests/RunCMake/target_link_options/RunCMakeTest.cmake b/Tests/RunCMake/target_link_options/RunCMakeTest.cmake
index 5562c9e..45ef4a3 100644
--- a/Tests/RunCMake/target_link_options/RunCMakeTest.cmake
+++ b/Tests/RunCMake/target_link_options/RunCMakeTest.cmake
@@ -32,6 +32,18 @@
   run_cmake_target(LINK_OPTIONS exe LinkOptions_exe --config Release)
   run_cmake_target(LINK_OPTIONS dollar-option LinkOptions_dollar_exe --config Release)
 
+  if(CMAKE_SYSTEM_NAME MATCHES "(Linux|Darwin)" AND
+      RunCMake_GENERATOR MATCHES "(Ninja|Makefiles)")
+
+    run_cmake(position_LINK_OPTIONS)
+
+    run_cmake_target(position_LINK_OPTIONS shared LinkOptions_shared ${VERBOSE})
+    run_cmake_target(position_LINK_OPTIONS module LinkOptions_module ${VERBOSE})
+    if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+      run_cmake_target(position_LINK_OPTIONS framework LinkOptions_framework ${VERBOSE})
+    endif()
+  endif()
+
   run_cmake(genex_LINK_LANGUAGE)
 
   run_cmake_target(genex_LINK_LANGUAGE interface LinkOptions_shared_interface --config Release)
diff --git a/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-framework-check.cmake b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-framework-check.cmake
new file mode 100644
index 0000000..0f0de1c
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-framework-check.cmake
@@ -0,0 +1,4 @@
+
+if (NOT actual_stdout MATCHES "BADFLAG_GLOBAL(\.[a-z]+)? +(-)?BADFLAG_PRIVATE")
+  set (RunCMake_TEST_FAILED "options order is not respected.")
+endif()
diff --git a/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-framework-result.txt b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-framework-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-framework-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-module-check.cmake b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-module-check.cmake
new file mode 100644
index 0000000..0f0de1c
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-module-check.cmake
@@ -0,0 +1,4 @@
+
+if (NOT actual_stdout MATCHES "BADFLAG_GLOBAL(\.[a-z]+)? +(-)?BADFLAG_PRIVATE")
+  set (RunCMake_TEST_FAILED "options order is not respected.")
+endif()
diff --git a/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-module-result.txt b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-module-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-module-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-shared-check.cmake b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-shared-check.cmake
new file mode 100644
index 0000000..0f0de1c
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-shared-check.cmake
@@ -0,0 +1,4 @@
+
+if (NOT actual_stdout MATCHES "BADFLAG_GLOBAL(\.[a-z]+)? +(-)?BADFLAG_PRIVATE")
+  set (RunCMake_TEST_FAILED "options order is not respected.")
+endif()
diff --git a/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-shared-result.txt b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-shared-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-shared-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_options/position_LINK_OPTIONS.cmake b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS.cmake
new file mode 100644
index 0000000..1a0c8d3
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS.cmake
@@ -0,0 +1,28 @@
+
+enable_language(C)
+
+set(obj "${CMAKE_C_OUTPUT_EXTENSION}")
+if(BORLAND)
+  set(pre -)
+endif()
+
+set(CMAKE_VERBOSE_MAKEFILE TRUE)
+set(CMAKE_C_USE_RESPONSE_FILE_FOR_LIBRARIES FALSE)
+
+# shared configuration
+string(APPEND CMAKE_SHARED_LINKER_FLAGS " ${pre}BADFLAG_GLOBAL${obj}")
+add_library(LinkOptions_shared SHARED LinkOptionsLib.c)
+target_link_options(LinkOptions_shared PRIVATE ${pre}BADFLAG_PRIVATE${obj})
+
+# module configuration
+string(APPEND CMAKE_MODULE_LINKER_FLAGS " ${pre}BADFLAG_GLOBAL${obj}")
+add_library(LinkOptions_module MODULE LinkOptionsLib.c)
+target_link_options(LinkOptions_module PRIVATE ${pre}BADFLAG_PRIVATE${obj})
+
+if (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+  # framework configuration
+  string(APPEND CMAKE_MACOSX_FRAMEWORK_LINKER_FLAGS " ${pre}BADFLAG_GLOBAL${obj}")
+  add_library(LinkOptions_framework SHARED LinkOptionsLib.c)
+  set_property(TARGET LinkOptions_framework PROPERTY FRAMEWORK TRUE)
+  target_link_options(LinkOptions_framework PRIVATE ${pre}BADFLAG_PRIVATE${obj})
+endif()