Merge branch '1.3-rel' (1a2c9ee2)
[iotivity.git] / build_common / windows / SConscript
1 ##
2 # This script includes windows specific config (MSVS/MSVC)
3 ##
4 Import('env')
5 import os.path
6
7 help_vars = Variables()
8 if env.get('BUILD_JAVA') == True:
9     if not env.get('ANDROID_GRADLE'):
10         SConscript('../../extlibs/android/gradle/SConscript')
11         help_vars.Add(PathVariable('ANDROID_GRADLE', 'Android Gradle directory', os.path.join(env.get('SRC_DIR'), 'extlibs', 'android', 'gradle', 'gradle-2.2.1/bin/gradle')))
12
13     if env.get('ANDROID_GRADLE'):
14         android_gradle = env.get('ANDROID_GRADLE')
15     else:
16         print(
17 '''
18 *************************************** Info **********************************
19 *    Android Gradle path isn't set, the default will be used. You can set     *
20 * environment variable ANDROID_GRADLE or add it in command line as:           *
21 *      # scons ANDROID_GRADLE=<path to android GRADLE> ...                    *
22 *******************************************************************************
23 ''')
24         android_gradle = os.path.join(env.get('SRC_DIR'), 'extlibs', 'android', 'gradle', 'gradle-2.2.1', 'bin', 'gradle')
25
26 help_vars.Update(env)
27 Help(help_vars.GenerateHelpText(env))
28
29 # Set common flags
30 if env['CC'] == 'cl':
31     if env.get('UWP_APP') == '1':
32         # Currently only supports VS2015 (14.0)
33         supported_uwp_msvc_versions = ['14.0']
34         # If MSVC_VERSION is not supported for UWP, exit on error
35         if env.get('MSVC_VERSION') not in supported_uwp_msvc_versions:
36             print '\nError: Trying to Build UWP binaries with unsupported Visual Studio version\n'
37             Exit(1)
38
39     #  - warning C4133: incompatible type conversion
40     env.AppendUnique(CCFLAGS=['/we4133'])
41
42     # Disable the following warnings:
43     #  - warning C4127: conditional expression is constant
44     #    - Disabled due to the widespread usage in IoTivity
45     #  - warning C4200: zero-sized array in struct/union.
46     #    - It is an acceptable approach for variable size structs.
47     #  - warning C4201: nameless struct/union
48     #    - Disabled due to IoTivity not being ANSI compatible
49     #  - warning C4204: nonstandard extension used: non-constant aggregate initializer
50     #    - Disabled due to IoTivity not being ANSI compatible and this is an appropriate way to intialize
51     #      structs for non-legacy compilers.
52     #  - warning C4214:  bit field types other than int
53     #    - Disabled due to IoTivity not being ANSI compatible
54     #  - warning C4221: nonstandard extension used: 'identifier' cannot be initialized using address of automatic variable
55     #    - Disabled due to IoTivity not being ANSI compatible
56     #  - warning C4232: nonstandard extension used: 'read': address of dllimport 'fread' is not static, identity not guaranteed
57     #    - fread, frwrite, etc are provided by the platform and cannot be changed.
58     #  - warning C4503: decorated name length exceeded, name was truncated.
59     #    - Might cause issues during linking and debugging.
60     #  - warning C4512: assignment operator could not be generated.
61     #    - It's an acceptable warning displayed only by Visual Studio 2013 compiler.
62     #  - warning C4706: assignment within conditional expression
63     #    - Disabled due to the widespread usage in IoTivity and low impact.
64     env.AppendUnique(CCFLAGS=[
65         '/wd4127', '/wd4200', '/wd4201', '/wd4204', '/wd4214', '/wd4221',
66         '/wd4232', '/wd4503', '/wd4512', '/wd4706'])
67
68     # Enabling /W4 warnings globally for Windows builds.
69     env.AppendUnique(CCFLAGS=['/W4', '/WX'])
70     env.AppendUnique(CCFLAGS=['/EHsc'])
71
72     # Set release/debug flags
73     if env.get('RELEASE'):
74         env.AppendUnique(CCFLAGS=['/MD', '/O2', '/GF'])
75     else:
76         env.AppendUnique(CCFLAGS=['/MDd', '/Od', '/RTC1'])
77         env.AppendUnique(LINKFLAGS=['/debug'])
78
79
80     # Work around [IOT-1986]
81     # During some Windows multi-threaded builds, SCons/Python/Pywin32 appear to try
82     # linking with these static libraries while another SCons thread started executing
83     # InstallTarget() for this static LIB, but didn't finish yet. That behavior results
84     # in linker errors. Work around this issue by linking with the source of InstallTarget(),
85     # rather than the target.
86     env.PrependUnique(LIBPATH=[os.path.join(env.get('BUILD_DIR'), 'resource', 'src')])
87     env.PrependUnique(LIBPATH=[os.path.join(env.get('BUILD_DIR'), 'resource', 'c_common', 'windows')])
88     env.PrependUnique(LIBPATH=[os.path.join(env.get('BUILD_DIR'), 'resource', 'oc_logger')])
89     env.PrependUnique(LIBPATH=[os.path.join(env.get('BUILD_DIR'), 'resource', 'csdk', 'resource-directory')])
90     env.PrependUnique(LIBPATH=['#extlibs/mbedtls'])
91
92     env['PDB'] = '${TARGET.base}.pdb'
93     env.Append(LINKFLAGS=['/PDB:${TARGET.base}.pdb'])
94
95     # Visual Studio compiler complains that functions like strncpy are unsafe. We
96     # are aware that it's possible to create a non-null terminated string using the
97     # strncpy function.  However, the str*_s functions are not standard and thus
98     # will not work on all systems supported by IoTivity. This will prevent Visual
99     # Studio from displaying unwanted warnings.
100     # See https://msdn.microsoft.com/en-us/library/ttcz0bys.aspx for more details.
101     env.AppendUnique(CPPDEFINES=['_CRT_SECURE_NO_WARNINGS', '_CRT_NONSTDC_NO_WARNINGS', '_SCL_SECURE_NO_WARNINGS'])
102
103     if env.get('UWP_APP') != '1':
104         # Add Desktop specific libraries
105         env.AppendUnique(LIBS=[
106             'bcrypt',
107             'ws2_32',
108             'advapi32',
109             'iphlpapi',
110             'crypt32',
111             'kernel32',
112         ])
113     else:
114         # Add Windows Universal Platform specific libraries and flags
115         # Note: We technically should set WINAPI_FAMILY=WINAPI_FAMILY_APP, but cannot
116         #       due to [IOT-2312]. All APIs used are store/UWP compatible at this time.
117         env.AppendUnique(CPPDEFINES=['UWP_APP', '__WRL_NO_DEFAULT_LIB__'])
118         env.AppendUnique(LINKFLAGS=['/MANIFEST:NO', '/WINMD:NO', '/APPCONTAINER'])
119         env.AppendUnique(LIBS=['WindowsApp', 'bcrypt', 'ws2_32', 'iphlpapi', 'crypt32'])
120
121 elif env['CC'] == 'gcc':
122     print "\nError: gcc not supported on Windows.  Use Visual Studio!\n"
123     Exit(1)