Commit f222d8cc authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

Merge pull request #634 from masuidrive/use_ruby_for_building

Use CRuby for building
parents 3be5bfbc 8f9105d2
...@@ -19,10 +19,12 @@ cscope.out ...@@ -19,10 +19,12 @@ cscope.out
/bin /bin
/mrblib/mrblib.c /mrblib/mrblib.c
/mrblib/*.*tmp /mrblib/*.*tmp
/mrblib/mrblib.mrb
/test/mrbtest /test/mrbtest
/test/mrbtest.c /test/mrbtest.c
/test/*.*tmp /test/*.*tmp
/test/mrubytest.* /test/mrubytest.*
tools/mrbc/mrbc.mrb
CMakeFiles CMakeFiles
CMakeCache.txt CMakeCache.txt
/mrbgems/generator /mrbgems/generator
......
# no installation... # no installation...
script: "make all test" script: "./minirake all test"
# Makefile description.
# basic build file for mruby
# compiler, linker (gcc), archiver, parser generator
export CC = gcc
export LL = gcc
export AR = ar
export YACC = bison
MRUBY_ROOT := $(realpath .)
ifeq ($(strip $(ENABLE_GEMS)),)
# by default GEMs are deactivated
ENABLE_GEMS = false
endif
ifeq ($(strip $(ACTIVE_GEMS)),)
# the default file which contains the active GEMs
ACTIVE_GEMS = GEMS.active
endif
ifeq ($(strip $(COMPILE_MODE)),)
# default compile option
COMPILE_MODE = debug
endif
ifeq ($(COMPILE_MODE),debug)
CFLAGS = -g -O3
else ifeq ($(COMPILE_MODE),release)
CFLAGS = -O3
else ifeq ($(COMPILE_MODE),small)
CFLAGS = -Os
endif
ALL_CFLAGS = -Wall -Werror-implicit-function-declaration $(CFLAGS)
ifeq ($(OS),Windows_NT)
MAKE_FLAGS = --no-print-directory CC=$(CC) LL=$(LL) ALL_CFLAGS='$(ALL_CFLAGS)' LDFLAGS='$(LDFLAGS)' ENABLE_GEMS='$(ENABLE_GEMS)' ACTIVE_GEMS='$(ACTIVE_GEMS)' MRUBY_ROOT='$(MRUBY_ROOT)'
else
MAKE_FLAGS = --no-print-directory CC='$(CC)' LL='$(LL)' ALL_CFLAGS='$(ALL_CFLAGS)' LDFLAGS='$(LDFLAGS)' ENABLE_GEMS='$(ENABLE_GEMS)' ACTIVE_GEMS='$(ACTIVE_GEMS)' MRUBY_ROOT='$(MRUBY_ROOT)'
endif
##############################
# internal variables
export MSG_BEGIN = @for line in
export MSG_END = ; do echo "$$line"; done
export CP := cp
export RM_F := rm -f
export CAT := cat
##############################
# generic build targets, rules
.PHONY : all
all :
@$(MAKE) -C src $(MAKE_FLAGS)
@$(MAKE) -C mrblib $(MAKE_FLAGS)
ifeq ($(ENABLE_GEMS),true)
@echo "-- MAKE mrbgems --"
@$(MAKE) -C mrbgems $(MAKE_FLAGS)
endif
$(MAKE) -C tools/mruby $(MAKE_FLAGS)
@$(MAKE) -C tools/mirb $(MAKE_FLAGS)
# mruby test
.PHONY : test
test : all
@$(MAKE) -C test $(MAKE_FLAGS)
# clean up
.PHONY : clean
clean :
@$(MAKE) clean -C src $(MAKE_FLAGS)
ifeq ($(ENABLE_GEMS),true)
@echo "-- CLEAN mrbgems --"
@$(MAKE) clean -C mrbgems $(MAKE_FLAGS)
endif
@$(MAKE) clean -C tools/mruby $(MAKE_FLAGS)
@$(MAKE) clean -C tools/mirb $(MAKE_FLAGS)
@$(MAKE) clean -C test $(MAKE_FLAGS)
# display help for build configuration and interesting targets
.PHONY : showconfig
showconfig :
$(MSG_BEGIN) \
"" \
" CC = $(CC)" \
" LL = $(LL)" \
" MAKE = $(MAKE)" \
"" \
" CFLAGS = $(CFLAGS)" \
" ALL_CFLAGS = $(ALL_CFLAGS)" \
$(MSG_END)
.PHONY : help
help :
$(MSG_BEGIN) \
"" \
" Basic mruby Makefile" \
"" \
"targets:" \
" all (default): build all targets, install (locally) in-repo" \
" clean: clean all built and in-repo installed artifacts" \
" showconfig: show build config summary" \
" test: run all mruby tests" \
$(MSG_END)
# Build description.
# basic build file for mruby
# compiler, linker (gcc), archiver, parser generator
CC = ENV['CC'] || 'gcc'
LL = ENV['LL'] || 'gcc'
AR = ENV['AR'] || 'ar'
YACC = ENV['YACC'] || 'bison'
MAKE = ENV['MAKE'] || 'make'
# mruby source root path
MRUBY_ROOT = ENV['MRUBY_ROOT'] || File.expand_path(File.dirname(__FILE__))
# by default GEMs are deactivated
ENABLE_GEMS = false
# the default file which contains the active GEMs
ACTIVE_GEMS = File.join(File.dirname(__FILE__), 'mrbgems', 'GEMS.active')
# default compile option
COMPILE_MODE = :debug
##############################
# compile flags
case COMPILE_MODE.to_s
when 'debug'
CFLAGS = ['-g', '-O3']
when 'release'
CFLAGS = ['-O3']
when 'small'
CFLAGS = ['-Os']
else
CFLAGS = [ENV['CFLAGS']]
end
LDFLAGS = [ENV['LDFLAGS']]
CFLAGS << "-Wall" << "-Werror-implicit-function-declaration" << "-I#{MRUBY_ROOT}/include"
if ENV['OS'] == 'Windows_NT'
MAKE_FLAGS = "--no-print-directory CC=#{CC} LL=#{LL} CFLAGS='#{CFLAGS.join(' ')}' LDFLAGS='#{LDFLAGS.join(' ')}' ENABLE_GEMS='#{ENABLE_GEMS}' MRUBY_ROOT='#{MRUBY_ROOT}'"
else
MAKE_FLAGS = "--no-print-directory CC='#{CC}' LL='#{LL}' CFLAGS='#{CFLAGS.join(' ')}' LDFLAGS='#{LDFLAGS.join(' ')}' ENABLE_GEMS='#{ENABLE_GEMS}' MRUBY_ROOT='#{MRUBY_ROOT}'"
end
##############################
# internal variables
CP = ENV['CP'] ||= 'cp'
RM_F = ENV['RM_F'] ||= 'rm -f'
CAT = ENV['CAT'] ||= 'cat'
##############################
# generic build targets, rules
if ENABLE_GEMS
require './mrbgems/build_tasks'
end
task :default => :all
desc "build all targets, install (locally) in-repo"
task :all do
sh "#{MAKE} -C src #{MAKE_FLAGS}"
sh "#{MAKE} -C mrblib #{MAKE_FLAGS}"
if ENABLE_GEMS
puts "-- MAKE mrbgems --"
Rake::Task['mrbgems_all'].invoke
end
sh "#{MAKE} -C tools/mruby #{MAKE_FLAGS}"
sh "#{MAKE} -C tools/mirb #{MAKE_FLAGS}"
end
desc "sh all mruby tests"
task :test => [:all] do
sh "#{MAKE} -C test #{MAKE_FLAGS}"
end
desc "clean all built and in-repo installed artifacts"
task :clean do
sh "#{MAKE} clean -C src #{MAKE_FLAGS}"
sh "#{MAKE} clean -C mrblib #{MAKE_FLAGS}"
if ENABLE_GEMS
puts "-- MAKE mrbgems --"
Rake::Task['mrbgems_clean'].invoke
end
sh "#{MAKE} clean -C tools/mruby #{MAKE_FLAGS}"
sh "#{MAKE} clean -C tools/mirb #{MAKE_FLAGS}"
sh "#{MAKE} clean -C test #{MAKE_FLAGS}"
end
desc "show build config summary"
task :showconfig do
puts " CC = #{CC}"
puts " LL = #{LL}"
puts " MAKE = #{MAKE}"
puts ""
puts " CFLAGS = #{CFLAGS.join(' ')}"
puts " LDFLAGS = #{LDFLAGS.join(' ')}"
end
This diff is collapsed.
# makefile description.
# add gems to the ruby library
ifeq ($(strip $(MRUBY_ROOT)),)
MRUBY_ROOT := $(realpath ..)
endif
LIBR := ../lib/libmruby.a
RM_F := rm -f
CC_FLAGS := -Wall -Werror-implicit-function-declaration -g -O3 -MMD -I. -I./../include
export CC = gcc
export LL = gcc
export AR = ar
GENERATOR := $(MRUBY_ROOT)/mrbgems/generator
ifeq ($(OS),Windows_NT)
GENERATOR_BIN := $(GENERATOR).exe
else
GENERATOR_BIN := $(GENERATOR)
endif
GEM_INIT := gem_init
GEM_MAKEFILE := g/Makefile
GEM_MAKEFILE_LIST := g/MakefileGemList
GEMDLIB := g/mrbgemtest.ctmp
ifeq ($(strip $(ACTIVE_GEMS)),)
# the default file which contains the active GEMs
ACTIVE_GEMS = GEMS.active
endif
##############################
# generic build targets, rules
.PHONY : all
all : all_gems $(GEM_INIT).a
$(GEM_INIT).a : $(GEM_INIT).o
$(AR) rs gem_init.a $(GEM_INIT).o
all_gems : $(GENERATOR_BIN)
@echo "Generate Gem List Makefile"
$(GENERATOR_BIN) makefile_list $(ACTIVE_GEMS) > $(GEM_MAKEFILE_LIST)
@echo "Generate Gem Makefile"
$(GENERATOR_BIN) makefile $(ACTIVE_GEMS) "$(MRUBY_ROOT)" > $(GEM_MAKEFILE)
@echo "Build all gems"
$(MAKE) -C g MRUBY_ROOT='$(MRUBY_ROOT)' ACTIVE_GEMS="$(ACTIVE_GEMS)"
$(GEM_INIT).c : $(GENERATOR_BIN)
@echo "Generate Gem driver"
$(GENERATOR_BIN) $(GEM_INIT) $(ACTIVE_GEMS) > $@
$(GEM_INIT).o : $(GEM_INIT).c
@echo "Build the driver which initializes all gems"
$(CC) $(CC_FLAGS) -MMD -c $< -o $@
# Generator
$(GENERATOR_BIN) : $(GENERATOR).o
@echo "Build the generator which creates the driver and Gem Makefile"
$(LL) -o $@ $(CC_FLAGS) $<
$(GENERATOR).o : $(GENERATOR).c
$(CC) $(CC_FLAGS) -MMD -c $< -o $@
.PHONY : prepare-test
prepare-test :
@$(MAKE) prepare-test -C g ACTIVE_GEMS="$(ACTIVE_GEMS)" MRUBY_ROOT='$(MRUBY_ROOT)'
# clean driver and all gems
.PHONY : clean
clean : $(GENERATOR_BIN)
@echo "Cleanup Gems"
$(GENERATOR_BIN) makefile $(ACTIVE_GEMS) "$(MRUBY_ROOT)" > $(GEM_MAKEFILE)
$(MAKE) clean -C g ACTIVE_GEMS="$(ACTIVE_GEMS)" MRUBY_ROOT='$(MRUBY_ROOT)'
-$(RM_F) $(GEM_INIT).c *.o *.d $(GENERATOR_BIN) $(GEM_MAKEFILE) $(GEM_MAKEFILE_LIST) gem_init.a
...@@ -28,6 +28,9 @@ ifeq ($(strip $(ACTIVE_GEMS)),) ...@@ -28,6 +28,9 @@ ifeq ($(strip $(ACTIVE_GEMS)),)
ACTIVE_GEMS = GEMS.active ACTIVE_GEMS = GEMS.active
endif endif
MAKEFILE_GEM_LIST := $(MRUBY_ROOT)/mrbgems/g/MakefileGemList
include $(MAKEFILE_GEM_LIST)
# Default rules which are calling the # Default rules which are calling the
# gem specific gem-all and gem-clean # gem specific gem-all and gem-clean
# implementations of a gem # implementations of a gem
...@@ -46,14 +49,14 @@ gem_mixlib.c : gem_mrblib_header.ctmp gem_mrblib_irep.ctmp gem_mixlib_init.ctmp ...@@ -46,14 +49,14 @@ gem_mixlib.c : gem_mrblib_header.ctmp gem_mrblib_irep.ctmp gem_mixlib_init.ctmp
cat $^ > $@ cat $^ > $@
gem_mixlib_init.ctmp : gem_mixlib_init.ctmp :
$(MRUBY_ROOT)/mrbgems/generator gem_mixlib $(GEM) > $@ ruby $(MRUBY_ROOT)/mrbgems/generate_gem_mixlib.rb '$(GEM)' > $@
# Building target for C files # Building target for C files
gem-c-files : gem_srclib.o gem-c-files : gem_srclib.o
$(AR) rs $(GEM_PACKAGE) $(GEM_OBJECTS) $< $(AR) rs $(GEM_PACKAGE) $(GEM_OBJECTS) $<
gem_srclib.c : gem_srclib.c :
$(MRUBY_ROOT)/mrbgems/generator gem_srclib $(GEM) > $@ ruby $(MRUBY_ROOT)/mrbgems/generate_gem_srclib.rb '$(GEM)' > $@
# Building target for Ruby Files # Building target for Ruby Files
gem-rb-files : gem_mrblib.o gem-rb-files : gem_mrblib.o
...@@ -63,10 +66,10 @@ gem_mrblib.c : gem_mrblib_header.ctmp gem_mrblib_irep.ctmp gem_mrblib_init.ctmp ...@@ -63,10 +66,10 @@ gem_mrblib.c : gem_mrblib_header.ctmp gem_mrblib_irep.ctmp gem_mrblib_init.ctmp
cat $^ > $@ cat $^ > $@
gem_mrblib_header.ctmp : gem_mrblib_header.ctmp :
$(MRUBY_ROOT)/mrbgems/generator gem_mrblib > $@ ruby $(MRUBY_ROOT)/mrbgems/generate_gem_mrblib_header.rb '$(GEM)' > $@
gem_mrblib_init.ctmp : gem_mrblib_init.ctmp :
$(MRUBY_ROOT)/mrbgems/generator gem_mrblib $(GEM) > $@ ruby $(MRUBY_ROOT)/mrbgems/generate_gem_mrblib.rb '$(GEM)' > $@
gem_mrblib_irep.ctmp : gem_mrblib.rbtmp gem_mrblib_irep.ctmp : gem_mrblib.rbtmp
$(MRUBY_ROOT)/bin/mrbc -Bgem_mrblib_irep_$(subst -,_,$(GEM)) -o$@ $< $(MRUBY_ROOT)/bin/mrbc -Bgem_mrblib_irep_$(subst -,_,$(GEM)) -o$@ $<
...@@ -84,6 +87,9 @@ gem-clean-c-files : ...@@ -84,6 +87,9 @@ gem-clean-c-files :
gem-clean-rb-files : gem-clean-rb-files :
-$(RM) $(GEM_PACKAGE) gem_mrblib.o gem_mrblib.c gem_mrblib_header.ctmp gem_mrblib_init.ctmp gem_mrblib_irep.ctmp gem_mrblib.rbtmp -$(RM) $(GEM_PACKAGE) gem_mrblib.o gem_mrblib.c gem_mrblib_header.ctmp gem_mrblib_init.ctmp gem_mrblib_irep.ctmp gem_mrblib.rbtmp
%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $(GEM_INCLUDE_LIST) $< -o $@
.PHONY : clean .PHONY : clean
clean : gem-clean clean : gem-clean
@echo "Gem '$(GEM)' is clean" @echo "Gem '$(GEM)' is clean"
MRBGEMS_PATH = File.dirname(__FILE__)
GEM_INIT = "#{MRBGEMS_PATH}/gem_init"
GEM_MAKEFILE = "#{MRBGEMS_PATH}/g/Makefile"
GEM_MAKEFILE_LIST = "#{MRBGEMS_PATH}/g/MakefileGemList"
MAKEFILE_4_GEM = "#{MRUBY_ROOT}/mrbgems/Makefile4gem"
GEM_MAKE_FLAGS = "#{MAKE_FLAGS} MAKEFILE_4_GEM='#{MAKEFILE_4_GEM}'"
task :mrbgems_all => ["#{GEM_INIT}.a", :mrbgems_generate_gem_makefile_list] do
for_each_gem do |path, gemname|
sh "#{MAKE} -C #{path} #{GEM_MAKE_FLAGS}"
end
end
task :mrbgems_clean do
sh "cd #{MRUBY_ROOT}/mrbgems && #{RM_F} *.c *.d *.a *.o"
sh "cd #{MRUBY_ROOT}/mrbgems/g && #{RM_F} *.c *.d *.rbtmp *.ctmp *.o mrbtest"
for_each_gem do |path, gemname|
sh "#{MAKE} clean -C #{path} #{GEM_MAKE_FLAGS}"
end
end
task :mrbgems_prepare_test do
sh "#{CAT} #{for_each_gem{|path, gemname| "#{path}/test/*.rb "}} > #{MRUBY_ROOT}/mrbgems/g/mrbgemtest.rbtmp"
sh "#{MRUBY_ROOT}/bin/mrbc -Bmrbgemtest_irep -o#{MRUBY_ROOT}/mrbgems/g/mrbgemtest.ctmp #{MRUBY_ROOT}/mrbgems/g/mrbgemtest.rbtmp"
end
file "#{GEM_INIT}.a" => ["#{GEM_INIT}.c", "#{GEM_INIT}.o"] do |t|
sh "#{AR} rs #{t.name} #{GEM_INIT}.o"
end
rule ".o" => [".c"] do |t|
puts "Build the driver which initializes all gems"
sh "#{CC} #{CFLAGS.join(' ')} -I#{MRUBY_ROOT}/include -MMD -c #{t.source} -o #{t.name}"
end
file "#{GEM_INIT}.c" do |t|
puts "Generate Gem driver: #{t.name}"
open(t.name, 'w') do |f|
f.puts <<__EOF__
/*
* This file contains a list of all
* initializing methods which are
* necessary to bootstrap all gems.
*
* IMPORTANT:
* This file was generated!
* All manual changes will get lost.
*/
#include "mruby.h"
#{for_each_gem{|path, gemname, escaped_gemname| "void GENERATED_TMP_mrb_%s_gem_init(mrb_state*);" % [escaped_gemname]}}
void
mrb_init_mrbgems(mrb_state *mrb) {
#{for_each_gem{|path, gemname, escaped_gemname| " GENERATED_TMP_mrb_%s_gem_init(mrb);" % [escaped_gemname]}}
}
__EOF__
end
end
def for_each_gem(&block)
IO.readlines(ACTIVE_GEMS).map { |line|
path = line.chomp
gemname = File.basename(path)
escaped_gemname = gemname.gsub(/-/, '_')
block.call(path, gemname, escaped_gemname)
}.join('')
end
task :mrbgems_generate_gem_makefile_list do
open(GEM_MAKEFILE_LIST, 'w') do |f|
f.puts <<__EOF__
GEM_LIST := #{for_each_gem{|path, gemname| "#{path}/mrb-#{gemname}-gem.a "}}
GEM_ARCHIVE_FILES := #{MRUBY_ROOT}/mrbgems/gem_init.a
GEM_ARCHIVE_FILES += $(GEM_LIST)
GEM_INCLUDE_LIST := #{for_each_gem{|path, gemname| "-I#{path}/include "}}
__EOF__
end
end
#!/usr/bin/env ruby
gemname = ARGV.shift.gsub('-', '_')
puts <<__EOF__
void mrb_#{gemname}_gem_init(mrb_state*);
void
GENERATED_TMP_mrb_#{gemname}_gem_init(mrb_state *mrb)
{
mrb_#{gemname}_gem_init(mrb);
mrb_load_irep(mrb, gem_mrblib_irep_#{gemname});
if (mrb->exc) {
mrb_p(mrb, mrb_obj_value(mrb->exc));
exit(0);
}
}
__EOF__
#!/usr/bin/env ruby
gemname = ARGV.shift.gsub('-', '_')
puts <<__EOF__
void
GENERATED_TMP_mrb_#{gemname}_gem_init(mrb_state *mrb)
{
mrb_load_irep(mrb, gem_mrblib_irep_#{gemname});
if (mrb->exc) {
mrb_p(mrb, mrb_obj_value(mrb->exc));
exit(0);
}
}
__EOF__
#!/usr/bin/env ruby
puts <<__EOF__
/*
* This file is loading the irep
* Ruby GEM code.
*
* IMPORTANT:
* This file was generated!
* All manual changes will get lost.
*/
#include "mruby.h"
#include "mruby/irep.h"
#include "mruby/dump.h"
#include "mruby/string.h"
#include "mruby/proc.h"
__EOF__
\ No newline at end of file
#!/usr/bin/env ruby
gemname = ARGV.shift.gsub('-', '_')
puts <<__EOF__
/*
* This file is loading the irep
* Ruby GEM code.
*
* IMPORTANT:
* This file was generated!
* All manual changes will get lost.
*/
#include "mruby.h"
void mrb_#{gemname}_gem_init(mrb_state*);
void
GENERATED_TMP_mrb_#{gemname}_gem_init(mrb_state *mrb)
{
mrb_#{gemname}_gem_init(mrb);
}
__EOF__
\ No newline at end of file
This diff is collapsed.
...@@ -78,6 +78,9 @@ MRUBY= ../bin/mruby ...@@ -78,6 +78,9 @@ MRUBY= ../bin/mruby
EXE := $(TARGET) EXE := $(TARGET)
endif endif
RAKE = ../minirake
############################## ##############################
# generic build targets, rules # generic build targets, rules
...@@ -106,7 +109,7 @@ $(OBJS) : %.o : %.c ...@@ -106,7 +109,7 @@ $(OBJS) : %.o : %.c
# Compile C source from merged mruby source # Compile C source from merged mruby source
$(CLIB) : $(DLIB) $(INIT) $(CLIB) : $(DLIB) $(INIT)
ifeq ($(ENABLE_GEMS),true) ifeq ($(ENABLE_GEMS),true)
@$(MAKE) prepare-test -C $(GEMDIR) @$(RAKE) mrbgems_prepare_test
endif endif
$(CAT) $(INIT) $(DLIB) $(GEMDLIB) > $@ $(CAT) $(INIT) $(DLIB) $(GEMDLIB) > $@
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment