Added new foreign_cc framework commands: (#628)

- enable_tracing
- disable_tracing
- script_extension
- shebang
This commit is contained in:
UebelAndre 2021-04-30 13:26:23 -07:00 committed by GitHub
parent 1bd2a8c547
commit 923cd88ed4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 121 additions and 37 deletions

View File

@ -3,7 +3,7 @@
load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain") load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain")
load("//foreign_cc/private:detect_root.bzl", "detect_root") load("//foreign_cc/private:detect_root.bzl", "detect_root")
load("//foreign_cc/private:framework.bzl", "wrap_outputs") load("//foreign_cc/private:framework.bzl", "wrap_outputs")
load("//foreign_cc/private/framework:helpers.bzl", "convert_shell_script") load("//foreign_cc/private/framework:helpers.bzl", "convert_shell_script", "shebang")
# Common attributes for all built_tool rules # Common attributes for all built_tool rules
FOREIGN_CC_BUILT_TOOLS_ATTRS = { FOREIGN_CC_BUILT_TOOLS_ATTRS = {
@ -48,12 +48,12 @@ def built_tool_rule_impl(ctx, script_lines, out_dir, mnemonic):
"cd $$BUILD_TMPDIR$$", "cd $$BUILD_TMPDIR$$",
] ]
script.append("set -x") script.append("##enable_tracing##")
script.extend(script_lines) script.extend(script_lines)
script.append("set +x") script.append("##disable_tracing##")
script_text = "\n".join([ script_text = "\n".join([
"#!/usr/bin/env bash", shebang(ctx),
convert_shell_script(ctx, script), convert_shell_script(ctx, script),
"", "",
]) ])

View File

@ -88,7 +88,7 @@ def create_cmake_script(
directory = "$$EXT_BUILD_ROOT$$/" + root directory = "$$EXT_BUILD_ROOT$$/" + root
script.append("set -x") script.append("##enable_tracing##")
# Configure the CMake generate command # Configure the CMake generate command
script.append(" ".join([ script.append(" ".join([
@ -102,7 +102,7 @@ def create_cmake_script(
script.extend(cmake_commands) script.extend(cmake_commands)
script.append("set +x") script.append("##disable_tracing##")
return params.commands + script return params.commands + script

View File

@ -70,9 +70,9 @@ def create_configure_script(
user_options = " ".join(user_options), user_options = " ".join(user_options),
)) ))
script.append("set -x") script.append("##enable_tracing##")
script.extend(make_commands) script.extend(make_commands)
script.append("set +x") script.append("##disable_tracing##")
return script return script

View File

@ -11,6 +11,8 @@ load(
"convert_shell_script", "convert_shell_script",
"create_function", "create_function",
"os_name", "os_name",
"script_extension",
"shebang",
) )
load( load(
"//toolchains/native_tools:tool_access.bzl", "//toolchains/native_tools:tool_access.bzl",
@ -360,7 +362,7 @@ def cc_external_rule_impl(ctx, attrs):
] ]
script_text = "\n".join([ script_text = "\n".join([
"#!/usr/bin/env bash", shebang(ctx),
convert_shell_script(ctx, script_lines), convert_shell_script(ctx, script_lines),
]) ])
wrapped_outputs = wrap_outputs(ctx, lib_name, attrs.configure_name, script_text) wrapped_outputs = wrap_outputs(ctx, lib_name, attrs.configure_name, script_text)
@ -443,9 +445,10 @@ WrappedOutputs = provider(
# buildifier: disable=function-docstring # buildifier: disable=function-docstring
def wrap_outputs(ctx, lib_name, configure_name, script_text, build_script_file = None): def wrap_outputs(ctx, lib_name, configure_name, script_text, build_script_file = None):
extension = script_extension(ctx)
build_log_file = ctx.actions.declare_file("{}_foreign_cc/{}.log".format(lib_name, configure_name)) build_log_file = ctx.actions.declare_file("{}_foreign_cc/{}.log".format(lib_name, configure_name))
build_script_file = ctx.actions.declare_file("{}_foreign_cc/build_script.sh".format(lib_name)) build_script_file = ctx.actions.declare_file("{}_foreign_cc/build_script{}".format(lib_name, extension))
wrapper_script_file = ctx.actions.declare_file("{}_foreign_cc/wrapper_build_script.sh".format(lib_name)) wrapper_script_file = ctx.actions.declare_file("{}_foreign_cc/wrapper_build_script{}".format(lib_name, extension))
ctx.actions.write( ctx.actions.write(
output = build_script_file, output = build_script_file,
@ -492,7 +495,7 @@ def wrap_outputs(ctx, lib_name, configure_name, script_text, build_script_file =
"##redirect_out_err## $$BUILD_SCRIPT$$ $$BUILD_LOG$$", "##redirect_out_err## $$BUILD_SCRIPT$$ $$BUILD_LOG$$",
] ]
build_command = "\n".join([ build_command = "\n".join([
"#!/usr/bin/env bash", shebang(ctx),
convert_shell_script(ctx, build_command_lines), convert_shell_script(ctx, build_command_lines),
"", "",
]) ])

View File

@ -37,6 +37,28 @@ load("//foreign_cc/private/framework/toolchains:commands.bzl", "PLATFORM_COMMAND
def os_name(ctx): def os_name(ctx):
return call_shell(create_context(ctx), "os_name") return call_shell(create_context(ctx), "os_name")
def script_extension(ctx):
"""A helper method for getting the script extension of the current foreign_cc framework toolchain
Args:
ctx (ctx): The current rule's context object
Returns:
str: A script extension. eg: `.sh`
"""
return call_shell(create_context(ctx), "script_extension")
def shebang(ctx):
"""A helper method for getting the shebang of the current foreign_cc framework toolchain
Args:
ctx (ctx): The current rule's context object
Returns:
str: A shebang for a script. eg: `#!/usr/bin/env bash`
"""
return call_shell(create_context(ctx), "shebang")
def create_function(ctx, name, text): def create_function(ctx, name, text):
return call_shell(create_context(ctx), "define_function", name, text) return call_shell(create_context(ctx), "define_function", name, text)

View File

@ -90,10 +90,18 @@ PLATFORM_COMMANDS = {
], ],
doc = "Defines a function with 'text' as the function body.", doc = "Defines a function with 'text' as the function body.",
), ),
"disable_tracing": _command_info(
arguments = [],
doc = "Disable script tracing. eg: `set +x`",
),
"echo": _command_info( "echo": _command_info(
arguments = [_argument_info(name = "text", data_type = type(""), doc = "Text to output")], arguments = [_argument_info(name = "text", data_type = type(""), doc = "Text to output")],
doc = "Outputs 'text' to stdout", doc = "Outputs 'text' to stdout",
), ),
"enable_tracing": _command_info(
arguments = [],
doc = "Enable script tracing. eg: `set -x`",
),
"env": _command_info( "env": _command_info(
arguments = [], arguments = [],
doc = "Print all environment variables", doc = "Print all environment variables",
@ -173,10 +181,18 @@ PLATFORM_COMMANDS = {
], ],
doc = "Replaces all occurrences of 'from_' to 'to_' recursively in the directory 'dir'.", doc = "Replaces all occurrences of 'from_' to 'to_' recursively in the directory 'dir'.",
), ),
"script_extension": _command_info(
arguments = [],
doc = "Return the extension for the current set of commands (`.sh` for bash, `.ps1` for powershell)",
),
"script_prelude": _command_info( "script_prelude": _command_info(
arguments = [], arguments = [],
doc = "Function for setting necessary environment variables for the platform", doc = "Function for setting necessary environment variables for the platform",
), ),
"shebang": _command_info(
arguments = [],
doc = "The shebang for the current shell executable",
),
"symlink_contents_to_dir": _command_info( "symlink_contents_to_dir": _command_info(
arguments = [ arguments = [
_argument_info( _argument_info(

View File

@ -7,6 +7,12 @@ _REPLACE_VALUE = "\\${EXT_BUILD_DEPS}"
def os_name(): def os_name():
return "linux" return "linux"
def shebang():
return "#!/usr/bin/env bash"
def script_extension():
return ".sh"
def pwd(): def pwd():
return "$(pwd)" return "$(pwd)"
@ -31,6 +37,12 @@ def path(expression):
def touch(path): def touch(path):
return "touch " + path return "touch " + path
def enable_tracing():
return "set -x"
def disable_tracing():
return "set +x"
def mkdirs(path): def mkdirs(path):
return "mkdir -p " + path return "mkdir -p " + path

View File

@ -7,6 +7,12 @@ _REPLACE_VALUE = "\\${EXT_BUILD_DEPS}"
def os_name(): def os_name():
return "macos" return "macos"
def shebang():
return "#!/usr/bin/env bash"
def script_extension():
return ".sh"
def pwd(): def pwd():
return "$(pwd)" return "$(pwd)"
@ -31,6 +37,12 @@ def path(expression):
def touch(path): def touch(path):
return "touch " + path return "touch " + path
def enable_tracing():
return "set -x"
def disable_tracing():
return "set +x"
def mkdirs(path): def mkdirs(path):
return "mkdir -p " + path return "mkdir -p " + path

View File

@ -7,6 +7,12 @@ _REPLACE_VALUE = "\\${EXT_BUILD_DEPS}"
def os_name(): def os_name():
return "windows" return "windows"
def shebang():
return "#!/usr/bin/env bash"
def script_extension():
return ".sh"
def pwd(): def pwd():
return "$(type -t cygpath > /dev/null && cygpath $(pwd) -w || pwd -W)" return "$(type -t cygpath > /dev/null && cygpath $(pwd) -w || pwd -W)"
@ -31,6 +37,12 @@ def path(expression):
def touch(path): def touch(path):
return "touch " + path return "touch " + path
def enable_tracing():
return "set -x"
def disable_tracing():
return "set +x"
def mkdirs(path): def mkdirs(path):
return "mkdir -p " + path return "mkdir -p " + path

View File

@ -10,9 +10,9 @@ def create_make_script(
script.append("##symlink_contents_to_dir## $$EXT_BUILD_ROOT$$/{} $$BUILD_TMPDIR$$".format(root)) script.append("##symlink_contents_to_dir## $$EXT_BUILD_ROOT$$/{} $$BUILD_TMPDIR$$".format(root))
script.append("set -x") script.append("##enable_tracing##")
script.extend(make_commands) script.extend(make_commands)
script.append("set +x") script.append("##disable_tracing##")
return script return script
# buildifier: disable=function-docstring-args # buildifier: disable=function-docstring-args

View File

@ -1,12 +1,19 @@
# buildifier: disable=module-docstring """A module defining some sketchy solutions for managing outputs of foreign_cc rules"""
# buildifier: disable=name-conventions
CreatedByScript = provider( def _created_by_script(file, script):
doc = "Structure to keep declared file or directory and creating script.", """Structure to keep declared file or directory and creating script.
fields = dict(
file = "Declared file or directory", Args:
script = "Script that creates that file or directory", file (File): Declared file or directory
), script (str): Script that creates that file or directory
)
Returns:
struct: A struct of script info
"""
return struct(
file = file,
script = script,
)
def fictive_file_in_genroot(actions, target_name): def fictive_file_in_genroot(actions, target_name):
"""Creates a fictive file under the build root. """Creates a fictive file under the build root.
@ -20,7 +27,7 @@ def fictive_file_in_genroot(actions, target_name):
# we need this fictive file in the genroot to get the path of the root in the script # we need this fictive file in the genroot to get the path of the root in the script
empty = actions.declare_file("empty_{}.txt".format(target_name)) empty = actions.declare_file("empty_{}.txt".format(target_name))
return CreatedByScript( return _created_by_script(
file = empty, file = empty,
script = "##touch## $$EXT_BUILD_ROOT$$/" + empty.path, script = "##touch## $$EXT_BUILD_ROOT$$/" + empty.path,
) )
@ -36,7 +43,7 @@ def copy_directory(actions, orig_path, copy_path):
copy_path: target directory, relative to the build root copy_path: target directory, relative to the build root
""" """
dir_copy = actions.declare_directory(copy_path) dir_copy = actions.declare_directory(copy_path)
return CreatedByScript( return _created_by_script(
file = dir_copy, file = dir_copy,
script = "\n".join([ script = "\n".join([
"##mkdirs## $$EXT_BUILD_ROOT$$/" + dir_copy.path, "##mkdirs## $$EXT_BUILD_ROOT$$/" + dir_copy.path,

View File

@ -257,9 +257,9 @@ def _merge_flag_values_no_toolchain_file_test(ctx):
expected = r"""export CC="/usr/bin/gcc" expected = r"""export CC="/usr/bin/gcc"
export CXX="/usr/bin/gcc" export CXX="/usr/bin/gcc"
export CXXFLAGS="foo=\\\"bar\\\" -Fbat" export CXXFLAGS="foo=\\\"bar\\\" -Fbat"
set -x ##enable_tracing##
cmake -DCMAKE_AR="/usr/bin/ar" -DCMAKE_BUILD_TYPE="RelWithDebInfo" -DCMAKE_INSTALL_PREFIX="test_rule" -DCMAKE_PREFIX_PATH="$$EXT_BUILD_DEPS$$" -DCMAKE_RANLIB="" -G 'Unix Makefiles' $$EXT_BUILD_ROOT$$/external/test_rule cmake -DCMAKE_AR="/usr/bin/ar" -DCMAKE_BUILD_TYPE="RelWithDebInfo" -DCMAKE_INSTALL_PREFIX="test_rule" -DCMAKE_PREFIX_PATH="$$EXT_BUILD_DEPS$$" -DCMAKE_RANLIB="" -G 'Unix Makefiles' $$EXT_BUILD_ROOT$$/external/test_rule
set +x ##disable_tracing##
""" """
asserts.equals(env, expected.splitlines(), script) asserts.equals(env, expected.splitlines(), script)
@ -307,9 +307,9 @@ export CXX="/usr/bin/gcc"
export CFLAGS="-U_FORTIFY_SOURCE -fstack-protector -Wall" export CFLAGS="-U_FORTIFY_SOURCE -fstack-protector -Wall"
export CXXFLAGS="-U_FORTIFY_SOURCE -fstack-protector -Wall" export CXXFLAGS="-U_FORTIFY_SOURCE -fstack-protector -Wall"
export ASMFLAGS="-U_FORTIFY_SOURCE -fstack-protector -Wall" export ASMFLAGS="-U_FORTIFY_SOURCE -fstack-protector -Wall"
set -x ##enable_tracing##
cmake -DCMAKE_AR="/usr/bin/ar" -DCMAKE_SHARED_LINKER_FLAGS="-shared -fuse-ld=gold" -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=gold -Wl -no-as-needed" -DNOFORTRAN="on" -DCMAKE_BUILD_TYPE="Debug" -DCMAKE_INSTALL_PREFIX="test_rule" -DCMAKE_PREFIX_PATH="$$EXT_BUILD_DEPS$$;/abc/def" -DCMAKE_RANLIB="" --debug-output -Wdev -G 'Ninja' $$EXT_BUILD_ROOT$$/external/test_rule cmake -DCMAKE_AR="/usr/bin/ar" -DCMAKE_SHARED_LINKER_FLAGS="-shared -fuse-ld=gold" -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=gold -Wl -no-as-needed" -DNOFORTRAN="on" -DCMAKE_BUILD_TYPE="Debug" -DCMAKE_INSTALL_PREFIX="test_rule" -DCMAKE_PREFIX_PATH="$$EXT_BUILD_DEPS$$;/abc/def" -DCMAKE_RANLIB="" --debug-output -Wdev -G 'Ninja' $$EXT_BUILD_ROOT$$/external/test_rule
set +x ##disable_tracing##
""" """
asserts.equals(env, expected.splitlines(), script) asserts.equals(env, expected.splitlines(), script)
@ -360,9 +360,9 @@ export CXX="/usr/bin/gcc"
export CFLAGS="-U_FORTIFY_SOURCE -fstack-protector -Wall" export CFLAGS="-U_FORTIFY_SOURCE -fstack-protector -Wall"
export CXXFLAGS="-U_FORTIFY_SOURCE -fstack-protector -Wall" export CXXFLAGS="-U_FORTIFY_SOURCE -fstack-protector -Wall"
export ASMFLAGS="-U_FORTIFY_SOURCE -fstack-protector -Wall" export ASMFLAGS="-U_FORTIFY_SOURCE -fstack-protector -Wall"
set -x ##enable_tracing##
cmake -DCMAKE_AR="/usr/bin/ar" -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=gold -Wl -no-as-needed" -DCMAKE_BUILD_TYPE="Debug" -DCMAKE_INSTALL_PREFIX="test_rule" -DCMAKE_PREFIX_PATH="$$EXT_BUILD_DEPS$$;/abc/def" -DCMAKE_RANLIB="" --debug-output -Wdev -G 'Ninja' $$EXT_BUILD_ROOT$$/external/test_rule cmake -DCMAKE_AR="/usr/bin/ar" -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=gold -Wl -no-as-needed" -DCMAKE_BUILD_TYPE="Debug" -DCMAKE_INSTALL_PREFIX="test_rule" -DCMAKE_PREFIX_PATH="$$EXT_BUILD_DEPS$$;/abc/def" -DCMAKE_RANLIB="" --debug-output -Wdev -G 'Ninja' $$EXT_BUILD_ROOT$$/external/test_rule
set +x ##disable_tracing##
""" """
asserts.equals(env, expected.splitlines(), script) asserts.equals(env, expected.splitlines(), script)
@ -415,9 +415,9 @@ set(CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=gold -Wl -no-as-needed")
set(CMAKE_SHARED_LINKER_FLAGS_INIT "-shared -fuse-ld=gold") set(CMAKE_SHARED_LINKER_FLAGS_INIT "-shared -fuse-ld=gold")
EOF EOF
set -x ##enable_tracing##
cmake -DNOFORTRAN="on" -DCMAKE_TOOLCHAIN_FILE="crosstool_bazel.cmake" -DCMAKE_BUILD_TYPE="Debug" -DCMAKE_INSTALL_PREFIX="test_rule" -DCMAKE_PREFIX_PATH="$$EXT_BUILD_DEPS$$" -DCMAKE_RANLIB="" --debug-output -Wdev -G 'Ninja' $$EXT_BUILD_ROOT$$/external/test_rule cmake -DNOFORTRAN="on" -DCMAKE_TOOLCHAIN_FILE="crosstool_bazel.cmake" -DCMAKE_BUILD_TYPE="Debug" -DCMAKE_INSTALL_PREFIX="test_rule" -DCMAKE_PREFIX_PATH="$$EXT_BUILD_DEPS$$" -DCMAKE_RANLIB="" --debug-output -Wdev -G 'Ninja' $$EXT_BUILD_ROOT$$/external/test_rule
set +x ##disable_tracing##
""" """
asserts.equals(env, expected.splitlines(), script) asserts.equals(env, expected.splitlines(), script)
@ -479,9 +479,9 @@ export CFLAGS="-cc-flag -gcc_toolchain cc-toolchain --from-env --additional-flag
export CXXFLAGS="--quoted=\\\"abc def\\\" --sysroot=/abc/sysroot --gcc_toolchain cxx-toolchain" export CXXFLAGS="--quoted=\\\"abc def\\\" --sysroot=/abc/sysroot --gcc_toolchain cxx-toolchain"
export ASMFLAGS="assemble assemble-user" export ASMFLAGS="assemble assemble-user"
export CUSTOM_ENV="YES" export CUSTOM_ENV="YES"
set -x ##enable_tracing##
cmake -DCMAKE_AR="/cxx_linker_static" -DCMAKE_CXX_LINK_EXECUTABLE="became" -DCMAKE_SHARED_LINKER_FLAGS="shared1 shared2" -DCMAKE_EXE_LINKER_FLAGS="executable" -DCMAKE_BUILD_TYPE="user_type" -DCUSTOM_CACHE="YES" -DCMAKE_INSTALL_PREFIX="test_rule" -DCMAKE_PREFIX_PATH="$$EXT_BUILD_DEPS$$" -DCMAKE_RANLIB="" --debug-output -Wdev -G 'Ninja' $$EXT_BUILD_ROOT$$/external/test_rule cmake -DCMAKE_AR="/cxx_linker_static" -DCMAKE_CXX_LINK_EXECUTABLE="became" -DCMAKE_SHARED_LINKER_FLAGS="shared1 shared2" -DCMAKE_EXE_LINKER_FLAGS="executable" -DCMAKE_BUILD_TYPE="user_type" -DCUSTOM_CACHE="YES" -DCMAKE_INSTALL_PREFIX="test_rule" -DCMAKE_PREFIX_PATH="$$EXT_BUILD_DEPS$$" -DCMAKE_RANLIB="" --debug-output -Wdev -G 'Ninja' $$EXT_BUILD_ROOT$$/external/test_rule
set +x ##disable_tracing##
""" """
asserts.equals(env, expected.splitlines(), script) asserts.equals(env, expected.splitlines(), script)
@ -552,9 +552,9 @@ set(CMAKE_SYSROOT "/abc/sysroot")
EOF EOF
export CUSTOM_ENV="YES" export CUSTOM_ENV="YES"
set -x ##enable_tracing##
cmake -DCUSTOM_CACHE="YES" -DCMAKE_TOOLCHAIN_FILE="crosstool_bazel.cmake" -DCMAKE_BUILD_TYPE="Debug" -DCMAKE_INSTALL_PREFIX="test_rule" -DCMAKE_PREFIX_PATH="$$EXT_BUILD_DEPS$$" -DCMAKE_RANLIB="" --debug-output -Wdev -G 'Ninja' $$EXT_BUILD_ROOT$$/external/test_rule cmake -DCUSTOM_CACHE="YES" -DCMAKE_TOOLCHAIN_FILE="crosstool_bazel.cmake" -DCMAKE_BUILD_TYPE="Debug" -DCMAKE_INSTALL_PREFIX="test_rule" -DCMAKE_PREFIX_PATH="$$EXT_BUILD_DEPS$$" -DCMAKE_RANLIB="" --debug-output -Wdev -G 'Ninja' $$EXT_BUILD_ROOT$$/external/test_rule
set +x ##disable_tracing##
""" """
asserts.equals(env, expected.splitlines(), script) asserts.equals(env, expected.splitlines(), script)