1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2012 Alexis Laferrière <alexis.laf@xymus.net>
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
17 # provides tools to write C .c and .h files
22 # Accumulates all C code for a compilation unit
23 class CCompilationUnit
25 # comments and native interface imports
26 var header_c_base
= new Template
28 # custom C header code or generated for other languages
29 var header_custom
= new Template
31 # types of extern classes and friendly types
32 var header_c_types
= new Template
34 # implementation declaration for extern methods
35 var header_decl
= new Template
38 # comments, imports, etc
39 var body_decl
= new Template
41 # custom code and generated for ffi
42 var body_custom
= new Template
44 # implementation body of extern methods
45 var body_impl
= new Template
47 # files to compile TODO check is appropriate
48 var files
= new Array[String]
50 fun add_local_function
( efc
: CFunction )
52 body_decl
.add
( "{efc.signature};\n" )
54 body_impl
.add
( efc
.to_writer
)
57 fun add_exported_function
( efc
: CFunction )
59 header_decl
.add
( "{efc.signature};\n" )
61 body_impl
.add
( efc
.to_writer
)
64 fun compile_header_core
( stream
: OStream )
66 header_c_base
.write_to
( stream
)
67 header_custom
.write_to
( stream
)
68 header_c_types
.write_to
( stream
)
69 header_decl
.write_to
( stream
)
72 fun compile_body_core
( stream
: OStream )
74 body_decl
.write_to
( stream
)
75 body_custom
.write_to
( stream
)
76 body_impl
.write_to
( stream
)
80 # Accumulates C code related to a specific function
82 var signature
: String
84 var decls
= new Template
85 var exprs
= new Template
87 fun to_writer
: Template
102 # An extern file to compile
104 # The filename of the file
107 # The name of the target in the Makefile
108 # Usually the produced .o file
109 fun makefile_rule_name
: String is abstract
111 # The content of the rule in the make
112 # Usually the one-line shell command after the tabulation
113 fun makefile_rule_content
: String is abstract
115 fun compiles_to_o_file
: Bool do return false
117 fun add_to_jar
: Bool do return false
120 # An extern C file to compile
124 init (filename
, cflags
: String)
131 # Additionnal specific CC compiler -c flags
134 redef fun hash
do return filename
.hash
135 redef fun ==(o
) do return o
isa ExternCFile and filename
== o
.filename
137 redef fun makefile_rule_name
do
138 var basename
= filename
.basename
(".c")
139 var res
= "{basename}.extern.o"
143 redef fun makefile_rule_content
do
144 var ff
= filename
.basename
("")
145 var o
= makefile_rule_name
146 return "$(CC) $(CFLAGS) {self.cflags} -c -o {o} {ff}"
149 redef fun compiles_to_o_file
do return true