[ruby-core:81490] [Ruby trunk Feature#13570] Using mkmf for ruby/spec C API specs

From: Greg.mpls@...
Date: 2017-05-31 22:25:41 UTC
List: ruby-core #81490
Issue #13570 has been updated by MSP-Greg (Greg L).


Benoit,

After screwing around with quite a bit of make code, I found the (simple) issue. The code in [Object.cp](https://github.com/ruby/ruby/blob/trunk/spec/mspec/lib/mspec/helpers/fs.rb#L3-L11) does not properly copy binary files on Windows.

Hence, since we know the `src` and `dest` are on the same partition/drive, I used `File.rename` in `spec_helper.rb`.  Below is a diff/patch file:

```diff
--- spec_helper_orig.rb	Mon May 29 13:34:22 2017
+++ spec_helper.rb	Wed May 31 15:47:17 2017
@@ -18,11 +18,7 @@
 
 def compile_extension(name)
   debug = false
-  run_mkmf_in_process = false
-
-  if RUBY_NAME == 'truffleruby'
-    run_mkmf_in_process = true
-  end
+  run_mkmf_in_process = RUBY_NAME == 'truffleruby'
 
   ext = "#{name}_spec"
   lib = "#{object_path}/#{ext}.#{RbConfig::CONFIG['DLEXT']}"
@@ -61,7 +57,7 @@
       raise "make failed:\n#{output}" unless $?.success?
       $stderr.puts output if debug
 
-      cp File.basename(lib), lib
+      File.rename File.basename(lib), lib
     end
   ensure
     rm_r tmpdir unless debug

```

Tests run with `-j` both via `make test-spec` and running `mspec`.  Results of both are at [Ruby MinGW Test Results](https://msp-greg.github.io/file.mingw_test-all.html#test-spec-Failure-Error-Summary).

Thanks for the work.

----------------------------------------
Feature #13570: Using mkmf for ruby/spec C API specs
https://bugs.ruby-lang.org/issues/13570#change-65198

* Author: Eregon (Benoit Daloze)
* Status: Assigned
* Priority: Normal
* Assignee: cruby-windows
* Target version: 
----------------------------------------
Hello all,

I am thinking to use mkmf to compile the C API specs.

https://github.com/ruby/ruby/blob/trunk/spec/rubyspec/optional/capi/spec_helper.rb
is getting pretty complex and hard to maintain.

I have a few questions:
* Does mkmf works well on Windows?
* What is a good way to compile a single .c file with mkmf to a given library file in another directory?

I tried this but I am not sure it's correct:

~~~ ruby
def compile_extension(name)
  objdir = object_path
  ext = "#{name}_spec"
  lib = "#{objdir}/#{ext}.#{RbConfig::CONFIG['DLEXT']}"

  require 'mkmf' # TODO: probably best to use a subprocess to avoid polluting the namespace
  Dir.chdir(objdir) do
    $srcs = ["#{extension_path}/#{ext}.c"]
    $objs = ["#{extension_path}/#{ext}.o"] # should probably be in objdir but that does not seem to work
    create_makefile(ext)
    system "make"
  end

  lib
end
~~~

Alternatively, we can copy the needed files to a temporary directory, build there and copy the shared library back.
It's a bit more work but not a big deal either.

---Files--------------------------------
spec_helper.rb (2.22 KB)


-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next