diff --git a/Dockerfile b/Dockerfile index e2289f8..5793c24 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1 +1,8 @@ -FROM hone/mruby-cli +FROM hone/mruby-cli:15.04 + +RUN apt-get update && \ + apt-get install -y --no-install-recommends software-properties-common && \ + add-apt-repository ppa:george-edison55/cmake-3.x && \ + apt-get update && \ + apt-get upgrade -y cmake + diff --git a/bintest/mruby-cli.rb b/bintest/mruby-cli.rb index c120e8d..266caab 100644 --- a/bintest/mruby-cli.rb +++ b/bintest/mruby-cli.rb @@ -7,7 +7,7 @@ Dir.mktmpdir do |tmp_dir| Dir.chdir(tmp_dir) do app_name = "new_cli" - output, status = Open3.capture2(BIN_PATH, "--setup", app_name) + output, status = Open3.capture2(BIN_PATH, "setup", app_name) assert_true status.success?, "Process did not exit cleanly" assert_true Dir.exist?(app_name) @@ -25,14 +25,14 @@ Dir.mktmpdir do |tmp_dir| Dir.chdir(tmp_dir) do app_name = "hello_world" - Open3.capture2(BIN_PATH, "--setup", app_name) + Open3.capture2(BIN_PATH, "setup", app_name) Dir.chdir(app_name) do output, status = Open3.capture2("rake compile") - assert_true status.success?, "Process did not exit cleanly" + assert_true status.success?, "`rake compile` did not exit cleanly" output, status = Open3.capture2("mruby/bin/#{app_name}") - assert_true status.success?, "Process did not exit cleanly" + assert_true status.success?, "`#{app_name}` did not exit cleanly" assert_include output, "Hello World" %w(x86_64-pc-linux-gnu i686-pc-linux-gnu).each do |host| @@ -41,10 +41,10 @@ end output, status = Open3.capture2("rake test:bintest") - assert_true status.success?, "Process did not exit cleanly" + assert_true status.success?, "`rake test:bintest` did not exit cleanly" output, status = Open3.capture2("rake test:mtest") - assert_true status.success?, "Process did not exit cleanly" + assert_true status.success?, "`rake test:mtest` did not exit cleanly" assert_false output.include?("Error:"), "mtest has errors" assert_false output.include?("Failure:"), "mtest has failures" end @@ -62,5 +62,5 @@ assert('help') do output, status = Open3.capture2(BIN_PATH, "--help") assert_true status.success?, "Process did not exit cleanly" - assert_include output, "mruby-cli [switches] [arguments]" + assert_include output, "Create your own cli application." end diff --git a/build_config.rb b/build_config.rb index 35e2ef1..7a0444d 100644 --- a/build_config.rb +++ b/build_config.rb @@ -11,6 +11,8 @@ def gem_config(conf) conf.enable_bintest conf.enable_debug conf.enable_test + conf.enable_cxx_abi + conf.linker.flags << "-static-libstdc++" gem_config(conf) end @@ -18,6 +20,9 @@ def gem_config(conf) MRuby::Build.new('x86_64-pc-linux-gnu') do |conf| toolchain :gcc + conf.enable_cxx_abi + conf.linker.flags << "-static-libstdc++" + gem_config(conf) end @@ -28,67 +33,82 @@ def gem_config(conf) cc.flags << "-m32" end + conf.enable_cxx_abi + conf.linker.flags << "-static-libstdc++" + gem_config(conf) end MRuby::CrossBuild.new('x86_64-apple-darwin14') do |conf| - toolchain :clang + toolchain :clang - [conf.cc, conf.linker].each do |cc| - cc.command = 'x86_64-apple-darwin14-clang' - end - conf.cxx.command = 'x86_64-apple-darwin14-clang++' - conf.archiver.command = 'x86_64-apple-darwin14-ar' + [conf.cc, conf.linker].each do |cc| + cc.command = 'x86_64-apple-darwin14-clang' + end + conf.cxx.command = 'x86_64-apple-darwin14-clang++' + conf.cxx.flags << "-std=c++11 -stdlib=libc++" + conf.linker.flags << "-std=c++11 -stdlib=libc++" + conf.archiver.command = 'x86_64-apple-darwin14-ar' - conf.build_target = 'x86_64-pc-linux-gnu' - conf.host_target = 'x86_64-apple-darwin14' + conf.build_target = 'x86_64-pc-linux-gnu' + conf.host_target = 'x86_64-apple-darwin14' - gem_config(conf) + conf.enable_cxx_abi + gem_config(conf) end MRuby::CrossBuild.new('i386-apple-darwin14') do |conf| - toolchain :clang + toolchain :clang - [conf.cc, conf.linker].each do |cc| - cc.command = 'i386-apple-darwin14-clang' - end - conf.cxx.command = 'i386-apple-darwin14-clang++' - conf.archiver.command = 'i386-apple-darwin14-ar' + [conf.cc, conf.linker].each do |cc| + cc.command = 'i386-apple-darwin14-clang' + end + conf.cxx.command = 'i386-apple-darwin14-clang++' + conf.cxx.flags << "-std=c++11 -stdlib=libc++" + conf.linker.flags << "-std=c++11 -stdlib=libc++" + conf.linker.flags << "-static-libstdc++" - conf.build_target = 'i386-pc-linux-gnu' - conf.host_target = 'i386-apple-darwin14' + conf.archiver.command = 'i386-apple-darwin14-ar' - gem_config(conf) + conf.build_target = 'i386-pc-linux-gnu' + conf.host_target = 'i386-apple-darwin14' + + conf.enable_cxx_abi + gem_config(conf) end MRuby::CrossBuild.new('x86_64-w64-mingw32') do |conf| - toolchain :gcc + toolchain :gcc - [conf.cc, conf.linker].each do |cc| - cc.command = 'x86_64-w64-mingw32-gcc' - end - conf.cxx.command = 'x86_64-w64-mingw32-cpp' - conf.archiver.command = 'x86_64-w64-mingw32-gcc-ar' - conf.exts.executable = ".exe" + [conf.cc, conf.linker].each do |cc| + cc.command = 'x86_64-w64-mingw32-gcc' + end + conf.cxx.command = 'x86_64-w64-mingw32-g++' + conf.archiver.command = 'x86_64-w64-mingw32-gcc-ar' + conf.exts.executable = ".exe" - conf.build_target = 'x86_64-pc-linux-gnu' - conf.host_target = 'x86_64-w64-mingw32' + conf.build_target = 'x86_64-pc-linux-gnu' + conf.host_target = 'x86_64-w64-mingw32' - gem_config(conf) + conf.enable_cxx_abi + conf.linker.flags << "-static-libstdc++" + gem_config(conf) end MRuby::CrossBuild.new('i686-w64-mingw32') do |conf| - toolchain :gcc + toolchain :gcc - [conf.cc, conf.linker].each do |cc| - cc.command = 'i686-w64-mingw32-gcc' - end - conf.cxx.command = 'i686-w64-mingw32-cpp' - conf.archiver.command = 'i686-w64-mingw32-gcc-ar' - conf.exts.executable = ".exe" + [conf.cc, conf.linker].each do |cc| + cc.command = 'i686-w64-mingw32-gcc' + end + conf.cxx.command = 'i686-w64-mingw32-g++' + conf.archiver.command = 'i686-w64-mingw32-gcc-ar' + conf.exts.executable = ".exe" - conf.build_target = 'i686-pc-linux-gnu' - conf.host_target = 'i686-w64-mingw32' + conf.build_target = 'i686-pc-linux-gnu' + conf.host_target = 'i686-w64-mingw32' - gem_config(conf) + conf.enable_cxx_abi + conf.linker.flags << "-static-libstdc++" + gem_config(conf) end diff --git a/mrbgem.rake b/mrbgem.rake index 9994eb8..1df5bcd 100644 --- a/mrbgem.rake +++ b/mrbgem.rake @@ -5,7 +5,6 @@ MRuby::Gem::Specification.new('mruby-cli') do |spec| spec.bins = ['mruby-cli'] spec.add_dependency 'mruby-io', :mgem => 'mruby-io' - spec.add_dependency 'mruby-getopts', :mgem => 'mruby-getopts' spec.add_dependency 'mruby-dir', :mgem => 'mruby-dir' - spec.add_dependency 'mruby-mtest', :mgem => 'mruby-mtest' + spec.add_dependency 'mruby-docopt', :github => 'hone/mruby-docopt' end diff --git a/mrblib/mruby-cli/cli.rb b/mrblib/mruby-cli/cli.rb index c79bc1f..f647749 100644 --- a/mrblib/mruby-cli/cli.rb +++ b/mrblib/mruby-cli/cli.rb @@ -1,30 +1,42 @@ module MRubyCLI class CLI def initialize(argv, output_io = $stdout, error_io = $stderr) - @options = setup_options - @opts = @options.parse(argv) + @usage = setup_options + @options = Docopt.parse(@usage, argv) @output_io = output_io @error_io = error_io end def run - if app_name = @options.option(:setup) - Setup.new(app_name, @output_io).run - elsif @options.option(:version) + if @options["setup"] + Setup.new(@options[""], @output_io).run + elsif @options["--version"] Version.new(@output_io).run else - Help.new(@output_io).run + Help.new(@usage, @output_io).run end end private def setup_options - options = Options.new - options.add(Option.new("setup", "s", true)) - options.add(Option.new("version", "v")) - options.add(Option.new("help", "h")) + USAGE = < + mruby-cli (-v | --version) + mruby-cli (-h | --help) + +Create your own cli application. +Setup will scafold your application. + + Arguments: + name The name of your application + + Options: + -h --Help Show this screen. + -v --version Show version. +USAGE end end end diff --git a/mrblib/mruby-cli/help.rb b/mrblib/mruby-cli/help.rb index 214dbd5..d09fbb1 100644 --- a/mrblib/mruby-cli/help.rb +++ b/mrblib/mruby-cli/help.rb @@ -1,14 +1,12 @@ module MRubyCLI class Help - def initialize(output_io) + def initialize(usage, output_io) + @usage = usage @output_io = output_io end def run - @output_io.puts "mruby-cli [switches] [arguments]" - @output_io.puts "mruby-cli -h, --help : show this message" - @output_io.puts "mruby-cli -s, --setup= : setup your app" - @output_io.puts "mruby-cli -v, --version : print mruby-cli version" + @output_io.puts @usage end end end diff --git a/mrblib/mruby-cli/option.rb b/mrblib/mruby-cli/option.rb deleted file mode 100644 index 5d549d9..0000000 --- a/mrblib/mruby-cli/option.rb +++ /dev/null @@ -1,24 +0,0 @@ -module MRubyCLI - class Option - attr_reader :short, :long, :value - - def initialize(long, short, value = false) - @short = short - @long = long - @value = value - end - - def to_long_opt - to_getopt(@long, @value) - end - - def to_short_opt - to_getopt(@short, @value) - end - - private - def to_getopt(name, value) - value ? "#{name}:" : name - end - end -end diff --git a/mrblib/mruby-cli/options.rb b/mrblib/mruby-cli/options.rb deleted file mode 100644 index 03882e4..0000000 --- a/mrblib/mruby-cli/options.rb +++ /dev/null @@ -1,44 +0,0 @@ -module MRubyCLI - class Options - attr_reader :short_opts, :long_opts - attr_writer :parsed_opts - - def initialize - @options = {} - @short_opts_array = [] - @short_opts = "" - @long_opts = [] - @parsed_opts = {} - end - - def add(option) - @options[option.long.to_sym] = option - @long_opts << option.to_long_opt - @long_opts.sort! - @short_opts_array << option.to_short_opt - @short_opts = @short_opts_array.sort!.join("") - - option - end - - def parse(args) - class << args; include Getopts; end - @parsed_opts = args.getopts(@short_opts, *@long_opts) - end - - def option(long_opt) - option = @options[long_opt] - - return nil unless option - if retn = @parsed_opts[option.long] - if option.value - return retn unless retn.empty? - else - return retn - end - end - return @parsed_opts[option.short] if @parsed_opts[option.short] - return false - end - end -end diff --git a/test/mruby-cli/test_option.rb b/test/mruby-cli/test_option.rb deleted file mode 100644 index 367cc6d..0000000 --- a/test/mruby-cli/test_option.rb +++ /dev/null @@ -1,29 +0,0 @@ -module MRubyCLI - class TestOption < MTest::Unit::TestCase - def test_to_long_opt_true - option = Option.new("setup", "s", true) - - assert_equal "setup:", option.to_long_opt - end - - def test_to_short_opt_true - option = Option.new("setup", "s", true) - - assert_equal "s:", option.to_short_opt - end - - def test_to_long_opt_false - option = Option.new("version", "v") - - assert_equal "version", option.to_long_opt - end - - def test_to_short_opt_false - option = Option.new("version", "v") - - assert_equal "v", option.to_short_opt - end - end -end - -MTest::Unit.new.run diff --git a/test/mruby-cli/test_options.rb b/test/mruby-cli/test_options.rb deleted file mode 100644 index 15a2bba..0000000 --- a/test/mruby-cli/test_options.rb +++ /dev/null @@ -1,38 +0,0 @@ -module MRubyCLI - class TestOptions < MTest::Unit::TestCase - def test_add - options = Options.new - options.add(Option.new("setup", "s", true)) - options.add(Option.new("version", "v", false)) - - assert_equal %w(setup: version), options.long_opts - assert_equal "s:v", options.short_opts - end - - def test_option - options = Options.new - options.add(Option.new("setup", "s", true)) - options.add(Option.new("version", "v", false)) - - options.parsed_opts = {"setup" => "foo"} - assert_equal "foo", options.option(:setup) - - options.parsed_opts = {"s" => "foo"} - assert_equal "foo", options.option(:setup) - - options.parsed_opts = {"version" => ""} - assert_equal "", options.option(:version) - - options.parsed_opts = {"v" => ""} - assert_equal "", options.option(:version) - - options.parsed_opts = {"v" => ""} - assert_equal false, options.option(:setup) - - options.parsed_opts = {"v" => ""} - assert_equal nil, options.option(:blah) - end - end -end - -MTest::Unit.new.run