Home | History | Annotate | Download | only in build
      1 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 # This file is meant to be included into a target to provide a rule
      6 # to build Java in a consistent manner.
      7 #
      8 # To use this, create a gyp target with the following form:
      9 # {
     10 #   'target_name': 'my-package_java',
     11 #   'type': 'none',
     12 #   'variables': {
     13 #     'java_in_dir': 'path/to/package/root',
     14 #   },
     15 #   'includes': ['path/to/this/gypi/file'],
     16 # }
     17 #
     18 # Required variables:
     19 #  java_in_dir - The top-level java directory. The src should be in
     20 #    <java_in_dir>/src.
     21 # Optional/automatic variables:
     22 #  additional_input_paths - These paths will be included in the 'inputs' list to
     23 #    ensure that this target is rebuilt when one of these paths changes.
     24 #  additional_src_dirs - Additional directories with .java files to be compiled
     25 #    and included in the output of this target.
     26 #  generated_src_dirs - Same as additional_src_dirs except used for .java files
     27 #    that are generated at build time. This should be set automatically by a
     28 #    target's dependencies. The .java files in these directories are not
     29 #    included in the 'inputs' list (unlike additional_src_dirs).
     30 #  input_jars_paths - The path to jars to be included in the classpath. This
     31 #    should be filled automatically by depending on the appropriate targets.
     32 #  javac_includes - A list of specific files to include. This is by default
     33 #    empty, which leads to inclusion of all files specified. May include
     34 #    wildcard, and supports '**/' for recursive path wildcards, ie.:
     35 #    '**/MyFileRegardlessOfDirectory.java', '**/IncludedPrefix*.java'.
     36 #  has_java_resources - Set to 1 if the java target contains an
     37 #    Android-compatible resources folder named res.  If 1, R_package and
     38 #    R_package_relpath must also be set.
     39 #  R_package - The java package in which the R class (which maps resources to
     40 #    integer IDs) should be generated, e.g. org.chromium.content.
     41 #  R_package_relpath - Same as R_package, but replace each '.' with '/'.
     42 #  res_extra_dirs - A list of extra directories containing Android resources.
     43 #    These directories may be generated at build time.
     44 #  res_extra_files - A list of the files in res_extra_dirs.
     45 #  never_lint - Set to 1 to not run lint on this target.
     46 
     47 {
     48   'dependencies': [
     49     '<(DEPTH)/build/android/setup.gyp:build_output_dirs'
     50   ],
     51   'variables': {
     52     'android_jar': '<(android_sdk)/android.jar',
     53     'input_jars_paths': [ '<(android_jar)' ],
     54     'additional_src_dirs': [],
     55     'javac_includes': [],
     56     'jar_name': '<(_target_name).jar',
     57     'jar_dir': '<(PRODUCT_DIR)/lib.java',
     58     'jar_path': '<(intermediate_dir)/<(jar_name)',
     59     'jar_final_path': '<(jar_dir)/<(jar_name)',
     60     'jar_excluded_classes': [ '*/R.class', '*/R##*.class' ],
     61     'instr_stamp': '<(intermediate_dir)/instr.stamp',
     62     'additional_input_paths': [],
     63     'dex_path': '<(PRODUCT_DIR)/lib.java/<(_target_name).dex.jar',
     64     'generated_src_dirs': ['>@(generated_R_dirs)'],
     65     'generated_R_dirs': [],
     66     'has_java_resources%': 0,
     67     'res_extra_dirs': [],
     68     'res_extra_files': [],
     69     'res_v14_verify_only%': 0,
     70     'resource_input_paths': ['>@(res_extra_files)'],
     71     'intermediate_dir': '<(SHARED_INTERMEDIATE_DIR)/<(_target_name)',
     72     'classes_dir': '<(intermediate_dir)/classes',
     73     'compile_stamp': '<(intermediate_dir)/compile.stamp',
     74     'lint_stamp': '<(intermediate_dir)/lint.stamp',
     75     'lint_result': '<(intermediate_dir)/lint_result.xml',
     76     'lint_config': '<(intermediate_dir)/lint_config.xml',
     77     'never_lint%': 0,
     78     'proguard_config%': '',
     79     'proguard_preprocess%': '0',
     80     'variables': {
     81       'variables': {
     82         'proguard_preprocess%': 0,
     83         'emma_never_instrument%': 0,
     84       },
     85       'conditions': [
     86         ['proguard_preprocess == 1', {
     87           'javac_jar_path': '<(intermediate_dir)/<(_target_name).pre.jar'
     88         }, {
     89           'javac_jar_path': '<(jar_path)'
     90         }],
     91         ['chromium_code != 0 and emma_coverage != 0 and emma_never_instrument == 0', {
     92           'emma_instrument': 1,
     93         }, {
     94           'emma_instrument': 0,
     95         }],
     96       ],
     97     },
     98     'emma_instrument': '<(emma_instrument)',
     99     'javac_jar_path': '<(javac_jar_path)',
    100   },
    101   # This all_dependent_settings is used for java targets only. This will add the
    102   # jar path to the classpath of dependent java targets.
    103   'all_dependent_settings': {
    104     'variables': {
    105       'input_jars_paths': ['<(jar_final_path)'],
    106       'library_dexed_jars_paths': ['<(dex_path)'],
    107     },
    108   },
    109   'conditions': [
    110     ['has_java_resources == 1', {
    111       'variables': {
    112         'res_dir': '<(java_in_dir)/res',
    113         'res_input_dirs': ['<(res_dir)', '<@(res_extra_dirs)'],
    114         'resource_input_paths': ['<!@(find <(res_dir) -type f)'],
    115 
    116         'R_dir': '<(intermediate_dir)/java_R',
    117         'R_text_file': '<(R_dir)/R.txt',
    118 
    119         'generated_src_dirs': ['<(R_dir)'],
    120         'additional_input_paths': ['<(resource_zip_path)', ],
    121 
    122         'dependencies_res_zip_paths': [],
    123         'resource_zip_path': '<(PRODUCT_DIR)/res.java/<(_target_name).zip',
    124       },
    125       'all_dependent_settings': {
    126         'variables': {
    127           # Dependent libraries include this target's R.java file via
    128           # generated_R_dirs.
    129           'generated_R_dirs': ['<(R_dir)'],
    130 
    131           # Dependent libraries and apks include this target's resources via
    132           # dependencies_res_zip_paths.
    133           'additional_input_paths': ['<(resource_zip_path)'],
    134           'dependencies_res_zip_paths': ['<(resource_zip_path)'],
    135 
    136           # additional_res_packages and additional_R_text_files are used to
    137           # create this packages R.java files when building the APK.
    138           'additional_res_packages': ['<(R_package)'],
    139           'additional_R_text_files': ['<(R_text_file)'],
    140         },
    141       },
    142       'actions': [
    143         # Generate R.java and crunch image resources.
    144         {
    145           'action_name': 'process_resources',
    146           'message': 'processing resources for <(_target_name)',
    147           'variables': {
    148             'android_manifest': '<(DEPTH)/build/android/AndroidManifest.xml',
    149             # Write the inputs list to a file, so that its mtime is updated when
    150             # the list of inputs changes.
    151             'inputs_list_file': '>|(java_resources.<(_target_name).gypcmd >@(resource_input_paths))',
    152             'process_resources_options': [],
    153             'conditions': [
    154               ['res_v14_verify_only == 1', {
    155                 'process_resources_options': ['--v14-verify-only']
    156               }],
    157             ],
    158           },
    159           'inputs': [
    160             '<(DEPTH)/build/android/gyp/util/build_utils.py',
    161             '<(DEPTH)/build/android/gyp/process_resources.py',
    162             '<(DEPTH)/build/android/gyp/generate_v14_compatible_resources.py',
    163             '>@(resource_input_paths)',
    164             '>@(dependencies_res_zip_paths)',
    165             '>(inputs_list_file)',
    166           ],
    167           'outputs': [
    168             '<(resource_zip_path)',
    169           ],
    170           'action': [
    171             'python', '<(DEPTH)/build/android/gyp/process_resources.py',
    172             '--android-sdk', '<(android_sdk)',
    173             '--android-sdk-tools', '<(android_sdk_tools)',
    174             '--non-constant-id',
    175 
    176             '--android-manifest', '<(android_manifest)',
    177             '--custom-package', '<(R_package)',
    178 
    179             '--dependencies-res-zips', '>(dependencies_res_zip_paths)',
    180             '--resource-dirs', '<(res_input_dirs)',
    181 
    182             '--R-dir', '<(R_dir)',
    183             '--resource-zip-out', '<(resource_zip_path)',
    184 
    185             '<@(process_resources_options)',
    186           ],
    187         },
    188       ],
    189     }],
    190     ['proguard_preprocess == 1', {
    191       'actions': [
    192         {
    193           'action_name': 'proguard_<(_target_name)',
    194           'message': 'Proguard preprocessing <(_target_name) jar',
    195           'inputs': [
    196             '<(android_sdk_root)/tools/proguard/lib/proguard.jar',
    197             '<(DEPTH)/build/android/gyp/util/build_utils.py',
    198             '<(DEPTH)/build/android/gyp/proguard.py',
    199             '<(javac_jar_path)',
    200             '<(proguard_config)',
    201           ],
    202           'outputs': [
    203             '<(jar_path)',
    204           ],
    205           'action': [
    206             'python', '<(DEPTH)/build/android/gyp/proguard.py',
    207             '--proguard-path=<(android_sdk_root)/tools/proguard/lib/proguard.jar',
    208             '--input-path=<(javac_jar_path)',
    209             '--output-path=<(jar_path)',
    210             '--proguard-config=<(proguard_config)',
    211             '--classpath=<(android_sdk_jar) >(input_jars_paths)',
    212           ]
    213         },
    214       ],
    215     }],
    216   ],
    217   'actions': [
    218     {
    219       'action_name': 'javac_<(_target_name)',
    220       'message': 'Compiling <(_target_name) java sources',
    221       'variables': {
    222         'java_sources': ['>!@(find >(java_in_dir)/src >(additional_src_dirs) -name "*.java")'],
    223       },
    224       'inputs': [
    225         '<(DEPTH)/build/android/gyp/util/build_utils.py',
    226         '<(DEPTH)/build/android/gyp/javac.py',
    227         '>@(java_sources)',
    228         '>@(input_jars_paths)',
    229         '>@(additional_input_paths)',
    230       ],
    231       'outputs': [
    232         '<(compile_stamp)',
    233       ],
    234       'action': [
    235         'python', '<(DEPTH)/build/android/gyp/javac.py',
    236         '--output-dir=<(classes_dir)',
    237         '--classpath=>(input_jars_paths)',
    238         '--src-gendirs=>(generated_src_dirs)',
    239         '--javac-includes=<(javac_includes)',
    240         '--chromium-code=<(chromium_code)',
    241         '--stamp=<(compile_stamp)',
    242         '>@(java_sources)',
    243       ]
    244     },
    245     {
    246       'variables': {
    247         'src_dirs': [
    248           '<(java_in_dir)/src',
    249           '>@(additional_src_dirs)',
    250         ],
    251         'stamp_path': '<(lint_stamp)',
    252         'result_path': '<(lint_result)',
    253         'config_path': '<(lint_config)',
    254       },
    255       'inputs': [
    256         '<(compile_stamp)',
    257       ],
    258       'outputs': [
    259         '<(lint_stamp)',
    260       ],
    261       'includes': [ 'android/lint_action.gypi' ],
    262     },
    263     {
    264       'action_name': 'jar_<(_target_name)',
    265       'message': 'Creating <(_target_name) jar',
    266       'inputs': [
    267         '<(DEPTH)/build/android/gyp/util/build_utils.py',
    268         '<(DEPTH)/build/android/gyp/util/md5_check.py',
    269         '<(DEPTH)/build/android/gyp/jar.py',
    270         '<(compile_stamp)',
    271       ],
    272       'outputs': [
    273         '<(javac_jar_path)',
    274       ],
    275       'action': [
    276         'python', '<(DEPTH)/build/android/gyp/jar.py',
    277         '--classes-dir=<(classes_dir)',
    278         '--jar-path=<(javac_jar_path)',
    279         '--excluded-classes=<(jar_excluded_classes)',
    280       ]
    281     },
    282     {
    283       'action_name': 'instr_jar_<(_target_name)',
    284       'message': 'Instrumenting <(_target_name) jar',
    285       'variables': {
    286         'input_path': '<(jar_path)',
    287         'output_path': '<(jar_final_path)',
    288         'stamp_path': '<(instr_stamp)',
    289         'instr_type': 'jar',
    290       },
    291       'outputs': [
    292         '<(jar_final_path)',
    293       ],
    294       'inputs': [
    295         '<(jar_path)',
    296       ],
    297       'includes': [ 'android/instr_action.gypi' ],
    298     },
    299     {
    300       'action_name': 'jar_toc_<(_target_name)',
    301       'message': 'Creating <(_target_name) jar.TOC',
    302       'inputs': [
    303         '<(DEPTH)/build/android/gyp/util/build_utils.py',
    304         '<(DEPTH)/build/android/gyp/util/md5_check.py',
    305         '<(DEPTH)/build/android/gyp/jar_toc.py',
    306         '<(jar_final_path)',
    307       ],
    308       'outputs': [
    309         '<(jar_final_path).TOC',
    310       ],
    311       'action': [
    312         'python', '<(DEPTH)/build/android/gyp/jar_toc.py',
    313         '--jar-path=<(jar_final_path)',
    314         '--toc-path=<(jar_final_path).TOC',
    315       ]
    316     },
    317     {
    318       'action_name': 'dex_<(_target_name)',
    319       'variables': {
    320         'conditions': [
    321           ['emma_instrument != 0', {
    322             'dex_no_locals': 1,
    323           }],
    324         ],
    325         'dex_input_paths': [ '<(jar_final_path)' ],
    326         'output_path': '<(dex_path)',
    327       },
    328       'includes': [ 'android/dex_action.gypi' ],
    329     },
    330   ],
    331 }
    332