From acc6cfd1dcc8dfcfa416ef67b0d97f27bbde9281 Mon Sep 17 00:00:00 2001 From: Oskar Eichler Date: Fri, 28 Aug 2026 03:41:30 +0300 Subject: [PATCH 1/2] Merge compiler flags in linear time --- lib/pkg-config.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/pkg-config.rb b/lib/pkg-config.rb index 542d67c..5fb9b32 100644 --- a/lib/pkg-config.rb +++ b/lib/pkg-config.rb @@ -585,15 +585,15 @@ def normalize_cflags(cflags) # https://github.com/pkgconf/pkgconf/blob/pkgconf-2.5.1/libpkgconf/fragment.c#L381-L416 def merge_back_cflags(cflags) merge_backed_cflags = [] - cflags.each do |cflag| + seen = {} + cflags.reverse_each do |cflag| if mergeable_flag?(cflag) - # NOTE: This may be slow because this checks merge_back_cflags N times - # (where N is the number of mergeable flags). - merge_backed_cflags.delete(cflag) + next if seen.key?(cflag) + seen[cflag] = true end merge_backed_cflags << cflag end - merge_backed_cflags + merge_backed_cflags.reverse! end def mergeable_flag?(flag) From d9383ad6a59bf8c24e11001eea8ff2eeaa66eeb8 Mon Sep 17 00:00:00 2001 From: Oskar Eichler <62393985+OskarEichler@users.noreply.github.com> Date: Fri, 28 Aug 2026 15:18:49 +0300 Subject: [PATCH 2/2] Add regression coverage for merge compiler flags in linear time --- test/test-pkg-config.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/test-pkg-config.rb b/test/test-pkg-config.rb index 67893b3..2f703fd 100644 --- a/test/test-pkg-config.rb +++ b/test/test-pkg-config.rb @@ -343,5 +343,11 @@ def test_mixed merge_back_cflags(["-DFOO", "-Wall", "-Wl,--as-needed", "-DFOO", "-Wall", "-Wl,--as-needed"])) end + + def test_preserves_the_last_mergeable_occurrence + assert_equal(["-O2", "-DFOO", "-Wextra", "-O3"], + merge_back_cflags(["-DFOO", "-O2", "-DFOO", + "-Wextra", "-O3"])) + end end end