Make moderate binding testable by command line switches
[chromium-blink-merge.git] / third_party / cython / rules.gni
blobea6e0aebf6f4db6ab5bd43bd88f04301de446668
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.
5 template("python_binary_source_set") {
6   # Only available on linux for now.
7   assert(is_linux)
8   assert(defined(invoker.cython_sources) || defined(invoker.sources))
10   config_name = target_name + "_python_config"
12   target_visibility = [ ":$target_name" ]
14   if (defined(invoker.cython_sources)) {
15     generator_target_name = target_name + "_cython_compiler"
17     cython_root = "//third_party/cython"
18     cython_script = "$cython_root/src/cython.py"
19     cython_output = "${target_out_dir}/${target_name}.cc"
21     action(generator_target_name) {
22       visibility = target_visibility
23       script = cython_script
24       sources = invoker.cython_sources
25       outputs = [
26         cython_output,
27       ]
28       args = [
29                "--cplus",
30                "-I",
31                rebase_path("//", root_build_dir),
32                "-I",
33                rebase_path(target_gen_dir, root_build_dir),
34                "-o",
35                rebase_path(cython_output, root_build_dir),
36              ] + rebase_path(sources, root_build_dir)
37     }
38   }
40   config(config_name) {
41     visibility = target_visibility
42     python_flags = "//third_party/cython/python_flags.py"
43     include_dirs = exec_script(python_flags, [ "--includes" ], "list lines")
44     libs = exec_script(python_flags, [ "--libraries" ], "list lines")
45     lib_dirs = exec_script(python_flags, [ "--library_dirs" ], "list lines")
46     if (!is_win) {
47       # Generated code includes static utility functions that often go unused.
48       cflags = [ "-Wno-unused-function" ]
49     }
50   }
52   source_set(target_name) {
53     if (defined(invoker.visibility)) {
54       visibility = invoker.visibility
55     }
56     sources = []
57     if (defined(invoker.cython_sources)) {
58       sources += [ cython_output ]
59     }
60     if (defined(invoker.sources)) {
61       sources += invoker.sources
62     }
63     if (defined(invoker.configs)) {
64       configs += invoker.configs
65     }
66     all_dependent_configs = [ ":$config_name" ]
67     deps = []
68     if (defined(invoker.cython_sources)) {
69       deps += [ ":$generator_target_name" ]
70     }
71     if (defined(invoker.deps)) {
72       deps += invoker.deps
73     }
74     if (defined(invoker.datadeps)) {
75       datadeps = invoker.datadeps
76     }
77   }
80 template("python_binary_module") {
81   # Only available on linux for now.
82   assert(is_linux)
84   has_sources = defined(invoker.cython_sources) || defined(invoker.sources)
86   assert(has_sources || defined(invoker.deps))
87   assert(
88       !defined(invoker.python_base_module) || invoker.python_base_module != "")
90   sources_target_name = target_name + "_cython_sources"
91   shared_library_name = target_name + "_shared_library"
93   if (is_linux) {
94     shared_library_prefix = "lib"
95     shared_library_suffix = ".so"
96     python_module_suffix = ".so"
97   }
99   target_visibility = [
100     ":$sources_target_name",
101     ":$shared_library_name",
102     ":$target_name",
103   ]
105   if (has_sources) {
106     python_binary_source_set(sources_target_name) {
107       visibility = target_visibility
108       if (defined(invoker.cython_sources)) {
109         cython_sources = invoker.cython_sources
110       }
111       if (defined(invoker.sources)) {
112         sources = invoker.sources
113       }
114       if (defined(invoker.configs)) {
115         configs = invoker.configs
116       }
117       if (defined(invoker.deps)) {
118         deps = invoker.deps
119       }
120       if (defined(invoker.datadeps)) {
121         datadeps = invoker.datadeps
122       }
123     }
124   }
126   shared_library(shared_library_name) {
127     visibility = target_visibility
128     if (defined(invoker.configs)) {
129       configs += invoker.configs
130     }
131     deps = []
132     if (has_sources) {
133       deps += [ ":$sources_target_name" ]
134     }
135     if (defined(invoker.deps)) {
136       deps += invoker.deps
137     }
138     if (defined(invoker.datadeps)) {
139       datadeps = invoker.datadeps
140     }
141   }
143   copy(target_name) {
144     if (defined(invoker.python_base_module)) {
145       python_base_module = invoker.python_base_module
146       output = "$root_out_dir/python/$python_base_module/${target_name}${python_module_suffix}"
147     } else {
148       output = "$root_out_dir/python/${target_name}${python_module_suffix}"
149     }
151     sources = [
152       "$root_out_dir/${shared_library_prefix}${shared_library_name}${shared_library_suffix}",
153     ]
154     outputs = [
155       output,
156     ]
157     deps = [
158       ":$shared_library_name",
159     ]
160   }