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

# Definitions to be used when building stand-alone PDFium binaries.

{
  'variables': {
    'component%': 'static_library',
    'clang%': 0,
    'asan%': 0,
    'sanitizer_coverage%': 0,
    'use_goma%': 0,
    'gomadir%': '',
    'msvs_multi_core_compile%': '1',
    'pdf_enable_xfa%': 1,
    'variables': {
      'variables': {
        'variables': {
          'conditions': [
            ['OS=="linux" or OS=="mac"', {
              # This handles the Unix platforms we generally deal with.
              # Anything else gets passed through, which probably won't work
              # very well; such hosts should pass an explicit target_arch
              # to gyp.
              'host_arch%':
                '<!(uname -m | sed -e "s/i.86/ia32/;\
                                       s/x86_64/x64/;\
                                       s/amd64/x64/;\
                                       s/arm.*/arm/;\
                                       s/aarch64/arm64/;\
                                       s/mips.*/mipsel/")',
            }, {
              # OS!="linux" and OS!="mac"
              'host_arch%': 'ia32',
            }],
          ],
        },
        'host_arch%': '<(host_arch)',
        'target_arch%': '<(host_arch)',
      },
      'host_arch%': '<(host_arch)',
      'target_arch%': '<(target_arch)',
    },
    'clang_dir%': 'third_party/llvm-build/Release+Asserts',
    # These two are needed by V8.
    'host_arch%': '<(host_arch)',
    'target_arch%': '<(target_arch)',
    'werror%': '-Werror',
    'v8_optimized_debug%': 0,
    'v8_use_external_startup_data%': 0,
    'icu_gyp_path': '../third_party/icu/icu.gyp',
    'libjpeg_gyp_path': '../third_party/third_party.gyp',
    'conditions': [
      ['OS == "win"', {
        'os_posix%': 0,
      }, {
        'os_posix%': 1,
      }],
      ['OS=="linux" or OS=="mac"', {
        'clang%': 1,
        'host_clang%': 1,
      }, {
        'clang%': 0,
        'host_clang%': 0,
      }],
      # Set default gomadir.
      ['OS=="win"', {
        'gomadir%': 'c:\\goma\\goma-win',
      }, {
        'gomadir%': '<!(/bin/echo -n ${HOME}/goma)',
      }],
    ],
  },
  'target_defaults': {
    'default_configuration': 'Debug',
    'configurations': {
      'Debug': {
        'cflags': [
          '-g',
          '-O0',
          '-fdata-sections',
          '-ffunction-sections',
        ],
        'defines': ['_DEBUG'],
        'msvs_settings': {
          'VCCLCompilerTool': {
            'Optimization': '0',
            'conditions': [
              ['component=="shared_library"', {
                'RuntimeLibrary': '3',  # /MDd
              }, {
                'RuntimeLibrary': '1',  # /MTd
              }],
            ],
          },
          'VCLinkerTool': {
            'LinkIncremental': '2',
          },
        },
        'xcode_settings': {
          'GCC_OPTIMIZATION_LEVEL': '0',  # -O0
        },
        'conditions': [
          ['OS=="linux"', {
            # Enable libstdc++ debugging to help catch problems early.
            'defines': ['_GLIBCXX_DEBUG=1',],
          }],
        ],
      },
      'Release': {
        'cflags': [
          '-fno-strict-aliasing',
        ],
        'defines': ['NDEBUG'],
        'xcode_settings': {
          'GCC_OPTIMIZATION_LEVEL': '3',  # -O3
          'GCC_STRICT_ALIASING': 'NO',
        },
        'msvs_settings': {
          'VCCLCompilerTool': {
            'Optimization': '2',
            'InlineFunctionExpansion': '2',
            'EnableIntrinsicFunctions': 'true',
            'FavorSizeOrSpeed': '0',
            'StringPooling': 'true',
            'conditions': [
              ['component=="shared_library"', {
                'RuntimeLibrary': '2',  #/MD
              }, {
                'RuntimeLibrary': '0',  #/MT
              }],
            ],
          },
          'VCLinkerTool': {
            'LinkIncremental': '1',
            'OptimizeReferences': '2',
            'EnableCOMDATFolding': '2',
          },
        },
        'conditions': [
          ['OS=="linux"', {
            'cflags': [
              '-fdata-sections',
              '-ffunction-sections',
              '-O3',
              '-O2',
            ],
          }],
          ['OS=="android"', {
            'cflags!': [
              '-O3',
              '-Os',
            ],
            'cflags': [
              '-fdata-sections',
              '-ffunction-sections',
              '-O2',
            ],
          }],
        ],  # conditions
      },
      'Debug_x64': {
        'inherit_from': ['Debug'],
        'msvs_configuration_platform': 'x64',
      },
      'Release_x64': {
        'inherit_from': ['Release'],
        'msvs_configuration_platform': 'x64',
      },
    },
    'cflags': [
      '-Wall',
      '-Werror',
      '-W',
      '-Wno-missing-field-initializers',
      # Code might someday be made clean for -Wsign-compare, but for now
      # this produces too much noise to be useful.
      '-Wno-sign-compare',
      '-Wno-unused-parameter',
      '-pthread',
      '-fno-exceptions',
      '-fvisibility=hidden',
    ],
    'cflags_cc': [
      '-std=c++11',
      # Add back when ICU is clean
      # '-Wnon-virtual-dtor',
      '-fno-rtti',
    ],
    'ldflags': [
      '-pthread',
    ],
    'defines': [
      # Don't use deprecated V8 APIs anywhere.
      'V8_DEPRECATION_WARNINGS',
    ],
    'msvs_cygwin_dirs': ['<(DEPTH)/v8/third_party/cygwin'],
    'msvs_configuration_attributes': {
      'OutputDirectory': '<(DEPTH)\\build\\$(ConfigurationName)',
      'IntermediateDirectory': '$(OutDir)\\obj\\$(ProjectName)',
      'CharacterSet': '1',
    },
    'msvs_disabled_warnings': [
      # ####
      # This section is PDFium specific.
      # ####

      # C4800: forcing value to bool 'true' or 'false' (performance warning)
      4800,

      # ####
      # This section should match Chromium's build/common.gypi.
      # ####

      # C4091: 'typedef ': ignored on left of 'X' when no variable is
      #                    declared.
      # This happens in a number of Windows headers. Dumb.
      4091,

      # C4127: conditional expression is constant
      # This warning can in theory catch dead code and other problems, but
      # triggers in far too many desirable cases where the conditional
      # expression is either set by macros or corresponds some legitimate
      # compile-time constant expression (due to constant template args,
      # conditionals comparing the sizes of different types, etc.).  Some of
      # these can be worked around, but it's not worth it.
      4127,

      # C4351: new behavior: elements of array 'array' will be default
      #        initialized
      # This is a silly "warning" that basically just alerts you that the
      # compiler is going to actually follow the language spec like it's
      # supposed to, instead of not following it like old buggy versions
      # did.  There's absolutely no reason to turn this on.
      4351,

      # C4355: 'this': used in base member initializer list
      # It's commonly useful to pass |this| to objects in a class'
      # initializer list.  While this warning can catch real bugs, most of
      # the time the constructors in question don't attempt to call methods
      # on the passed-in pointer (until later), and annotating every legit
      # usage of this is simply more hassle than the warning is worth.
      4355,

      # C4503: 'identifier': decorated name length exceeded, name was
      #        truncated
      # This only means that some long error messages might have truncated
      # identifiers in the presence of lots of templates.  It has no effect
      # on program correctness and there's no real reason to waste time
      # trying to prevent it.
      4503,

      # Warning C4589 says: "Constructor of abstract class ignores
      # initializer for virtual base class." Disable this warning because it
      # is flaky in VS 2015 RTM. It triggers on compiler generated
      # copy-constructors in some cases.
      4589,

      # C4611: interaction between 'function' and C++ object destruction is
      #        non-portable
      # This warning is unavoidable when using e.g. setjmp/longjmp.  MSDN
      # suggests using exceptions instead of setjmp/longjmp for C++, but
      # Chromium code compiles without exception support.  We therefore have
      # to use setjmp/longjmp for e.g. JPEG decode error handling, which
      # means we have to turn off this warning (and be careful about how
      # object destruction happens in such cases).
      4611,

      # TODO(thestig): These warnings are level 4. They will be slowly
      # removed as code is fixed.
      4100, # Unreferenced formal parameter
      4121, # Alignment of a member was sensitive to packing
      4244, # Conversion from 'type1' to 'type2', possible loss of data
      4505, # Unreferenced local function has been removed
      4510, # Default constructor could not be generated
      4512, # Assignment operator could not be generated
      4610, # Object can never be instantiated
      4838, # Narrowing conversion. Doesn't seem to be very useful.
      4995, # 'X': name was marked as #pragma deprecated
      4996, # 'X': was declared deprecated (for GetVersionEx).

      # These are variable shadowing warnings that are new in VS2015. We
      # should work through these at some point -- they may be removed from
      # the RTM release in the /W4 set.
      4456, 4457, 4458, 4459,

      # TODO(brucedawson): http://crbug.com/554200 4312 is a VS
      # 2015 64-bit warning for integer to larger pointer
      4312,

      # ####
      # Do not add PDFium specific entries here. Add them to the top.
      # ####
    ],
    'msvs_settings': {
      'VCCLCompilerTool': {
        'MinimalRebuild': 'false',
        'BufferSecurityCheck': 'true',
        'EnableFunctionLevelLinking': 'true',
        'RuntimeTypeInfo': 'false',
        'WarningLevel': '3',
        'DebugInformationFormat': '3',
        'Detect64BitPortabilityProblems': 'false',
        'conditions': [
          [ 'msvs_multi_core_compile', {
            'AdditionalOptions': ['/MP'],
          }],
          ['component=="shared_library"', {
            'ExceptionHandling': '1',  # /EHsc
          }, {
            'ExceptionHandling': '0',
          }],
          ['target_arch=="x64"', {
            # 64-bit warnings need to be resolved.
            # https://code.google.com/p/pdfium/issues/detail?id=101
            'WarnAsError': 'false',
          }, {
            'WarnAsError': 'true',
          }],
          ['clang==1', {
            'AdditionalOptions': [
              # Don't warn about unused function parameters.
              # (This is also used on other platforms.)
              '-Wno-unused-parameter',
              # Don't warn about the "struct foo f = {0};" initialization
              # pattern.
              '-Wno-missing-field-initializers',

              # Many files use intrinsics without including this header.
              # TODO(hans): Fix those files, or move this to sub-GYPs.
              '/FIIntrin.h',

              # TODO(hans): Make this list shorter eventually, http://crbug.com/504657
              '-Qunused-arguments',  # http://crbug.com/504658
              '-Wno-microsoft-enum-value',  # http://crbug.com/505296
              '-Wno-unknown-pragmas',  # http://crbug.com/505314
              '-Wno-microsoft-cast',  # http://crbug.com/550065
            ],
          }],
          ['OS=="win" and clang==1 and MSVS_VERSION == "2013"', {
            'VCCLCompilerTool': {
              'AdditionalOptions': [
                '-fmsc-version=1800',
              ],
            },
          }],
          ['OS=="win" and clang==1 and MSVS_VERSION == "2015"', {
            'VCCLCompilerTool': {
              'AdditionalOptions': [
                '-fmsc-version=1900',
              ],
            },
          }],
        ],
      },
      'VCLibrarianTool': {
        'AdditionalOptions': ['/ignore:4221'],
      },
      'VCLinkerTool': {
        'GenerateDebugInformation': 'true',
        'LinkIncremental': '1',
        # SubSystem values:
        #   0 == not set
        #   1 == /SUBSYSTEM:CONSOLE
        #   2 == /SUBSYSTEM:WINDOWS
        'SubSystem': '1',
      },
    },
    'xcode_settings': {
      'ALWAYS_SEARCH_USER_PATHS': 'NO',
      'CLANG_CXX_LANGUAGE_STANDARD': 'c++11',
      'GCC_CW_ASM_SYNTAX': 'NO',                # No -fasm-blocks
      'GCC_DYNAMIC_NO_PIC': 'NO',               # No -mdynamic-no-pic
                                                # (Equivalent to -fPIC)
      'GCC_ENABLE_CPP_EXCEPTIONS': 'NO',        # -fno-exceptions
      'GCC_ENABLE_CPP_RTTI': 'NO',              # -fno-rtti
      'GCC_ENABLE_PASCAL_STRINGS': 'NO',        # No -mpascal-strings
      # GCC_INLINES_ARE_PRIVATE_EXTERN maps to -fvisibility-inlines-hidden
      'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES',
      'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES',      # -fvisibility=hidden
      'GCC_TREAT_WARNINGS_AS_ERRORS': 'NO',     # -Werror
      'GCC_WARN_NON_VIRTUAL_DESTRUCTOR': 'YES', # -Wnon-virtual-dtor
      'SYMROOT': '<(DEPTH)/xcodebuild',
      'USE_HEADERMAP': 'NO',
      'OTHER_CFLAGS': [
        '-fno-strict-aliasing',
      ],
      'WARNING_CFLAGS': [
        '-Wall',
        '-Wendif-labels',
        '-W',
        '-Wno-unused-parameter',
      ],
    },
    'variables': {
      'clang_warning_flags': [],
    },
    'includes': [ 'set_clang_warning_flags.gypi', ],
    'conditions': [
      ['component=="shared_library"', {
        'cflags': [
          '-fPIC',
        ],
      }],
      ['asan==1', {
        'defines': [
          'ADDRESS_SANITIZER',
          'LEAK_SANITIZER',
        ],
        'cflags': [
          '-fsanitize=address',
          '-gline-tables-only',
        ],
        'ldflags': [
          '-fsanitize=address',
        ],
      }],
      ['sanitizer_coverage!=0', {
        'cflags': [
          '-fsanitize-coverage=<(sanitizer_coverage)',
        ],
      }],
      ['OS=="win"', {
        'defines': [
          'NOMINMAX',
          '_CRT_SECURE_NO_DEPRECATE',
          '_CRT_NONSTDC_NO_DEPRECATE',
        ],
        'conditions': [
          ['component=="static_library"', {
            'defines': [
              '_HAS_EXCEPTIONS=0',
            ],
          }],
          ['use_goma==1', {
            # goma doesn't support PDB yet.
            'msvs_settings': {
              'VCLinkerTool': {
                'GenerateDebugInformation': 'true',
              },
              'VCCLCompilerTool': {
                'DebugInformationFormat': '1',
              },
            },
          }],
        ],
      }],  # OS=="win"
      ['OS=="mac"', {
        'target_conditions': [
          ['_type!="static_library"', {
            'xcode_settings': {'OTHER_LDFLAGS': ['-Wl,-search_paths_first']},
          }],
        ],  # target_conditions
        'variables': {
          'mac_sdk_min': '10.10',
          'mac_sdk%': '<!(python <(DEPTH)/build_gyp/mac_find_sdk.py <(mac_sdk_min))',
        },
        'xcode_settings': {
          'SDKROOT': 'macosx<(mac_sdk)',  # -isysroot
          # See comment in Chromium's common.gypi for why this is needed.
          'SYMROOT': '<(DEPTH)/xcodebuild',
        },
      }],  # OS=="mac"
      ['v8_use_external_startup_data==1', {
        'defines': [
          'V8_USE_EXTERNAL_STARTUP_DATA',
        ],
      }],  # v8_use_external_startup_data==1
      ['clang==1 or host_clang==1', {
        # This is here so that all files get recompiled after a clang roll and
        # when turning clang on or off.
        # (defines are passed via the command line, and build systems rebuild
        # things when their commandline changes). Nothing should ever read this
        # define.
        'defines': ['CR_CLANG_REVISION=<!(python <(DEPTH)/tools/clang/scripts/update.py --print-revision)'],
      }],
    ],
  },
  'conditions': [
    ['OS=="linux" or OS=="mac"', {
      'conditions': [
        ['clang==1', {
          'make_global_settings': [
            ['CC', '<(clang_dir)/bin/clang'],
            ['CXX', '<(clang_dir)/bin/clang++'],
          ],
        }],
      ],
    }],  # OS=="linux" or OS=="mac"
    ['OS=="win"', {
      'conditions': [
        ['clang==1', {
          'make_global_settings': [
            ['CC', '<(clang_dir)/bin/clang-cl'],
          ],
        }],
      ],
    }],  # OS=="win"
    ["use_goma==1", {
      'make_global_settings': [
        ['CC_wrapper', '<(gomadir)/gomacc'],
        ['CXX_wrapper', '<(gomadir)/gomacc'],
      ],
    }],  # use_goma==1
  ],
}