| """This file contains helpers for cmake.""" |
| |
| def _quote(s): |
| """Quotes the given string for use in a shell command. |
| |
| This function double-quotes the given string (in case it contains spaces or |
| other special characters) and escapes any special characters (dollar signs, |
| double-quotes, and backslashes) that may be present. |
| |
| Args: |
| s: The string to quote. |
| |
| Returns: |
| An escaped and quoted version of the string that can be passed to a shell |
| command. |
| """ |
| return ('"' + |
| s.replace("\\", "\\\\").replace("$", "\\$").replace('"', "\\\"") + |
| '"') |
| |
| def cmake_var_string(cmake_vars): |
| """Converts a dictionary to an input suitable for expand_cmake_vars. |
| |
| Ideally we would jist stringify in the expand_cmake_vars() rule, but select() |
| interacts badly with genrules. |
| |
| Args: |
| cmake_vars: a dictionary with string keys and values that are convertable to |
| strings. |
| |
| Returns: |
| cmake_vars in a form suitable for passing to expand_cmake_vars. |
| """ |
| return " ".join([ |
| _quote("{}={}".format(k, str(v))) |
| for (k, v) in cmake_vars.items() |
| ]) |
| |
| def expand_cmake_vars(name, src, dst, cmake_vars): |
| """Expands #cmakedefine, #cmakedefine01, and CMake variables in a text file. |
| |
| Args: |
| name: the name of the rule |
| src: the input of the rule |
| dst: the output of the rule |
| cmake_vars: a string containing the CMake variables, as generated by |
| cmake_var_string. |
| """ |
| expand_cmake_vars_tool = "@org_tensorflow//third_party/llvm_openmp:expand_cmake_vars" |
| native.genrule( |
| name = name, |
| srcs = [src], |
| tools = [expand_cmake_vars_tool], |
| outs = [dst], |
| cmd = ("$(location {}) ".format(expand_cmake_vars_tool) + cmake_vars + |
| "< $< > $@"), |
| ) |