paper_house 0.4.0

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.
Files changed (75) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +17 -0
  5. data/Gemfile +35 -0
  6. data/Guardfile +28 -0
  7. data/README.md +116 -0
  8. data/Rakefile +139 -0
  9. data/cucumber.yml +3 -0
  10. data/examples/c_extension/.gitignore +5 -0
  11. data/examples/c_extension/Rakefile +3 -0
  12. data/examples/c_extension/Rakefile.llvm +5 -0
  13. data/examples/c_extension/hello.c +6 -0
  14. data/examples/executable/.gitignore +4 -0
  15. data/examples/executable/Rakefile +3 -0
  16. data/examples/executable/Rakefile.llvm +5 -0
  17. data/examples/executable/hello.c +7 -0
  18. data/examples/executable_subdirs/.gitignore +4 -0
  19. data/examples/executable_subdirs/Rakefile +9 -0
  20. data/examples/executable_subdirs/includes/hello.h +1 -0
  21. data/examples/executable_subdirs/sources/hello.c +6 -0
  22. data/examples/executable_subdirs/sources/main.c +8 -0
  23. data/examples/shared_library/.gitignore +8 -0
  24. data/examples/shared_library/Rakefile +17 -0
  25. data/examples/shared_library/Rakefile.llvm +19 -0
  26. data/examples/shared_library/hello.c +6 -0
  27. data/examples/shared_library/hello.h +1 -0
  28. data/examples/shared_library/main.c +7 -0
  29. data/examples/shared_library/symlinks.rake +7 -0
  30. data/examples/shared_library_subdirs/.gitignore +8 -0
  31. data/examples/shared_library_subdirs/Rakefile +27 -0
  32. data/examples/shared_library_subdirs/includes/hello.h +1 -0
  33. data/examples/shared_library_subdirs/sources/hello.c +6 -0
  34. data/examples/shared_library_subdirs/sources/main.c +8 -0
  35. data/examples/static_library/.gitignore +7 -0
  36. data/examples/static_library/Rakefile +13 -0
  37. data/examples/static_library/Rakefile.llvm +14 -0
  38. data/examples/static_library/hello.c +6 -0
  39. data/examples/static_library/hello.h +1 -0
  40. data/examples/static_library/main.c +7 -0
  41. data/examples/static_library_subdirs/.gitignore +7 -0
  42. data/examples/static_library_subdirs/Rakefile +17 -0
  43. data/examples/static_library_subdirs/includes/hello.h +1 -0
  44. data/examples/static_library_subdirs/sources/hello.c +6 -0
  45. data/examples/static_library_subdirs/sources/main.c +8 -0
  46. data/features/c_extension_task.feature +119 -0
  47. data/features/executable_task.feature +83 -0
  48. data/features/shared_library_task.feature +209 -0
  49. data/features/static_library_task.feature +116 -0
  50. data/features/step_definitions/paper_house_steps.rb +8 -0
  51. data/features/support/env.rb +41 -0
  52. data/features/support/hooks.rb +12 -0
  53. data/lib/paper_house/auto_depends.rb +95 -0
  54. data/lib/paper_house/build_task.rb +188 -0
  55. data/lib/paper_house/c_extension_task.rb +95 -0
  56. data/lib/paper_house/cc_options.rb +81 -0
  57. data/lib/paper_house/dependency.rb +74 -0
  58. data/lib/paper_house/executable_task.rb +77 -0
  59. data/lib/paper_house/library_task.rb +64 -0
  60. data/lib/paper_house/linker_options.rb +89 -0
  61. data/lib/paper_house/platform.rb +69 -0
  62. data/lib/paper_house/safe_popen.rb +50 -0
  63. data/lib/paper_house/shared_library_task.rb +92 -0
  64. data/lib/paper_house/static_library_task.rb +65 -0
  65. data/lib/paper_house/version.rb +30 -0
  66. data/lib/paper_house.rb +30 -0
  67. data/paper_house.gemspec +34 -0
  68. data/spec/paper_house/c_extension_task_spec.rb +59 -0
  69. data/spec/paper_house/cc_options_spec.rb +59 -0
  70. data/spec/paper_house/executable_task_spec.rb +49 -0
  71. data/spec/paper_house/shared_library_task_spec.rb +94 -0
  72. data/spec/paper_house/static_library_task_spec.rb +61 -0
  73. data/spec/paper_house/version_spec.rb +31 -0
  74. data/spec/spec_helper.rb +46 -0
  75. metadata +161 -0
@@ -0,0 +1,17 @@
1
+ require "paper_house"
2
+
3
+ task :hello => :libhello
4
+
5
+ PaperHouse::StaticLibraryTask.new :libhello do | task |
6
+ task.library_name = "hello"
7
+ task.target_directory = "objects"
8
+ task.sources = "sources/hello.c"
9
+ task.includes = "includes"
10
+ task.cflags = [ "-Werror", "-Wall", "-Wextra" ]
11
+ end
12
+
13
+ PaperHouse::ExecutableTask.new :hello do | task |
14
+ task.sources = "sources/main.c"
15
+ task.includes = "includes"
16
+ task.ldflags = "-Lobjects"
17
+ end
@@ -0,0 +1 @@
1
+ void print_hello();
@@ -0,0 +1,6 @@
1
+ #include <stdio.h>
2
+
3
+ void
4
+ print_hello() {
5
+ printf( "Hello, PaperHouse!\n" );
6
+ }
@@ -0,0 +1,8 @@
1
+ #include <stdlib.h>
2
+ #include "hello.h"
3
+
4
+ int
5
+ main() {
6
+ print_hello();
7
+ return 0;
8
+ }
@@ -0,0 +1,119 @@
1
+ Feature: PaperHouse::CExtensionTask
2
+
3
+ PaperHouse provides a rake task called `PaperHouse::CExtensionTask`
4
+ to build a C extention library from *.c and *.h files. These source
5
+ files can be located in multiple subdirectories.
6
+
7
+ @linux
8
+ Scenario: Build a C extension from one *.c and *.h file
9
+ Given the current project directory is "examples/c_extension"
10
+ When I successfully run `rake hello`
11
+ Then the output should match /^gcc/
12
+ And the output should not match /^llvm-gcc/
13
+ And a file named "hello.so" should exist
14
+ And I successfully run `ruby -I. -rhello -e "p HelloPaperHouse"`
15
+ And the output should contain:
16
+ """
17
+ HelloPaperHouse
18
+ """
19
+
20
+ @mac
21
+ Scenario: Build a C extension from one *.c and *.h file
22
+ Given the current project directory is "examples/c_extension"
23
+ When I successfully run `rake hello`
24
+ Then the output should match /^gcc/
25
+ And the output should not match /^llvm-gcc/
26
+ And a file named "hello.bundle" should exist
27
+ And I successfully run `ruby -I. -rhello -e "p HelloPaperHouse"`
28
+ And the output should contain:
29
+ """
30
+ HelloPaperHouse
31
+ """
32
+
33
+ @linux
34
+ Scenario: Build a C extension from one *.c and *.h file using llvm-gcc by specifying 'CC=' option
35
+ Given the current project directory is "examples/c_extension"
36
+ When I successfully run `rake hello CC=llvm-gcc`
37
+ Then the output should match /^llvm-gcc/
38
+ And the output should not match /^gcc/
39
+ And a file named "hello.so" should exist
40
+ And I successfully run `ruby -I. -rhello -e "p HelloPaperHouse"`
41
+ And the output should contain:
42
+ """
43
+ HelloPaperHouse
44
+ """
45
+
46
+ @mac
47
+ Scenario: Build a C extension from one *.c and *.h file using llvm-gcc by specifying 'CC=' option
48
+ Given the current project directory is "examples/c_extension"
49
+ When I successfully run `rake hello CC=llvm-gcc`
50
+ Then the output should match /^llvm-gcc/
51
+ And the output should not match /^gcc/
52
+ And a file named "hello.bundle" should exist
53
+ And I successfully run `ruby -I. -rhello -e "p HelloPaperHouse"`
54
+ And the output should contain:
55
+ """
56
+ HelloPaperHouse
57
+ """
58
+
59
+ @linux
60
+ Scenario: Build a C extension from one *.c and *.h file using llvm-gcc
61
+ Given the current project directory is "examples/c_extension"
62
+ When I successfully run `rake -f Rakefile.llvm hello`
63
+ Then the output should match /^llvm-gcc/
64
+ And the output should not match /^gcc/
65
+ And a file named "hello.so" should exist
66
+ And I successfully run `ruby -I. -rhello -e "p HelloPaperHouse"`
67
+ And the output should contain:
68
+ """
69
+ HelloPaperHouse
70
+ """
71
+
72
+ @mac
73
+ Scenario: Build a C extension from one *.c and *.h file using llvm-gcc
74
+ Given the current project directory is "examples/c_extension"
75
+ When I successfully run `rake -f Rakefile.llvm hello`
76
+ Then the output should match /^llvm-gcc/
77
+ And the output should not match /^gcc/
78
+ And a file named "hello.bundle" should exist
79
+ And I successfully run `ruby -I. -rhello -e "p HelloPaperHouse"`
80
+ And the output should contain:
81
+ """
82
+ HelloPaperHouse
83
+ """
84
+
85
+ @linux
86
+ Scenario: Clean
87
+ Given the current project directory is "examples/c_extension"
88
+ And I successfully run `rake hello`
89
+ When I successfully run `rake clean`
90
+ Then a file named "hello.o" should not exist
91
+ And a file named ".hello.depends" should exist
92
+ And a file named "hello.so" should exist
93
+
94
+ @mac
95
+ Scenario: Clean
96
+ Given the current project directory is "examples/c_extension"
97
+ And I successfully run `rake hello`
98
+ When I successfully run `rake clean`
99
+ Then a file named "hello.o" should not exist
100
+ And a file named ".hello.depends" should exist
101
+ And a file named "hello.bundle" should exist
102
+
103
+ @linux
104
+ Scenario: Clobber
105
+ Given the current project directory is "examples/c_extension"
106
+ And I successfully run `rake hello`
107
+ When I successfully run `rake clobber`
108
+ Then a file named "hello.o" should not exist
109
+ And a file named ".hello.depends" should not exist
110
+ And a file named "hello.so" should not exist
111
+
112
+ @mac
113
+ Scenario: Clobber
114
+ Given the current project directory is "examples/c_extension"
115
+ And I successfully run `rake hello`
116
+ When I successfully run `rake clobber`
117
+ Then a file named "hello.o" should not exist
118
+ And a file named ".hello.depends" should not exist
119
+ And a file named "hello.bundle" should not exist
@@ -0,0 +1,83 @@
1
+ Feature: PaperHouse::ExecutableTask
2
+
3
+ PaperHouse provides a rake task called `PaperHouse::ExecutableTask`
4
+ to build an executable from *.c and *.h files. These source files
5
+ can be located in multiple subdirectories.
6
+
7
+ Scenario: Build an executable from one *.c file
8
+ Given the current project directory is "examples/executable"
9
+ When I successfully run `rake hello`
10
+ Then the output should contain:
11
+ """
12
+ gcc -H -fPIC -I. -c hello.c -o ./hello.o
13
+ gcc -o ./hello ./hello.o
14
+ """
15
+ And a file named "hello" should exist
16
+ And I successfully run `./hello`
17
+ And the output should contain:
18
+ """
19
+ Hello, PaperHouse!
20
+ """
21
+
22
+ Scenario: Build an executable from one *.c file using llvm-gcc by specifying `CC=` option
23
+ Given the current project directory is "examples/executable"
24
+ When I successfully run `rake hello CC=llvm-gcc`
25
+ Then the output should contain:
26
+ """
27
+ llvm-gcc -H -fPIC -I. -c hello.c -o ./hello.o
28
+ llvm-gcc -o ./hello ./hello.o
29
+ """
30
+ And a file named "hello" should exist
31
+ And I successfully run `./hello`
32
+ And the output should contain:
33
+ """
34
+ Hello, PaperHouse!
35
+ """
36
+
37
+ Scenario: Build an executable from one *.c file using llvm-gcc
38
+ Given the current project directory is "examples/executable"
39
+ When I successfully run `rake -f Rakefile.llvm hello`
40
+ Then the output should contain:
41
+ """
42
+ llvm-gcc -H -fPIC -I. -c hello.c -o ./hello.o
43
+ llvm-gcc -o ./hello ./hello.o
44
+ """
45
+ And a file named "hello" should exist
46
+ And I successfully run `./hello`
47
+ And the output should contain:
48
+ """
49
+ Hello, PaperHouse!
50
+ """
51
+
52
+ Scenario: Build an executable from multiple *.c and *.h files in subdirectories
53
+ Given the current project directory is "examples/executable_subdirs"
54
+ When I successfully run `rake hello`
55
+ Then the output should contain:
56
+ """
57
+ gcc -H -Wall -Wextra -fPIC -Iincludes -Isources -c sources/hello.c -o objects/hello.o
58
+ gcc -H -Wall -Wextra -fPIC -Iincludes -Isources -c sources/main.c -o objects/main.o
59
+ mkdir -p objects
60
+ gcc -o objects/hello objects/hello.o objects/main.o
61
+ """
62
+ And a file named "objects/hello" should exist
63
+ And I successfully run `./objects/hello`
64
+ And the output should contain:
65
+ """
66
+ Hello, PaperHouse!
67
+ """
68
+
69
+ Scenario: Clean
70
+ Given the current project directory is "examples/executable"
71
+ And I successfully run `rake hello`
72
+ When I successfully run `rake clean`
73
+ Then a file named "hello.o" should not exist
74
+ And a file named ".hello.depends" should exist
75
+ And a file named "hello" should exist
76
+
77
+ Scenario: Clobber
78
+ Given the current project directory is "examples/executable"
79
+ And I successfully run `rake hello`
80
+ When I successfully run `rake clobber`
81
+ Then a file named "hello.o" should not exist
82
+ And a file named ".hello.depends" should not exist
83
+ And a file named "hello" should not exist
@@ -0,0 +1,209 @@
1
+ Feature: PaperHouse::SharedLibraryTask
2
+
3
+ PaperHouse provides a rake task called
4
+ `PaperHouse::SharedLibraryTask` to build a shared library from *.c
5
+ and *.h files. These source files can be located in multiple
6
+ subdirectories.
7
+
8
+ @linux
9
+ Scenario: Build a shared library from one *.c and *.h file
10
+ Given the current project directory is "examples/shared_library"
11
+ When I successfully run `rake hello`
12
+ Then the output should contain:
13
+ """
14
+ gcc -H -fPIC -I. -c hello.c -o ./hello.o
15
+ gcc -H -fPIC -I. -c main.c -o ./main.o
16
+ gcc -shared -Wl,-soname,libhello.so.0 -o ./libhello.so.0.1.0 ./hello.o -lm
17
+ ln -s libhello.so.0.1.0 libhello.so
18
+ ln -s libhello.so.0.1.0 libhello.so.0
19
+ gcc -o ./hello ./main.o -L. -lhello
20
+ """
21
+ And a file named "libhello.so.0.1.0" should exist
22
+ And a file named "hello" should exist
23
+ And I successfully run `./hello`
24
+ And the output should contain:
25
+ """
26
+ Hello, PaperHouse!
27
+ """
28
+
29
+ @mac
30
+ Scenario: Build a shared library from one *.c and *.h file
31
+ Given the current project directory is "examples/shared_library"
32
+ When I successfully run `rake hello`
33
+ Then the output should contain:
34
+ """
35
+ gcc -H -fPIC -I. -c hello.c -o ./hello.o
36
+ gcc -H -fPIC -I. -c main.c -o ./main.o
37
+ gcc -shared -Wl,-install_name,libhello.so.0 -o ./libhello.so.0.1.0 ./hello.o -lm
38
+ ln -s libhello.so.0.1.0 libhello.so
39
+ ln -s libhello.so.0.1.0 libhello.so.0
40
+ gcc -o ./hello ./main.o -L. -lhello
41
+ """
42
+ And a file named "libhello.so.0.1.0" should exist
43
+ And a file named "hello" should exist
44
+ And I successfully run `./hello`
45
+ And the output should contain:
46
+ """
47
+ Hello, PaperHouse!
48
+ """
49
+
50
+ @linux
51
+ Scenario: Build a shared library from one *.c and *.h file using llvm-gcc by specifying `CC=` option
52
+ Given the current project directory is "examples/shared_library"
53
+ When I successfully run `rake hello CC=llvm-gcc`
54
+ Then the output should contain:
55
+ """
56
+ llvm-gcc -H -fPIC -I. -c hello.c -o ./hello.o
57
+ llvm-gcc -H -fPIC -I. -c main.c -o ./main.o
58
+ llvm-gcc -shared -Wl,-soname,libhello.so.0 -o ./libhello.so.0.1.0 ./hello.o -lm
59
+ ln -s libhello.so.0.1.0 libhello.so
60
+ ln -s libhello.so.0.1.0 libhello.so.0
61
+ llvm-gcc -o ./hello ./main.o -L. -lhello
62
+ """
63
+ And a file named "libhello.so.0.1.0" should exist
64
+ And a file named "hello" should exist
65
+ And I successfully run `./hello`
66
+ And the output should contain:
67
+ """
68
+ Hello, PaperHouse!
69
+ """
70
+
71
+ @mac
72
+ Scenario: Build a shared library from one *.c and *.h file using llvm-gcc by specifying `CC=` option
73
+ Given the current project directory is "examples/shared_library"
74
+ When I successfully run `rake hello CC=llvm-gcc`
75
+ Then the output should contain:
76
+ """
77
+ llvm-gcc -H -fPIC -I. -c hello.c -o ./hello.o
78
+ llvm-gcc -H -fPIC -I. -c main.c -o ./main.o
79
+ llvm-gcc -shared -Wl,-install_name,libhello.so.0 -o ./libhello.so.0.1.0 ./hello.o -lm
80
+ ln -s libhello.so.0.1.0 libhello.so
81
+ ln -s libhello.so.0.1.0 libhello.so.0
82
+ llvm-gcc -o ./hello ./main.o -L. -lhello
83
+ """
84
+ And a file named "libhello.so.0.1.0" should exist
85
+ And a file named "hello" should exist
86
+ And I successfully run `./hello`
87
+ And the output should contain:
88
+ """
89
+ Hello, PaperHouse!
90
+ """
91
+
92
+ @linux
93
+ Scenario: Build a shared library from one *.c and *.h file using llvm-gcc
94
+ Given the current project directory is "examples/shared_library"
95
+ When I successfully run `rake -f Rakefile.llvm hello`
96
+ Then the output should contain:
97
+ """
98
+ llvm-gcc -H -fPIC -I. -c hello.c -o ./hello.o
99
+ llvm-gcc -H -fPIC -I. -c main.c -o ./main.o
100
+ llvm-gcc -shared -Wl,-soname,libhello.so.0 -o ./libhello.so.0.1.0 ./hello.o -lm
101
+ ln -s libhello.so.0.1.0 libhello.so
102
+ ln -s libhello.so.0.1.0 libhello.so.0
103
+ llvm-gcc -o ./hello ./main.o -L. -lhello
104
+ """
105
+ And a file named "libhello.so.0.1.0" should exist
106
+ And a file named "hello" should exist
107
+ And I successfully run `./hello`
108
+ And the output should contain:
109
+ """
110
+ Hello, PaperHouse!
111
+ """
112
+
113
+ @mac
114
+ Scenario: Build a shared library from one *.c and *.h file using llvm-gcc
115
+ Given the current project directory is "examples/shared_library"
116
+ When I successfully run `rake -f Rakefile.llvm hello`
117
+ Then the output should contain:
118
+ """
119
+ llvm-gcc -H -fPIC -I. -c hello.c -o ./hello.o
120
+ llvm-gcc -H -fPIC -I. -c main.c -o ./main.o
121
+ llvm-gcc -shared -Wl,-install_name,libhello.so.0 -o ./libhello.so.0.1.0 ./hello.o -lm
122
+ ln -s libhello.so.0.1.0 libhello.so
123
+ ln -s libhello.so.0.1.0 libhello.so.0
124
+ llvm-gcc -o ./hello ./main.o -L. -lhello
125
+ """
126
+ And a file named "libhello.so.0.1.0" should exist
127
+ And a file named "hello" should exist
128
+ And I successfully run `./hello`
129
+ And the output should contain:
130
+ """
131
+ Hello, PaperHouse!
132
+ """
133
+
134
+ @linux
135
+ Scenario: Build a shared library from multiple *.c and *.h files in subcirectories
136
+ Given the current project directory is "examples/shared_library_subdirs"
137
+ When I successfully run `rake hello`
138
+ Then the output should contain:
139
+ """
140
+ gcc -H -Werror -Wall -Wextra -fPIC -Iincludes -Isources -c sources/hello.c -o objects/hello.o
141
+ gcc -H -fPIC -Iincludes -Isources -c sources/main.c -o ./main.o
142
+ mkdir -p objects
143
+ gcc -shared -Wl,-soname,libhello.so.0 -o objects/libhello.so.0.1.0 objects/hello.o
144
+ ln -s objects/libhello.so.0.1.0 libhello.so
145
+ ln -s objects/libhello.so.0.1.0 libhello.so.0
146
+ gcc -o ./hello ./main.o -L. -lhello
147
+ """
148
+ And a file named "objects/libhello.so.0.1.0" should exist
149
+ And a file named "hello" should exist
150
+ And I successfully run `./hello`
151
+ And the output should contain:
152
+ """
153
+ Hello, PaperHouse!
154
+ """
155
+
156
+ @mac
157
+ Scenario: Build a shared library from multiple *.c and *.h files in subcirectories
158
+ Given the current project directory is "examples/shared_library_subdirs"
159
+ When I successfully run `rake hello`
160
+ Then the output should contain:
161
+ """
162
+ gcc -H -Werror -Wall -Wextra -fPIC -Iincludes -Isources -c sources/hello.c -o objects/hello.o
163
+ gcc -H -fPIC -Iincludes -Isources -c sources/main.c -o ./main.o
164
+ mkdir -p objects
165
+ gcc -shared -Wl,-install_name,libhello.so.0 -o objects/libhello.so.0.1.0 objects/hello.o
166
+ ln -s objects/libhello.so.0.1.0 libhello.so
167
+ ln -s objects/libhello.so.0.1.0 libhello.so.0
168
+ gcc -o ./hello ./main.o -L. -lhello
169
+ """
170
+ And a file named "objects/libhello.so.0.1.0" should exist
171
+ And a file named "hello" should exist
172
+ And I successfully run `./hello`
173
+ And the output should contain:
174
+ """
175
+ Hello, PaperHouse!
176
+ """
177
+
178
+ Scenario: Automatically rebuild an executable when dependent library is updated
179
+ Given the current project directory is "examples/shared_library"
180
+ And I successfully run `rake hello`
181
+ And I successfully run `sleep 1`
182
+ And I successfully run `touch libhello.so.0`
183
+ When I successfully run `rake hello`
184
+ Then the output should contain:
185
+ """
186
+ gcc -o ./hello ./main.o -L. -lhello
187
+ """
188
+
189
+ Scenario: Clean
190
+ Given the current project directory is "examples/shared_library"
191
+ When I successfully run `rake hello`
192
+ When I successfully run `rake clean`
193
+ Then a file named "hello.o" should not exist
194
+ And a file named "main.o" should not exist
195
+ And a file named ".libhello.depends" should exist
196
+ And a file named ".hello.depends" should exist
197
+ And a file named "libhello.so.0.1.0" should exist
198
+ And a file named "hello" should exist
199
+
200
+ Scenario: Clobber
201
+ Given the current project directory is "examples/shared_library"
202
+ When I successfully run `rake hello`
203
+ When I successfully run `rake clobber`
204
+ Then a file named "hello.o" should not exist
205
+ And a file named "main.o" should not exist
206
+ And a file named ".libhello.depends" should not exist
207
+ And a file named ".hello.depends" should not exist
208
+ And a file named "libhello.so.0.1.0" should not exist
209
+ And a file named "hello" should not exist
@@ -0,0 +1,116 @@
1
+ Feature: PaperHouse::StaticLibraryTask
2
+
3
+ PaperHouse provides a rake task called
4
+ `PaperHouse::StaticLibraryTask` to build a static library from *.c
5
+ and *.h files. These source files can be located in multiple
6
+ subdirectories.
7
+
8
+ Scenario: Build a static library from one *.c and *.h file
9
+ Given the current project directory is "examples/static_library"
10
+ When I successfully run `rake hello`
11
+ Then the output should contain:
12
+ """
13
+ gcc -H -fPIC -I. -c hello.c -o ./hello.o
14
+ gcc -H -fPIC -I. -c main.c -o ./main.o
15
+ ar -cq ./libhello.a ./hello.o
16
+ ranlib ./libhello.a
17
+ gcc -o ./hello ./main.o -L. -lhello
18
+ """
19
+ And a file named "libhello.a" should exist
20
+ And a file named "hello" should exist
21
+ And I successfully run `./hello`
22
+ And the output should contain:
23
+ """
24
+ Hello, PaperHouse!
25
+ """
26
+
27
+ Scenario: Build a static library from one *.c and *.h file using llvm-gcc by specifying `CC=` option
28
+ Given the current project directory is "examples/static_library"
29
+ When I successfully run `rake hello CC=llvm-gcc`
30
+ Then the output should contain:
31
+ """
32
+ llvm-gcc -H -fPIC -I. -c hello.c -o ./hello.o
33
+ llvm-gcc -H -fPIC -I. -c main.c -o ./main.o
34
+ ar -cq ./libhello.a ./hello.o
35
+ ranlib ./libhello.a
36
+ llvm-gcc -o ./hello ./main.o -L. -lhello
37
+ """
38
+ And a file named "libhello.a" should exist
39
+ And a file named "hello" should exist
40
+ And I successfully run `./hello`
41
+ And the output should contain:
42
+ """
43
+ Hello, PaperHouse!
44
+ """
45
+
46
+ Scenario: Build a static library from one *.c and *.h file using llvm-gcc
47
+ Given the current project directory is "examples/static_library"
48
+ When I successfully run `rake -f Rakefile.llvm hello`
49
+ Then the output should contain:
50
+ """
51
+ llvm-gcc -H -fPIC -I. -c hello.c -o ./hello.o
52
+ llvm-gcc -H -fPIC -I. -c main.c -o ./main.o
53
+ ar -cq ./libhello.a ./hello.o
54
+ ranlib ./libhello.a
55
+ llvm-gcc -o ./hello ./main.o -L. -lhello
56
+ """
57
+ And a file named "libhello.a" should exist
58
+ And a file named "hello" should exist
59
+ And I successfully run `./hello`
60
+ And the output should contain:
61
+ """
62
+ Hello, PaperHouse!
63
+ """
64
+
65
+ Scenario: Build a static library from multiple *.c and *.h files in subcirectories
66
+ Given the current project directory is "examples/static_library_subdirs"
67
+ When I successfully run `rake hello`
68
+ Then the output should contain:
69
+ """
70
+ gcc -H -Werror -Wall -Wextra -fPIC -Iincludes -Isources -c sources/hello.c -o objects/hello.o
71
+ gcc -H -fPIC -Iincludes -Isources -c sources/main.c -o ./main.o
72
+ mkdir -p objects
73
+ ar -cq objects/libhello.a objects/hello.o
74
+ ranlib objects/libhello.a
75
+ gcc -o ./hello ./main.o -Lobjects -lhello
76
+ """
77
+ And a file named "objects/libhello.a" should exist
78
+ And a file named "hello" should exist
79
+ And I successfully run `./hello`
80
+ And the output should contain:
81
+ """
82
+ Hello, PaperHouse!
83
+ """
84
+
85
+ Scenario: Automatically rebuild an executable when dependent library is updated
86
+ Given the current project directory is "examples/static_library"
87
+ And I successfully run `rake hello`
88
+ And I successfully run `sleep 1`
89
+ And I successfully run `touch libhello.a`
90
+ When I successfully run `rake hello`
91
+ Then the output should contain:
92
+ """
93
+ gcc -o ./hello ./main.o -L. -lhello
94
+ """
95
+
96
+ Scenario: Clean
97
+ Given the current project directory is "examples/static_library"
98
+ And I successfully run `rake hello`
99
+ When I successfully run `rake clean`
100
+ Then a file named "hello.o" should not exist
101
+ And a file named "main.o" should not exist
102
+ And a file named ".libhello.depends" should exist
103
+ And a file named ".hello.depends" should exist
104
+ And a file named "libhello.a" should exist
105
+ And a file named "hello" should exist
106
+
107
+ Scenario: Clobber
108
+ Given the current project directory is "examples/static_library"
109
+ And I successfully run `rake hello`
110
+ When I successfully run `rake clobber`
111
+ Then a file named "hello.o" should not exist
112
+ And a file named "main.o" should not exist
113
+ And a file named ".libhello.depends" should not exist
114
+ And a file named ".hello.depends" should not exist
115
+ And a file named "libhello.a" should not exist
116
+ And a file named "hello" should not exist
@@ -0,0 +1,8 @@
1
+ Given(/^the current project directory is "(.*?)"$/) do | dir |
2
+ in_current_dir do
3
+ project_files = Dir.glob( File.join( "..", "..", dir, "*" ) )
4
+ FileUtils.cp_r project_files, "."
5
+ system "rake clobber"
6
+ FileUtils.rm_r "objects" if FileTest.exists?( "objects" )
7
+ end
8
+ end
@@ -0,0 +1,41 @@
1
+ #
2
+ # Copyright (C) 2013 NEC Corporation
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License, version 3, as
6
+ # published by the Free Software Foundation.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along
14
+ # with this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
+ #
17
+
18
+
19
+ require "rubygems"
20
+
21
+ require "simplecov"
22
+ SimpleCov.start
23
+
24
+ require "aruba/cucumber"
25
+ require "rake"
26
+
27
+
28
+ ENV[ "LD_LIBRARY_PATH" ] = "."
29
+
30
+
31
+ if ENV[ "TRAVIS" ]
32
+ require "coveralls"
33
+ Coveralls.wear_merged!
34
+ end
35
+
36
+
37
+ ### Local variables:
38
+ ### mode: Ruby
39
+ ### coding: utf-8-unix
40
+ ### indent-tabs-mode: nil
41
+ ### End:
@@ -0,0 +1,12 @@
1
+ Before do
2
+ ENV[ "CC" ] = nil
3
+ ENV[ "dragonegg_disable_version_check" ] = "1"
4
+ @aruba_timeout_seconds = 5
5
+ end
6
+
7
+
8
+ After do
9
+ ENV[ "CC" ] = nil
10
+ ENV[ "dragonegg_disable_version_check" ] = nil
11
+ Rake::Task.clear
12
+ end