diff --git a/Gemfile b/Gemfile index 38da745..28a072a 100644 --- a/Gemfile +++ b/Gemfile @@ -1,3 +1,6 @@ # frozen_string_literal: true source "https://rubygems.org" + +gem "codetracer-ruby-recorder", path: "gems/native-tracer" +gem "codetracer_pure_ruby_recorder", path: "gems/pure-ruby-tracer" diff --git a/Justfile b/Justfile index ab8a6a1..deced66 100644 --- a/Justfile +++ b/Justfile @@ -7,4 +7,4 @@ bench name="heavy_work": ruby test/benchmarks/run_benchmark.rb {{name}} build-extension: - cargo build --release --manifest-path ext/native_tracer/Cargo.toml + cargo build --release --manifest-path gems/native-tracer/ext/native_tracer/Cargo.toml diff --git a/Rakefile b/Rakefile index 4ebda76..07494aa 100644 --- a/Rakefile +++ b/Rakefile @@ -1,7 +1,7 @@ require 'rb_sys/extensiontask' RbSys::ExtensionTask.new('codetracer_ruby_recorder') do |ext| - ext.ext_dir = 'ext/native_tracer' - ext.lib_dir = 'src' - ext.gem_spec = Gem::Specification.load('codetracer-ruby-recorder.gemspec') + ext.ext_dir = 'gems/native-tracer/ext/native_tracer' + ext.lib_dir = 'gems/native-tracer/lib' + ext.gem_spec = Gem::Specification.load('gems/native-tracer/codetracer-ruby-recorder.gemspec') end diff --git a/gems/native-tracer/bin/codetracer-ruby-recorder b/gems/native-tracer/bin/codetracer-ruby-recorder new file mode 100644 index 0000000..ab00c17 --- /dev/null +++ b/gems/native-tracer/bin/codetracer-ruby-recorder @@ -0,0 +1,5 @@ +#!/usr/bin/env ruby +require 'rbconfig' +script = File.expand_path('../lib/native_trace.rb', __dir__) +exec RbConfig.ruby, script, *ARGV + diff --git a/codetracer-ruby-recorder.gemspec b/gems/native-tracer/codetracer-ruby-recorder.gemspec similarity index 67% rename from codetracer-ruby-recorder.gemspec rename to gems/native-tracer/codetracer-ruby-recorder.gemspec index 4f01849..bf6eb28 100644 --- a/codetracer-ruby-recorder.gemspec +++ b/gems/native-tracer/codetracer-ruby-recorder.gemspec @@ -9,9 +9,12 @@ Gem::Specification.new do |spec| spec.license = 'MIT' spec.homepage = 'https://github.com/metacraft-labs/codetracer-ruby-recorder' - spec.files = Dir['src/**/*', 'ext/native_tracer/**/{Cargo.toml,*.rs}', 'ext/native_tracer/extconf.rb', 'README.md', 'LICENSE'] - spec.require_paths = ['src'] + spec.files = Dir['lib/**/*', 'ext/native_tracer/**/{Cargo.toml,*.rs}', + 'ext/native_tracer/extconf.rb', '../../README.md', '../../LICENSE'] + spec.require_paths = ['lib'] spec.extensions = ['ext/native_tracer/extconf.rb'] + spec.bindir = 'bin' + spec.executables = ['codetracer-ruby-recorder'] spec.add_development_dependency 'rb_sys', '~> 0.9' end diff --git a/ext/native_tracer/.gitignore b/gems/native-tracer/ext/native_tracer/.gitignore similarity index 100% rename from ext/native_tracer/.gitignore rename to gems/native-tracer/ext/native_tracer/.gitignore diff --git a/ext/native_tracer/Cargo.lock b/gems/native-tracer/ext/native_tracer/Cargo.lock similarity index 100% rename from ext/native_tracer/Cargo.lock rename to gems/native-tracer/ext/native_tracer/Cargo.lock diff --git a/ext/native_tracer/Cargo.toml b/gems/native-tracer/ext/native_tracer/Cargo.toml similarity index 100% rename from ext/native_tracer/Cargo.toml rename to gems/native-tracer/ext/native_tracer/Cargo.toml diff --git a/ext/native_tracer/README.md b/gems/native-tracer/ext/native_tracer/README.md similarity index 100% rename from ext/native_tracer/README.md rename to gems/native-tracer/ext/native_tracer/README.md diff --git a/ext/native_tracer/build.rs b/gems/native-tracer/ext/native_tracer/build.rs similarity index 100% rename from ext/native_tracer/build.rs rename to gems/native-tracer/ext/native_tracer/build.rs diff --git a/ext/native_tracer/extconf.rb b/gems/native-tracer/ext/native_tracer/extconf.rb similarity index 100% rename from ext/native_tracer/extconf.rb rename to gems/native-tracer/ext/native_tracer/extconf.rb diff --git a/ext/native_tracer/src/lib.rs b/gems/native-tracer/ext/native_tracer/src/lib.rs similarity index 100% rename from ext/native_tracer/src/lib.rs rename to gems/native-tracer/ext/native_tracer/src/lib.rs diff --git a/src/native_trace.rb b/gems/native-tracer/lib/native_trace.rb similarity index 100% rename from src/native_trace.rb rename to gems/native-tracer/lib/native_trace.rb diff --git a/bin/codetracer-pure-ruby-recorder b/gems/pure-ruby-tracer/bin/codetracer-pure-ruby-recorder old mode 100755 new mode 100644 similarity index 57% rename from bin/codetracer-pure-ruby-recorder rename to gems/pure-ruby-tracer/bin/codetracer-pure-ruby-recorder index 8b56d83..7adbdd7 --- a/bin/codetracer-pure-ruby-recorder +++ b/gems/pure-ruby-tracer/bin/codetracer-pure-ruby-recorder @@ -1,4 +1,4 @@ #!/usr/bin/env ruby require 'rbconfig' -script = File.expand_path('../src/trace.rb', __dir__) +script = File.expand_path('../lib/trace.rb', __dir__) exec RbConfig.ruby, script, *ARGV diff --git a/codetracer_pure_ruby_recorder.gemspec b/gems/pure-ruby-tracer/codetracer_pure_ruby_recorder.gemspec similarity index 83% rename from codetracer_pure_ruby_recorder.gemspec rename to gems/pure-ruby-tracer/codetracer_pure_ruby_recorder.gemspec index c1b0211..4f644e8 100644 --- a/codetracer_pure_ruby_recorder.gemspec +++ b/gems/pure-ruby-tracer/codetracer_pure_ruby_recorder.gemspec @@ -9,8 +9,8 @@ Gem::Specification.new do |spec| spec.license = 'MIT' spec.homepage = 'https://github.com/metacraft-labs/codetracer-ruby-recorder' - spec.files = Dir['src/**/*', 'bin/*', 'README.md', 'LICENSE'] - spec.require_paths = ['src'] + spec.files = Dir['lib/**/*', 'bin/*', '../../README.md', '../../LICENSE'] + spec.require_paths = ['lib'] spec.bindir = 'bin' spec.executables = ['codetracer-pure-ruby-recorder'] end diff --git a/gems/pure-ruby-tracer/lib/native_trace.rb b/gems/pure-ruby-tracer/lib/native_trace.rb new file mode 100644 index 0000000..010431a --- /dev/null +++ b/gems/pure-ruby-tracer/lib/native_trace.rb @@ -0,0 +1,34 @@ +#!/usr/bin/env ruby +# SPDX-License-Identifier: MIT +# Simple utility loading the native tracer extension and executing a program. + +require 'optparse' + +options = {} +parser = OptionParser.new do |opts| + opts.banner = "usage: ruby native_trace.rb [options] [args]" + opts.on('-o DIR', '--out-dir DIR', 'Directory to write trace files') do |dir| + options[:out_dir] = dir + end + opts.on('-h', '--help', 'Print this help') do + puts opts + exit + end +end +parser.order! + +if ARGV.empty? + $stderr.puts parser + exit 1 +end + +out_dir = options[:out_dir] || ENV['CODETRACER_RUBY_RECORDER_OUT_DIR'] || Dir.pwd +ENV['CODETRACER_RUBY_RECORDER_OUT_DIR'] = out_dir + +# Path to the compiled native extension +ext_path = File.expand_path('../ext/native_tracer/target/release/libcodetracer_ruby_recorder', __dir__) +require ext_path + +program = ARGV.shift +load program + diff --git a/src/recorder.rb b/gems/pure-ruby-tracer/lib/recorder.rb similarity index 100% rename from src/recorder.rb rename to gems/pure-ruby-tracer/lib/recorder.rb diff --git a/src/trace.rb b/gems/pure-ruby-tracer/lib/trace.rb similarity index 100% rename from src/trace.rb rename to gems/pure-ruby-tracer/lib/trace.rb diff --git a/scripts/publish_gems.rb b/scripts/publish_gems.rb old mode 100755 new mode 100644 index 6c48714..38b7fa2 --- a/scripts/publish_gems.rb +++ b/scripts/publish_gems.rb @@ -28,7 +28,7 @@ def run(cmd, env = {}) end # Build and publish pure Ruby gem -run('gem build codetracer_pure_ruby_recorder.gemspec') +run('gem build gems/pure-ruby-tracer/codetracer_pure_ruby_recorder.gemspec') pure_gem = Dir['codetracer_pure_ruby_recorder-*.gem'].max_by { |f| File.mtime(f) } run("gem push #{pure_gem}") FileUtils.rm_f(pure_gem) diff --git a/test/benchmarks/run_benchmark.rb b/test/benchmarks/run_benchmark.rb index f5a1235..75940a6 100644 --- a/test/benchmarks/run_benchmark.rb +++ b/test/benchmarks/run_benchmark.rb @@ -32,7 +32,7 @@ raise 'reference trace hash mismatch' unless Digest::SHA256.file(FIXTURE).hexdigest == EXPECTED_HASH elapsed = Benchmark.realtime do - system('ruby', File.expand_path('../../src/trace.rb', __dir__), '--out-dir', OUTPUT_DIR, PROGRAM) + system('ruby', File.expand_path('../../gems/pure-ruby-tracer/lib/trace.rb', __dir__), '--out-dir', OUTPUT_DIR, PROGRAM) raise 'trace failed' unless $?.success? end puts "Benchmark runtime: #{(elapsed * 1000).round} ms" diff --git a/test/test_tracer.rb b/test/test_tracer.rb index f327910..6b15259 100644 --- a/test/test_tracer.rb +++ b/test/test_tracer.rb @@ -16,7 +16,7 @@ def run_trace(program_name) program = File.join('test', 'programs', program_name) out_dir = File.join('test', 'tmp', base) FileUtils.mkdir_p(out_dir) - system('ruby', 'src/trace.rb', '--out-dir', out_dir, program) + system('ruby', 'gems/pure-ruby-tracer/lib/trace.rb', '--out-dir', out_dir, program) raise "trace failed" unless $?.success? JSON.parse(File.read(File.join(out_dir, 'trace.json'))) end