cpp_engine 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/bin/cppengine ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+ require 'cpp_engine'
3
+ puts "cpp_engine started"
4
+
5
+ engine=CppEngine.new
6
+ if File.exists?("enginespec")
7
+ engine.load "enginespec"
8
+ engine.run
9
+ exit
10
+ end
11
+ #puts engine.grep_cpp_files
12
+ #engine.run
@@ -0,0 +1,64 @@
1
+ class CppEngine::Compiler
2
+
3
+ attr_accessor :flags,:obj_dir,:header_dirs,:lib_dirs,:libs,:product, :source_files
4
+ def initialize params={}
5
+ self.flags = params[:flags] || []
6
+ self.header_dirs = params[:header_dirs] || []
7
+ self.lib_dirs = params[:lib_dirs] || []
8
+ self.libs = params[:libs] || []
9
+ self.product = params[:product] || "executable"
10
+ end
11
+
12
+ def execute command
13
+ puts command
14
+ system command
15
+ end
16
+
17
+ def compile
18
+ @objs=[]
19
+ source_files.each{|source_file|
20
+ @objs<<get_obj_path(source_file)
21
+ if outdated? source_file
22
+ execute compile_command(source_file)
23
+ end
24
+ }
25
+ end
26
+
27
+ def link
28
+ execute link_command(@objs,@product)
29
+ end
30
+
31
+ def compile_command source_file
32
+ header_dirs_flags=header_dirs.map{|dir| "-I#{dir}"}
33
+ return "g++ -c #{(flags+header_dirs_flags).join(" ")} #{source_file}"
34
+ end
35
+
36
+ def link_command objs, product
37
+ lib_dirs_flags = lib_dirs.map{|dir| "-L#{dir}"}
38
+ lib_flags = libs.map{|lib| "-l#{lib}"}
39
+ return "g++ #{(flags+lib_dirs_flags+lib_flags).join(" ")} #{objs.join(" ")} -o #{product}"
40
+
41
+ end
42
+
43
+
44
+ def outdated? source_path
45
+ obj=get_obj_path source_path
46
+ return true if !File.exists?(obj)
47
+ return true if File.mtime(source_path)>File.mtime(obj)
48
+ dependent_headers(source_path).each{|header|
49
+ return true if File.mtime(header)>File.mtime(obj)
50
+ }
51
+
52
+ return false
53
+ end
54
+
55
+ def dependent_headers source_path
56
+ result= `g++ -MM #{source_path}`
57
+ return result.gsub(/\w+\.o:\s+/,"").gsub(/(\n)|(\\)/,"").split(/\s+/).select{|f| f=~/(\.h$)|(.hpp$)/}
58
+ end
59
+
60
+ def get_obj_path source_path
61
+ return source_path.sub(".cpp",".o")
62
+ end
63
+
64
+ end
@@ -0,0 +1,18 @@
1
+ class CppEngine
2
+ module DslLoader
3
+
4
+ def load dsl_file
5
+
6
+ self.instance_eval(File.read(dsl_file))
7
+ end
8
+
9
+ def compile source_patterns,&block
10
+ compiler=Compiler.new
11
+ block.call compiler
12
+ compiler.source_files=grep_cpp_files source_patterns
13
+ @compilers<<compiler
14
+ end
15
+
16
+ end
17
+ include DslLoader
18
+ end
data/lib/cpp_engine.rb ADDED
@@ -0,0 +1,32 @@
1
+ class CppEngine
2
+ OBJ_DIR="build/objs"
3
+ def initialize root_path="."
4
+ @root_path=root_path
5
+ @compilers=[]
6
+ end
7
+
8
+ def run
9
+ @compilers.each{|compiler|
10
+ compiler.compile
11
+ compiler.link
12
+ }
13
+
14
+ # compiler=Compiler.new
15
+ # compiler.compile @cpp_files
16
+ # compiler.link
17
+
18
+ end
19
+
20
+ def grep_cpp_files source_patterns
21
+ @cpp_files=[]
22
+
23
+ source_patterns.each{|pattern|
24
+ @cpp_files+=Dir[pattern]
25
+ }
26
+ return @cpp_files
27
+
28
+ end
29
+
30
+ end
31
+ require 'cpp_engine/compiler'
32
+ require 'cpp_engine/dsl_loader'
metadata ADDED
@@ -0,0 +1,49 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cpp_engine
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - tsdeng
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-01-24 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: cpp engine
15
+ email: tianshuo@me.com
16
+ executables:
17
+ - cppengine
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - lib/cpp_engine/compiler.rb
22
+ - lib/cpp_engine/dsl_loader.rb
23
+ - lib/cpp_engine.rb
24
+ - bin/cppengine
25
+ homepage:
26
+ licenses: []
27
+ post_install_message:
28
+ rdoc_options: []
29
+ require_paths:
30
+ - lib
31
+ required_ruby_version: !ruby/object:Gem::Requirement
32
+ none: false
33
+ requirements:
34
+ - - ! '>='
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ! '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ requirements: []
44
+ rubyforge_project:
45
+ rubygems_version: 1.8.15
46
+ signing_key:
47
+ specification_version: 3
48
+ summary: streamlined build system for C++ development
49
+ test_files: []