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

{
  'conditions': [
    ['OS=="linux" and ( (branding=="Chrome" and enable_remoting_host==1 and chromeos==0) or (archive_chromoting_tests==1) )', {
      'variables': {
        'build_deb_script': 'host/installer/linux/build-deb.sh',
        'deb_filename': 'host/installer/<!(["<(build_deb_script)", "-p", "-s", "<(DEPTH)"])',
        'packaging_outputs': [
          '<(deb_filename)',
          '<!(echo <(deb_filename) | sed -e "s/.deb$/.changes/")',
          '<(PRODUCT_DIR)/remoting_me2me_host.debug',
          '<(PRODUCT_DIR)/remoting_start_host.debug',
          '<(PRODUCT_DIR)/native_messaging_host.debug',
          '<(PRODUCT_DIR)/remote_assistance_host.debug',
        ]
      },
      'targets': [
        {
          # Store the installer package(s) into a zip file so there is a
          # consistent filename to reference for build archiving (i.e. in
          # FILES.cfg). This also avoids possible conflicts with "wildcard"
          # package handling in other build/signing scripts.
          'target_name': 'remoting_me2me_host_archive',
          'type': 'none',
          'dependencies': [
            'remoting_me2me_host_deb_installer',
          ],
          'actions': [
            {
              'action_name': 'build_linux_installer_zip',
              'inputs': [
                '<@(packaging_outputs)',
              ],
              'outputs': [
                '<(PRODUCT_DIR)/remoting-me2me-host-<(OS).zip',
              ],
              'action': [ 'zip', '-j', '-0', '<@(_outputs)', '<@(_inputs)' ],
            },
          ],
        },
        {
          'target_name': 'remoting_me2me_host_deb_installer',
          'type': 'none',
          'dependencies': [
            '<(icu_gyp_path):icudata',
            'remoting_it2me_native_messaging_host',
            'remoting_me2me_host',
            'remoting_me2me_native_messaging_host',
            'remoting_native_messaging_manifests',
            'remoting_resources',
            'remoting_start_host',
          ],
          'actions': [
            {
              'action_name': 'build_debian_package',
              'inputs': [
                '<(build_deb_script)',
                'host/installer/linux/Makefile',
                'host/installer/linux/debian/chrome-remote-desktop.init',
                'host/installer/linux/debian/chrome-remote-desktop.pam',
                'host/installer/linux/debian/compat',
                'host/installer/linux/debian/control',
                'host/installer/linux/debian/copyright',
                'host/installer/linux/debian/postinst',
                'host/installer/linux/debian/preinst',
                'host/installer/linux/debian/rules',
              ],
              'outputs': [
                '<@(packaging_outputs)',
              ],
              'action': [ '<(build_deb_script)', '-s', '<(DEPTH)' ],
            },
          ],
        },
      ],
    }],  # OS=="linux" and branding=="Chrome"

    ['OS=="linux" and enable_remoting_host==1', {
      'targets': [
        # Linux breakpad processing
        # The following target is disabled temporarily because it was failing
        # on build bots. See crbug.com/386886 .
        #
        # {
        #   'target_name': 'remoting_linux_symbols',
        #   'type': 'none',
        #   'conditions': [
        #     ['linux_dump_symbols==1', {
        #       'actions': [
        #         {
        #           'action_name': 'dump_symbols',
        #           'inputs': [
        #             '<(DEPTH)/build/linux/dump_app_syms',
        #             '<(PRODUCT_DIR)/dump_syms',
        #             '<(PRODUCT_DIR)/remoting_me2me_host',
        #           ],
        #           'outputs': [
        #             '<(PRODUCT_DIR)/remoting_me2me_host.breakpad.<(target_arch)',
        #           ],
        #           'action': ['<(DEPTH)/build/linux/dump_app_syms',
        #                      '<(PRODUCT_DIR)/dump_syms',
        #                      '<(linux_strip_binary)',
        #                      '<(PRODUCT_DIR)/remoting_me2me_host',
        #                      '<@(_outputs)'],
        #           'message': 'Dumping breakpad symbols to <(_outputs)',
        #           'process_outputs_as_sources': 1,
        #         },
        #       ],
        #       'dependencies': [
        #         'remoting_me2me_host',
        #         '../breakpad/breakpad.gyp:dump_syms',
        #       ],
        #     }],  # 'linux_dump_symbols==1'
        #   ],  # end of 'conditions'
        # },  # end of target 'remoting_linux_symbols'
      ],  # end of 'targets'
    }],  # 'OS=="linux"'

  ],  # end of 'conditions'
}
