blob: 07f7bb93b8a04ce1fa0f23b8369653a89fbeda63 [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
30require 'mkmf'
31
32LIBDIR = RbConfig::CONFIG['libdir']
33INCLUDEDIR = RbConfig::CONFIG['includedir']
34
35HEADER_DIRS = [
Tim Emiolae2860c52015-01-16 02:58:41 -080036 # Search /opt/local (Mac source install)
37 '/opt/local/include',
nnoble097ef9b2014-12-01 17:06:10 -080038
Tim Emiolae2860c52015-01-16 02:58:41 -080039 # Search /usr/local (Source install)
40 '/usr/local/include',
nnoble097ef9b2014-12-01 17:06:10 -080041
Tim Emiolae2860c52015-01-16 02:58:41 -080042 # Check the ruby install locations
43 INCLUDEDIR
nnoble097ef9b2014-12-01 17:06:10 -080044]
45
46LIB_DIRS = [
Tim Emiolae2860c52015-01-16 02:58:41 -080047 # Search /opt/local (Mac source install)
48 '/opt/local/lib',
nnoble097ef9b2014-12-01 17:06:10 -080049
Tim Emiolae2860c52015-01-16 02:58:41 -080050 # Search /usr/local (Source install)
51 '/usr/local/lib',
nnoble097ef9b2014-12-01 17:06:10 -080052
Tim Emiolae2860c52015-01-16 02:58:41 -080053 # Check the ruby install locations
54 LIBDIR
nnoble097ef9b2014-12-01 17:06:10 -080055]
56
Nicolas "Pixel" Nobled51d1212016-01-31 11:33:19 +010057windows = RUBY_PLATFORM =~ /mingw|mswin/
58
murgatroid99d7e1a102015-12-18 11:16:16 -080059grpc_root = File.expand_path(File.join(File.dirname(__FILE__), '../../../..'))
60
61grpc_config = ENV['GRPC_CONFIG'] || 'opt'
62
Nicolas Noble86cbe302016-02-05 15:08:12 -080063ENV['MACOSX_DEPLOYMENT_TARGET'] = '10.7'
64
Nicolas "Pixel" Noble791e93e2016-03-01 02:48:00 +010065ENV['AR'] = RbConfig::CONFIG['AR'] + ' rcs'
66ENV['CC'] = RbConfig::CONFIG['CC']
67ENV['LD'] = ENV['CC']
Nicolas "Pixel" Noblee7a91a22016-01-28 07:46:08 +010068
Nicolas "Pixel" Noble791e93e2016-03-01 02:48:00 +010069ENV['AR'] = 'libtool -o' if RUBY_PLATFORM =~ /darwin/
Nicolas Noble2bc107f2016-02-02 23:15:22 -080070
Nicolas "Pixel" Noble791e93e2016-03-01 02:48:00 +010071ENV['EMBED_OPENSSL'] = 'true'
72ENV['EMBED_ZLIB'] = 'true'
73ENV['ARCH_FLAGS'] = RbConfig::CONFIG['ARCH_FLAG']
74ENV['ARCH_FLAGS'] = '-arch i386 -arch x86_64' if RUBY_PLATFORM =~ /darwin/
75ENV['CFLAGS'] = '-DGPR_BACKWARDS_COMPATIBILITY_MODE'
Nicolas "Pixel" Noblee7a91a22016-01-28 07:46:08 +010076
Nicolas "Pixel" Noble791e93e2016-03-01 02:48:00 +010077output_dir = File.expand_path(RbConfig::CONFIG['topdir'])
78grpc_lib_dir = File.join(output_dir, 'libs', grpc_config)
79ENV['BUILDDIR'] = output_dir
Nicolas "Pixel" Noblee7a91a22016-01-28 07:46:08 +010080
Nicolas "Pixel" Noble791e93e2016-03-01 02:48:00 +010081puts 'Building internal gRPC into ' + grpc_lib_dir
82system("make -j -C #{grpc_root} #{grpc_lib_dir}/libgrpc.a CONFIG=#{grpc_config}")
83exit 1 unless $? == 0
nnoble097ef9b2014-12-01 17:06:10 -080084
murgatroid99d7e1a102015-12-18 11:16:16 -080085$CFLAGS << ' -I' + File.join(grpc_root, 'include')
Nicolas "Pixel" Nobled51d1212016-01-31 11:33:19 +010086$LDFLAGS << ' ' + File.join(grpc_lib_dir, 'libgrpc.a') unless windows
murgatroid99d7e1a102015-12-18 11:16:16 -080087if grpc_config == 'gcov'
88 $CFLAGS << ' -O0 -fprofile-arcs -ftest-coverage'
89 $LDFLAGS << ' -fprofile-arcs -ftest-coverage -rdynamic'
murgatroid9951dbf902015-07-07 16:00:06 -070090end
91
Nicolas "Pixel" Nobled3554972016-02-03 02:11:43 +010092$LDFLAGS << ' -Wl,-wrap,memcpy' if RUBY_PLATFORM =~ /linux/
93$LDFLAGS << ' -static' if windows
Craig Tiller4bef7ce2016-02-02 08:38:43 -080094
murgatroid99fa0fa182015-07-07 18:02:00 -070095$CFLAGS << ' -std=c99 '
96$CFLAGS << ' -Wall '
97$CFLAGS << ' -Wextra '
98$CFLAGS << ' -pedantic '
99$CFLAGS << ' -Werror '
Nicolas "Pixel" Noblee7a91a22016-01-28 07:46:08 +0100100$CFLAGS << ' -Wno-format '
murgatroid990b90c1e2015-07-07 17:44:46 -0700101
Nicolas "Pixel" Nobleeade6e02016-01-29 22:53:31 +0100102output = File.join('grpc', 'grpc_c')
Nicolas "Pixel" Noblee7a91a22016-01-28 07:46:08 +0100103puts 'Generating Makefile for ' + output
104create_makefile(output)
murgatroid99d7e1a102015-12-18 11:16:16 -0800105
Nicolas "Pixel" Noblee7a91a22016-01-28 07:46:08 +0100106strip_tool = RbConfig::CONFIG['STRIP']
Nicolas Noble2bc107f2016-02-02 23:15:22 -0800107strip_tool = 'strip -x' if RUBY_PLATFORM =~ /darwin/
Nicolas "Pixel" Noblee7a91a22016-01-28 07:46:08 +0100108
Nicolas "Pixel" Noble17230442016-01-29 01:46:19 +0100109if grpc_config == 'opt'
110 File.open('Makefile.new', 'w') do |o|
111 o.puts 'hijack: all strip'
112 o.puts
113 File.foreach('Makefile') do |i|
114 o.puts i
115 end
116 o.puts
117 o.puts 'strip:'
118 o.puts "\t$(ECHO) Stripping $(DLLIB)"
119 o.puts "\t$(Q) #{strip_tool} $(DLLIB)"
Nicolas "Pixel" Noblee7a91a22016-01-28 07:46:08 +0100120 end
Nicolas "Pixel" Noble17230442016-01-29 01:46:19 +0100121 File.rename('Makefile.new', 'Makefile')
Nicolas "Pixel" Noblee7a91a22016-01-28 07:46:08 +0100122end