1 # Copyright 2014 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 template("python_binary_module") { 6 # Only available on linux for now. 7 assert(is_linux) 8 assert(defined(invoker.sources)) 9 assert(defined(invoker.python_base_module)) 10 11 cython_root = "//third_party/cython" 12 cython_script = "$cython_root/src/cython.py" 13 cython_output = "${target_out_dir}/${target_name}.cc" 14 15 generator_target_name = target_name + "_cython_compiler" 16 shared_library_name = target_name + "_shared_library" 17 config_name = target_name + "_python_config" 18 19 if (is_linux) { 20 shared_library_prefix = "lib" 21 shared_library_suffix = ".so" 22 python_module_suffix = ".so" 23 } 24 25 target_visibility = [ 26 ":$generator_target_name", 27 ":$shared_library_name", 28 ":$target_name", 29 ] 30 31 action(generator_target_name) { 32 visibility = target_visibility 33 script = cython_script 34 sources = invoker.sources 35 outputs = [ cython_output ] 36 args = [ 37 "--cplus", 38 "-I", rebase_path("//", root_build_dir), 39 "-o", rebase_path(cython_output, root_build_dir), 40 ] + rebase_path(sources, root_build_dir) 41 } 42 43 config(config_name) { 44 visibility = target_visibility 45 python_flags = "//third_party/cython/python_flags.py" 46 include_dirs = exec_script(python_flags, 47 [ "--gn", "--includes" ], 48 "list lines") 49 libs = exec_script(python_flags, 50 [ "--gn", "--libraries" ], 51 "list lines") 52 lib_dirs = exec_script(python_flags, 53 [ "--gn", "--library_dirs" ], 54 "list lines") 55 if (!is_win) { 56 # Generated code includes static utility functions that often go unused. 57 cflags = [ 58 "-Wno-unused-function", 59 ] 60 } 61 } 62 63 shared_library(shared_library_name) { 64 visibility = target_visibility 65 deps = [ 66 ":$generator_target_name", 67 ] 68 if (defined(invoker.deps)) { 69 deps += invoker.deps 70 } 71 if (defined(invoker.datadeps)) { 72 datadeps = invoker.datadeps 73 } 74 sources = [ cython_output ] 75 if (defined(invoker.additional_sources)) { 76 sources += invoker.additional_sources 77 } 78 configs += [ ":$config_name" ] 79 } 80 81 copy(target_name) { 82 python_base_module = invoker.python_base_module 83 sources = [ 84 "$root_out_dir/${shared_library_prefix}${shared_library_name}${shared_library_suffix}" 85 ] 86 outputs = [ 87 "$root_out_dir/python/$python_base_module/${target_name}${python_module_suffix}" 88 ] 89 deps = [ 90 ":$shared_library_name" 91 ] 92 } 93 } 94