Skip to content

Commit 65c7c23

Browse files
committed
Merge pull request #9676 from ruby/bsd-make-jobserver-skip
Skip the make job server when using BSD make (cherry picked from commit 81c7eb5)
1 parent ac6835a commit 65c7c23

2 files changed

Lines changed: 53 additions & 1 deletion

File tree

‎bundler/lib/bundler/installer/parallel_installer.rb‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ def with_jobserver
125125
# every native extension build with `fatal error U1065: invalid option
126126
# '-'`. Skip the jobserver when nmake is in use. Other Windows toolchains
127127
# such as mingw use GNU make and keep working through the inherited pipe.
128-
return yield if nmake?
128+
return yield if nmake? || bsd_make?
129129

130130
begin
131131
r, w = IO.pipe
@@ -155,6 +155,12 @@ def nmake?
155155
/\bnmake/i.match?(make.to_s)
156156
end
157157

158+
def bsd_make?
159+
return false unless Gem.freebsd_platform?
160+
make = ENV["MAKE"] || ENV["make"] || "make"
161+
!/\bgmake/i.match?(make)
162+
end
163+
158164
def install_serially
159165
until finished_installing?
160166
raise "failed to find a spec to enqueue while installing serially" unless spec_install = @specs.find(&:ready_to_enqueue?)

‎bundler/spec/bundler/installer/parallel_installer_spec.rb‎

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,4 +246,50 @@ def redefine_build_jobs
246246
expect(makeflags_during).to eq(makeflags_before)
247247
end
248248
end
249+
250+
describe "make jobserver on BSD" do
251+
# BSD make (the default `make` on FreeBSD) can't parse the GNU
252+
# `--jobserver-auth` and aborts every native extension build, so the
253+
# jobserver must be skipped there.
254+
it "leaves MAKEFLAGS untouched" do
255+
parallel_installer = Bundler::ParallelInstaller.new(nil, [], 5, false, false)
256+
257+
makeflags_before = ENV["MAKEFLAGS"]
258+
makeflags_during = :not_yielded
259+
260+
old_make = ENV["MAKE"]
261+
ENV.delete("MAKE")
262+
allow(Gem).to receive(:freebsd_platform?).and_return(true)
263+
begin
264+
parallel_installer.send(:with_jobserver) do
265+
makeflags_during = ENV["MAKEFLAGS"]
266+
end
267+
ensure
268+
ENV["MAKE"] = old_make
269+
end
270+
271+
expect(makeflags_during).to eq(makeflags_before)
272+
end
273+
274+
# A BSD user who opts into gmake gets a make that understands the
275+
# jobserver, so it should still be set up.
276+
it "sets up the jobserver when gmake is used" do
277+
parallel_installer = Bundler::ParallelInstaller.new(nil, [], 5, false, false)
278+
279+
makeflags_during = :not_yielded
280+
281+
old_make = ENV["MAKE"]
282+
ENV["MAKE"] = "gmake"
283+
allow(Gem).to receive(:freebsd_platform?).and_return(true)
284+
begin
285+
parallel_installer.send(:with_jobserver) do
286+
makeflags_during = ENV["MAKEFLAGS"]
287+
end
288+
ensure
289+
ENV["MAKE"] = old_make
290+
end
291+
292+
expect(makeflags_during).to include("--jobserver-auth=")
293+
end
294+
end
249295
end

0 commit comments

Comments
 (0)