1*cc02d7e2SAndroid Build Coastguard Worker# Copyright 2015 gRPC authors. 2*cc02d7e2SAndroid Build Coastguard Worker# 3*cc02d7e2SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*cc02d7e2SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*cc02d7e2SAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*cc02d7e2SAndroid Build Coastguard Worker# 7*cc02d7e2SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*cc02d7e2SAndroid Build Coastguard Worker# 9*cc02d7e2SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*cc02d7e2SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*cc02d7e2SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*cc02d7e2SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*cc02d7e2SAndroid Build Coastguard Worker# limitations under the License. 14*cc02d7e2SAndroid Build Coastguard Worker 15*cc02d7e2SAndroid Build Coastguard Workerrequire 'etc' 16*cc02d7e2SAndroid Build Coastguard Workerrequire 'mkmf' 17*cc02d7e2SAndroid Build Coastguard Workerrequire_relative '../../lib/grpc/version.rb' 18*cc02d7e2SAndroid Build Coastguard Worker 19*cc02d7e2SAndroid Build Coastguard Workerwindows = RUBY_PLATFORM =~ /mingw|mswin/ 20*cc02d7e2SAndroid Build Coastguard Workerwindows_ucrt = RUBY_PLATFORM =~ /(mingw|mswin).*ucrt/ 21*cc02d7e2SAndroid Build Coastguard Workerbsd = RUBY_PLATFORM =~ /bsd/ 22*cc02d7e2SAndroid Build Coastguard Workerdarwin = RUBY_PLATFORM =~ /darwin/ 23*cc02d7e2SAndroid Build Coastguard Workerlinux = RUBY_PLATFORM =~ /linux/ 24*cc02d7e2SAndroid Build Coastguard Workercross_compiling = ENV['RCD_HOST_RUBY_VERSION'] # set by rake-compiler-dock in build containers 25*cc02d7e2SAndroid Build Coastguard Worker# TruffleRuby uses the Sulong LLVM runtime, which is different from Apple's. 26*cc02d7e2SAndroid Build Coastguard Workerapple_toolchain = darwin && RUBY_ENGINE != 'truffleruby' 27*cc02d7e2SAndroid Build Coastguard Worker 28*cc02d7e2SAndroid Build Coastguard Workergrpc_root = File.expand_path(File.join(File.dirname(__FILE__), '../../../..')) 29*cc02d7e2SAndroid Build Coastguard Worker 30*cc02d7e2SAndroid Build Coastguard Workergrpc_config = ENV['GRPC_CONFIG'] || 'opt' 31*cc02d7e2SAndroid Build Coastguard Worker 32*cc02d7e2SAndroid Build Coastguard WorkerENV['MACOSX_DEPLOYMENT_TARGET'] = '10.10' 33*cc02d7e2SAndroid Build Coastguard Worker 34*cc02d7e2SAndroid Build Coastguard Workerdef debug_symbols_output_dir 35*cc02d7e2SAndroid Build Coastguard Worker d = ENV['GRPC_RUBY_DEBUG_SYMBOLS_OUTPUT_DIR'] 36*cc02d7e2SAndroid Build Coastguard Worker return nil if d.nil? or d.size == 0 37*cc02d7e2SAndroid Build Coastguard Worker d 38*cc02d7e2SAndroid Build Coastguard Workerend 39*cc02d7e2SAndroid Build Coastguard Worker 40*cc02d7e2SAndroid Build Coastguard Workerdef maybe_remove_strip_all_linker_flag(flags) 41*cc02d7e2SAndroid Build Coastguard Worker if debug_symbols_output_dir 42*cc02d7e2SAndroid Build Coastguard Worker # Hack to prevent automatic stripping during shared library linking. 43*cc02d7e2SAndroid Build Coastguard Worker # rake-compiler-dock sets the -s LDFLAG when building rubies for 44*cc02d7e2SAndroid Build Coastguard Worker # cross compilation, and this -s flag propagates into RbConfig. Stripping 45*cc02d7e2SAndroid Build Coastguard Worker # during the link is problematic because it prevents us from saving 46*cc02d7e2SAndroid Build Coastguard Worker # debug symbols. We want to first link our shared library, then save 47*cc02d7e2SAndroid Build Coastguard Worker # debug symbols, and only after that strip. 48*cc02d7e2SAndroid Build Coastguard Worker flags = flags.split(' ') 49*cc02d7e2SAndroid Build Coastguard Worker flags = flags.reject {|flag| flag == '-s'} 50*cc02d7e2SAndroid Build Coastguard Worker flags = flags.join(' ') 51*cc02d7e2SAndroid Build Coastguard Worker end 52*cc02d7e2SAndroid Build Coastguard Worker flags 53*cc02d7e2SAndroid Build Coastguard Workerend 54*cc02d7e2SAndroid Build Coastguard Worker 55*cc02d7e2SAndroid Build Coastguard Workerdef env_unset?(name) 56*cc02d7e2SAndroid Build Coastguard Worker ENV[name].nil? || ENV[name].size == 0 57*cc02d7e2SAndroid Build Coastguard Workerend 58*cc02d7e2SAndroid Build Coastguard Worker 59*cc02d7e2SAndroid Build Coastguard Workerdef inherit_env_or_rbconfig(name) 60*cc02d7e2SAndroid Build Coastguard Worker ENV[name] = inherit_rbconfig(name) if env_unset?(name) 61*cc02d7e2SAndroid Build Coastguard Workerend 62*cc02d7e2SAndroid Build Coastguard Worker 63*cc02d7e2SAndroid Build Coastguard Workerdef inherit_rbconfig(name, linker_flag: false) 64*cc02d7e2SAndroid Build Coastguard Worker value = RbConfig::CONFIG[name] || '' 65*cc02d7e2SAndroid Build Coastguard Worker if linker_flag 66*cc02d7e2SAndroid Build Coastguard Worker value = maybe_remove_strip_all_linker_flag(value) 67*cc02d7e2SAndroid Build Coastguard Worker end 68*cc02d7e2SAndroid Build Coastguard Worker p "extconf.rb setting ENV[#{name}] = #{value}" 69*cc02d7e2SAndroid Build Coastguard Worker ENV[name] = value 70*cc02d7e2SAndroid Build Coastguard Workerend 71*cc02d7e2SAndroid Build Coastguard Worker 72*cc02d7e2SAndroid Build Coastguard Workerdef env_append(name, string) 73*cc02d7e2SAndroid Build Coastguard Worker ENV[name] += ' ' + string 74*cc02d7e2SAndroid Build Coastguard Workerend 75*cc02d7e2SAndroid Build Coastguard Worker 76*cc02d7e2SAndroid Build Coastguard Worker# build grpc C-core 77*cc02d7e2SAndroid Build Coastguard Workerinherit_env_or_rbconfig 'AR' 78*cc02d7e2SAndroid Build Coastguard Workerinherit_env_or_rbconfig 'CC' 79*cc02d7e2SAndroid Build Coastguard Workerinherit_env_or_rbconfig 'CXX' 80*cc02d7e2SAndroid Build Coastguard Workerinherit_env_or_rbconfig 'RANLIB' 81*cc02d7e2SAndroid Build Coastguard Workerinherit_env_or_rbconfig 'STRIP' 82*cc02d7e2SAndroid Build Coastguard Workerinherit_rbconfig 'CPPFLAGS' 83*cc02d7e2SAndroid Build Coastguard Workerinherit_rbconfig('LDFLAGS', linker_flag: true) 84*cc02d7e2SAndroid Build Coastguard Worker 85*cc02d7e2SAndroid Build Coastguard WorkerENV['LD'] = ENV['CC'] if env_unset?('LD') 86*cc02d7e2SAndroid Build Coastguard WorkerENV['LDXX'] = ENV['CXX'] if env_unset?('LDXX') 87*cc02d7e2SAndroid Build Coastguard Worker 88*cc02d7e2SAndroid Build Coastguard Workerif RUBY_ENGINE == 'truffleruby' 89*cc02d7e2SAndroid Build Coastguard Worker # ensure we can find the system's OpenSSL 90*cc02d7e2SAndroid Build Coastguard Worker env_append 'CPPFLAGS', RbConfig::CONFIG['cppflags'] 91*cc02d7e2SAndroid Build Coastguard Workerend 92*cc02d7e2SAndroid Build Coastguard Worker 93*cc02d7e2SAndroid Build Coastguard Workerif apple_toolchain && !cross_compiling 94*cc02d7e2SAndroid Build Coastguard Worker ENV['AR'] = 'libtool' 95*cc02d7e2SAndroid Build Coastguard Worker ENV['ARFLAGS'] = '-o' 96*cc02d7e2SAndroid Build Coastguard Workerend 97*cc02d7e2SAndroid Build Coastguard Worker 98*cc02d7e2SAndroid Build Coastguard Worker# Don't embed on TruffleRuby (constant-time crypto is unsafe with Sulong, slow build times) 99*cc02d7e2SAndroid Build Coastguard WorkerENV['EMBED_OPENSSL'] = (RUBY_ENGINE != 'truffleruby').to_s 100*cc02d7e2SAndroid Build Coastguard Worker# Don't embed on TruffleRuby (the system zlib is already linked for the zlib C extension, slow build times) 101*cc02d7e2SAndroid Build Coastguard WorkerENV['EMBED_ZLIB'] = (RUBY_ENGINE != 'truffleruby').to_s 102*cc02d7e2SAndroid Build Coastguard Worker 103*cc02d7e2SAndroid Build Coastguard WorkerENV['ARCH_FLAGS'] = RbConfig::CONFIG['ARCH_FLAG'] 104*cc02d7e2SAndroid Build Coastguard Workerif apple_toolchain && !cross_compiling 105*cc02d7e2SAndroid Build Coastguard Worker if RUBY_PLATFORM =~ /arm64/ 106*cc02d7e2SAndroid Build Coastguard Worker ENV['ARCH_FLAGS'] = '-arch arm64' 107*cc02d7e2SAndroid Build Coastguard Worker else 108*cc02d7e2SAndroid Build Coastguard Worker ENV['ARCH_FLAGS'] = '-arch i386 -arch x86_64' 109*cc02d7e2SAndroid Build Coastguard Worker end 110*cc02d7e2SAndroid Build Coastguard Workerend 111*cc02d7e2SAndroid Build Coastguard Worker 112*cc02d7e2SAndroid Build Coastguard Workerenv_append 'CPPFLAGS', '-DGRPC_XDS_USER_AGENT_NAME_SUFFIX="\"RUBY\""' 113*cc02d7e2SAndroid Build Coastguard Worker 114*cc02d7e2SAndroid Build Coastguard Workerrequire_relative '../../lib/grpc/version' 115*cc02d7e2SAndroid Build Coastguard Workerenv_append 'CPPFLAGS', '-DGRPC_XDS_USER_AGENT_VERSION_SUFFIX="\"' + GRPC::VERSION + '\""' 116*cc02d7e2SAndroid Build Coastguard Workerenv_append 'CPPFLAGS', '-DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK=1' 117*cc02d7e2SAndroid Build Coastguard Worker 118*cc02d7e2SAndroid Build Coastguard Workeroutput_dir = File.expand_path(RbConfig::CONFIG['topdir']) 119*cc02d7e2SAndroid Build Coastguard Workergrpc_lib_dir = File.join(output_dir, 'libs', grpc_config) 120*cc02d7e2SAndroid Build Coastguard WorkerENV['BUILDDIR'] = output_dir 121*cc02d7e2SAndroid Build Coastguard Worker 122*cc02d7e2SAndroid Build Coastguard Workerstrip_tool = RbConfig::CONFIG['STRIP'] 123*cc02d7e2SAndroid Build Coastguard Workerstrip_tool += ' -x' if apple_toolchain 124*cc02d7e2SAndroid Build Coastguard Worker 125*cc02d7e2SAndroid Build Coastguard Workerunless windows 126*cc02d7e2SAndroid Build Coastguard Worker puts 'Building internal gRPC into ' + grpc_lib_dir 127*cc02d7e2SAndroid Build Coastguard Worker nproc = 4 128*cc02d7e2SAndroid Build Coastguard Worker nproc = Etc.nprocessors if Etc.respond_to? :nprocessors 129*cc02d7e2SAndroid Build Coastguard Worker nproc_override = ENV['GRPC_RUBY_BUILD_PROCS'] 130*cc02d7e2SAndroid Build Coastguard Worker unless nproc_override.nil? or nproc_override.size == 0 131*cc02d7e2SAndroid Build Coastguard Worker nproc = nproc_override 132*cc02d7e2SAndroid Build Coastguard Worker puts "Overriding make parallelism to #{nproc}" 133*cc02d7e2SAndroid Build Coastguard Worker end 134*cc02d7e2SAndroid Build Coastguard Worker make = bsd ? 'gmake' : 'make' 135*cc02d7e2SAndroid Build Coastguard Worker cmd = "#{make} -j#{nproc} -C #{grpc_root} #{grpc_lib_dir}/libgrpc.a CONFIG=#{grpc_config} Q=" 136*cc02d7e2SAndroid Build Coastguard Worker puts "Building grpc native library: #{cmd}" 137*cc02d7e2SAndroid Build Coastguard Worker system(cmd) 138*cc02d7e2SAndroid Build Coastguard Worker exit 1 unless $? == 0 139*cc02d7e2SAndroid Build Coastguard Workerend 140*cc02d7e2SAndroid Build Coastguard Worker 141*cc02d7e2SAndroid Build Coastguard Worker# C-core built, generate Makefile for ruby extension 142*cc02d7e2SAndroid Build Coastguard Worker$LDFLAGS = maybe_remove_strip_all_linker_flag($LDFLAGS) 143*cc02d7e2SAndroid Build Coastguard Worker$DLDFLAGS = maybe_remove_strip_all_linker_flag($DLDFLAGS) 144*cc02d7e2SAndroid Build Coastguard Worker 145*cc02d7e2SAndroid Build Coastguard Worker$CFLAGS << ' -DGRPC_RUBY_WINDOWS_UCRT' if windows_ucrt 146*cc02d7e2SAndroid Build Coastguard Worker$CFLAGS << ' -I' + File.join(grpc_root, 'include') 147*cc02d7e2SAndroid Build Coastguard Worker$CFLAGS << ' -g' 148*cc02d7e2SAndroid Build Coastguard Worker 149*cc02d7e2SAndroid Build Coastguard Workerdef have_ruby_abi_version() 150*cc02d7e2SAndroid Build Coastguard Worker return true if RUBY_ENGINE == 'truffleruby' 151*cc02d7e2SAndroid Build Coastguard Worker # ruby_abi_version is only available in development versions: https://github.com/ruby/ruby/pull/6231 152*cc02d7e2SAndroid Build Coastguard Worker return false if RUBY_PATCHLEVEL >= 0 153*cc02d7e2SAndroid Build Coastguard Worker 154*cc02d7e2SAndroid Build Coastguard Worker m = /(\d+)\.(\d+)/.match(RUBY_VERSION) 155*cc02d7e2SAndroid Build Coastguard Worker if m.nil? 156*cc02d7e2SAndroid Build Coastguard Worker puts "Failed to parse ruby version: #{RUBY_VERSION}. Assuming ruby_abi_version symbol is NOT present." 157*cc02d7e2SAndroid Build Coastguard Worker return false 158*cc02d7e2SAndroid Build Coastguard Worker end 159*cc02d7e2SAndroid Build Coastguard Worker major = m[1].to_i 160*cc02d7e2SAndroid Build Coastguard Worker minor = m[2].to_i 161*cc02d7e2SAndroid Build Coastguard Worker if major >= 3 and minor >= 2 162*cc02d7e2SAndroid Build Coastguard Worker puts "Ruby version #{RUBY_VERSION} >= 3.2. Assuming ruby_abi_version symbol is present." 163*cc02d7e2SAndroid Build Coastguard Worker return true 164*cc02d7e2SAndroid Build Coastguard Worker end 165*cc02d7e2SAndroid Build Coastguard Worker puts "Ruby version #{RUBY_VERSION} < 3.2. Assuming ruby_abi_version symbol is NOT present." 166*cc02d7e2SAndroid Build Coastguard Worker false 167*cc02d7e2SAndroid Build Coastguard Workerend 168*cc02d7e2SAndroid Build Coastguard Worker 169*cc02d7e2SAndroid Build Coastguard Workerdef ext_export_filename() 170*cc02d7e2SAndroid Build Coastguard Worker name = 'ext-export' 171*cc02d7e2SAndroid Build Coastguard Worker name += '-truffleruby' if RUBY_ENGINE == 'truffleruby' 172*cc02d7e2SAndroid Build Coastguard Worker name += '-with-ruby-abi-version' if have_ruby_abi_version() 173*cc02d7e2SAndroid Build Coastguard Worker name 174*cc02d7e2SAndroid Build Coastguard Workerend 175*cc02d7e2SAndroid Build Coastguard Worker 176*cc02d7e2SAndroid Build Coastguard Workerext_export_file = File.join(grpc_root, 'src', 'ruby', 'ext', 'grpc', ext_export_filename()) 177*cc02d7e2SAndroid Build Coastguard Worker$LDFLAGS << ' -Wl,--version-script="' + ext_export_file + '.gcc"' if linux 178*cc02d7e2SAndroid Build Coastguard Workerif apple_toolchain 179*cc02d7e2SAndroid Build Coastguard Worker $LDFLAGS << ' -weak_framework CoreFoundation' 180*cc02d7e2SAndroid Build Coastguard Worker $LDFLAGS << ' -Wl,-exported_symbols_list,"' + ext_export_file + '.clang"' 181*cc02d7e2SAndroid Build Coastguard Workerend 182*cc02d7e2SAndroid Build Coastguard Worker 183*cc02d7e2SAndroid Build Coastguard Worker$LDFLAGS << ' ' + File.join(grpc_lib_dir, 'libgrpc.a') unless windows 184*cc02d7e2SAndroid Build Coastguard Workerif grpc_config == 'gcov' 185*cc02d7e2SAndroid Build Coastguard Worker $CFLAGS << ' -O0 -fprofile-arcs -ftest-coverage' 186*cc02d7e2SAndroid Build Coastguard Worker $LDFLAGS << ' -fprofile-arcs -ftest-coverage -rdynamic' 187*cc02d7e2SAndroid Build Coastguard Workerend 188*cc02d7e2SAndroid Build Coastguard Worker 189*cc02d7e2SAndroid Build Coastguard Workerif grpc_config == 'dbg' 190*cc02d7e2SAndroid Build Coastguard Worker $CFLAGS << ' -O0' 191*cc02d7e2SAndroid Build Coastguard Workerend 192*cc02d7e2SAndroid Build Coastguard Worker 193*cc02d7e2SAndroid Build Coastguard Worker# Do not statically link standard libraries on TruffleRuby as this does not work when compiling to bitcode 194*cc02d7e2SAndroid Build Coastguard Workerif linux && RUBY_ENGINE != 'truffleruby' 195*cc02d7e2SAndroid Build Coastguard Worker $LDFLAGS << ' -static-libgcc -static-libstdc++' 196*cc02d7e2SAndroid Build Coastguard Workerend 197*cc02d7e2SAndroid Build Coastguard Worker$LDFLAGS << ' -static' if windows 198*cc02d7e2SAndroid Build Coastguard Worker 199*cc02d7e2SAndroid Build Coastguard Worker$CFLAGS << ' -std=c11 ' 200*cc02d7e2SAndroid Build Coastguard Worker$CFLAGS << ' -Wall ' 201*cc02d7e2SAndroid Build Coastguard Worker$CFLAGS << ' -Wextra ' 202*cc02d7e2SAndroid Build Coastguard Worker$CFLAGS << ' -pedantic ' 203*cc02d7e2SAndroid Build Coastguard Worker 204*cc02d7e2SAndroid Build Coastguard Workeroutput = File.join('grpc', 'grpc_c') 205*cc02d7e2SAndroid Build Coastguard Workerputs "extconf.rb $LDFLAGS: #{$LDFLAGS}" 206*cc02d7e2SAndroid Build Coastguard Workerputs "extconf.rb $DLDFLAGS: #{$DLDFLAGS}" 207*cc02d7e2SAndroid Build Coastguard Workerputs "extconf.rb $CFLAGS: #{$CFLAGS}" 208*cc02d7e2SAndroid Build Coastguard Workerputs 'Generating Makefile for ' + output 209*cc02d7e2SAndroid Build Coastguard Workercreate_makefile(output) 210*cc02d7e2SAndroid Build Coastguard Worker 211*cc02d7e2SAndroid Build Coastguard Workerruby_major_minor = /(\d+\.\d+)/.match(RUBY_VERSION).to_s 212*cc02d7e2SAndroid Build Coastguard Workerdebug_symbols = "grpc-#{GRPC::VERSION}-#{RUBY_PLATFORM}-ruby-#{ruby_major_minor}.dbg" 213*cc02d7e2SAndroid Build Coastguard Worker 214*cc02d7e2SAndroid Build Coastguard WorkerFile.open('Makefile.new', 'w') do |o| 215*cc02d7e2SAndroid Build Coastguard Worker o.puts 'hijack_remove_unused_artifacts: all remove_unused_artifacts' 216*cc02d7e2SAndroid Build Coastguard Worker o.puts 217*cc02d7e2SAndroid Build Coastguard Worker o.write(File.read('Makefile')) 218*cc02d7e2SAndroid Build Coastguard Worker o.puts 219*cc02d7e2SAndroid Build Coastguard Worker o.puts 'remove_unused_artifacts: $(DLLIB)' 220*cc02d7e2SAndroid Build Coastguard Worker # Now that the extension library has been linked, we can remove unused artifacts 221*cc02d7e2SAndroid Build Coastguard Worker # that take up a lot of disk space. 222*cc02d7e2SAndroid Build Coastguard Worker rm_obj_cmd = "rm -rf #{File.join(output_dir, 'objs')}" 223*cc02d7e2SAndroid Build Coastguard Worker o.puts "\t$(ECHO) Removing unused object artifacts: #{rm_obj_cmd}" 224*cc02d7e2SAndroid Build Coastguard Worker o.puts "\t$(Q) #{rm_obj_cmd}" 225*cc02d7e2SAndroid Build Coastguard Worker rm_grpc_core_libs = "rm -f #{grpc_lib_dir}/*.a" 226*cc02d7e2SAndroid Build Coastguard Worker o.puts "\t$(ECHO) Removing unused grpc core libraries: #{rm_grpc_core_libs}" 227*cc02d7e2SAndroid Build Coastguard Worker o.puts "\t$(Q) #{rm_grpc_core_libs}" 228*cc02d7e2SAndroid Build Coastguard Workerend 229*cc02d7e2SAndroid Build Coastguard WorkerFile.rename('Makefile.new', 'Makefile') 230*cc02d7e2SAndroid Build Coastguard Worker 231*cc02d7e2SAndroid Build Coastguard Workerif grpc_config == 'opt' 232*cc02d7e2SAndroid Build Coastguard Worker File.open('Makefile.new', 'w') do |o| 233*cc02d7e2SAndroid Build Coastguard Worker o.puts 'hijack: all strip' 234*cc02d7e2SAndroid Build Coastguard Worker o.puts 235*cc02d7e2SAndroid Build Coastguard Worker o.write(File.read('Makefile')) 236*cc02d7e2SAndroid Build Coastguard Worker o.puts 237*cc02d7e2SAndroid Build Coastguard Worker o.puts 'strip: $(DLLIB)' 238*cc02d7e2SAndroid Build Coastguard Worker if debug_symbols_output_dir 239*cc02d7e2SAndroid Build Coastguard Worker o.puts "\t$(ECHO) Saving debug symbols in #{debug_symbols_output_dir}/#{debug_symbols}" 240*cc02d7e2SAndroid Build Coastguard Worker o.puts "\t$(Q) objcopy --only-keep-debug $(DLLIB) #{debug_symbols_output_dir}/#{debug_symbols}" 241*cc02d7e2SAndroid Build Coastguard Worker end 242*cc02d7e2SAndroid Build Coastguard Worker o.puts "\t$(ECHO) Stripping $(DLLIB)" 243*cc02d7e2SAndroid Build Coastguard Worker o.puts "\t$(Q) #{strip_tool} $(DLLIB)" 244*cc02d7e2SAndroid Build Coastguard Worker end 245*cc02d7e2SAndroid Build Coastguard Worker File.rename('Makefile.new', 'Makefile') 246*cc02d7e2SAndroid Build Coastguard Workerend 247*cc02d7e2SAndroid Build Coastguard Worker 248*cc02d7e2SAndroid Build Coastguard Workerif ENV['GRPC_RUBY_TEST_ONLY_WORKAROUND_MAKE_INSTALL_BUG'] 249*cc02d7e2SAndroid Build Coastguard Worker # Note: this env var setting is intended to work around a problem observed 250*cc02d7e2SAndroid Build Coastguard Worker # with the ginstall command on grpc's macos automated test infrastructure, 251*cc02d7e2SAndroid Build Coastguard Worker # and is not guaranteed to work in the wild. 252*cc02d7e2SAndroid Build Coastguard Worker # Also see https://github.com/rake-compiler/rake-compiler/issues/210. 253*cc02d7e2SAndroid Build Coastguard Worker puts 'Overriding the generated Makefile install target to use cp' 254*cc02d7e2SAndroid Build Coastguard Worker File.open('Makefile.new', 'w') do |o| 255*cc02d7e2SAndroid Build Coastguard Worker File.foreach('Makefile') do |i| 256*cc02d7e2SAndroid Build Coastguard Worker if i.start_with?('INSTALL_PROG = ') 257*cc02d7e2SAndroid Build Coastguard Worker override = 'INSTALL_PROG = cp' 258*cc02d7e2SAndroid Build Coastguard Worker puts "Replacing generated Makefile line: |#{i}|, with: |#{override}|" 259*cc02d7e2SAndroid Build Coastguard Worker o.puts override 260*cc02d7e2SAndroid Build Coastguard Worker else 261*cc02d7e2SAndroid Build Coastguard Worker o.puts i 262*cc02d7e2SAndroid Build Coastguard Worker end 263*cc02d7e2SAndroid Build Coastguard Worker end 264*cc02d7e2SAndroid Build Coastguard Worker end 265*cc02d7e2SAndroid Build Coastguard Worker File.rename('Makefile.new', 'Makefile') 266*cc02d7e2SAndroid Build Coastguard Workerend 267