blob: 6c0486f1a8cbda124b56f22f60535a4a42c1804f [file] [log] [blame]
Craig Tiller6169d5f2016-03-31 07:46:18 -07001# Copyright 2015, Google Inc.
nnoble097ef9b2014-12-01 17:06:10 -08002# All rights reserved.
3#
4# Redistribution and use in source and binary forms, with or without
5# modification, are permitted provided that the following conditions are
6# met:
7#
8# * Redistributions of source code must retain the above copyright
9# notice, this list of conditions and the following disclaimer.
10# * Redistributions in binary form must reproduce the above
11# copyright notice, this list of conditions and the following disclaimer
12# in the documentation and/or other materials provided with the
13# distribution.
14# * Neither the name of Google Inc. nor the names of its
15# contributors may be used to endorse or promote products derived from
16# this software without specific prior written permission.
17#
18# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
J. Martin18e8b142017-02-23 18:52:46 -060030require 'etc'
nnoble097ef9b2014-12-01 17:06:10 -080031require 'mkmf'
32
33LIBDIR = RbConfig::CONFIG['libdir']
34INCLUDEDIR = RbConfig::CONFIG['includedir']
35
36HEADER_DIRS = [
Tim Emiolae2860c52015-01-16 02:58:41 -080037 # Search /opt/local (Mac source install)
38 '/opt/local/include',
nnoble097ef9b2014-12-01 17:06:10 -080039
Tim Emiolae2860c52015-01-16 02:58:41 -080040 # Search /usr/local (Source install)
41 '/usr/local/include',
nnoble097ef9b2014-12-01 17:06:10 -080042
Tim Emiolae2860c52015-01-16 02:58:41 -080043 # Check the ruby install locations
44 INCLUDEDIR
nnoble097ef9b2014-12-01 17:06:10 -080045]
46
47LIB_DIRS = [
Tim Emiolae2860c52015-01-16 02:58:41 -080048 # Search /opt/local (Mac source install)
49 '/opt/local/lib',
nnoble097ef9b2014-12-01 17:06:10 -080050
Tim Emiolae2860c52015-01-16 02:58:41 -080051 # Search /usr/local (Source install)
52 '/usr/local/lib',
nnoble097ef9b2014-12-01 17:06:10 -080053
Tim Emiolae2860c52015-01-16 02:58:41 -080054 # Check the ruby install locations
55 LIBDIR
nnoble097ef9b2014-12-01 17:06:10 -080056]
57
Nicolas "Pixel" Nobled51d1212016-01-31 11:33:19 +010058windows = RUBY_PLATFORM =~ /mingw|mswin/
59
murgatroid99d7e1a102015-12-18 11:16:16 -080060grpc_root = File.expand_path(File.join(File.dirname(__FILE__), '../../../..'))
61
62grpc_config = ENV['GRPC_CONFIG'] || 'opt'
63
Nicolas Noble86cbe302016-02-05 15:08:12 -080064ENV['MACOSX_DEPLOYMENT_TARGET'] = '10.7'
65
Nicolas "Pixel" Noble791e93e2016-03-01 02:48:00 +010066ENV['AR'] = RbConfig::CONFIG['AR'] + ' rcs'
67ENV['CC'] = RbConfig::CONFIG['CC']
Craig Tiller9f3822c2017-04-10 15:07:22 -070068ENV['CXX'] = RbConfig::CONFIG['CXX']
Nicolas "Pixel" Noble791e93e2016-03-01 02:48:00 +010069ENV['LD'] = ENV['CC']
Nicolas "Pixel" Noblee7a91a22016-01-28 07:46:08 +010070
Nicolas "Pixel" Noble791e93e2016-03-01 02:48:00 +010071ENV['AR'] = 'libtool -o' if RUBY_PLATFORM =~ /darwin/
Nicolas Noble2bc107f2016-02-02 23:15:22 -080072
Nicolas "Pixel" Noble791e93e2016-03-01 02:48:00 +010073ENV['EMBED_OPENSSL'] = 'true'
74ENV['EMBED_ZLIB'] = 'true'
Yuchen Zengb1b21152016-08-12 11:27:30 -070075ENV['EMBED_CARES'] = 'true'
Nicolas "Pixel" Noble791e93e2016-03-01 02:48:00 +010076ENV['ARCH_FLAGS'] = RbConfig::CONFIG['ARCH_FLAG']
77ENV['ARCH_FLAGS'] = '-arch i386 -arch x86_64' if RUBY_PLATFORM =~ /darwin/
78ENV['CFLAGS'] = '-DGPR_BACKWARDS_COMPATIBILITY_MODE'
Nicolas "Pixel" Noblee7a91a22016-01-28 07:46:08 +010079
Nicolas "Pixel" Noble791e93e2016-03-01 02:48:00 +010080output_dir = File.expand_path(RbConfig::CONFIG['topdir'])
81grpc_lib_dir = File.join(output_dir, 'libs', grpc_config)
82ENV['BUILDDIR'] = output_dir
Nicolas "Pixel" Noblee7a91a22016-01-28 07:46:08 +010083
Nicolas "Pixel" Nobled8b07cb2016-05-05 03:55:55 +020084unless windows
85 puts 'Building internal gRPC into ' + grpc_lib_dir
J. Martin18e8b142017-02-23 18:52:46 -060086 nproc = 4
87 nproc = Etc.nprocessors * 2 if Etc.respond_to? :nprocessors
Craig Tillerf85aabf2017-04-10 14:06:15 -070088 system("make -j#{nproc} -C #{grpc_root} #{grpc_lib_dir}/libgrpc.a CONFIG=#{grpc_config} Q=")
Nicolas "Pixel" Nobled8b07cb2016-05-05 03:55:55 +020089 exit 1 unless $? == 0
90end
nnoble097ef9b2014-12-01 17:06:10 -080091
murgatroid99d7e1a102015-12-18 11:16:16 -080092$CFLAGS << ' -I' + File.join(grpc_root, 'include')
Nicolas "Pixel" Nobled51d1212016-01-31 11:33:19 +010093$LDFLAGS << ' ' + File.join(grpc_lib_dir, 'libgrpc.a') unless windows
murgatroid99d7e1a102015-12-18 11:16:16 -080094if grpc_config == 'gcov'
95 $CFLAGS << ' -O0 -fprofile-arcs -ftest-coverage'
96 $LDFLAGS << ' -fprofile-arcs -ftest-coverage -rdynamic'
murgatroid9951dbf902015-07-07 16:00:06 -070097end
98
Alexander Polcyn38ba85c2016-08-29 16:59:23 -070099if grpc_config == 'dbg'
100 $CFLAGS << ' -O0'
101end
102
Nicolas "Pixel" Nobled3554972016-02-03 02:11:43 +0100103$LDFLAGS << ' -Wl,-wrap,memcpy' if RUBY_PLATFORM =~ /linux/
104$LDFLAGS << ' -static' if windows
Craig Tiller4bef7ce2016-02-02 08:38:43 -0800105
murgatroid99fa0fa182015-07-07 18:02:00 -0700106$CFLAGS << ' -std=c99 '
107$CFLAGS << ' -Wall '
108$CFLAGS << ' -Wextra '
109$CFLAGS << ' -pedantic '
Nicolas "Pixel" Noblee7a91a22016-01-28 07:46:08 +0100110$CFLAGS << ' -Wno-format '
murgatroid990b90c1e2015-07-07 17:44:46 -0700111
Nicolas "Pixel" Nobleeade6e02016-01-29 22:53:31 +0100112output = File.join('grpc', 'grpc_c')
Nicolas "Pixel" Noblee7a91a22016-01-28 07:46:08 +0100113puts 'Generating Makefile for ' + output
114create_makefile(output)
murgatroid99d7e1a102015-12-18 11:16:16 -0800115
Nicolas "Pixel" Noblee7a91a22016-01-28 07:46:08 +0100116strip_tool = RbConfig::CONFIG['STRIP']
Nicolas Noble2bc107f2016-02-02 23:15:22 -0800117strip_tool = 'strip -x' if RUBY_PLATFORM =~ /darwin/
Nicolas "Pixel" Noblee7a91a22016-01-28 07:46:08 +0100118
Nicolas "Pixel" Noble17230442016-01-29 01:46:19 +0100119if grpc_config == 'opt'
120 File.open('Makefile.new', 'w') do |o|
121 o.puts 'hijack: all strip'
122 o.puts
123 File.foreach('Makefile') do |i|
124 o.puts i
125 end
126 o.puts
127 o.puts 'strip:'
128 o.puts "\t$(ECHO) Stripping $(DLLIB)"
129 o.puts "\t$(Q) #{strip_tool} $(DLLIB)"
Nicolas "Pixel" Noblee7a91a22016-01-28 07:46:08 +0100130 end
Nicolas "Pixel" Noble17230442016-01-29 01:46:19 +0100131 File.rename('Makefile.new', 'Makefile')
Nicolas "Pixel" Noblee7a91a22016-01-28 07:46:08 +0100132end