# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. require 'rbconfig' require 'rake/clean' CLOWNFISH_RUBY_DIR = File.absolute_path('.') CLOWNFISH_INCLUDE_DIR = File.join('..','include') CLOWNFISH_SRC_DIR = File.join('..','src') LEMON_SRC_DIR = File.join('..','..','lemon') desc "Build lemon" task :build_lemon do puts "Building lemon" run_make(LEMON_SRC_DIR,[]) end desc "Build Clownfish" task :clownfish => [:parse_y_files] do Dir.glob("../src/*.c").each do|c_file| obj_file = c_file.gsub(/\.c$/,'.o') command = "#{cc_command} #{includes} #{extra_ccflags} -o #{obj_file} -c #{c_file}" puts command if system(command).nil? abort "Failed cc compile" end end end desc "Lemonize the y file" task :parse_y_files => [:build_lemon] do puts "Parsing y files" Dir.glob("#{CLOWNFISH_SRC_DIR}/*.y").each do |y_file| c_file = y_file.gsub(/\.y$/,'.c') h_file = y_file.gsub(/\.y$/,'.h') report_file = y_file.gsub(/\.y$/,'.out') command = File.join(LEMON_SRC_DIR,'lemon') + ' -c ' + File.join(y_file) puts command if system(command).nil? abort "Problem parsing y file with lemon" end end end task :default => [:clownfish] def cc_command RbConfig::CONFIG["CC"] end def extra_ccflags ccflags = '-std=gnu99 -fno-common -fno-strict-aliasing -pipe -fstack-protector -O3 ' ccflags += ENV['CFLAGS'] if ENV['CFLAGS'] if !defined?(cc_command) abort "Invalid GCC version: gcc_version" end if ENV.has_key?('LUCY_VALGRIND') ccflags += "-fno-inline-functions " end if cc_command =~ /^cl\b/ ccflags += '/TP -D_CRT_SECURE_NO_WARNINGS ' end if ccflags !~ /-std=/ ccflags += "-std=gnu99 " end if ccflags !~ /-D_GNU_SOURCE/ ccflags += "-D_GNU_SOURCE " end return ccflags end def includes return "-I#{CLOWNFISH_INCLUDE_DIR} -I#{CLOWNFISH_SRC_DIR}" end def make_command command = RbConfig::CONFIG["make-prog"] if !command if RUBY_PLATFORM =~ /mswin/i cc = cc_command if cc =~ /^cl\b/ command = "nmake" else command = "dmake" end else command = "make" end end return command end def run_make(dir, params) current_dir = Dir.pwd chdir(dir) if dir command = params.clone command.unshift("CC=#{cc_command}") if RUBY_PLATFORM =~ /mswin/i if cc_command =~ /^cl\b/ command.unshift("-f", "Makefile.MSVC") else command.unshift("-f", "Makefile.MinGW") end end command.unshift(make_command) success = system(*command) if !success raise "Make failed" end chdir(current_dir) if dir end CLEAN.include(CLOWNFISH_SRC_DIR + '/CFCParseHeader.out') CLEAN.include(CLOWNFISH_SRC_DIR + '/CFCParseHeader.c') CLEAN.include(CLOWNFISH_SRC_DIR + '/CFCParseHeader.h')