summaryrefslogtreecommitdiffhomepage
path: root/mrbgems
diff options
context:
space:
mode:
authorYuichiro MASUI <[email protected]>2012-12-22 01:38:06 +0900
committerYuichiro MASUI <[email protected]>2012-12-22 01:38:06 +0900
commitdee0b2283c180c4e2584ff27dcb241a80fb7cfc2 (patch)
tree9e1a6e1f1c3cf399aa51ce88d328a24fe62bb227 /mrbgems
parent429359819a9a3155984c134f62976a42d314244c (diff)
downloadmruby-dee0b2283c180c4e2584ff27dcb241a80fb7cfc2.tar.gz
mruby-dee0b2283c180c4e2584ff27dcb241a80fb7cfc2.zip
Add MRUBY_CFLAGS / MRUBY_LDFLAGS to mrbgems
Diffstat (limited to 'mrbgems')
-rw-r--r--mrbgems/Makefile4gem52
-rw-r--r--mrbgems/build_tasks.rb43
2 files changed, 82 insertions, 13 deletions
diff --git a/mrbgems/Makefile4gem b/mrbgems/Makefile4gem
index cd3151b2e..d6022c84a 100644
--- a/mrbgems/Makefile4gem
+++ b/mrbgems/Makefile4gem
@@ -12,8 +12,19 @@ CC := gcc
RM := rm -f
AR := ar
+# mruby compiler
+ifeq ($(OS),Windows_NT)
+MRBC = $(MRUBY_ROOT)/bin/mrbc.exe
+else
+MRBC = $(MRUBY_ROOT)/bin/mrbc
+endif
+
SRC_DIR := src
MRB_DIR := mrblib
+TEST_DIR := test
+
+GEM_TEST_RB_FILES := $(wildcard $(TEST_DIR)/*.rb)
+GEM_TEST_C_FILES := $(wildcard $(TEST_DIR)/*.c)
# LIBR can be manipulated with command line arguments
ifeq ($(strip $(LIBR)),)
@@ -29,7 +40,7 @@ ifeq ($(strip $(ACTIVE_GEMS)),)
endif
MAKEFILE_GEM_LIST := $(MRUBY_ROOT)/mrbgems/g/MakefileGemList
-include $(MAKEFILE_GEM_LIST)
+-include $(MAKEFILE_GEM_LIST)
# Default rules which are calling the
# gem specific gem-all and gem-clean
@@ -72,20 +83,45 @@ gem_mrblib_init.ctmp :
ruby $(MRUBY_ROOT)/mrbgems/generate_gem_mrblib.rb '$(GEM)' > $@
gem_mrblib_irep.ctmp : gem_mrblib.rbtmp
- $(MRUBY_ROOT)/bin/mrbc -Bgem_mrblib_irep_$(subst -,_,$(GEM)) -o$@ $<
+ $(MRBC) -Bgem_mrblib_irep_$(subst -,_,$(GEM)) -o$@ $<
gem_mrblib.rbtmp :
- cat $(GEM_RB_FILES) > $@
+ cat $(GEM_RB_FILES) > $@
+
+
+gem_test.ctmp : gem_test.rbtmp $(GEM_TEST_C_FILES)
+ $(MRBC) -Bgem_mrblib_irep_$(subst -,_,$(GEM))_test -o$@ $<
+ifeq ($(GEM_TEST_C_FILES),)
+ echo "void mrb_$(subst -,_,$(GEM))_gem_test_init(mrb_state* mrb) { }" >> $@
+else
+ cat $(GEM_TEST_C_FILES) >> $@
+endif
+
+gem_test.rbtmp : $(GEM_TEST_RB_FILES)
+ifeq ($(GEM_TEST_RB_FILES),)
+ echo > $@
+else
+ cat $(GEM_TEST_RB_FILES) > $@
+endif
+
+gem-test-c-and-rb-files : gem_test.ctmp
+
+gem-test-c-files : gem_test.ctmp
+
+gem-test-rb-files : gem_test.ctmp
+
gem-clean-c-and-rb-files :
-$(RM) $(GEM_PACKAGE) gem_mixlib.o gem_mixlib.c gem_mrblib_header.ctmp gem_mrblib_irep.ctmp gem_mixlib_init.ctmp gem_mrblib.rbtmp
- -$(RM) gem_srclib.c gem_srclib.o $(GEM_OBJECTS)
+ -$(RM) gem_srclib.c gem_srclib.o $(GEM_OBJECTS) gem_test.ctmp gem_test.rbtmp gem-cflags.tmp gem-ldflags.tmp
gem-clean-c-files :
- -$(RM) $(GEM_PACKAGE) gem_srclib.c gem_srclib.o $(GEM_OBJECTS)
+ -$(RM) $(GEM_PACKAGE) gem_srclib.c gem_srclib.o $(GEM_OBJECTS) gem_test.ctmp gem_test.rbtmp gem-cflags.tmp gem-ldflags.tmp
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_test.ctmp gem_test.rbtmp gem-cflags.tmp gem-ldflags.tmp
+
%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $(GEM_INCLUDE_LIST) $< -o $@
@@ -93,3 +129,9 @@ gem-clean-rb-files :
.PHONY : clean
clean : gem-clean
@echo "Gem '$(GEM)' is clean"
+
+.PHONY : gem-flags
+gem-flags :
+ @echo "$(MRUBY_CFLAGS) -I`pwd`/include" > gem-cflags.tmp
+ @echo "$(MRUBY_LDFLAGS)" > gem-ldflags.tmp
+
diff --git a/mrbgems/build_tasks.rb b/mrbgems/build_tasks.rb
index 3c6c457c0..4f0d1175f 100644
--- a/mrbgems/build_tasks.rb
+++ b/mrbgems/build_tasks.rb
@@ -5,15 +5,25 @@ GEM_MAKEFILE = "#{MRBGEMS_PATH}/g/Makefile"
GEM_MAKEFILE_LIST = "#{MRBGEMS_PATH}/g/MakefileGemList"
MAKEFILE_4_GEM = "#{MRUBY_ROOT}/mrbgems/Makefile4gem"
-if ENV['OS'] == 'Windows_NT'
-GEM_MAKE_FLAGS = "#{MAKE_FLAGS} MAKEFILE_4_GEM=\"#{MAKEFILE_4_GEM}\""
-else
-GEM_MAKE_FLAGS = "#{MAKE_FLAGS} MAKEFILE_4_GEM='#{MAKEFILE_4_GEM}'"
+def gem_make_flags
+ if ENV['OS'] == 'Windows_NT'
+ "#{MAKE_FLAGS rescue ''} MAKEFILE_4_GEM=\"#{MAKEFILE_4_GEM}\""
+ else
+ "#{MAKE_FLAGS rescue ''} MAKEFILE_4_GEM='#{MAKEFILE_4_GEM}'"
+ end
end
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}"
+ sh "#{MAKE} -C #{path} #{gem_make_flags}"
+ end
+end
+
+task :load_mrbgems_flags do
+ for_each_gem do |path, gemname|
+ sh "#{MAKE} gem-flags -C #{path} #{gem_make_flags}"
+ CFLAGS << File.read("#{path}/gem-cflags.tmp").chomp
+ LDFLAGS << File.read("#{path}/gem-ldflags.tmp").chomp
end
end
@@ -21,13 +31,30 @@ 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}"
+ sh "#{MAKE} gem-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"
+ for_each_gem do |path, gemname, escaped_gemname|
+ sh "#{MAKE} gem-test -C #{path} #{gem_make_flags}"
+ end
+ open("#{MRUBY_ROOT}/mrbgems/g/mrbgemtest.ctmp", 'w') do |f|
+ for_each_gem do |path, gemname, escaped_gemname|
+ f.puts "void mrb_#{escaped_gemname}_gem_test_init(mrb_state *mrb);"
+ f.puts "extern const char gem_mrblib_irep_#{escaped_gemname}_test[];"
+ end
+ f.puts "void mrbgemtest_init(mrb_state* mrb) {"
+ for_each_gem do |path, gemname, escaped_gemname|
+ f.puts "mrb_#{escaped_gemname}_gem_test_init(mrb);"
+ end
+ for_each_gem do |path, gemname, escaped_gemname|
+ f.puts "mrb_load_irep(mrb, gem_mrblib_irep_#{escaped_gemname}_test);"
+ end
+ f.puts "}"
+
+ end
+ sh "#{CAT} #{for_each_gem{|path, gemname| "#{path}/gem_test.ctmp "}} >> #{MRUBY_ROOT}/mrbgems/g/mrbgemtest.ctmp"
end
file "#{GEM_INIT}.a" => ["#{GEM_INIT}.c", "#{GEM_INIT}.o"] do |t|