cxx 0.1.13 → 0.1.14
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/.gitignore +2 -0
- data/.rvmrc +1 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +35 -0
- data/Rakefile.rb +30 -0
- data/junit.rb +91 -0
- data/lib/cxx/eval_context.rb +8 -33
- data/lib/cxx/version.rb +1 -1
- data/rake_helper/spec.rb +14 -0
- data/spec/cxx_spec.rb +166 -0
- data/spec/object_dependency_spec.rb +63 -0
- data/spec/project_path_spec.rb +69 -0
- data/spec/testdata/basic/exe12/help.cpp +5 -0
- data/spec/testdata/basic/exe12/help.h +6 -0
- data/spec/testdata/basic/exe12/main.cpp +10 -0
- data/spec/testdata/basic/exe12/project.rb +5 -0
- data/spec/testdata/basic/lib1/lib1.cpp +7 -0
- data/spec/testdata/basic/lib1/lib1.h +8 -0
- data/spec/testdata/basic/lib1/project.rb +5 -0
- data/spec/testdata/basic/lib2/lib2.cpp +17 -0
- data/spec/testdata/basic/lib2/lib2.h +6 -0
- data/spec/testdata/basic/lib2/project.rb +8 -0
- data/spec/testdata/multiple_levels/libs/lib1/lib1.cpp +7 -0
- data/spec/testdata/multiple_levels/libs/lib1/lib1.h +8 -0
- data/spec/testdata/multiple_levels/libs/lib1/project.rb +5 -0
- data/spec/testdata/multiple_levels/libs/lib2/lib2.cpp +21 -0
- data/spec/testdata/multiple_levels/libs/lib2/lib2.h +6 -0
- data/spec/testdata/multiple_levels/libs/lib2/project.rb +19 -0
- data/spec/testdata/multiple_levels/mainproject/basic/help.cpp +5 -0
- data/spec/testdata/multiple_levels/mainproject/basic/help.h +6 -0
- data/spec/testdata/multiple_levels/mainproject/basic/main.cpp +10 -0
- data/spec/testdata/multiple_levels/mainproject/basic/project.rb +8 -0
- data/spec/testdata/onlyOneHeader/.gitignore +1 -0
- data/spec/testdata/onlyOneHeader/Rakefile.rb +4 -0
- data/spec/testdata/onlyOneHeader/help.cpp +5 -0
- data/spec/testdata/onlyOneHeader/help.h +7 -0
- data/spec/testdata/onlyOneHeader/main.cpp +8 -0
- data/spec/testdata/onlyOneHeader/project.rb +4 -0
- data/spec/testdata/onlyOneHeader/testin.c +0 -0
- metadata +37 -2
data/.gitignore
CHANGED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use 1.9.3@cxxproject_tests --create
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
builder (3.1.3)
|
5
|
+
diff-lcs (1.1.3)
|
6
|
+
gem-release (0.4.1)
|
7
|
+
grit (2.5.0)
|
8
|
+
diff-lcs (~> 1.1)
|
9
|
+
mime-types (~> 1.15)
|
10
|
+
posix-spawn (~> 0.3.6)
|
11
|
+
mime-types (1.19)
|
12
|
+
posix-spawn (0.3.6)
|
13
|
+
roodi (2.1.0)
|
14
|
+
ruby_parser
|
15
|
+
rspec (2.11.0)
|
16
|
+
rspec-core (~> 2.11.0)
|
17
|
+
rspec-expectations (~> 2.11.0)
|
18
|
+
rspec-mocks (~> 2.11.0)
|
19
|
+
rspec-core (2.11.1)
|
20
|
+
rspec-expectations (2.11.3)
|
21
|
+
diff-lcs (~> 1.1.3)
|
22
|
+
rspec-mocks (2.11.2)
|
23
|
+
ruby_parser (2.3.1)
|
24
|
+
sexp_processor (~> 3.0)
|
25
|
+
sexp_processor (3.2.0)
|
26
|
+
|
27
|
+
PLATFORMS
|
28
|
+
ruby
|
29
|
+
|
30
|
+
DEPENDENCIES
|
31
|
+
builder
|
32
|
+
gem-release
|
33
|
+
grit
|
34
|
+
roodi
|
35
|
+
rspec
|
data/Rakefile.rb
CHANGED
@@ -1,3 +1,33 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
|
+
require './rake_helper/spec.rb'
|
2
3
|
|
3
4
|
task :package => :build
|
5
|
+
|
6
|
+
projects = ['frazzle',
|
7
|
+
'cxxproject',
|
8
|
+
'cxxproject_gcctoolchain']
|
9
|
+
|
10
|
+
desc 'cleanup all built gems'
|
11
|
+
task :clean do
|
12
|
+
projects.each do |p|
|
13
|
+
cd "../#{p}" do
|
14
|
+
sh 'rake clobber_package'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
desc 'install prerequisites for build'
|
20
|
+
task :wipe_gems do
|
21
|
+
sh "rvm --force gemset empty"
|
22
|
+
end
|
23
|
+
|
24
|
+
desc 'install all built gems'
|
25
|
+
task :build_and_install_gems do
|
26
|
+
projects.each do |p|
|
27
|
+
cd "../#{p}" do
|
28
|
+
sh 'rm -rf pkg'
|
29
|
+
sh 'rake package'
|
30
|
+
sh 'rake install'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/junit.rb
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
Copyright (c) 2012, Nathaniel Ritmeyer
|
4
|
+
All rights reserved.
|
5
|
+
|
6
|
+
Redistribution and use in source and binary forms, with or without
|
7
|
+
modification, are permitted provided that the following conditions are met:
|
8
|
+
|
9
|
+
1. Redistributions of source code must retain the above copyright notice,
|
10
|
+
this list of conditions and the following disclaimer.
|
11
|
+
|
12
|
+
2. Redistributions in binary form must reproduce the above copyright
|
13
|
+
notice, this list of conditions and the following disclaimer in the
|
14
|
+
documentation and/or other materials provided with the distribution.
|
15
|
+
|
16
|
+
3. Neither the name Nathaniel Ritmeyer nor the names of contributors to
|
17
|
+
this software may be used to endorse or promote products derived from this
|
18
|
+
software without specific prior written permission.
|
19
|
+
|
20
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
|
21
|
+
IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
22
|
+
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
23
|
+
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
|
24
|
+
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
25
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
26
|
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
27
|
+
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
28
|
+
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
29
|
+
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
30
|
+
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31
|
+
|
32
|
+
=end
|
33
|
+
|
34
|
+
require 'time'
|
35
|
+
require 'builder'
|
36
|
+
require 'rspec/core/formatters/base_formatter'
|
37
|
+
|
38
|
+
class JUnit < RSpec::Core::Formatters::BaseFormatter
|
39
|
+
def initialize output
|
40
|
+
super output
|
41
|
+
@test_results = []
|
42
|
+
end
|
43
|
+
|
44
|
+
def example_passed example
|
45
|
+
@test_results << example
|
46
|
+
end
|
47
|
+
|
48
|
+
def example_failed example
|
49
|
+
@test_results << example
|
50
|
+
end
|
51
|
+
|
52
|
+
def example_pending example
|
53
|
+
@test_results << example
|
54
|
+
end
|
55
|
+
|
56
|
+
def failure_details_for example
|
57
|
+
exception = example.metadata[:execution_result][:exception]
|
58
|
+
exception.nil? ? "" : "#{exception.message}\n#{format_backtrace(exception.backtrace, example).join("\n")}"
|
59
|
+
end
|
60
|
+
|
61
|
+
def full_name_for example
|
62
|
+
test_name = ""
|
63
|
+
current_example_group = example.metadata[:example_group]
|
64
|
+
until current_example_group.nil? do
|
65
|
+
test_name = "#{current_example_group[:description]}." + test_name
|
66
|
+
current_example_group = current_example_group[:example_group]
|
67
|
+
end
|
68
|
+
test_name << example.metadata[:description]
|
69
|
+
end
|
70
|
+
|
71
|
+
def dump_summary duration, example_count, failure_count, pending_count
|
72
|
+
builder = Builder::XmlMarkup.new :indent => 2
|
73
|
+
builder.instruct! :xml, :version => "1.0", :encoding => "UTF-8"
|
74
|
+
builder.testsuite :errors => 0, :failures => failure_count, :skipped => pending_count, :tests => example_count, :time => duration, :timestamp => Time.now.iso8601 do
|
75
|
+
builder.properties
|
76
|
+
@test_results.each do |test|
|
77
|
+
builder.testcase :classname => full_name_for(test), :name => test.metadata[:full_description], :time => test.metadata[:execution_result][:run_time] do
|
78
|
+
case test.metadata[:execution_result][:status]
|
79
|
+
when "failed"
|
80
|
+
builder.failure :message => "failed #{test.metadata[:full_description]}", :type => "failed" do
|
81
|
+
builder.cdata! failure_details_for test
|
82
|
+
end
|
83
|
+
when "pending" then builder.skipped
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
output.puts builder.target!
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
data/lib/cxx/eval_context.rb
CHANGED
@@ -3,18 +3,6 @@ require 'cxxproject/context'
|
|
3
3
|
require 'cxxproject/utils/utils'
|
4
4
|
|
5
5
|
module Cxx
|
6
|
-
class BinaryLibs
|
7
|
-
class << self
|
8
|
-
def [](*libs)
|
9
|
-
libraries = Array.new
|
10
|
-
libs.each do |x|
|
11
|
-
libraries << Cxxproject::BinaryLibrary.new(x)
|
12
|
-
end
|
13
|
-
libraries
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
6
|
class EvalContext
|
19
7
|
include Cxxproject
|
20
8
|
include Cxxproject::Context
|
@@ -38,7 +26,6 @@ module Cxx
|
|
38
26
|
# * :sources
|
39
27
|
# * :includes
|
40
28
|
# * :dependencies
|
41
|
-
# * :libpath
|
42
29
|
# * :output_dir
|
43
30
|
def exe(name, hash)
|
44
31
|
raise "not a hash" unless hash.is_a?(Hash)
|
@@ -46,7 +33,6 @@ module Cxx
|
|
46
33
|
bblock = Cxxproject::Executable.new(name)
|
47
34
|
bblock.set_sources(hash[:sources]) if hash.has_key?(:sources)
|
48
35
|
bblock.set_includes(get_as_array(hash, :includes)) if hash.has_key?(:includes)
|
49
|
-
calc_lib_searchpath(hash).each { |sp| bblock.add_lib_element(Cxxproject::HasLibraries::SEARCH_PATH, sp) }
|
50
36
|
if hash.has_key?(:dependencies)
|
51
37
|
bblock.set_dependencies(hash[:dependencies])
|
52
38
|
hash[:dependencies].each { |d| bblock.add_lib_element(Cxxproject::HasLibraries::DEPENDENCY, d) }
|
@@ -55,18 +41,6 @@ module Cxx
|
|
55
41
|
all_blocks << bblock
|
56
42
|
end
|
57
43
|
|
58
|
-
def calc_lib_searchpath(hash)
|
59
|
-
if hash.has_key?(:libpath)
|
60
|
-
hash[:libpath]
|
61
|
-
else
|
62
|
-
if Cxxproject::Utils::OS.linux? || Cxxproject::Utils::OS.mac?
|
63
|
-
["/usr/local/lib","/usr/lib"]
|
64
|
-
elsif Cxxproject::Utils::OS.windows?
|
65
|
-
["C:/tool/cygwin/lib", "C:/Tool/cygwin/usr/local/lib"]
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
44
|
# specify a sourcelib
|
71
45
|
# hash supports:
|
72
46
|
# * :sources
|
@@ -92,23 +66,24 @@ module Cxx
|
|
92
66
|
all_blocks << bblock
|
93
67
|
end
|
94
68
|
|
95
|
-
def bin_lib(name, hash=
|
69
|
+
def bin_lib(name, hash=Hash.new)
|
96
70
|
raise "not a hash" unless hash.is_a?(Hash)
|
97
71
|
check_hash(hash, [:includes, :lib_path])
|
72
|
+
|
98
73
|
bblock = Cxxproject::BinaryLibrary.new(name)
|
99
74
|
bblock.set_includes(get_as_array(hash, :includes)) if hash.has_key?(:includes)
|
100
75
|
bblock.add_lib_element(Cxxproject::HasLibraries::SEARCH_PATH, hash[:lib_path], true) if hash.has_key?(:lib_path)
|
76
|
+
return bblock
|
101
77
|
end
|
102
78
|
|
103
79
|
# specify some binary libs
|
104
80
|
# returns all binary libs as array
|
105
|
-
def bin_libs(
|
106
|
-
|
81
|
+
def bin_libs(names, hash=Hash.new)
|
82
|
+
raise "not a hash" unless hash.is_a?(Hash)
|
83
|
+
check_hash(hash, [:includes, :lib_path])
|
84
|
+
|
107
85
|
mapped = names.map{|n|n.to_s}
|
108
|
-
mapped.
|
109
|
-
res << Cxxproject::BinaryLibrary.new(name)
|
110
|
-
end
|
111
|
-
mapped
|
86
|
+
return mapped.map{|name|bin_lib(name, hash)}
|
112
87
|
end
|
113
88
|
|
114
89
|
def compile(name, hash)
|
data/lib/cxx/version.rb
CHANGED
data/rake_helper/spec.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rake/clean'
|
2
|
+
|
3
|
+
SPEC_PATTERN ='spec/**/*_spec.rb'
|
4
|
+
|
5
|
+
require 'rspec/core/rake_task'
|
6
|
+
desc "Run examples"
|
7
|
+
RSpec::Core::RakeTask.new() do |t|
|
8
|
+
t.pattern = SPEC_PATTERN
|
9
|
+
if ENV['BUILD_SERVER']
|
10
|
+
t.rspec_opts = '-r ./junit.rb -f JUnit -o build/test_details.xml'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
task :gem => [:spec]
|
data/spec/cxx_spec.rb
ADDED
@@ -0,0 +1,166 @@
|
|
1
|
+
require 'cxx'
|
2
|
+
require 'cxxproject/utils/cleanup'
|
3
|
+
|
4
|
+
RSPECDIR = File.dirname(__FILE__)
|
5
|
+
puts RSPECDIR
|
6
|
+
|
7
|
+
class SpecTaskListener
|
8
|
+
def initialize
|
9
|
+
@task_execution_count = 0
|
10
|
+
end
|
11
|
+
def before_prerequisites(name)
|
12
|
+
end
|
13
|
+
|
14
|
+
def after_prerequisites(name)
|
15
|
+
end
|
16
|
+
|
17
|
+
def before_execute(name)
|
18
|
+
@task_execution_count += 1
|
19
|
+
end
|
20
|
+
|
21
|
+
def after_execute(name)
|
22
|
+
end
|
23
|
+
def reset_exec_count()
|
24
|
+
@task_execution_count = 0
|
25
|
+
end
|
26
|
+
def get_exec_count()
|
27
|
+
@task_execution_count
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def rebuild
|
32
|
+
tasks = fresh_cxx.all_tasks
|
33
|
+
execute_all_tasks(tasks)
|
34
|
+
end
|
35
|
+
|
36
|
+
def check_rebuilding (end_product, prereq_file, should_rebuild = true)
|
37
|
+
sleep(1)
|
38
|
+
FileUtils.touch prereq_file
|
39
|
+
# prereq_file should be newer
|
40
|
+
File.mtime(prereq_file).should > File.mtime(end_product)
|
41
|
+
rebuild
|
42
|
+
if should_rebuild
|
43
|
+
# prereq_file should NOT be newer
|
44
|
+
File.mtime(prereq_file).should <= File.mtime(end_product)
|
45
|
+
else
|
46
|
+
# prereq_file should still be newer
|
47
|
+
File.mtime(prereq_file).should > File.mtime(end_product)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def execute_all_tasks(tasks)
|
52
|
+
tasks.each do |t|
|
53
|
+
t.invoke
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def fresh_cxx
|
58
|
+
Cxxproject::Utils.cleanup_rake
|
59
|
+
outputdir = 'output'
|
60
|
+
cxx(FileList['**/project.rb'], outputdir, 'gcc','.')
|
61
|
+
end
|
62
|
+
|
63
|
+
def cleanup
|
64
|
+
rm_r 'output' if File.directory?('output')
|
65
|
+
end
|
66
|
+
|
67
|
+
ONLY_ONE_HEADER = "#{RSPECDIR}/testdata/onlyOneHeader"
|
68
|
+
describe Cxx::RubyDsl do
|
69
|
+
before(:all) do
|
70
|
+
Rake::application.options.silent = true
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should provide runtask for executables' do
|
74
|
+
cd ONLY_ONE_HEADER, :verbose => false do
|
75
|
+
cleanup
|
76
|
+
tasks = fresh_cxx.all_tasks
|
77
|
+
Rake::Task['run:basic'].invoke
|
78
|
+
cleanup
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'should rebuild only when one file was changed' do
|
83
|
+
require 'cxxproject/ext/rake_listener'
|
84
|
+
require 'cxxproject/ext/rake_dirty'
|
85
|
+
|
86
|
+
listener = SpecTaskListener.new
|
87
|
+
Rake::add_listener(listener)
|
88
|
+
cd(ONLY_ONE_HEADER, :verbose => false) do
|
89
|
+
# fresh build
|
90
|
+
listener.reset_exec_count
|
91
|
+
cleanup
|
92
|
+
|
93
|
+
tasks = fresh_cxx.all_tasks
|
94
|
+
CLOBBER.each { |fn| rm_r fn rescue nil }
|
95
|
+
execute_all_tasks(tasks)
|
96
|
+
fresh_build_steps = listener.get_exec_count
|
97
|
+
|
98
|
+
# rebuild, nothing changed
|
99
|
+
listener.reset_exec_count
|
100
|
+
execute_all_tasks(tasks)
|
101
|
+
rebuild_build_steps = listener.get_exec_count
|
102
|
+
|
103
|
+
# rebuild, nothing changed
|
104
|
+
listener.reset_exec_count
|
105
|
+
execute_all_tasks(tasks)
|
106
|
+
listener.get_exec_count.should == rebuild_build_steps
|
107
|
+
|
108
|
+
# rebuild after header changed
|
109
|
+
listener.reset_exec_count
|
110
|
+
sleep(1)
|
111
|
+
files2touch = Dir.glob('help.h')
|
112
|
+
FileUtils.touch files2touch
|
113
|
+
execute_all_tasks(fresh_cxx.all_tasks)
|
114
|
+
rebuild_after_touch_steps = listener.get_exec_count
|
115
|
+
rebuild_after_touch_steps.should > rebuild_build_steps
|
116
|
+
|
117
|
+
# rebuild, nothing changed
|
118
|
+
listener.reset_exec_count
|
119
|
+
execute_all_tasks(tasks)
|
120
|
+
listener.get_exec_count.should == rebuild_build_steps
|
121
|
+
|
122
|
+
cleanup
|
123
|
+
end
|
124
|
+
Rake::remove_listener(listener)
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'should rebuild when any source file changes' do
|
128
|
+
cd("#{RSPECDIR}/testdata/basic", :verbose => false) do
|
129
|
+
cleanup
|
130
|
+
|
131
|
+
tasks = fresh_cxx.all_tasks
|
132
|
+
CLOBBER.each { |fn| rm_r fn rescue nil }
|
133
|
+
execute_all_tasks(tasks)
|
134
|
+
|
135
|
+
# dependencies: exe -> libC -> libB
|
136
|
+
|
137
|
+
headerA = 'exe12/help.h'
|
138
|
+
sourceA = 'exe12/main.cpp'
|
139
|
+
projectA = 'exe12/project.rb'
|
140
|
+
headerB = 'lib1/lib1.h'
|
141
|
+
sourceB = 'lib1/lib1.cpp'
|
142
|
+
projectB = 'lib1/project.rb'
|
143
|
+
headerC = 'lib2/lib2.h'
|
144
|
+
sourceC = 'lib2/lib2.cpp'
|
145
|
+
projectC = 'lib2/project.rb'
|
146
|
+
exe = 'output/basic.exe'
|
147
|
+
libB = 'output/libs/lib1.a'
|
148
|
+
libC = 'output/libs/lib2.a'
|
149
|
+
|
150
|
+
check_rebuilding exe, headerA
|
151
|
+
check_rebuilding exe, sourceA
|
152
|
+
check_rebuilding exe, projectA
|
153
|
+
check_rebuilding exe, headerB
|
154
|
+
check_rebuilding exe, headerC
|
155
|
+
check_rebuilding libB, sourceA, false
|
156
|
+
check_rebuilding libB, sourceB
|
157
|
+
|
158
|
+
check_rebuilding libB, sourceC, false
|
159
|
+
check_rebuilding libC, sourceB
|
160
|
+
|
161
|
+
cleanup
|
162
|
+
Cxxproject::Utils.cleanup_rake
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'cxx'
|
2
|
+
require 'cxxproject/ext/rake_listener.rb'
|
3
|
+
require 'cxxproject/utils/cleanup'
|
4
|
+
|
5
|
+
OUT_DIR='cxxbuild'
|
6
|
+
|
7
|
+
describe Rake::Task do
|
8
|
+
compiler = 'gcc'
|
9
|
+
|
10
|
+
before(:each) do
|
11
|
+
Rake::application.options.silent = true
|
12
|
+
Cxxproject::Utils.cleanup_rake
|
13
|
+
end
|
14
|
+
|
15
|
+
after(:each) do
|
16
|
+
Cxxproject::Utils.cleanup_rake
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should fail if source of object is missing' do
|
20
|
+
file 'test.cc' => 'compiler'
|
21
|
+
File.delete('test.cc') if File.exists?('test.cc')
|
22
|
+
sl = Cxxproject::SourceLibrary.new('testlib').set_sources(['test.cc']).set_project_dir(".")
|
23
|
+
cxx = cxx([], OUT_DIR, compiler, '.')
|
24
|
+
|
25
|
+
task = Rake::application['lib:testlib']
|
26
|
+
task.invoke
|
27
|
+
task.failure.should eq(true)
|
28
|
+
|
29
|
+
FileUtils.rm_rf(OUT_DIR)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should not fail if include-dependency of object is missing' do
|
33
|
+
File.open('test.cc', 'w') do |io|
|
34
|
+
io.puts('#include "test.h"')
|
35
|
+
end
|
36
|
+
|
37
|
+
File.open('test.h', 'w') do |io|
|
38
|
+
end
|
39
|
+
|
40
|
+
sl = Cxxproject::SourceLibrary.new('testlib').set_sources(['test.cc']).set_project_dir(".")
|
41
|
+
cxx([], OUT_DIR, compiler, '.')
|
42
|
+
|
43
|
+
task = Rake::application['lib:testlib']
|
44
|
+
task.invoke
|
45
|
+
task.failure.should == false
|
46
|
+
|
47
|
+
Cxxproject::Utils.cleanup_rake
|
48
|
+
|
49
|
+
FileUtils.rm_rf('test.h')
|
50
|
+
File.open('test.cc', 'w') do |io|
|
51
|
+
end
|
52
|
+
|
53
|
+
sl = Cxxproject::SourceLibrary.new('testlib').set_sources(['test.cc']).set_project_dir(".")
|
54
|
+
cxx([], OUT_DIR, compiler, '.')
|
55
|
+
|
56
|
+
task = Rake::application[File.join(OUT_DIR, 'libs', 'libtestlib.a')]
|
57
|
+
task.invoke
|
58
|
+
task.failure.should == false
|
59
|
+
|
60
|
+
FileUtils.rm_rf('test.cc')
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'cxx'
|
2
|
+
require 'cxxproject/utils/cleanup'
|
3
|
+
|
4
|
+
RSPECDIR = File.dirname(__FILE__)
|
5
|
+
|
6
|
+
describe Cxx::RubyDsl do
|
7
|
+
|
8
|
+
def execute_all_tasks(tasks)
|
9
|
+
tasks.each do |t|
|
10
|
+
t.invoke
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def fresh_cxx(outputdir,base)
|
15
|
+
Cxxproject::Utils.cleanup_rake
|
16
|
+
project_configs = nil
|
17
|
+
cd base do # have to be relative to base
|
18
|
+
project_configs = Dir.glob('**/project.rb')
|
19
|
+
end
|
20
|
+
cxx(project_configs, outputdir, 'gcc', base)
|
21
|
+
end
|
22
|
+
|
23
|
+
# def is_older? fileA, fileB
|
24
|
+
# File.mtime(fileA) < File.mtime(fileB)
|
25
|
+
# end
|
26
|
+
|
27
|
+
# def is_newer? fileA, fileB
|
28
|
+
# File.mtime(fileA) > File.mtime(fileB)
|
29
|
+
# end
|
30
|
+
|
31
|
+
def test_on_level(base, outputdir)
|
32
|
+
libOne = "#{outputdir}/libs/lib1.a"
|
33
|
+
libTwo = "#{outputdir}/libs/lib2.a"
|
34
|
+
exe = "#{outputdir}/basic.exe"
|
35
|
+
exe2 = "#{outputdir}/debug.exe"
|
36
|
+
files = [libOne,libTwo,exe,exe2]
|
37
|
+
rm_r outputdir if File.directory?(outputdir)
|
38
|
+
tasks = fresh_cxx(outputdir, base).all_tasks
|
39
|
+
CLOBBER.each { |fn| rm_r fn rescue nil }
|
40
|
+
|
41
|
+
files.all? {|f| File.exists?(f).should be_false }
|
42
|
+
|
43
|
+
execute_all_tasks(tasks)
|
44
|
+
|
45
|
+
files.all? {|f| File.exists?(f).should be_true }
|
46
|
+
|
47
|
+
# cleanup
|
48
|
+
rm_r outputdir if File.directory?(outputdir)
|
49
|
+
Cxxproject::Utils.cleanup_rake
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should resolve paths on different levels' do
|
53
|
+
outputdir = 'output'
|
54
|
+
|
55
|
+
cd("#{RSPECDIR}/testdata/multiple_levels", :verbose => false) do
|
56
|
+
test_on_level(".", outputdir)
|
57
|
+
end
|
58
|
+
|
59
|
+
cd("#{RSPECDIR}/testdata/multiple_levels/mainproject", :verbose => false) do
|
60
|
+
test_on_level("..", outputdir)
|
61
|
+
end
|
62
|
+
|
63
|
+
cd("#{RSPECDIR}/testdata", :verbose => false) do
|
64
|
+
test_on_level("multiple_levels/", outputdir)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#include "lib2.h"
|
2
|
+
|
3
|
+
#include <iostream>
|
4
|
+
#include <math.h>
|
5
|
+
#include "lib1.h"
|
6
|
+
#include <dlfcn.h>
|
7
|
+
#include <zlib.h>
|
8
|
+
|
9
|
+
void lib2() {
|
10
|
+
std::cout << "lib2" << std::endl;
|
11
|
+
lib1();
|
12
|
+
std::cout << sin(5) << std::endl;
|
13
|
+
void* help = dlopen("test", RTLD_LAZY);
|
14
|
+
std::cout << (long)help << std::endl;
|
15
|
+
Bytef b = 0;
|
16
|
+
uLong res = crc32(0, &b, 1);
|
17
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#include "lib2.h"
|
2
|
+
|
3
|
+
#include <iostream>
|
4
|
+
#include <math.h>
|
5
|
+
#include "lib1.h"
|
6
|
+
#include <dlfcn.h>
|
7
|
+
#include <zlib.h>
|
8
|
+
|
9
|
+
void lib2() {
|
10
|
+
#ifdef UNIT_TEST
|
11
|
+
std::cout << "lib2 for UNIT_TEST defined" << std::endl;
|
12
|
+
#else
|
13
|
+
std::cout << "lib2" << std::endl;
|
14
|
+
#endif
|
15
|
+
lib1();
|
16
|
+
std::cout << sin(5) << std::endl;
|
17
|
+
void* help = dlopen("test", RTLD_LAZY);
|
18
|
+
std::cout << (long)help << std::endl;
|
19
|
+
Bytef b = 0;
|
20
|
+
uLong res = crc32(0, &b, 1);
|
21
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
cxx_configuration do
|
2
|
+
deps = ['1', BinaryLibrary.new('z')]
|
3
|
+
deps << BinaryLibrary.new('dl') if Utils::OS.linux?
|
4
|
+
|
5
|
+
source_lib "2",
|
6
|
+
:sources => FileList['**/*.cpp'],
|
7
|
+
:dependencies => deps,
|
8
|
+
:includes => ['.']
|
9
|
+
|
10
|
+
|
11
|
+
unittest_flags = {
|
12
|
+
:DEFINES => ['UNIT_TEST','CPPUNIT_MAIN="main"']
|
13
|
+
}
|
14
|
+
source_lib "2_debug",
|
15
|
+
:sources => FileList['**/*.cpp'],
|
16
|
+
:dependencies => deps,
|
17
|
+
:includes => ['.'],
|
18
|
+
:toolchain => Provider.modify_cpp_compiler("gcc", unittest_flags)
|
19
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
output
|
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cxx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.14
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-09-
|
12
|
+
date: 2012-09-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: cxxproject
|
@@ -51,15 +51,50 @@ extensions: []
|
|
51
51
|
extra_rdoc_files: []
|
52
52
|
files:
|
53
53
|
- .gitignore
|
54
|
+
- .rvmrc
|
55
|
+
- Gemfile
|
56
|
+
- Gemfile.lock
|
54
57
|
- Rakefile.rb
|
55
58
|
- bin/cxx
|
56
59
|
- cxx.gemspec
|
60
|
+
- junit.rb
|
57
61
|
- lib/cxx.rb
|
58
62
|
- lib/cxx/eval_context.rb
|
59
63
|
- lib/cxx/version.rb
|
60
64
|
- lib/cxx/wizard/Rakefile.rb.template
|
61
65
|
- lib/cxx/wizard/project.rb.template
|
62
66
|
- lib/cxx/wizard/project_wizard.rb
|
67
|
+
- rake_helper/spec.rb
|
68
|
+
- spec/cxx_spec.rb
|
69
|
+
- spec/object_dependency_spec.rb
|
70
|
+
- spec/project_path_spec.rb
|
71
|
+
- spec/testdata/basic/exe12/help.cpp
|
72
|
+
- spec/testdata/basic/exe12/help.h
|
73
|
+
- spec/testdata/basic/exe12/main.cpp
|
74
|
+
- spec/testdata/basic/exe12/project.rb
|
75
|
+
- spec/testdata/basic/lib1/lib1.cpp
|
76
|
+
- spec/testdata/basic/lib1/lib1.h
|
77
|
+
- spec/testdata/basic/lib1/project.rb
|
78
|
+
- spec/testdata/basic/lib2/lib2.cpp
|
79
|
+
- spec/testdata/basic/lib2/lib2.h
|
80
|
+
- spec/testdata/basic/lib2/project.rb
|
81
|
+
- spec/testdata/multiple_levels/libs/lib1/lib1.cpp
|
82
|
+
- spec/testdata/multiple_levels/libs/lib1/lib1.h
|
83
|
+
- spec/testdata/multiple_levels/libs/lib1/project.rb
|
84
|
+
- spec/testdata/multiple_levels/libs/lib2/lib2.cpp
|
85
|
+
- spec/testdata/multiple_levels/libs/lib2/lib2.h
|
86
|
+
- spec/testdata/multiple_levels/libs/lib2/project.rb
|
87
|
+
- spec/testdata/multiple_levels/mainproject/basic/help.cpp
|
88
|
+
- spec/testdata/multiple_levels/mainproject/basic/help.h
|
89
|
+
- spec/testdata/multiple_levels/mainproject/basic/main.cpp
|
90
|
+
- spec/testdata/multiple_levels/mainproject/basic/project.rb
|
91
|
+
- spec/testdata/onlyOneHeader/.gitignore
|
92
|
+
- spec/testdata/onlyOneHeader/Rakefile.rb
|
93
|
+
- spec/testdata/onlyOneHeader/help.cpp
|
94
|
+
- spec/testdata/onlyOneHeader/help.h
|
95
|
+
- spec/testdata/onlyOneHeader/main.cpp
|
96
|
+
- spec/testdata/onlyOneHeader/project.rb
|
97
|
+
- spec/testdata/onlyOneHeader/testin.c
|
63
98
|
homepage:
|
64
99
|
licenses: []
|
65
100
|
post_install_message:
|