1#!/usr/bin/perl 2 3# Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. 4# 5# This program is free software; you can redistribute it and/or modify 6# it under the terms of the GNU General Public License, version 2.0, 7# as published by the Free Software Foundation. 8# 9# This program is also distributed with certain software (including 10# but not limited to OpenSSL) that is licensed under separate terms, 11# as designated in a particular file or component or in included license 12# documentation. The authors of MySQL hereby grant you an additional 13# permission to link the program and your derivative works with the 14# separately licensed software that they have included with MySQL. 15# 16# This program is distributed in the hope that it will be useful, 17# but WITHOUT ANY WARRANTY; without even the implied warranty of 18# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19# GNU General Public License, version 2.0, for more details. 20# 21# You should have received a copy of the GNU General Public License 22# along with this program; if not, write to the Free Software 23# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 24 25use strict; 26use Cwd 'abs_path'; 27use File::Basename; 28 29my $cmakeargs = ""; 30 31# Find source root directory 32# Assume this script is in <srcroot>/cmake 33my $srcdir = dirname(dirname(abs_path($0))); 34my $cmake_install_prefix=""; 35 36# Sets installation directory, bindir, libdir, libexecdir etc 37# the equivalent CMake variables are given without prefix 38# e.g if --prefix is /usr and --bindir is /usr/bin 39# then cmake variable (INSTALL_BINDIR) must be just "bin" 40 41sub set_installdir 42{ 43 my($path, $varname) = @_; 44 my $prefix_length = length($cmake_install_prefix); 45 if (($prefix_length > 0) && (index($path,$cmake_install_prefix) == 0)) 46 { 47 # path is under the prefix, so remove the prefix and maybe following "/" 48 $path = substr($path, $prefix_length); 49 if(length($path) > 0) 50 { 51 my $char = substr($path, 0, 1); 52 if($char eq "/") 53 { 54 $path= substr($path, 1); 55 } 56 } 57 if(length($path) > 0) 58 { 59 $cmakeargs = $cmakeargs." -D".$varname."=".$path; 60 } 61 } 62} 63 64# CMake understands CC and CXX env.variables correctly, if they contain 1 or 2 tokens 65# e.g CXX=g++ and CXX="ccache g++" are ok. However it could have a problem if there 66# (recognizing g++) with more tokens ,e.g CXX="ccache g++ --pipe". 67# The problem is simply fixed by splitting compiler and flags, e.g 68# CXX="ccache g++ --pipe" => CXX=ccache g++ CXXFLAGS=--pipe 69 70sub check_compiler 71{ 72 my ($varname, $flagsvarname) = @_; 73 my @tokens = split(/ /,$ENV{$varname}); 74 if($#tokens >= 2) 75 { 76 $ENV{$varname} = $tokens[0]." ".$tokens[1]; 77 my $flags; 78 79 for(my $i=2; $i<=$#tokens; $i++) 80 { 81 $flags= $flags." ".$tokens[$i]; 82 } 83 if(defined $ENV{$flagsvarname}) 84 { 85 $flags = $flags." ".$ENV{$flagsvarname}; 86 } 87 $ENV{$flagsvarname}=$flags; 88 print("$varname=$ENV{$varname}\n"); 89 print("$flagsvarname=$ENV{$flagsvarname}\n"); 90 } 91} 92 93check_compiler("CC", "CFLAGS"); 94check_compiler("CXX", "CXXFLAGS"); 95 96if(defined $ENV{"CXX"} and $ENV{"CXX"} =~ m/gcc/) 97{ 98 my $old_cxx= $ENV{"CXX"}; 99 $ENV{"CXX"} =~ s/gcc/g++/; 100 print("configure.pl : switching CXX compiler from $old_cxx to $ENV{CXX}\n"); 101} 102 103if(defined $ENV{"CXXFLAGS"} and $ENV{"CXXFLAGS"} =~ "-fno-exceptions") 104{ 105 $ENV{"CXXFLAGS"} =~ s/-fno-exceptions//; 106 print("configure.pl : stripping off -fno-exceptions CXXFLAGS=$ENV{CXXFLAGS}\n"); 107} 108 109foreach my $option (@ARGV) 110{ 111 if (substr ($option, 0, 2) eq "--") 112 { 113 $option = substr($option, 2); 114 } 115 else 116 { 117 # This must be environment variable 118 my @v = split('=', $option); 119 my $name = shift(@v); 120 if(@v) 121 { 122 $ENV{$name} = join('=', @v); 123 } 124 next; 125 } 126 if($option =~ /srcdir/) 127 { 128 $srcdir = substr($option,7); 129 next; 130 } 131 if($option =~ /help/) 132 { 133 system("cmake ${srcdir} -LH"); 134 exit(0); 135 } 136 if($option =~ /with-plugins=/) 137 { 138 my @plugins= split(/,/, substr($option,13)); 139 foreach my $p (@plugins) 140 { 141 $p =~ s/-/_/g; 142 $cmakeargs = $cmakeargs." -DWITH_".uc($p)."=1"; 143 } 144 next; 145 } 146 if($option =~ /with-extra-charsets=/) 147 { 148 my $charsets= substr($option,20); 149 $cmakeargs = $cmakeargs." -DWITH_EXTRA_CHARSETS=".$charsets; 150 next; 151 } 152 if($option =~ /without-plugin=/) 153 { 154 $cmakeargs = $cmakeargs." -DWITHOUT_".uc(substr($option,15))."=1"; 155 next; 156 } 157 if($option =~ /with-zlib-dir=bundled/) 158 { 159 $cmakeargs = $cmakeargs." -DWITH_ZLIB=bundled"; 160 next; 161 } 162 if($option =~ /with-zlib-dir=/) 163 { 164 $cmakeargs = $cmakeargs." -DWITH_ZLIB=system"; 165 next; 166 } 167 if($option =~ /with-libevent=/) 168 { 169 $cmakeargs = $cmakeargs." -DWITH_LIBEVENT=system"; 170 next; 171 } 172 if($option =~ /with-libevent/) 173 { 174 $cmakeargs = $cmakeargs." -DWITH_LIBEVENT=bundled"; 175 next; 176 } 177 if($option =~ /with-ssl=/) 178 { 179 $cmakeargs = $cmakeargs." -DWITH_SSL=yes"; 180 next; 181 } 182 if($option =~ /with-ssl/) 183 { 184 $cmakeargs = $cmakeargs." -DWITH_SSL=bundled"; 185 next; 186 } 187 if($option =~ /prefix=/) 188 { 189 $cmake_install_prefix= substr($option, 7); 190 $cmakeargs = $cmakeargs." -DCMAKE_INSTALL_PREFIX=".$cmake_install_prefix; 191 next; 192 } 193 if($option =~/bindir=/) 194 { 195 set_installdir(substr($option,7), "INSTALL_BINDIR"); 196 next; 197 } 198 if($option =~/libdir=/) 199 { 200 set_installdir(substr($option,7), "INSTALL_LIBDIR"); 201 next; 202 } 203 if($option =~/libexecdir=/) 204 { 205 set_installdir(substr($option,11), "INSTALL_SBINDIR"); 206 next; 207 } 208 if($option =~/includedir=/) 209 { 210 set_installdir(substr($option,11), "INSTALL_INCLUDEDIR"); 211 next; 212 } 213 if ($option =~ /extra-charsets=all/) 214 { 215 $cmakeargs = $cmakeargs." -DWITH_CHARSETS=all"; 216 next; 217 } 218 if ($option =~ /extra-charsets=complex/) 219 { 220 $cmakeargs = $cmakeargs." -DWITH_CHARSETS=complex"; 221 next; 222 } 223 if ($option =~ /localstatedir=/) 224 { 225 $cmakeargs = $cmakeargs." -DMYSQL_DATADIR=".substr($option,14); 226 next; 227 } 228 if ($option =~ /with-comment=/) 229 { 230 $cmakeargs = $cmakeargs." \"-DWITH_COMMENT=".substr($option,13)."\""; 231 next; 232 } 233 if ($option =~ /mysql-maintainer-mode/) 234 { 235 $cmakeargs = $cmakeargs." -DMYSQL_MAINTAINER_MODE=" . 236 ($option =~ /enable/ ? "1" : "0"); 237 next; 238 } 239 if ($option =~ /with-comment=/) 240 { 241 $cmakeargs = $cmakeargs." \"-DWITH_COMMENT=".substr($option,13)."\""; 242 next; 243 } 244 if ($option =~ /with-gcov/) 245 { 246 $cmakeargs = $cmakeargs." -DENABLE_GCOV=ON"; 247 next; 248 } 249 if ($option =~ /with-client-ldflags/) 250 { 251 print("configure.pl : ignoring $option\n"); 252 next; 253 } 254 if ($option =~ /with-mysqld-ldflags=/) 255 { 256 print("configure.pl : ignoring $option\n"); 257 next; 258 } 259 260 $option = uc($option); 261 $option =~ s/-/_/g; 262 $cmakeargs = $cmakeargs." -D".$option."=1"; 263} 264 265print("configure.pl : calling cmake $srcdir $cmakeargs\n"); 266unlink("CMakeCache.txt"); 267my $rc = system("cmake $srcdir $cmakeargs"); 268exit($rc); 269