Win changes (#85)

* Allow execution on Windows, use utils_win.sh, copy instead of symlink

* Prepare for execution on Windows: set up environment, convert path

also rename TMPDIR since it can clash with widely used variable
This commit is contained in:
irengrig 2018-09-11 11:43:13 +02:00 committed by GitHub
parent 3547a24075
commit 0aab4e65c5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 155 additions and 16 deletions

View File

@ -1 +1 @@
build --experimental_cc_skylark_api_enabled_packages=@rules_foreign_cc//tools/build_defs,tools/build_defs build --experimental_cc_skylark_api_enabled_packages=@rules_foreign_cc//tools/build_defs,tools/build_defs --action_env=PATH --test_env=PATH

View File

@ -8,10 +8,10 @@ def _cmake_tool(ctx):
cmake = ctx.actions.declare_directory("cmake") cmake = ctx.actions.declare_directory("cmake")
script_text = "\n".join([ script_text = "\n".join([
"BUILD_DIR=$(pwd)", "BUILD_DIR=$(pwd)",
"export TMPDIR=$(mktemp -d)", "export BUILD_TMPDIR=$(mktemp -d)",
"cp -R ./{}/. $TMPDIR".format(root), "cp -R ./{}/. $BUILD_TMPDIR".format(root),
"mkdir " + cmake.path, "mkdir " + cmake.path,
"pushd $TMPDIR", "pushd $BUILD_TMPDIR",
"./bootstrap --prefix=install", "./bootstrap --prefix=install",
"make install", "make install",
"cp -a ./install/. $BUILD_DIR/" + cmake.path, "cp -a ./install/. $BUILD_DIR/" + cmake.path,

View File

@ -2,6 +2,7 @@
# default placeholder value # default placeholder value
REPLACE_VALUE='BAZEL_GEN_ROOT' REPLACE_VALUE='BAZEL_GEN_ROOT'
export BUILD_PWD=$(pwd)
# Echo variables in the format # Echo variables in the format
# var1_name="var1_value" # var1_name="var1_value"
@ -124,3 +125,9 @@ function define_absolute_paths() {
function replace_absolute_paths() { function replace_absolute_paths() {
replace_in_files $1 $2 $REPLACE_VALUE replace_in_files $1 $2 $REPLACE_VALUE
} }
# function for setting necessary environment variables for the platform
function set_platform_env_vars() {
# empty for Mac OS
return 0
}

View File

@ -2,6 +2,7 @@
# default placeholder value # default placeholder value
REPLACE_VALUE='BAZEL_GEN_ROOT' REPLACE_VALUE='BAZEL_GEN_ROOT'
export BUILD_PWD=$(pwd)
# Echo variables in the format # Echo variables in the format
# var1_name="var1_value" # var1_name="var1_value"
@ -123,3 +124,9 @@ function define_absolute_paths() {
function replace_absolute_paths() { function replace_absolute_paths() {
replace_in_files $1 $2 $REPLACE_VALUE replace_in_files $1 $2 $REPLACE_VALUE
} }
# function for setting necessary environment variables for the platform
function set_platform_env_vars() {
# empty for Linux
return 0
}

123
for_workspace/utils_win.sh Normal file
View File

@ -0,0 +1,123 @@
#!/usr/bin/env bash
# default placeholder value
REPLACE_VALUE='BAZEL_GEN_ROOT'
export BUILD_PWD=$(cygpath -m $(pwd))
# Echo variables in the format
# var1_name="var1_value"
# ...
# vark_name="vark_value"
#
# arguments: the names of the variables
function echo_vars() {
for arg in "$@"
do
echo_var "$arg"
done
}
# Echo variable in the format var_name="var_value"
# $1 the name of the variable
function echo_var() {
local name="$1"
local value=${!name}
echo "$name: \"${value}\""
}
# Wrap the function execution in the echo lines:
# --- START $1
# (anything printed by $2)
# --- END $1
# $1 parameter to be printed next to start/end text
# $2 function to call in between START and END
function wrap() {
echo "--- START $1:"
$2
echo "--- END $1"
}
# Append string to PATH variable
# $1 string to append
function path() {
export PATH="$1:$PATH"
}
# Replace string in all files in directory
# $1 directory to search recursively, absolute path
# $2 string to replace
# $3 replace target
function replace_in_files() {
if [ -d "$1" ]; then
find $1 -type f -exec sed -i 's@'"$2"'@'"$3"'@g' {} ';'
fi
}
# copies contents of the directory to target directory (create the target directory if needed)
# $1 source directory, immediate children of which are copied
# $2 target directory
function copy_dir_contents_to_dir() {
local children=$(find $1 -maxdepth 1 -mindepth 1)
local target="$2"
mkdir -p ${target}
for child in $children; do
cp -R $child ${target}
done
}
# Symlink contents of the directory to target directory (create the target directory if needed).
# If file is passed, symlink it into the target directory.
# $1 source directory, immediate children of which are symlinked, or file to be symlinked.
# $2 target directory
function symlink_contents_to_dir() {
local target="$2"
mkdir -p ${target}
if [[ -f $1 ]]; then
symlink_to_dir $1 ${target}
return 0
fi
local children=$(find $1 -maxdepth 1 -mindepth 1)
for child in $children; do
symlink_to_dir $child ${target}
done
}
# COPIES all files from source directory to target directory (create the target directory if needed)
# (Windows complains about long filenames with symlink command, so copy them)
# NB symlinks from the source directory are copied
# $1 source directory
# $2 target directory
function symlink_to_dir() {
cp $1 $2
}
# Copy all files from source directory to target directory (create the target directory if needed),
# and add target paths on to path
# $1 source directory
# $2 target directory
function copy_and_add_to_path() {
copy_to_dir $1 $2
path $2/bin
path $2
}
# replace placeholder with absolute path in all files in a directory
# $1 directory
# $2 absolute path
function define_absolute_paths() {
replace_in_files $1 $REPLACE_VALUE $2
}
# replace the absolute path with a placeholder value in all files in a directory
# $1 directory
# $2 absolute path to replace
function replace_absolute_paths() {
replace_in_files $1 $2 $REPLACE_VALUE
}
# function for setting necessary environment variables for the platform
function set_platform_env_vars() {
export MSYS_NO_PATHCONV=1
export MSYS2_ARG_CONV_EXCL="*"
export SYSTEMDRIVE="C:"
}

View File

@ -40,7 +40,7 @@ def _cmake_external(ctx):
dict(ctx.attr.env_vars), dict(ctx.attr.env_vars),
ctx.attr.cmake_options, ctx.attr.cmake_options,
) )
copy_results = "copy_dir_contents_to_dir $TMPDIR/{} $INSTALLDIR".format(install_prefix) copy_results = "copy_dir_contents_to_dir $BUILD_TMPDIR/{} $INSTALLDIR".format(install_prefix)
tools_deps = ctx.attr.tools_deps + ([ctx.attr._cmake_dep] if hasattr(ctx.attr, "_cmake_dep") else []) tools_deps = ctx.attr.tools_deps + ([ctx.attr._cmake_dep] if hasattr(ctx.attr, "_cmake_dep") else [])
attrs = create_attrs( attrs = create_attrs(

View File

@ -169,20 +169,23 @@ def cc_external_rule_impl(ctx, attrs):
shell_utils = ctx.attr._utils.files.to_list()[0].path shell_utils = ctx.attr._utils.files.to_list()[0].path
script_lines = [ script_lines = [
"set -e",
"export EXT_BUILD_ROOT=$(pwd)",
"source " + shell_utils,
"echo \"Building external library '{}'\"".format(lib_name), "echo \"Building external library '{}'\"".format(lib_name),
"export TMPDIR=$(mktemp -d)", "set -e",
"trap \"{ rm -rf $TMPDIR $EXT_BUILD_ROOT/bazel_foreign_cc_deps; }\" EXIT", "source " + shell_utils,
"set_platform_env_vars",
"export EXT_BUILD_ROOT=$BUILD_PWD",
"export BUILD_TMPDIR=$(mktemp -d)",
"export EXT_BUILD_DEPS=$EXT_BUILD_ROOT/bazel_foreign_cc_deps", "export EXT_BUILD_DEPS=$EXT_BUILD_ROOT/bazel_foreign_cc_deps",
"mkdir -p $EXT_BUILD_DEPS", "mkdir -p $EXT_BUILD_DEPS",
"\n".join(_copy_deps_and_tools(inputs)),
"define_absolute_paths $EXT_BUILD_ROOT/bin $EXT_BUILD_ROOT/bin",
"export INSTALLDIR=$EXT_BUILD_ROOT/" + outputs.installdir.path, "export INSTALLDIR=$EXT_BUILD_ROOT/" + outputs.installdir.path,
"mkdir -p $INSTALLDIR", "mkdir -p $INSTALLDIR",
"echo_vars INSTALLDIR EXT_BUILD_DEPS EXT_BUILD_ROOT PATH", "echo \"Environment:______________\"",
"pushd $TMPDIR", "env",
"echo \"__________________________\"",
"trap \"{ rm -rf $BUILD_TMPDIR $EXT_BUILD_ROOT/bazel_foreign_cc_deps; }\" EXIT",
"\n".join(_copy_deps_and_tools(inputs)),
"define_absolute_paths $EXT_BUILD_ROOT/bin $EXT_BUILD_ROOT/bin",
"pushd $BUILD_TMPDIR",
attrs.configure_script, attrs.configure_script,
"\n".join(attrs.make_commands), "\n".join(attrs.make_commands),
_value(attrs.postfix_script, ""), _value(attrs.postfix_script, ""),

View File

@ -28,8 +28,7 @@ def _shell_utils_text(rctx, host_os):
if host_os.is_osx: if host_os.is_osx:
utils_name = "utils_osx.sh" utils_name = "utils_osx.sh"
if host_os.is_win: if host_os.is_win:
utils_name = "utils_win.bat" utils_name = "utils_win.sh"
fail("Not supported yet!")
path = rctx.path(Label("//for_workspace:" + utils_name)) path = rctx.path(Label("//for_workspace:" + utils_name))
rctx.template(utils_name, path, executable = True) rctx.template(utils_name, path, executable = True)