# Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

{
    # Everything below  this is duplicated in the GN build, except Mac support.
    # If you change anything also change angle/BUILD.gn
    'variables':
    {
        'util_sources':
        [
            'com_utils.h',
            'keyboard.h',
            'geometry_utils.cpp',
            'geometry_utils.h',
            'mouse.h',
            'random_utils.cpp',
            'random_utils.h',
            'shader_utils.cpp',
            'shader_utils.h',
            'system_utils.h',
            'Event.h',
            'EGLWindow.cpp',
            'EGLWindow.h',
            'Matrix.cpp',
            'Matrix.h',
            'OSPixmap.h',
            'OSWindow.cpp',
            'OSWindow.h',
            'Timer.h',
        ],
        'util_win32_sources':
        [
            'windows/win32/Win32_system_utils.cpp',
            'windows/win32/Win32Pixmap.cpp',
            'windows/win32/Win32Pixmap.h',
            'windows/win32/Win32Window.cpp',
            'windows/win32/Win32Window.h',
            'windows/Windows_system_utils.cpp',
            'windows/WindowsTimer.cpp',
            'windows/WindowsTimer.h',
        ],
        'util_winrt_sources':
        [
            'windows/winrt/WinRT_system_utils.cpp',
            'windows/winrt/WinRTPixmap.cpp',
            'windows/winrt/WinRTWindow.cpp',
            'windows/winrt/WinRTWindow.h',
            'windows/Windows_system_utils.cpp',
            'windows/WindowsTimer.cpp',
            'windows/WindowsTimer.h',
        ],
        'util_linux_sources':
        [
            'linux/LinuxTimer.cpp',
            'linux/LinuxTimer.h',
            'posix/Posix_system_utils.cpp',
        ],
        'util_x11_sources':
        [
            'x11/X11Pixmap.cpp',
            'x11/X11Pixmap.h',
            'x11/X11Window.cpp',
            'x11/X11Window.h',
        ],
        'util_ozone_sources':
        [
            'ozone/OzonePixmap.cpp',
            'ozone/OzoneWindow.cpp',
            'ozone/OzoneWindow.h',
        ],
        'util_osx_sources':
        [
            'osx/OSXTimer.cpp',
            'osx/OSXTimer.h',
            'osx/OSXPixmap.mm',
            'osx/OSXPixmap.h',
            'osx/OSXWindow.mm',
            'osx/OSXWindow.h',
            'posix/Posix_system_utils.cpp',
        ],
        'util_android_sources':
        [
            'android/AndroidPixmap.cpp',
            'android/AndroidWindow.cpp',
            'android/AndroidWindow.h',
            'android/third_party/android_native_app_glue.c',
            'android/third_party/android_native_app_glue.h',
        ],
    },
    'targets':
    [
        {
            'target_name': 'angle_util_config',
            'type': 'none',
            'direct_dependent_settings':
            {
                'include_dirs':
                [
                    '<(DEPTH)/include',
                    '<(DEPTH)/util',
                ],
                'sources':
                [
                    '<@(util_sources)',
                ],
                'defines':
                [
                    'GL_GLEXT_PROTOTYPES',
                    'EGL_EGLEXT_PROTOTYPES',
                    'LIBANGLE_UTIL_IMPLEMENTATION',
                ],
                'conditions':
                [
                    ['target_os=="win" and angle_build_winrt==0',
                    {
                        'sources':
                        [
                            '<@(util_win32_sources)',
                        ],
                    }],
                    ['target_os=="win" and angle_build_winrt==1',
                    {
                        'sources':
                        [
                            '<@(util_winrt_sources)',
                        ],
                    }],
                    ['OS=="linux"',
                    {
                        'sources':
                        [
                            '<@(util_linux_sources)',
                        ],
                        'link_settings':
                        {
                            'libraries':
                            [
                                '-ldl',
                            ],
                        },
                    }],
                    ['use_x11==1',
                    {
                        'sources':
                        [
                            '<@(util_x11_sources)',
                        ],
                        'link_settings':
                        {
                            'ldflags':
                            [
                                '<!@(<(pkg-config) --libs-only-L --libs-only-other x11 xi)',
                            ],
                            'libraries':
                            [
                                '<!@(<(pkg-config) --libs-only-l x11 xi)',
                            ],
                        },
                    }],
                    ['use_ozone==1',
                    {
                        'sources':
                        [
                            '<@(util_ozone_sources)',
                        ],
                    }],
                    ['OS=="mac"',
                    {
                        'sources':
                        [
                            '<@(util_osx_sources)',
                        ],
                        'xcode_settings':
                        {
                            'DYLIB_INSTALL_NAME_BASE': '@rpath',
                        },
                        'link_settings':
                        {
                            'libraries':
                            [
                                '$(SDKROOT)/System/Library/Frameworks/AppKit.framework',
                                '$(SDKROOT)/System/Library/Frameworks/QuartzCore.framework',
                            ],
                        },
                    }],
                ],
            },
        },

        {
            'target_name': 'angle_util',
            'type': 'shared_library',
            'includes': [ '../gyp/common_defines.gypi', ],
            'dependencies':
            [
                'angle_util_config',
                '<(DEPTH)/src/angle.gyp:angle_common',
                '<(DEPTH)/src/angle.gyp:libEGL',
                '<(DEPTH)/src/angle.gyp:libGLESv2',
            ],
            'export_dependent_settings':
            [
                '<(DEPTH)/src/angle.gyp:angle_common',
            ],
            'direct_dependent_settings':
            {
                'include_dirs':
                [
                    '<(DEPTH)/include',
                    '<(DEPTH)/util',
                ],
                'defines':
                [
                    'GL_GLEXT_PROTOTYPES',
                    'EGL_EGLEXT_PROTOTYPES',
                ],
            },
        },

        {
            'target_name': 'angle_util_static',
            'type': 'static_library',
            'includes': [ '../gyp/common_defines.gypi', ],
            'dependencies':
            [
                'angle_util_config',
                '<(DEPTH)/src/angle.gyp:angle_common',
                '<(DEPTH)/src/angle.gyp:libEGL_static',
                '<(DEPTH)/src/angle.gyp:libGLESv2_static',
            ],
            'export_dependent_settings':
            [
                '<(DEPTH)/src/angle.gyp:angle_common',
            ],
            'direct_dependent_settings':
            {
                'include_dirs':
                [
                    '<(DEPTH)/include',
                    '<(DEPTH)/util',
                ],
                'defines':
                [
                    'GL_GLEXT_PROTOTYPES',
                    'EGL_EGLEXT_PROTOTYPES',
                ],
            },
        },
    ],
}
