| # Copyright 2016 The PDFium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import("//build/config/clang/clang.gni") |
| import("//build/config/gclient_args.gni") |
| import("//build/config/rust.gni") |
| import("//testing/test.gni") |
| import("pdfium.gni") |
| |
| group("default") { |
| testonly = true |
| deps = [ ":pdfium" ] |
| if (pdf_is_standalone) { |
| deps += [ ":pdfium_all" ] |
| } |
| } |
| |
| group("freetype_common") { |
| public_deps = [] |
| if (pdf_bundle_freetype) { |
| public_deps += [ "third_party:fx_freetype" ] |
| } else { |
| public_deps += [ "//build/config/freetype" ] |
| } |
| } |
| |
| config("pdfium_common_config") { |
| cflags = [] |
| cflags_cc = [] |
| ldflags = [] |
| include_dirs = [ "." ] |
| defines = [] |
| |
| if (!use_system_libopenjpeg2) { |
| defines += [ "OPJ_STATIC" ] |
| } |
| |
| if (pdf_enable_click_logging) { |
| defines += [ "PDF_ENABLE_CLICK_LOGGING" ] |
| } |
| |
| if (pdf_use_skia && pdf_enable_fontations) { |
| defines += [ "PDF_ENABLE_FONTATIONS" ] |
| } |
| |
| if (pdf_use_partition_alloc) { |
| defines += [ "PDF_USE_PARTITION_ALLOC" ] |
| } |
| |
| if (is_win) { |
| # Assume UTF-8 by default to avoid code page dependencies. |
| cflags += [ "/utf-8" ] |
| |
| if (!is_clang) { |
| cflags += [ |
| # Warnings permanently disabled: |
| |
| # C4091: 'typedef ': ignored on left of 'X' when no variable is |
| # declared. |
| # This happens in a number of Windows headers. Dumb. |
| "/wd4091", |
| |
| # 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. |
| "/wd4127", |
| |
| # C4251: 'identifier' : class 'type' needs to have dll-interface to be |
| # used by clients of class 'type2' |
| # This is necessary for the shared library build. |
| "/wd4251", |
| |
| # C4275: non dll-interface class used as base for dll-interface class |
| # This points out a potential (but rare) problem with referencing static |
| # fields of a non-exported base, through the base's non-exported inline |
| # functions, or directly. The warning is subtle enough that people just |
| # suppressed it when they saw it, so it's not worth it. |
| "/wd4275", |
| |
| # C4312 is a VS 2015 64-bit warning for integer to larger pointer. |
| # TODO(brucedawson): fix warnings, crbug.com/554200 |
| "/wd4312", |
| |
| # C4324 warns when padding is added to fulfill alignas requirements, |
| # but can trigger in benign cases that are difficult to individually |
| # suppress. |
| "/wd4324", |
| |
| # 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. |
| "/wd4351", |
| |
| # 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. |
| "/wd4355", |
| |
| # 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. |
| "/wd4503", |
| |
| # 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. |
| "/wd4589", |
| |
| # 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). |
| "/wd4611", |
| |
| # Warnings to evaluate and possibly fix/reenable later: |
| |
| "/wd4100", # Unreferenced formal function parameter. |
| "/wd4121", # Alignment of a member was sensitive to packing. |
| "/wd4244", # Conversion: possible loss of data. |
| "/wd4505", # Unreferenced local function has been removed. |
| "/wd4510", # Default constructor could not be generated. |
| "/wd4512", # Assignment operator could not be generated. |
| "/wd4610", # Class can never be instantiated, constructor required. |
| "/wd4838", # Narrowing conversion. Doesn't seem to be very useful. |
| "/wd4995", # 'X': name was marked as #pragma deprecated |
| "/wd4996", # Deprecated function warning. |
| |
| # 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. |
| "/wd4456", |
| "/wd4457", |
| "/wd4458", |
| "/wd4459", |
| |
| # All of our compilers support the extensions below. |
| "/wd4200", # nonstandard extension used: zero-sized array in |
| # struct/union |
| "/wd4201", # nonstandard extension used: nameless struct/union |
| "/wd4204", # nonstandard extension used : non-constant aggregate |
| # initializer |
| |
| "/wd4221", # nonstandard extension used : 'identifier' : cannot be |
| # initialized using address of automatic variable |
| |
| # http://crbug.com/588506 - Conversion suppressions waiting on Clang |
| # -Wconversion. |
| "/wd4245", # 'conversion' : conversion from 'type1' to 'type2', |
| # signed/unsigned mismatch |
| |
| "/wd4267", # 'var' : conversion from 'size_t' to 'type', possible loss |
| # of data |
| |
| "/wd4305", # 'identifier' : truncation from 'type1' to 'type2' |
| "/wd4389", # 'operator' : signed/unsigned mismatch |
| |
| "/wd4702", # unreachable code |
| |
| # http://crbug.com/848979 - MSVC is more conservative than Clang with |
| # regards to variables initialized and consumed in different branches. |
| "/wd4701", # Potentially uninitialized local variable 'name' used |
| "/wd4703", # Potentially uninitialized local pointer variable 'name' |
| # used |
| |
| # http://crbug.com/848979 - Remaining Clang permitted warnings. |
| "/wd4661", # 'identifier' : no suitable definition provided for |
| # explicit |
| # template instantiation request |
| |
| "/wd4706", # assignment within conditional expression |
| # MSVC is stricter and requires a boolean expression. |
| |
| "/wd4715", # 'function' : not all control paths return a value' |
| # MSVC does not analyze switch (enum) for completeness. |
| ] |
| |
| cflags_cc += [ |
| # Allow "noexcept" annotations even though we compile with exceptions |
| # disabled. |
| "/wd4577", |
| ] |
| |
| if (current_cpu == "x86") { |
| if (msvc_use_sse2) { |
| cflags += [ "/arch:SSE2" ] |
| } |
| } |
| } |
| } |
| |
| if (is_clang) { |
| # Override -Wno-c++11-narrowing. |
| cflags += [ "-Wc++11-narrowing" ] |
| |
| # TODO(crbug.com/1213098): Remove once this is in //build. |
| cflags += [ "-Wdeprecated-copy" ] |
| |
| # May flag some issues when converting int to size_t. |
| cflags += [ "-Wtautological-unsigned-zero-compare" ] |
| } |
| |
| if (!is_win && !is_clang) { |
| cflags += [ |
| # Override -Wno-narrowing for GCC. |
| "-Wnarrowing", |
| |
| # GCC assumes that control can get past an exhaustive switch and then |
| # warns if there's no return there. |
| "-Wno-return-type", |
| ] |
| } |
| } |
| |
| config("pdfium_implementation_config") { |
| defines = [ "FPDF_IMPLEMENTATION" ] |
| visibility = [ ":pdfium_public_headers" ] |
| } |
| |
| config("pdfium_public_config") { |
| defines = [] |
| |
| if (pdf_enable_v8) { |
| defines += [ "PDF_ENABLE_V8" ] |
| |
| if (pdf_enable_xfa) { |
| defines += [ "PDF_ENABLE_XFA" ] |
| if (pdf_enable_xfa_bmp) { |
| defines += [ "PDF_ENABLE_XFA_BMP" ] |
| } |
| if (pdf_enable_xfa_gif) { |
| defines += [ "PDF_ENABLE_XFA_GIF" ] |
| } |
| if (pdf_enable_xfa_png) { |
| defines += [ "PDF_ENABLE_XFA_PNG" ] |
| } |
| if (pdf_enable_xfa_tiff) { |
| defines += [ "PDF_ENABLE_XFA_TIFF" ] |
| } |
| } |
| } |
| |
| if (pdf_use_skia) { |
| defines += [ "PDF_USE_SKIA" ] |
| } |
| } |
| |
| config("pdfium_core_config") { |
| cflags = [] |
| configs = [ |
| ":pdfium_common_config", |
| ":pdfium_public_config", |
| "//build/config/compiler:noshadowing", |
| ] |
| defines = [] |
| if (is_win) { |
| cflags += [ |
| "/wd4324", |
| "/wd4577", |
| ] |
| } |
| if (is_clang) { |
| cflags += [ "-Wcovered-switch-default" ] |
| } |
| } |
| |
| config("pdfium_plugin_config") { |
| cflags = [] |
| defines = [] |
| if (clang_use_chrome_plugins) { |
| # Catch misuse of C-style pointers. |
| # TODO(tsepez): enable for windows, too. |
| if (!is_win) { |
| cflags += [ |
| "-Xclang", |
| "-plugin-arg-find-bad-constructs", |
| "-Xclang", |
| "check-raw-ptr-fields", |
| |
| "-Xclang", |
| "-plugin-arg-find-bad-constructs", |
| "-Xclang", |
| "raw-ptr-exclude-path=public", |
| |
| "-Xclang", |
| "-plugin-arg-find-bad-constructs", |
| "-Xclang", |
| "raw-ptr-exclude-path=test", |
| |
| # TODO(tsepez): enforce raw_ref<> as well. |
| # "-Xclang", |
| # "-plugin-arg-find-bad-constructs", |
| # "-Xclang", |
| # "check-raw-ref-fields", |
| ] |
| defines += [ "PDF_ENABLE_UNOWNED_PTR_EXCLUSION" ] |
| } |
| |
| # Catch misuse of cppgc in XFA. |
| if (pdf_enable_xfa) { |
| cflags += [ |
| "-Xclang", |
| "-add-plugin", |
| "-Xclang", |
| "blink-gc-plugin", |
| ] |
| |
| # Disable GC plugin forbidding off-heap collections of GCed: |
| cflags += [ |
| "-Xclang", |
| "-plugin-arg-blink-gc-plugin", |
| "-Xclang", |
| "disable-off-heap-collections-of-gced-check", |
| ] |
| } |
| } |
| } |
| |
| config("pdfium_strict_config") { |
| configs = [ |
| ":pdfium_core_config", |
| ":pdfium_plugin_config", |
| "//build/config/compiler:wexit_time_destructors", |
| "//build/config/compiler:wglobal_constructors", |
| ] |
| } |
| |
| config("pdfium_nounsafe_buffer_usage_config") { |
| cflags = [] |
| if (is_clang) { |
| cflags += [ "-Wunsafe-buffer-usage" ] |
| } |
| } |
| |
| config("pdfium_noshorten_config") { |
| cflags = [] |
| if (is_clang) { |
| cflags += [ "-Wshorten-64-to-32" ] |
| } |
| } |
| |
| source_set("pdfium_public_headers_impl") { |
| sources = [ |
| "public/cpp/fpdf_deleters.h", |
| "public/cpp/fpdf_scopers.h", |
| "public/fpdf_annot.h", |
| "public/fpdf_attachment.h", |
| "public/fpdf_catalog.h", |
| "public/fpdf_dataavail.h", |
| "public/fpdf_doc.h", |
| "public/fpdf_edit.h", |
| "public/fpdf_ext.h", |
| "public/fpdf_flatten.h", |
| "public/fpdf_formfill.h", |
| "public/fpdf_fwlevent.h", |
| "public/fpdf_javascript.h", |
| "public/fpdf_ppo.h", |
| "public/fpdf_progressive.h", |
| "public/fpdf_save.h", |
| "public/fpdf_searchex.h", |
| "public/fpdf_signature.h", |
| "public/fpdf_structtree.h", |
| "public/fpdf_sysfontinfo.h", |
| "public/fpdf_text.h", |
| "public/fpdf_transformpage.h", |
| "public/fpdfview.h", |
| ] |
| } |
| |
| group("pdfium_public_headers") { |
| public_deps = [ ":pdfium_public_headers_impl" ] |
| public_configs = [ |
| ":pdfium_public_config", |
| ":pdfium_implementation_config", |
| ] |
| } |
| |
| component("pdfium") { |
| output_name = "pdfium" |
| libs = [] |
| configs += [ ":pdfium_strict_config" ] |
| public_configs = [ ":pdfium_public_config" ] |
| |
| deps = [ |
| "constants", |
| "core/fpdfapi/page", |
| "core/fpdfapi/parser", |
| "core/fpdfdoc", |
| "core/fxcodec", |
| "core/fxcrt", |
| "core/fxge", |
| "fpdfsdk", |
| "fpdfsdk/formfiller", |
| "fxjs", |
| "third_party:pdfium_base", |
| ] |
| |
| public_deps = [ |
| ":pdfium_public_headers_impl", |
| "core/fxcrt", |
| ] |
| |
| if (pdf_enable_xfa) { |
| deps += [ |
| "fpdfsdk/fpdfxfa", |
| "xfa/fxfa", |
| "xfa/fxfa/parser", |
| ] |
| } |
| |
| if (is_win) { |
| libs += [ |
| "advapi32.lib", |
| "gdi32.lib", |
| "user32.lib", |
| ] |
| } |
| |
| if (is_mac) { |
| frameworks = [ |
| "AppKit.framework", |
| "CoreFoundation.framework", |
| ] |
| } |
| |
| if (pdf_is_complete_lib) { |
| static_component_type = "static_library" |
| complete_static_lib = true |
| configs -= [ "//build/config/compiler:thin_archive" ] |
| } |
| } |
| |
| # Targets below this are only visible within this file. |
| visibility = [ ":*" ] |
| |
| group("pdfium_unittest_deps") { |
| testonly = true |
| public_deps = [ |
| "core/fxcrt", |
| "testing:unit_test_support", |
| "//testing/gmock", |
| "//testing/gtest", |
| ] |
| visibility += [ |
| "core/*", |
| "fpdfsdk/*", |
| "fxbarcode/*", |
| "fxjs/*", |
| "xfa/*", |
| ] |
| } |
| |
| test("pdfium_unittests") { |
| testonly = true |
| sources = [ "testing/unit_test_main.cpp" ] |
| deps = [ |
| "core/fdrm:unittests", |
| "core/fpdfapi/edit:unittests", |
| "core/fpdfapi/font:unittests", |
| "core/fpdfapi/page:unittests", |
| "core/fpdfapi/parser:unittests", |
| "core/fpdfapi/render:unittests", |
| "core/fpdfdoc:unittests", |
| "core/fpdftext:unittests", |
| "core/fxcodec:unittests", |
| "core/fxcrt", |
| "core/fxcrt:unittests", |
| "core/fxge:unittests", |
| "fpdfsdk:unittests", |
| "testing:unit_test_support", |
| "//testing/gmock", |
| "//testing/gtest", |
| ] |
| configs += [ ":pdfium_core_config" ] |
| if (is_android) { |
| use_raw_android_executable = true |
| } |
| if (pdf_enable_v8) { |
| configs += [ "//v8:external_startup_data" ] |
| deps += [ |
| "fxjs:unittests", |
| "//v8", |
| ] |
| if (pdf_enable_xfa) { |
| deps += [ |
| "core/fxcrt/css:unittests", |
| "fxbarcode:unittests", |
| "xfa/fde:unittests", |
| "xfa/fgas/crt:unittests", |
| "xfa/fgas/font:unittests", |
| "xfa/fgas/layout:unittests", |
| "xfa/fxfa:unittests", |
| "xfa/fxfa/formcalc:unittests", |
| "xfa/fxfa/parser:unittests", |
| ] |
| } |
| } |
| } |
| |
| group("pdfium_embeddertest_deps") { |
| testonly = true |
| public_deps = [ |
| ":pdfium_public_headers", |
| "core/fxcrt", |
| "testing:embedder_test_support", |
| "third_party:pdfium_base_test_support", |
| "//testing/gmock", |
| "//testing/gtest", |
| ] |
| visibility += [ |
| "core/*", |
| "fpdfsdk/*", |
| "fxjs/*", |
| "xfa/*", |
| ] |
| } |
| |
| test("pdfium_embeddertests") { |
| testonly = true |
| sources = [ "testing/embedder_test_main.cpp" ] |
| deps = [ |
| ":pdfium_embeddertest_deps", |
| "core/fpdfapi/edit:embeddertests", |
| "core/fpdfapi/parser:embeddertests", |
| "core/fpdfapi/render:embeddertests", |
| "core/fxcodec:embeddertests", |
| "core/fxcrt", |
| "core/fxge:embeddertests", |
| "fpdfsdk:embeddertests", |
| "fpdfsdk/formfiller:embeddertests", |
| "fpdfsdk/pwl:embeddertests", |
| "testing/image_diff", |
| "//testing/gmock", |
| "//testing/gtest", |
| ] |
| include_dirs = [ "testing/gmock/include" ] |
| configs += [ ":pdfium_core_config" ] |
| |
| if (is_android) { |
| ignore_all_data_deps = true |
| use_raw_android_executable = true |
| } |
| |
| if (pdf_enable_v8) { |
| deps += [ |
| "fxjs:embeddertests", |
| "//v8", |
| ] |
| configs += [ "//v8:external_startup_data" ] |
| } |
| |
| if (pdf_enable_xfa) { |
| deps += [ |
| "fpdfsdk/fpdfxfa:embeddertests", |
| "xfa/fwl:embeddertests", |
| "xfa/fxfa/layout:embeddertests", |
| "xfa/fxfa/parser:embeddertests", |
| ] |
| } |
| } |
| |
| executable("pdfium_diff") { |
| visibility += [ "testing/tools:test_runner_py" ] |
| testonly = true |
| sources = [ "testing/image_diff/image_diff.cpp" ] |
| deps = [ |
| "core/fxcrt", |
| "testing:path_service", |
| "testing/image_diff", |
| "//build/win:default_exe_manifest", |
| ] |
| configs += [ ":pdfium_strict_config" ] |
| } |
| |
| group("pdfium_all") { |
| testonly = true |
| deps = [ |
| ":pdfium_diff", |
| ":pdfium_embeddertests", |
| ":pdfium_unittests", |
| "samples", |
| "testing/fuzzers", |
| ] |
| |
| if (pdf_is_standalone) { |
| deps += [ "testing/tools:test_runner_py" ] |
| } |
| if (enable_rust) { |
| # Until there's actual Rust code to use, include the rust_build_tests in the |
| # all group to verify the language keeps working here. |
| deps += [ ":rust_build_tests" ] |
| } |
| } |
| |
| # Makes additional targets reachable only for "gn check". These are not always |
| # built by the "all" Ninja target, which uses the "default" group, which in turn |
| # depends on the "pdfium_all" group. |
| group("gn_check") { |
| deps = [] |
| |
| # TODO(crbug.com/pdfium/1832): Remove !is_android when //third_party/expat is |
| # available. |
| if (defined(checkout_skia) && checkout_skia && !is_android) { |
| deps += [ "//skia" ] |
| } |
| } |
| |
| if (enable_rust) { |
| group("rust_build_tests") { |
| testonly = true |
| deps = [ "//build/rust/tests" ] |
| } |
| } |