]> git.mdlowis.com Git - proto/sclpl.git/commitdiff
sclpl can now find it's own damn header (when run with a path prefix only)
authorMichael D. Lowis <mike@mdlowis.com>
Tue, 4 Nov 2014 20:47:35 +0000 (15:47 -0500)
committerMichael D. Lowis <mike@mdlowis.com>
Tue, 4 Nov 2014 20:47:35 +0000 (15:47 -0500)
build.rb
source/runtime/sclpl.h
source/sclpl/main.c
spec/cli_spec.rb

index 5f9c42123297db0f567978f430caec57f5a7e4ce..d0c3a625620ffe61560130755e4de5fcf46f3636 100755 (executable)
--- a/build.rb
+++ b/build.rb
@@ -14,28 +14,35 @@ base_env = BuildEnv.new do |env|
   env.build_dir('source','build/obj/source')
   env.build_dir('modules','build/obj/modules')
 
-  # Add a builder for creating a CMake project
-  env.add_builder :CMake do |target, sources, cache, env, vars|
-    target_dir = File.dirname(target)
-    source_dir = "../" * target_dir.split(/\\|\//).length + File.dirname(sources.first)
-    cmd = env.expand_varref("${CMAKE_CMD}", vars.merge('_SOURCES' => source_dir))
-    unless cache.up_to_date?(target, cmd, sources, env)
-      cache.mkdir_p(target_dir)
-      Dir.chdir(target_dir) { env.execute("CMake #{target}", cmd) }
-      cache.register_build(target, cmd, sources, env)
+  env.add_builder :Install do |target, sources, cache, env, vars|
+    is_dir = (sources.length > 1) || Dir.exists?(sources.first)
+    outdir = is_dir ? target : File.dirname(target)
+    # Collect the list of files to copy over
+    file_map = {}
+    if is_dir
+      sources.each do |src|
+        if Dir.exists? src
+          Dir["#{src}/**/*"].each do |subfile|
+              subpath = Pathname.new(subfile).relative_path_from(Pathname.new(src)).to_s
+              file_map[subfile] = "#{outdir}/#{subpath}"
+          end
+        else
+          file_map[src] = "#{outdir}/#{File.basename(src)}"
+        end
+      end
+    else
+      file_map[sources.first] = target
     end
-    target if File.exists? target
-  end
-
-  # Add a builder for building a project with Make
-  env.add_builder :Make do |target, sources, cache, env, vars|
-    working_dir = File.dirname(sources.first)
-    cmd = env.expand_varref("${MAKE_CMD}", vars)
-    unless cache.up_to_date?(target, cmd, sources, env)
-      Dir.chdir(working_dir) { env.execute("Make #{target}", cmd) }
-      cache.register_build(target, cmd, sources, env)
+    # Check the cache and  copy if necessary
+    unless cache.up_to_date?(target, :Install, file_map.keys, env)
+      puts "INSTALL #{target}"
+      file_map.each do |k,v|
+        cache.mkdir_p(File.dirname(v))
+        FileUtils.cp(k,v)
+      end
+      cache.register_build(target, :Install, file_map.keys, env)
     end
-    target if File.exists? target
+    target if (is_dir ? Dir.exists?(target) : File.exists?(target))
   end
 
   # CMake Configuration
@@ -69,18 +76,6 @@ test_env = base_env.clone do |env|
   end
 end
 
-#------------------------------------------------------------------------------
-# Clang Toolchain Targets
-#------------------------------------------------------------------------------
-#main_env.CMake('build/llvm/Makefile',
-#               Dir['source/vendor/llvm-3.4.2/CMakeLists.txt',
-#                   'source/vendor/llvm-3.4.2/cmake/**/*/'])
-#main_env.Make("build/llvm/bin/clang#{windows? ? '.exe':''}",
-#              ['build/llvm/Makefile'] + Dir['source/vendor/llvm-3.4.2/tools/**/*.*'])
-
-# Register clang with the environment
-#ENV['PATH'] = "build/llvm/bin/#{windows? ? ';':':'}#{ENV['PATH']}"
-
 #------------------------------------------------------------------------------
 # Release Build Targets
 #------------------------------------------------------------------------------
@@ -88,6 +83,7 @@ main_env.Library('build/lib/libcds.a', FileList['modules/libcds/source/**/*.c'])
 main_env.Library('build/lib/libopts.a', FileList['modules/libopts/source/**/*.c'])
 main_env.Program('build/bin/sclpl',
   FileList['source/sclpl/*.c', 'build/lib/libopts.a', 'build/lib/libcds.a'])
+main_env.Install('build/include/sclpl.h', 'source/runtime/sclpl.h')
 
 #------------------------------------------------------------------------------
 # Test Build Targets
index 1b1524db1ff9fe18003d19fe48e4fd89abf06e07..ae1699a5f9d28b4fff9c9d08a4e830b9adba8e7b 100644 (file)
@@ -89,9 +89,10 @@ static inline _Value __string(char v[]) {
 
 static inline _Value __struct(size_t nflds, ...) {
     void** obj = (void**)allocate(nflds, sizeof(void*) * nflds);
+    size_t i;
     va_list args;
     va_start(args, nflds);
-    for(size_t i = 0; i < nflds; i++)
+    for(i = 0; i < nflds; i++)
         obj[i] = va_arg(args, void*);
     va_end(args);
     return (_Value)obj;
index 2fca00dda41aa8f2769b690517875eff00e85774..95d01ae5da013e4b614163e6194ea52c11c5af32 100644 (file)
@@ -295,7 +295,7 @@ str_t* translate_file(str_t* in) {
 
 str_t* compile_file(str_t* in) {
     str_t* ofname  = get_filename(OBJECT, in);
-    vec_t* parts   = vec_new(5, str_new("gcc -c -o"), mem_retain(ofname), str_new("-I"), get_inc_dir(), mem_retain(in));
+    vec_t* parts   = vec_new(5, str_new("cc -c -o"), mem_retain(ofname), str_new("-I"), get_inc_dir(), mem_retain(in));
     str_t* command = str_join(" ", parts);
     if (opts_is_set(NULL, "verbose"))
         puts(str_cstr(command));
index e4a4480de250a3c054e6a7606721fdd8d82f3998..3924281452bd7b4964cd17758870e388ba588c8d 100644 (file)
@@ -47,23 +47,20 @@ describe "cli" do
     end
 
     it "should compile the input file in verbose mode (short flag)" do
-      pending "Can't find the sclpl header"
       expect(cli(['-v', '--object', 'spec/src/sample.scl'])).to eq(
-          "clang -c -o spec/src/sample.o spec/src/sample.c")
+          "cc -c -o spec/src/sample.o -I ./build/bin/../include/ spec/src/sample.c\n")
       expect(File.exists? 'spec/src/sample.o').to be(true)
       FileUtils.rm('spec/src/sample.o')
     end
 
     it "should compile the input file in verbose mode (long flag)" do
-      pending "Can't find the sclpl header"
       expect(cli(['--verbose', '--object', 'spec/src/sample.scl'])).to eq(
-          "clang -c -o spec/src/sample.o spec/src/sample.c")
+          "cc -c -o spec/src/sample.o -I ./build/bin/../include/ spec/src/sample.c\n")
       expect(File.exists? 'spec/src/sample.o').to be(true)
       FileUtils.rm('spec/src/sample.o')
     end
 
     it "should compile the input file" do
-      pending "Can't find the sclpl header"
       expect(cli(['--object', 'spec/src/sample.scl'])).to eq("")
       expect(File.exists? 'spec/src/sample.o').to be(true)
       FileUtils.rm('spec/src/sample.o')