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:
parent
3547a24075
commit
0aab4e65c5
2
.bazelrc
2
.bazelrc
|
@ -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
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
|
@ -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
|
||||||
|
}
|
|
@ -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:"
|
||||||
|
}
|
|
@ -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(
|
||||||
|
|
|
@ -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, ""),
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue