security: publish securevirtualresourcetypes.h
[iotivity.git] / resource / c_common / SConscript
1 #******************************************************************
2 #
3 # Copyright 2014 Intel Mobile Communications GmbH All Rights Reserved.
4 #
5 #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
6 #
7 # Licensed under the Apache License, Version 2.0 (the "License");
8 # you may not use this file except in compliance with the License.
9 # You may obtain a copy of the License at
10 #
11 #      http://www.apache.org/licenses/LICENSE-2.0
12 #
13 # Unless required by applicable law or agreed to in writing, software
14 # distributed under the License is distributed on an "AS IS" BASIS,
15 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 # See the License for the specific language governing permissions and
17 # limitations under the License.
18 #
19 #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
20
21 Import('env')
22 import os
23 import datetime
24
25 target_os = env.get('TARGET_OS')
26 target_arch = env.get('TARGET_ARCH')
27 src_dir = env.get('SRC_DIR')
28
29 ######################################################################
30 # Generate iotivity_config.h using presence of headers
31 ######################################################################
32 config_h_file_path = os.path.join(src_dir, 'resource', 'c_common',
33                                   'iotivity_config.h')
34
35 if (os.path.exists(config_h_file_path)) and (env.GetOption('clean')):
36     os.remove(config_h_file_path)
37
38 if (not os.path.isfile(config_h_file_path)) and (not env.GetOption('clean')):
39     conf = Configure(env.Clone(LIBS=[]))
40
41     config_h_header = '''
42 /* ****************************************************************************
43  * iotivity_config.h - IoTivity platform-specific configuration header.
44  *
45  * Auto-generated code for the %s %s platform.
46  *
47  *************************************************************************** */
48
49 #ifndef IOTIVITY_CONFIG_H__
50 #define IOTIVITY_CONFIG_H__
51
52 ''' % (str(target_os), str(target_arch))
53
54     config_h_body = ''
55
56     config_h_footer = '''
57
58 #include "platform_features.h"
59
60 #endif // IOTIVITY_CONFIG_H__
61
62 '''
63
64     cxx_headers = [
65         'arpa/inet.h',
66         'fcntl.h',
67         'grp.h',
68         'in6addr.h',
69         'linux/limits.h',
70         'memory.h',
71         'net/if.h',
72         'netdb.h',
73         'netinet/in.h',
74         'pthread.h',
75         'pwd.h',
76         'stdlib.h',
77         'string.h',
78         'strings.h',
79         'sys/ioctl.h',
80         'sys/poll.h',
81         'sys/select.h',
82         'sys/socket.h',
83         'sys/stat.h',
84         'sys/time.h',
85         'sys/types.h',
86         'sys/unistd.h',
87         'syslog.h',
88         'time.h',
89         'unistd.h',
90         'uuid/uuid.h',
91         'windows.h',
92         'winsock2.h',
93         'ws2tcpip.h'
94     ]
95
96     cxx_functions = ['strptime']
97
98     if target_os == 'arduino':
99         # Detection of headers on the Arduino platform is currently broken.
100         cxx_headers = []
101
102     if target_os == 'msys_nt':
103         # WinPThread provides a pthread.h, but we want to use native threads.
104         cxx_headers.remove('pthread.h')
105
106     def get_define_from_string(header_file):
107         header_file_converted = header_file.replace("/", "_").replace(".", "_").upper()
108         return "HAVE_" + header_file_converted
109
110     for header_file_name in cxx_headers:
111         if conf.CheckCXXHeader(header_file_name):
112             config_h_body += "#define %s 1\n\n" % get_define_from_string(
113                 header_file_name)
114
115     for function_name in cxx_functions:
116         if conf.CheckFunc(function_name):
117             config_h_body += "#define %s 1\n\n" % get_define_from_string(
118                 function_name)
119     conf.Finish()
120
121     # Autoconf feature doesn't work with Jenkins' arduino toolchain, so hardcode it here.
122     if target_os == 'arduino':
123         config_h_body += "#define HAVE_ARDUINO_TIME_H\n\n"
124
125     # Generate the file
126     if os.path.exists(config_h_file_path):
127         os.remove(config_h_file_path)
128     config_h_file = open(config_h_file_path, "w")
129     config_h_file.write(config_h_header + config_h_body + config_h_footer)
130     config_h_file.close()
131
132 # Sanity check to ensure that the above block created the file.
133 if (not os.path.exists(config_h_file_path)) and (not env.GetOption('clean')):
134     print "Error: iotivity_config.h file not created!"
135     Exit(1)
136
137 # iotivity_config.h should be copied to the build dir
138 env.UserInstallTargetHeader(
139     config_h_file_path, 'c_common', 'iotivity_config.h')
140
141 # Use the generated file internally
142 env.AppendUnique(CPPPATH=[os.path.join(src_dir, 'resource', 'c_common')])
143
144 ######################################################################
145
146 env.AppendUnique(CPPPATH=[
147     os.path.join(Dir('.').abspath, 'oic_malloc', 'include'),
148     os.path.join(Dir('.').abspath, 'oic_string', 'include'),
149     os.path.join(Dir('.').abspath, 'oic_time', 'include'),
150     os.path.join(Dir('.').abspath, 'ocatomic', 'include'),
151     os.path.join(Dir('.').abspath, 'ocrandom', 'include'),
152     os.path.join(Dir('.').abspath, 'octhread', 'include'),
153     os.path.join(Dir('.').abspath, 'oic_platform', 'include'),
154     os.path.join(Dir('.').abspath, 'octimer', 'include'),
155     '#/extlibs/mbedtls/mbedtls/include'
156 ])
157
158 if target_os not in ['tizen']:
159     env.AppendUnique(
160         LIBPATH=[os.path.join(env.get('BUILD_DIR'), 'resource', 'c_common')])
161
162 if target_os in ['tizen', 'linux']:
163     env.ParseConfig("pkg-config --cflags --libs uuid")
164
165 common_env = env.Clone()
166
167 ######################################################################
168 # Add platform-specific helper library
169 ######################################################################
170
171 if target_os in ['windows', 'msys_nt']:
172     SConscript('windows/SConscript', 'common_env')
173
174 ######################################################################
175 # Source files and Targets
176 ######################################################################
177 common_src = [
178     'oic_string/src/oic_string.c',
179     'oic_malloc/src/oic_malloc.c',
180     'oic_time/src/oic_time.c',
181     'ocrandom/src/ocrandom.c',
182     'oic_platform/src/oic_platform.c'
183 ]
184
185 if env['POSIX_SUPPORTED']:
186     common_src.append('octhread/src/posix/octhread.c')
187 elif target_os in ['windows']:
188     common_src.append('octhread/src/windows/octhread.c')
189 else:
190     common_src.append('octhread/src/noop/octhread.c')
191
192 if target_os in ['windows', 'msys_nt']:
193     common_src.append('ocatomic/src/windows/ocatomic.c')
194 elif target_os in ['arduino']:
195     common_src.append('ocatomic/src/arduino/ocatomic.c')
196 else:
197     common_src.append('ocatomic/src/others/ocatomic.c')
198
199 if target_os in ['windows']:
200     common_src.append('oic_platform/src/windows/oic_winplatform.cpp')
201 else:
202     common_src.append('oic_platform/src/others/oic_otherplatforms.c')
203
204 # C++ Arduino's <Timer.h> is included so use C++ compiler/flags
205 if target_os in ['arduino']:
206     octimer_env = common_env.Clone()
207     octimer_env.Replace(CC=env.get('CXX'))
208     octimer_env.Replace(CFLAGS=env.get('CXXFLAGS'))
209     octimer = octimer_env.Object('octimer/src/octimer.c')
210     common_src.append(octimer)
211 else:
212     common_src.append('octimer/src/octimer.c')
213
214 common_env.AppendUnique(LIBS=['logger'])
215 common_env.AppendUnique(CPPPATH=['#resource/csdk/logger/include'])
216 commonlib = common_env.StaticLibrary('c_common', common_src)
217 common_env.InstallTarget(commonlib, 'c_common')
218 common_env.UserInstallTargetLib(commonlib, 'c_common')
219 common_env.UserInstallTargetHeader(
220     'iotivity_debug.h', 'c_common', 'iotivity_debug.h')
221 common_env.UserInstallTargetHeader(
222     'platform_features.h', 'c_common', 'platform_features.h')
223 common_env.UserInstallTargetHeader(
224     'experimental/byte_array.h', 'c_common/experimental', 'byte_array.h')
225
226
227 Clean(commonlib, config_h_file_path)
228
229 # c_common calls into logger.
230 env.PrependUnique(LIBS=['c_common', 'logger'])