diff options
Diffstat (limited to 'taskcluster/scripts')
98 files changed, 13034 insertions, 0 deletions
diff --git a/taskcluster/scripts/builder/build-haz-linux.sh b/taskcluster/scripts/builder/build-haz-linux.sh new file mode 100755 index 0000000000..ad572876e6 --- /dev/null +++ b/taskcluster/scripts/builder/build-haz-linux.sh @@ -0,0 +1,190 @@ +#!/bin/bash -ex + +function usage() { + echo "Usage: $0 [--project <js|browser>] <workspace-dir> flags..." + echo "flags are treated the same way as a commit message would be" + echo "(as in, they are scanned for directives just like a try: ... line)" +} + +PROJECT=js +WORKSPACE= +while [[ $# -gt 0 ]]; do + if [[ "$1" == "-h" ]] || [[ "$1" == "--help" ]]; then + usage + exit 0 + elif [[ "$1" == "--project" ]]; then + shift + PROJECT="$1" + shift + elif [[ "$1" == "--no-tooltool" ]]; then + shift + elif [[ -z "$WORKSPACE" ]]; then + WORKSPACE=$( cd "$1" && pwd ) + shift + break + fi +done + +function check_commit_msg () { + ( set +e; + if [[ -n "$AUTOMATION" ]]; then + hg --cwd "$GECKO_PATH" log -r. --template '{desc}\n' | grep -F -q -- "$1" + else + echo -- "$SCRIPT_FLAGS" | grep -F -q -- "$1" + fi + ) +} + +if check_commit_msg "--dep"; then + HAZ_DEP=1 +fi + +SCRIPT_FLAGS=$* + +ANALYSIS_DIR="$WORKSPACE/haz-$PROJECT" + +# Ensure all the scripts in this dir are on the path.... +DIRNAME=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) +PATH=$DIRNAME:$PATH + +# Use GECKO_BASE_REPOSITORY as a signal for whether we are running in automation. +export AUTOMATION=${GECKO_BASE_REPOSITORY:+1} + +: "${GECKO_PATH:="$DIRNAME"/../../..}" + +if ! [ -d "$GECKO_PATH" ]; then + echo "GECKO_PATH must be set to a directory containing a gecko source checkout" >&2 + exit 1 +fi + +# Directory to hold the compiled JS shell that will run the analysis. +HAZARD_SHELL_OBJDIR=$WORKSPACE/obj-haz-shell + +export NO_MERCURIAL_SETUP_CHECK=1 + +if [[ "$PROJECT" = "browser" ]]; then ( + cd "$WORKSPACE" + set "$WORKSPACE" + # Mozbuild config: + export MOZBUILD_STATE_PATH=$WORKSPACE/mozbuild/ + # Create .mozbuild so mach doesn't complain about this + mkdir -p "$MOZBUILD_STATE_PATH" +) fi + +# Build the shell +export HAZARD_SHELL_OBJDIR # This will be picked up by mozconfig.haz_shell. +$GECKO_PATH/mach hazards build-shell + +# Run a self-test +$GECKO_PATH/mach hazards self-test --shell-objdir="$HAZARD_SHELL_OBJDIR" + +# Artifacts folder is outside of the cache. +mkdir -p "$HOME"/artifacts/ || true + +function grab_artifacts () { + local artifacts + artifacts="$HOME/artifacts" + + [ -d "$ANALYSIS_DIR" ] && ( + cd "$ANALYSIS_DIR" + ls -lah + + # Do not error out if no files found + shopt -s nullglob + set +e + local important + important=(refs.txt unnecessary.txt hazards.txt gcFunctions.txt allFunctions.txt heapWriteHazards.txt) + + # Bundle up the less important but still useful intermediate outputs, + # just to cut down on the clutter in treeherder's Job Details pane. + tar -acvf "${artifacts}/hazardIntermediates.tar.xz" --exclude-from <(IFS=$'\n'; echo "${important[*]}") *.txt *.lst build_xgill.log + + # Upload the important outputs individually, so that they will be + # visible in Job Details and accessible to automated jobs. + for f in "${important[@]}"; do + gzip -9 -c "$f" > "${artifacts}/$f.gz" + done + + # Check whether the user requested .xdb file upload in the top commit comment + if check_commit_msg "--upload-xdbs"; then + HAZ_UPLOAD_XDBS=1 + fi + + if [ -n "$HAZ_UPLOAD_XDBS" ]; then + for f in *.xdb; do + xz -c "$f" > "${artifacts}/$f.bz2" + done + fi + ) +} + +function check_hazards () { + ( + set +e + NUM_HAZARDS=$(grep -c 'Function.*has unrooted.*live across GC call' "$1"/rootingHazards.txt) + NUM_UNSAFE=$(grep -c '^Function.*takes unsafe address of unrooted' "$1"/refs.txt) + NUM_UNNECESSARY=$(grep -c '^Function.* has unnecessary root' "$1"/unnecessary.txt) + NUM_DROPPED=$(grep -c '^Dropped CFG' "$1"/build_xgill.log) + NUM_WRITE_HAZARDS=$(perl -lne 'print $1 if m!found (\d+)/\d+ allowed errors!' "$1"/heapWriteHazards.txt) + NUM_MISSING=$(grep -c '^Function.*expected hazard.*but none were found' "$1"/rootingHazards.txt) + + set +x + echo "TinderboxPrint: rooting hazards<br/>$NUM_HAZARDS" + echo "TinderboxPrint: (unsafe references to unrooted GC pointers)<br/>$NUM_UNSAFE" + echo "TinderboxPrint: (unnecessary roots)<br/>$NUM_UNNECESSARY" + echo "TinderboxPrint: missing expected hazards<br/>$NUM_MISSING" + echo "TinderboxPrint: heap write hazards<br/>$NUM_WRITE_HAZARDS" + + # Display errors in a way that will get picked up by the taskcluster scraper. + perl -lne 'print "TEST-UNEXPECTED-FAIL | hazards | $1 $2" if /^Function.* has (unrooted .*live across GC call).* (at .*)$/' "$1"/hazards.txt + + exit_status=0 + + if [ $NUM_HAZARDS -gt 0 ]; then + echo "TEST-UNEXPECTED-FAIL | hazards | $NUM_HAZARDS rooting hazards detected" >&2 + echo "TinderboxPrint: documentation<br/><a href='https://wiki.mozilla.org/Javascript:Hazard_Builds#Diagnosing_a_rooting_hazards_failure'>static rooting hazard analysis failures</a>, visit \"Inspect Task\" link for hazard details" + exit_status=1 + fi + + if [ $NUM_MISSING -gt 0 ]; then + echo "TEST-UNEXPECTED-FAIL | hazards | $NUM_MISSING expected hazards went undetected" >&2 + echo "TinderboxPrint: documentation<br/><a href='https://wiki.mozilla.org/Javascript:Hazard_Builds#Diagnosing_a_rooting_hazards_failure'>static rooting hazard analysis failures</a>, visit \"Inspect Task\" link for hazard details" + exit_status=1 + fi + + NUM_ALLOWED_WRITE_HAZARDS=0 + if [ $NUM_WRITE_HAZARDS -gt $NUM_ALLOWED_WRITE_HAZARDS ]; then + echo "TEST-UNEXPECTED-FAIL | heap-write-hazards | $NUM_WRITE_HAZARDS heap write hazards detected out of $NUM_ALLOWED_WRITE_HAZARDS allowed" >&2 + echo "TinderboxPrint: documentation<br/><a href='https://wiki.mozilla.org/Javascript:Hazard_Builds#Diagnosing_a_heap_write_hazard_failure'>heap write hazard analysis failures</a>, visit \"Inspect Task\" link for hazard details" + exit_status = 1 + fi + + if [ $NUM_DROPPED -gt 0 ]; then + echo "TEST-UNEXPECTED-FAIL | hazards | $NUM_DROPPED CFGs dropped" >&2 + echo "TinderboxPrint: sixgill unable to handle constructs<br/>$NUM_DROPPED" + exit_status=1 + fi + + if [ $exit_status -ne 0 ]; then + exit $exit_status + fi + ) +} + +trap grab_artifacts EXIT + +# Directory to hold the (useless) object files generated by the analysis. +export HAZ_OBJDIR="$WORKSPACE/obj-analyzed-$PROJECT" +mkdir -p "$HAZ_OBJDIR" + +export LD_LIBRARY_PATH="$MOZ_FETCHES_DIR/gcc/lib64:$LD_LIBRARY_PATH" + +# Gather the information from the source tree by compiling it. +$GECKO_PATH/mach hazards gather --application=$PROJECT --haz-objdir="$HAZ_OBJDIR" --work-dir="$ANALYSIS_DIR" + +# Analyze the collected information. +$GECKO_PATH/mach hazards analyze --application=$PROJECT --shell-objdir="$HAZARD_SHELL_OBJDIR" --work-dir="$ANALYSIS_DIR" + +check_hazards "$ANALYSIS_DIR" + +################################### script end ################################### diff --git a/taskcluster/scripts/builder/build-l10n.sh b/taskcluster/scripts/builder/build-l10n.sh new file mode 100755 index 0000000000..e9e9db81e8 --- /dev/null +++ b/taskcluster/scripts/builder/build-l10n.sh @@ -0,0 +1,111 @@ +#! /bin/bash -vex + +set -x -e + +echo "running as" $(id) + +. /builds/worker/scripts/xvfb.sh + +#### +# Taskcluster friendly wrapper for performing fx desktop l10n repacks via mozharness. +# Based on ./build-linux.sh +#### + +# Inputs, with defaults + +: MOZHARNESS_SCRIPT ${MOZHARNESS_SCRIPT} +: MOZHARNESS_CONFIG ${MOZHARNESS_CONFIG} +: MOZHARNESS_CONFIG_PATHS ${MOZHARNESS_CONFIG_PATHS} +: MOZHARNESS_ACTIONS ${MOZHARNESS_ACTIONS} +: MOZHARNESS_OPTIONS ${MOZHARNESS_OPTIONS} + +: TOOLTOOL_CACHE ${TOOLTOOL_CACHE:=/builds/worker/tooltool-cache} + +: MOZ_SCM_LEVEL ${MOZ_SCM_LEVEL:=1} + +: NEED_XVFB ${NEED_XVFB:=false} + +: MOZ_SCM_LEVEL ${MOZ_SCM_LEVEL:=1} + +: WORKSPACE ${WORKSPACE:=/builds/worker/workspace} +: MOZ_OBJDIR ${MOZ_OBJDIR:=$WORKSPACE/obj-build} + +set -v + +fail() { + echo # make sure error message is on a new line + echo "[build-l10n.sh:error]" "${@}" + exit 1 +} + +export MOZ_CRASHREPORTER_NO_REPORT=1 +export TINDERBOX_OUTPUT=1 + +# Ensure that in tree libraries can be found +export LIBRARY_PATH=$LIBRARY_PATH:$WORKSPACE/obj-build:$WORKSPACE/src/gcc/lib64 + +# test required parameters are supplied +if [[ -z ${MOZHARNESS_SCRIPT} ]]; then fail "MOZHARNESS_SCRIPT is not set"; fi +if [[ -z "${MOZHARNESS_CONFIG}" && -z "${EXTRA_MOZHARNESS_CONFIG}" ]]; then fail "MOZHARNESS_CONFIG or EXTRA_MOZHARNESS_CONFIG is not set"; fi + +cleanup() { + local rv=$? + cleanup_xvfb + exit $rv +} +trap cleanup EXIT INT + +# run XVfb in the background, if necessary +if $NEED_XVFB; then + start_xvfb '1024x768x24' 2 +fi + +# set up mozharness configuration, via command line, env, etc. + +# $TOOLTOOL_CACHE bypasses mozharness completely and is read by tooltool_wrapper.sh to set the +# cache. However, only some mozharness scripts use tooltool_wrapper.sh, so this may not be +# entirely effective. +export TOOLTOOL_CACHE + +export MOZ_OBJDIR + +config_path_cmds="" +for path in ${MOZHARNESS_CONFIG_PATHS}; do + config_path_cmds="${config_path_cmds} --extra-config-path ${GECKO_PATH}/${path}" +done + +# support multiple, space delimited, config files +config_cmds="" +for cfg in $MOZHARNESS_CONFIG; do + config_cmds="${config_cmds} --config ${cfg}" +done + +# if MOZHARNESS_ACTIONS is given, only run those actions (completely overriding default_actions +# in the mozharness configuration) +if [ -n "$MOZHARNESS_ACTIONS" ]; then + actions="" + for action in $MOZHARNESS_ACTIONS; do + actions="$actions --$action" + done +fi + +# if MOZHARNESS_OPTIONS is given, append them to mozharness command line run +if [ -n "$MOZHARNESS_OPTIONS" ]; then + options="" + for option in $MOZHARNESS_OPTIONS; do + options="$options --$option" + done +fi + +cd /builds/worker + +$GECKO_PATH/mach python \ + --requirements $GECKO_PATH/taskcluster/scripts/builder/requirements.txt \ + -- \ + $GECKO_PATH/testing/${MOZHARNESS_SCRIPT} \ + ${config_path_cmds} \ + ${config_cmds} \ + $actions \ + $options \ + --log-level=debug \ + --work-dir=$WORKSPACE \ diff --git a/taskcluster/scripts/builder/build-linux.sh b/taskcluster/scripts/builder/build-linux.sh new file mode 100755 index 0000000000..bcc5b34606 --- /dev/null +++ b/taskcluster/scripts/builder/build-linux.sh @@ -0,0 +1,130 @@ +#! /bin/bash -vex + +set -x -e + +echo "running as" $(id) + +#### +# Taskcluster friendly wrapper for performing fx desktop builds via mozharness. +#### + +# Inputs, with defaults + +: MOZHARNESS_SCRIPT ${MOZHARNESS_SCRIPT} +: MOZHARNESS_CONFIG ${MOZHARNESS_CONFIG} +: MOZHARNESS_CONFIG_PATHS ${MOZHARNESS_CONFIG_PATHS} +: MOZHARNESS_ACTIONS ${MOZHARNESS_ACTIONS} +: MOZHARNESS_OPTIONS ${MOZHARNESS_OPTIONS} + +: TOOLTOOL_CACHE ${TOOLTOOL_CACHE:=/builds/worker/tooltool-cache} + +: MOZ_SCM_LEVEL ${MOZ_SCM_LEVEL:=1} + +: NEED_XVFB ${NEED_XVFB:=false} + +: MH_CUSTOM_BUILD_VARIANT_CFG ${MH_CUSTOM_BUILD_VARIANT_CFG} +: MH_BRANCH ${MH_BRANCH:=mozilla-central} +: MH_BUILD_POOL ${MH_BUILD_POOL:=staging} + +: WORKSPACE ${WORKSPACE:=/builds/worker/workspace} +: MOZ_OBJDIR ${MOZ_OBJDIR:=$WORKSPACE/obj-build} + +set -v + +fail() { + echo # make sure error message is on a new line + echo "[build-linux.sh:error]" "${@}" + exit 1 +} + +export MOZ_CRASHREPORTER_NO_REPORT=1 +export TINDERBOX_OUTPUT=1 + +# use "simple" package names so that they can be hard-coded in the task's +# extras.locations +export MOZ_SIMPLE_PACKAGE_NAME=target + +# Ensure that in tree libraries can be found +export LIBRARY_PATH=$LIBRARY_PATH:$WORKSPACE/obj-build:$WORKSPACE/src/gcc/lib64 + +# test required parameters are supplied +if [[ -z ${MOZHARNESS_SCRIPT} ]]; then fail "MOZHARNESS_SCRIPT is not set"; fi +if [[ -z "${MOZHARNESS_CONFIG}" && -z "${EXTRA_MOZHARNESS_CONFIG}" ]]; then fail "MOZHARNESS_CONFIG or EXTRA_MOZHARNESS_CONFIG is not set"; fi + +# run XVfb in the background, if necessary +if $NEED_XVFB; then + . /builds/worker/scripts/xvfb.sh + + cleanup() { + local rv=$? + cleanup_xvfb + exit $rv + } + trap cleanup EXIT INT + + start_xvfb '1024x768x24' 2 +fi + +# set up mozharness configuration, via command line, env, etc. + +debug_flag="" +if [ 0$DEBUG -ne 0 ]; then + debug_flag='--debug' +fi + +custom_build_variant_cfg_flag="" +if [ -n "${MH_CUSTOM_BUILD_VARIANT_CFG}" ]; then + custom_build_variant_cfg_flag="--custom-build-variant-cfg=${MH_CUSTOM_BUILD_VARIANT_CFG}" +fi + +# $TOOLTOOL_CACHE bypasses mozharness completely and is read by tooltool_wrapper.sh to set the +# cache. However, only some mozharness scripts use tooltool_wrapper.sh, so this may not be +# entirely effective. +export TOOLTOOL_CACHE + +export MOZ_OBJDIR + +config_path_cmds="" +for path in ${MOZHARNESS_CONFIG_PATHS}; do + config_path_cmds="${config_path_cmds} --extra-config-path ${GECKO_PATH}/${path}" +done + +# support multiple, space delimited, config files +config_cmds="" +for cfg in $MOZHARNESS_CONFIG; do + config_cmds="${config_cmds} --config ${cfg}" +done + +# if MOZHARNESS_ACTIONS is given, only run those actions (completely overriding default_actions +# in the mozharness configuration) +if [ -n "$MOZHARNESS_ACTIONS" ]; then + actions="" + for action in $MOZHARNESS_ACTIONS; do + actions="$actions --$action" + done +fi + +# if MOZHARNESS_OPTIONS is given, append them to mozharness command line run +if [ -n "$MOZHARNESS_OPTIONS" ]; then + options="" + for option in $MOZHARNESS_OPTIONS; do + options="$options --$option" + done +fi + +cd /builds/worker + +$GECKO_PATH/mach python \ + --requirements $GECKO_PATH/taskcluster/scripts/builder/requirements.txt \ + -- \ + $GECKO_PATH/testing/${MOZHARNESS_SCRIPT} \ + ${config_path_cmds} \ + ${config_cmds} \ + $debug_flag \ + $custom_build_variant_cfg_flag \ + $actions \ + $options \ + --log-level=debug \ + --work-dir=$WORKSPACE \ + --branch=${MH_BRANCH} \ + --build-pool=${MH_BUILD_POOL} diff --git a/taskcluster/scripts/builder/build-sm-mozjs-crate.sh b/taskcluster/scripts/builder/build-sm-mozjs-crate.sh new file mode 100755 index 0000000000..1d16de037a --- /dev/null +++ b/taskcluster/scripts/builder/build-sm-mozjs-crate.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +set -xe + +source $(dirname $0)/sm-tooltool-config.sh + +cd "$GECKO_PATH/js/src" + +cp $GECKO_PATH/.cargo/config.in $GECKO_PATH/.cargo/config + +export PATH="$PATH:$MOZ_FETCHES_DIR/cargo/bin:$MOZ_FETCHES_DIR/rustc/bin" +export RUSTFMT="$MOZ_FETCHES_DIR/rustc/bin/rustfmt" +export RUST_BACKTRACE=1 +export AUTOMATION=1 + +cargo build --verbose --frozen --features debugmozjs +cargo build --verbose --frozen diff --git a/taskcluster/scripts/builder/build-sm-package.sh b/taskcluster/scripts/builder/build-sm-package.sh new file mode 100755 index 0000000000..ec8147cb34 --- /dev/null +++ b/taskcluster/scripts/builder/build-sm-package.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +set -xe + +source $(dirname $0)/sm-tooltool-config.sh + +mkdir -p $UPLOAD_DIR + +# Package up the sources into the release tarball. +AUTOMATION=1 DIST=$UPLOAD_DIR $GECKO_PATH/js/src/make-source-package.sh + +# Extract the tarball into a new directory in the workspace. + +PACKAGE_DIR=$WORK/sm-package + +# Do not use -p option because the package directory should not exist. +mkdir $PACKAGE_DIR +pushd $PACKAGE_DIR + +tar -xvf $UPLOAD_DIR/mozjs-*.tar.*z* + +: ${PYTHON3:=python3} + +status=0 +( + # Build the freshly extracted, packaged SpiderMonkey. + cd ./mozjs-*/js/src + + # MOZ_AUTOMATION enforces certain requirements that don't apply to + # packaged builds. Unset it. + unset MOZ_AUTOMATION + + AUTOMATION=1 $PYTHON3 ./devtools/automation/autospider.py --skip-tests=checks $SPIDERMONKEY_VARIANT +) || status=$? + +# Copy artifacts for upload by TaskCluster +cp -rL ./mozjs-*/obj-spider/dist/bin/{js,jsapi-tests,js-gdb.py,libmozjs*} $UPLOAD_DIR + +exit $status diff --git a/taskcluster/scripts/builder/build-sm-rust-bindings.sh b/taskcluster/scripts/builder/build-sm-rust-bindings.sh new file mode 100755 index 0000000000..e749712e70 --- /dev/null +++ b/taskcluster/scripts/builder/build-sm-rust-bindings.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +set -xe + +source $(dirname $0)/sm-tooltool-config.sh + +cd "$GECKO_PATH/js/rust" + +cp $GECKO_PATH/.cargo/config.in $GECKO_PATH/.cargo/config + +export RUSTFMT="$MOZ_FETCHES_DIR/rustc/bin/rustfmt" +export LD_LIBRARY_PATH="$MOZ_FETCHES_DIR/gcc/lib64" +# Enable backtraces if we panic. +export RUST_BACKTRACE=1 + +cargo test --verbose --frozen --features debugmozjs +cargo test --verbose --frozen diff --git a/taskcluster/scripts/builder/build-sm.sh b/taskcluster/scripts/builder/build-sm.sh new file mode 100755 index 0000000000..70cb163077 --- /dev/null +++ b/taskcluster/scripts/builder/build-sm.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +set -x + +source $(dirname $0)/sm-tooltool-config.sh + +: ${PYTHON3:=python3} + +# Ensure upload dir exists +mkdir -p $UPLOAD_DIR + +# Run the script +export MOZ_UPLOAD_DIR="$(cd "$UPLOAD_DIR"; pwd)" +export OBJDIR=$WORK/obj-spider +AUTOMATION=1 $PYTHON3 $GECKO_PATH/js/src/devtools/automation/autospider.py ${SPIDERMONKEY_PLATFORM:+--platform=$SPIDERMONKEY_PLATFORM} $SPIDERMONKEY_VARIANT +BUILD_STATUS=$? + +# Copy artifacts for upload by TaskCluster. +upload=${MOZ_AUTOMATION_UPLOAD-1} +# User-provided override switch. +if [ -n "$MOZ_JS_UPLOAD_BINARIES" ]; then + upload=1 +fi +if [ "$upload" = "1" ]; then + cp -rL $OBJDIR/dist/bin/{js,jsapi-tests,js-gdb.py} $UPLOAD_DIR + + # Fuzzing users want the correct version of llvm-symbolizer available in the + # same directory as the built output. + for f in "$MOZ_FETCHES_DIR/clang/bin/llvm-symbolizer"*; do + gzip -c "$f" > "$UPLOAD_DIR/llvm-symbolizer.gz" || echo "gzip $f failed" >&2 + break + done + + # Fuzzing also uses a few fields in target.json file for automated downloads to + # identify what was built. + if [ -n "$MOZ_BUILD_DATE" ] && [ -n "$GECKO_HEAD_REV" ]; then + cat >$UPLOAD_DIR/target.json <<EOF +{ + "buildid": "$MOZ_BUILD_DATE", + "moz_source_stamp": "$GECKO_HEAD_REV" +} +EOF + fi +else # !upload + +# Provide a note for users on why we don't include artifacts for these builds +# by default, and how they can get the artifacts if they really need them. +cat >$UPLOAD_DIR/README-artifacts.txt <<'EOF' +Artifact upload has been disabled for this build due to infrequent usage of the +generated artifacts. If you find yourself in a position where you need the +shell or similar artifacts from this build, please redo your push with the +environment variable MOZ_JS_UPLOAD_BINARIES set to 1. You can provide this as +the option `--env MOZ_JS_UPLOAD_BINARIES=1` to `mach try fuzzy` or `mach try auto`. +EOF +fi + +exit $BUILD_STATUS diff --git a/taskcluster/scripts/builder/repackage.sh b/taskcluster/scripts/builder/repackage.sh new file mode 100755 index 0000000000..15ddbe8557 --- /dev/null +++ b/taskcluster/scripts/builder/repackage.sh @@ -0,0 +1,104 @@ +#! /bin/bash -vex + +set -x -e + +echo "running as" $(id) + +. /builds/worker/scripts/xvfb.sh + +#### +# Taskcluster friendly wrapper for performing fx desktop builds via mozharness. +#### + +# Inputs, with defaults + +: MOZHARNESS_SCRIPT ${MOZHARNESS_SCRIPT} +: MOZHARNESS_CONFIG ${MOZHARNESS_CONFIG} +: MOZHARNESS_CONFIG_PATHS ${MOZHARNESS_CONFIG_PATHS} +: MOZHARNESS_ACTIONS ${MOZHARNESS_ACTIONS} +: MOZHARNESS_OPTIONS ${MOZHARNESS_OPTIONS} + +: TOOLTOOL_CACHE ${TOOLTOOL_CACHE:=/builds/worker/tooltool-cache} + +: MOZ_SCM_LEVEL ${MOZ_SCM_LEVEL:=1} + +: WORKSPACE ${WORKSPACE:=/builds/worker/workspace} +: MOZ_OBJDIR ${MOZ_OBJDIR:=$WORKSPACE/obj-build} + +set -v + +fail() { + echo # make sure error message is on a new line + echo "[build-linux.sh:error]" "${@}" + exit 1 +} + +export MOZ_CRASHREPORTER_NO_REPORT=1 +export TINDERBOX_OUTPUT=1 + +# use "simple" package names so that they can be hard-coded in the task's +# extras.locations +export MOZ_SIMPLE_PACKAGE_NAME=target + +# test required parameters are supplied +if [[ -z ${MOZHARNESS_SCRIPT} ]]; then fail "MOZHARNESS_SCRIPT is not set"; fi +if [[ -z "${MOZHARNESS_CONFIG}" && -z "${EXTRA_MOZHARNESS_CONFIG}" ]]; then fail "MOZHARNESS_CONFIG or EXTRA_MOZHARNESS_CONFIG is not set"; fi + +cleanup() { + local rv=$? + cleanup_xvfb + exit $rv +} +trap cleanup EXIT INT + +# set up mozharness configuration, via command line, env, etc. + +debug_flag="" +if [ 0$DEBUG -ne 0 ]; then + debug_flag='--debug' +fi + +# $TOOLTOOL_CACHE bypasses mozharness completely and is read by tooltool_wrapper.sh to set the +# cache. However, only some mozharness scripts use tooltool_wrapper.sh, so this may not be +# entirely effective. +export TOOLTOOL_CACHE + +export MOZ_OBJDIR + +config_path_cmds="" +for path in ${MOZHARNESS_CONFIG_PATHS}; do + config_path_cmds="${config_path_cmds} --extra-config-path ${GECKO_PATH}/${path}" +done + +# support multiple, space delimited, config files +config_cmds="" +for cfg in $MOZHARNESS_CONFIG; do + config_cmds="${config_cmds} --config ${cfg}" +done + +# if MOZHARNESS_ACTIONS is given, only run those actions (completely overriding default_actions +# in the mozharness configuration) +if [ -n "$MOZHARNESS_ACTIONS" ]; then + actions="" + for action in $MOZHARNESS_ACTIONS; do + actions="$actions --$action" + done +fi + +# if MOZHARNESS_OPTIONS is given, append them to mozharness command line run +if [ -n "$MOZHARNESS_OPTIONS" ]; then + options="" + for option in $MOZHARNESS_OPTIONS; do + options="$options --$option" + done +fi + +cd /builds/worker + +$GECKO_PATH/mach python $GECKO_PATH/testing/${MOZHARNESS_SCRIPT} \ + ${config_path_cmds} \ + ${config_cmds} \ + $actions \ + $options \ + --log-level=debug \ + --work-dir=$WORKSPACE \ diff --git a/taskcluster/scripts/builder/requirements.txt b/taskcluster/scripts/builder/requirements.txt new file mode 100644 index 0000000000..24156d6d30 --- /dev/null +++ b/taskcluster/scripts/builder/requirements.txt @@ -0,0 +1 @@ +psutil==5.7.0 diff --git a/taskcluster/scripts/builder/sm-tooltool-config.sh b/taskcluster/scripts/builder/sm-tooltool-config.sh new file mode 100755 index 0000000000..380fd2e131 --- /dev/null +++ b/taskcluster/scripts/builder/sm-tooltool-config.sh @@ -0,0 +1,67 @@ +#!/bin/bash + +set -x + +SPIDERMONKEY_VARIANT=${SPIDERMONKEY_VARIANT:-plain} +UPLOAD_DIR=${UPLOAD_DIR:-$HOME/artifacts/} +WORK=${WORK:-$HOME/workspace} + +export TOOLTOOL_CHECKOUT=${TOOLTOOL_CHECKOUT:-$WORK} + +( # Create scope for set -e +set -e +mkdir -p $WORK +cd $WORK + +# Need to install things from tooltool. Figure out what platform to use. + +case $(uname -m) in + i686 | arm ) + BITS=32 + ;; + *) + BITS=64 + ;; +esac + +case "$OSTYPE" in + darwin*) + PLATFORM_OS=macosx + ;; + linux-gnu) + PLATFORM_OS=linux + ;; + msys) + PLATFORM_OS=win + ;; + *) + echo "Unrecognized OSTYPE '$OSTYPE'" >&2 + PLATFORM_OS=linux + ;; +esac + +# Install everything needed for the browser on this platform. Not all of it is +# necessary for the JS shell, but it's less duplication to share tooltool +# manifests. +BROWSER_PLATFORM=$PLATFORM_OS$BITS + +(cd $TOOLTOOL_CHECKOUT && ${GECKO_PATH}/mach artifact toolchain${TOOLTOOL_MANIFEST:+ -v --tooltool-manifest $GECKO_PATH/$TOOLTOOL_MANIFEST}${TOOLTOOL_CACHE:+ --cache-dir $TOOLTOOL_CACHE}) + +) || exit 1 # end of set -e scope + +# Add all the fetches and tooltool binaries to our $PATH. +for bin in $MOZ_FETCHES_DIR/*/bin $TOOLTOOL_CHECKOUT/VC/bin/Hostx64/x86; do + if [ ! -d "$bin" ]; then + continue + fi + absbin=$(cd "$bin" && pwd) + export PATH="$absbin:$PATH" +done + +if [ -e $MOZ_FETCHES_DIR/rustc ]; then + export RUSTC="$MOZ_FETCHES_DIR/rustc/bin/rustc" + export CARGO="$MOZ_FETCHES_DIR/rustc/bin/cargo" +fi +if [ -e $MOZ_FETCHES_DIR/cbindgen ]; then + export CBINDGEN="$MOZ_FETCHES_DIR/cbindgen/cbindgen" +fi diff --git a/taskcluster/scripts/copy.sh b/taskcluster/scripts/copy.sh new file mode 100755 index 0000000000..931145a3b6 --- /dev/null +++ b/taskcluster/scripts/copy.sh @@ -0,0 +1,9 @@ +#! /bin/bash -ex + +# This script copies the contents of the "scripts" folder into a docker +# container using tar/untar the container id must be passed. + +DIRNAME=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) +docker exec $1 mkdir -p $2 +cd $DIRNAME +tar -cv * | docker exec -i $1 tar -x -C $2 diff --git a/taskcluster/scripts/iris/run-iris-linux.sh b/taskcluster/scripts/iris/run-iris-linux.sh new file mode 100755 index 0000000000..7b9a30286f --- /dev/null +++ b/taskcluster/scripts/iris/run-iris-linux.sh @@ -0,0 +1,59 @@ +#!/bin/bash +# Debian10 linux bootstrap +set -x +e -v + +# Set Iris code root, required by moziris +export IRIS_CODE_ROOT=$MOZ_FETCHES_DIR/iris_firefox + +# Set up a virtual display since we don't have an xdisplay +. $HOME/scripts/xvfb.sh +start_xvfb '1920x1080x24+32' 0 + +# Re-set `+e` after start_xvfb changes it +set +e + +# configure fluxbox +mkdir /builds/worker/.fluxbox/ +echo "exec startfluxbox" >> .xinitrc + +# required for X server to start correctly +touch ~/.Xauthority + +# start fluxbox +fluxbox & +killall fluxbox +echo "Control Mod4 Up :MaximizeWindow" >> /builds/worker/.fluxbox/keys +fluxbox reconfigure & + +# Install iris's pipenv +cd $MOZ_FETCHES_DIR/iris_firefox +PIPENV_MAX_RETRIES="5" pipenv install +pip_status=$? + +# If pipenv installation fails for any reason, make another attempt. +if [ $pip_status -eq 0 ] +then + echo "Pipenv installed correctly, proceeding to Iris test run:" +else + echo "Pipenv failed to install, attempting again:" + pipenv lock --clear # This purges any partially/incorrectly generated lock files + pipenv install +fi + +# Handle the nightly smoketest suite differently +[ "$CURRENT_TEST_DIR" != "nightly" ] && irisstring="firefox -t $CURRENT_TEST_DIR" || irisstring="$CURRENT_TEST_DIR" +echo "$irisstring" + +# Actually run the iris tests +pipenv run iris $irisstring -w ../../iris_runs -n --treeherder -f ../../fetches/firefox/firefox -y +status=$? + +# Zip up the test run output +cd ../.. +zip -r runs.zip iris_runs/runs + +# prevent timeout of the task +killall fluxbox + +# Exit with iris's exit code so treeherder knows if tests failed +exit $status diff --git a/taskcluster/scripts/iris/run-iris-macos.sh b/taskcluster/scripts/iris/run-iris-macos.sh new file mode 100755 index 0000000000..6d9d961614 --- /dev/null +++ b/taskcluster/scripts/iris/run-iris-macos.sh @@ -0,0 +1,38 @@ +#!/bin/bash +set -x +e -v + +cd $MOZ_FETCHES_DIR/iris_firefox + +# FIXME: Install the following without homebrew: +# tesseract +# p7zip +# xquartz +# pipenv +# pyobjc +# pyobjc-core + +# FIXME: Find a way to set these values: +# https://github.com/mozilla/iris_firefox/blob/master/bootstrap/osx_bootstrap.sh#L87-L91 + +# FIXME: Maybe find a way to create these download files: +# https://github.com/mozilla/iris_firefox/blob/master/bootstrap/osx_bootstrap.sh#L93-L104 + +# FIXME: Ensure all of the necessary python packages are available in the pypi mirror + +# Mount the downloaded Firefox and install iris's pipenv +hdiutil attach ../target.dmg +python3 -m ensurepip --upgrade +pipenv install + +# Handle the nightly smoketest suite differently +[ "$CURRENT_TEST_DIR" != "nightly" ] && irisstring="firefox -t $CURRENT_TEST_DIR" || irisstring="$CURRENT_TEST_DIR" +echo "$irisstring" + +# Run this chunk of iris tests +pipenv run iris $irisstring -w ../../iris_runs -f /Volumes/Firefox\ Nightly/Firefox\ Nightly.app/Contents/MacOS/firefox-bin -n --treeherder -y +runstatus=$? + +# FIXME: Return to the starting dir (../..) and zip up the iris_runs/runs dir + +# Exit with the iris test run's exit code +exit $runstatus diff --git a/taskcluster/scripts/iris/run-iris-windows.sh b/taskcluster/scripts/iris/run-iris-windows.sh new file mode 100755 index 0000000000..7cdde98e4a --- /dev/null +++ b/taskcluster/scripts/iris/run-iris-windows.sh @@ -0,0 +1,71 @@ +#!/bin/bash +set -x +e -v + +# Set Iris code root, required by moziris +export IRIS_CODE_ROOT=$MOZ_FETCHES_DIR/iris_firefox + +# Store our starting dir so we can get back to it later +dir=$(pwd) + +# Install scoop +powershell -Command "Set-ExecutionPolicy RemoteSigned -scope CurrentUser" +powershell -Command "iex (new-object net.webclient).downloadstring('https://get.scoop.sh')" +scoopstatus=$? + +# Install some packages +scoop install git # Needed to update scoop and pick up newer packages +scoop install python@3.7.3 # Worker only has 3.6.5 out of the box, we need 3.7.3+ + +# Enable some extra packages to be installed +scoop bucket add versions +scoop bucket add extras + +# Update scoop and scoop manifests +scoop update + +# `scoop update` seems to intermittently fail, add a retry attempt +if [ $scoopstatus -eq 0 ] +then + echo "Scoop updated successfully" +else + echo "scoop update failed, retrying" + scoop update +fi + +# Install the rest of the needed packages +scoop install which + +# Install tesseract-ocr +cd $MOZ_FETCHES_DIR/iris_firefox +scoop install bootstrap\\tesseract.json + +# Set up the pipenv +python3 -m pip install --upgrade pip +python3 -m pip install --upgrade pipenv +python3 -m pipenv install +pipstatus=$? + +# If any part of the pipenv's install failed, try it again +if [ $pipstatus -eq 0 ] +then + echo "Pipenv installed correctly, proceeding to Iris test run:" +else + echo "Pipenv failed to install, attempting again:" + python3 -m pipenv lock --clear + python3 -m pipenv install +fi + +# Handle the nightly smoketest suite differently +[ "$CURRENT_TEST_DIR" != "nightly" ] && irisstring="firefox -t $CURRENT_TEST_DIR" || irisstring="$CURRENT_TEST_DIR" +echo "$irisstring" + +# Run the iris test suite +python3 -m pipenv run iris $irisstring -w ../../iris_runs -n --treeherder -f ../../fetches/firefox/firefox.exe -y +runstatus=$? + +# Return to our starting dir and zip up the output of the test run +cd ../.. +zip -r runs.zip iris_runs/runs + +# Exit with the status from the iris run +exit $runstatus diff --git a/taskcluster/scripts/misc/android-gradle-dependencies.sh b/taskcluster/scripts/misc/android-gradle-dependencies.sh new file mode 100755 index 0000000000..f9fbe9387c --- /dev/null +++ b/taskcluster/scripts/misc/android-gradle-dependencies.sh @@ -0,0 +1,17 @@ +#!/bin/bash -vex + +set -x -e + +echo "running as" $(id) + +set -v + +cd $GECKO_PATH + +. taskcluster/scripts/misc/android-gradle-dependencies/before.sh + +export MOZCONFIG=mobile/android/config/mozconfigs/android-api-16-gradle-dependencies/nightly +./mach build +./mach android gradle-dependencies + +. taskcluster/scripts/misc/android-gradle-dependencies/after.sh diff --git a/taskcluster/scripts/misc/android-gradle-dependencies/after.sh b/taskcluster/scripts/misc/android-gradle-dependencies/after.sh new file mode 100755 index 0000000000..65f122ebe3 --- /dev/null +++ b/taskcluster/scripts/misc/android-gradle-dependencies/after.sh @@ -0,0 +1,31 @@ +#!/bin/bash -vex + +set -x -e + +echo "running as" $(id) + +: WORKSPACE ${WORKSPACE:=/builds/worker/workspace} + +set -v + +# Package everything up. +pushd $WORKSPACE +mkdir -p android-gradle-dependencies /builds/worker/artifacts + +# NEXUS_WORK is exported by `before.sh`. +cp -R ${NEXUS_WORK}/storage/jcenter android-gradle-dependencies +cp -R ${NEXUS_WORK}/storage/google android-gradle-dependencies +cp -R ${NEXUS_WORK}/storage/gradle-plugins android-gradle-dependencies + +# The Gradle wrapper will have downloaded and verified the hash of exactly one +# Gradle distribution. It will be located in $GRADLE_USER_HOME, like +# ~/.gradle/wrapper/dists/gradle-2.7-all/$PROJECT_HASH/gradle-2.7-all.zip. We +# want to remove the version from the internal directory for use via tooltool in +# a mozconfig. +cp ${GRADLE_USER_HOME}/wrapper/dists/gradle-*-*/*/gradle-*-*.zip gradle.zip +unzip -q gradle.zip +mv gradle-* android-gradle-dependencies/gradle-dist + +tar cv android-gradle-dependencies | $GECKO_PATH/taskcluster/scripts/misc/zstdpy > /builds/worker/artifacts/android-gradle-dependencies.tar.zst + +popd diff --git a/taskcluster/scripts/misc/android-gradle-dependencies/before.sh b/taskcluster/scripts/misc/android-gradle-dependencies/before.sh new file mode 100755 index 0000000000..7150731d73 --- /dev/null +++ b/taskcluster/scripts/misc/android-gradle-dependencies/before.sh @@ -0,0 +1,30 @@ +#!/bin/bash -vex + +set -x -e + +echo "running as" $(id) + +: WORKSPACE ${WORKSPACE:=/builds/worker/workspace} + +set -v + +# Export NEXUS_WORK so that `after.sh` can use it. +export NEXUS_WORK=/builds/worker/workspace/sonatype-nexus-work +mkdir -p ${NEXUS_WORK}/conf +cp /builds/worker/workspace/build/src/taskcluster/scripts/misc/android-gradle-dependencies/nexus.xml ${NEXUS_WORK}/conf/nexus.xml + +RUN_AS_USER=worker $MOZ_FETCHES_DIR/sonatype-nexus/bin/nexus restart + +# Wait "a while" for Nexus to actually start. Don't fail if this fails. +wget --quiet --retry-connrefused --waitretry=2 --tries=100 \ + http://localhost:8081/nexus/service/local/status || true +rm -rf status + +# It's helpful when debugging to see the "latest state". +curl http://localhost:8081/nexus/service/local/status || true + +# Verify Nexus has actually started. Fail if this fails. +curl --fail --silent --location http://localhost:8081/nexus/service/local/status | grep '<state>STARTED</state>' + +# It's helpful when debugging to see the repository configurations. +curl http://localhost:8081/nexus/service/local/repositories || true diff --git a/taskcluster/scripts/misc/android-gradle-dependencies/nexus.xml b/taskcluster/scripts/misc/android-gradle-dependencies/nexus.xml new file mode 100644 index 0000000000..2b40bedf37 --- /dev/null +++ b/taskcluster/scripts/misc/android-gradle-dependencies/nexus.xml @@ -0,0 +1,413 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- This Source Code Form is subject to the terms of the Mozilla Public + - License, v. 2.0. If a copy of the MPL was not distributed with this + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> + +<nexusConfiguration> + <version>2.8.0</version> + <nexusVersion>2.12.0-01</nexusVersion> + <globalConnectionSettings> + <connectionTimeout>20000</connectionTimeout> + <retrievalRetryCount>3</retrievalRetryCount> + <queryString></queryString> + </globalConnectionSettings> + <restApi> + <uiTimeout>60000</uiTimeout> + </restApi> + <httpProxy> + <enabled>true</enabled> + <port>8082</port> + <proxyPolicy>strict</proxyPolicy> + </httpProxy> + <routing> + <resolveLinks>true</resolveLinks> + </routing> + <repositories> + <repository> + <id>jcenter</id> + <name>jcenter</name> + <providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole> + <providerHint>maven2</providerHint> + <localStatus>IN_SERVICE</localStatus> + <notFoundCacheActive>true</notFoundCacheActive> + <notFoundCacheTTL>1440</notFoundCacheTTL> + <userManaged>true</userManaged> + <exposed>true</exposed> + <browseable>true</browseable> + <writePolicy>READ_ONLY</writePolicy> + <indexable>true</indexable> + <searchable>true</searchable> + <localStorage> + <provider>file</provider> + </localStorage> + <remoteStorage> + <url>https://jcenter.bintray.com/</url> + </remoteStorage> + <externalConfiguration> + <repositoryPolicy>RELEASE</repositoryPolicy> + <checksumPolicy>STRICT</checksumPolicy> + <fileTypeValidation>true</fileTypeValidation> + <downloadRemoteIndex>false</downloadRemoteIndex> + <artifactMaxAge>-1</artifactMaxAge> + <metadataMaxAge>1440</metadataMaxAge> + <itemMaxAge>1440</itemMaxAge> + <autoBlockActive>true</autoBlockActive> + </externalConfiguration> + </repository> + <repository> + <id>gradle-plugins</id> + <name>Gradle Plugins</name> + <providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole> + <providerHint>maven2</providerHint> + <localStatus>IN_SERVICE</localStatus> + <notFoundCacheActive>true</notFoundCacheActive> + <notFoundCacheTTL>1440</notFoundCacheTTL> + <userManaged>true</userManaged> + <exposed>true</exposed> + <browseable>true</browseable> + <writePolicy>READ_ONLY</writePolicy> + <indexable>true</indexable> + <searchable>true</searchable> + <localStorage> + <provider>file</provider> + </localStorage> + <remoteStorage> + <url>https://plugins.gradle.org/m2/</url> + </remoteStorage> + <externalConfiguration> + <repositoryPolicy>RELEASE</repositoryPolicy> + <checksumPolicy>STRICT</checksumPolicy> + <fileTypeValidation>true</fileTypeValidation> + <downloadRemoteIndex>false</downloadRemoteIndex> + <artifactMaxAge>-1</artifactMaxAge> + <metadataMaxAge>1440</metadataMaxAge> + <itemMaxAge>1440</itemMaxAge> + <autoBlockActive>true</autoBlockActive> + </externalConfiguration> + </repository> + <repository> + <id>google</id> + <name>google</name> + <providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole> + <providerHint>maven2</providerHint> + <localStatus>IN_SERVICE</localStatus> + <notFoundCacheActive>true</notFoundCacheActive> + <notFoundCacheTTL>1440</notFoundCacheTTL> + <userManaged>true</userManaged> + <exposed>true</exposed> + <browseable>true</browseable> + <writePolicy>READ_ONLY</writePolicy> + <indexable>true</indexable> + <searchable>true</searchable> + <localStorage> + <provider>file</provider> + </localStorage> + <remoteStorage> + <url>https://maven.google.com/</url> + </remoteStorage> + <externalConfiguration> + <repositoryPolicy>RELEASE</repositoryPolicy> + <!-- Google doesn't publish checksums. Why, Google, why? --> + <checksumPolicy>STRICT_IF_EXISTS</checksumPolicy> + <fileTypeValidation>true</fileTypeValidation> + <downloadRemoteIndex>false</downloadRemoteIndex> + <artifactMaxAge>-1</artifactMaxAge> + <metadataMaxAge>1440</metadataMaxAge> + <itemMaxAge>1440</itemMaxAge> + <autoBlockActive>true</autoBlockActive> + </externalConfiguration> + </repository> + <repository> + <id>central</id> + <name>Central</name> + <providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole> + <providerHint>maven2</providerHint> + <localStatus>IN_SERVICE</localStatus> + <notFoundCacheActive>true</notFoundCacheActive> + <notFoundCacheTTL>1440</notFoundCacheTTL> + <userManaged>true</userManaged> + <exposed>true</exposed> + <browseable>true</browseable> + <writePolicy>READ_ONLY</writePolicy> + <indexable>true</indexable> + <searchable>true</searchable> + <localStorage> + <provider>file</provider> + </localStorage> + <remoteStorage> + <url>https://repo1.maven.org/maven2/</url> + </remoteStorage> + <externalConfiguration> + <proxyMode>ALLOW</proxyMode> + <artifactMaxAge>-1</artifactMaxAge> + <itemMaxAge>1440</itemMaxAge> + <cleanseRepositoryMetadata>false</cleanseRepositoryMetadata> + <downloadRemoteIndex>false</downloadRemoteIndex> + <checksumPolicy>WARN</checksumPolicy> + <repositoryPolicy>RELEASE</repositoryPolicy> + </externalConfiguration> + </repository> + <repository> + <id>apache-snapshots</id> + <name>Apache Snapshots</name> + <providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole> + <providerHint>maven2</providerHint> + <localStatus>IN_SERVICE</localStatus> + <notFoundCacheActive>true</notFoundCacheActive> + <notFoundCacheTTL>1440</notFoundCacheTTL> + <userManaged>true</userManaged> + <exposed>true</exposed> + <browseable>true</browseable> + <writePolicy>READ_ONLY</writePolicy> + <indexable>true</indexable> + <searchable>true</searchable> + <localStorage> + <provider>file</provider> + </localStorage> + <remoteStorage> + <url>https://repository.apache.org/snapshots/</url> + </remoteStorage> + <externalConfiguration> + <proxyMode>ALLOW</proxyMode> + <artifactMaxAge>1440</artifactMaxAge> + <itemMaxAge>1440</itemMaxAge> + <cleanseRepositoryMetadata>false</cleanseRepositoryMetadata> + <downloadRemoteIndex>false</downloadRemoteIndex> + <checksumPolicy>WARN</checksumPolicy> + <repositoryPolicy>SNAPSHOT</repositoryPolicy> + </externalConfiguration> + </repository> + <repository> + <id>releases</id> + <name>Releases</name> + <providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole> + <providerHint>maven2</providerHint> + <localStatus>IN_SERVICE</localStatus> + <notFoundCacheTTL>1440</notFoundCacheTTL> + <userManaged>true</userManaged> + <exposed>true</exposed> + <browseable>true</browseable> + <writePolicy>ALLOW_WRITE_ONCE</writePolicy> + <indexable>true</indexable> + <searchable>true</searchable> + <localStorage> + <provider>file</provider> + </localStorage> + <externalConfiguration> + <proxyMode>ALLOW</proxyMode> + <artifactMaxAge>-1</artifactMaxAge> + <itemMaxAge>1440</itemMaxAge> + <cleanseRepositoryMetadata>false</cleanseRepositoryMetadata> + <downloadRemoteIndex>false</downloadRemoteIndex> + <checksumPolicy>WARN</checksumPolicy> + <repositoryPolicy>RELEASE</repositoryPolicy> + </externalConfiguration> + </repository> + <repository> + <id>snapshots</id> + <name>Snapshots</name> + <providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole> + <providerHint>maven2</providerHint> + <localStatus>IN_SERVICE</localStatus> + <notFoundCacheTTL>1440</notFoundCacheTTL> + <userManaged>true</userManaged> + <exposed>true</exposed> + <browseable>true</browseable> + <writePolicy>ALLOW_WRITE</writePolicy> + <indexable>true</indexable> + <searchable>true</searchable> + <localStorage> + <provider>file</provider> + </localStorage> + <externalConfiguration> + <proxyMode>ALLOW</proxyMode> + <artifactMaxAge>1440</artifactMaxAge> + <itemMaxAge>1440</itemMaxAge> + <cleanseRepositoryMetadata>false</cleanseRepositoryMetadata> + <downloadRemoteIndex>false</downloadRemoteIndex> + <checksumPolicy>WARN</checksumPolicy> + <repositoryPolicy>SNAPSHOT</repositoryPolicy> + </externalConfiguration> + </repository> + <repository> + <id>thirdparty</id> + <name>3rd party</name> + <providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole> + <providerHint>maven2</providerHint> + <localStatus>IN_SERVICE</localStatus> + <notFoundCacheTTL>1440</notFoundCacheTTL> + <userManaged>true</userManaged> + <exposed>true</exposed> + <browseable>true</browseable> + <writePolicy>ALLOW_WRITE_ONCE</writePolicy> + <indexable>true</indexable> + <searchable>true</searchable> + <localStorage> + <provider>file</provider> + </localStorage> + <externalConfiguration> + <proxyMode>ALLOW</proxyMode> + <artifactMaxAge>-1</artifactMaxAge> + <itemMaxAge>1440</itemMaxAge> + <cleanseRepositoryMetadata>false</cleanseRepositoryMetadata> + <downloadRemoteIndex>false</downloadRemoteIndex> + <checksumPolicy>WARN</checksumPolicy> + <repositoryPolicy>RELEASE</repositoryPolicy> + </externalConfiguration> + </repository> + <repository> + <id>central-m1</id> + <name>Central M1 shadow</name> + <providerRole>org.sonatype.nexus.proxy.repository.ShadowRepository</providerRole> + <providerHint>m2-m1-shadow</providerHint> + <localStatus>IN_SERVICE</localStatus> + <notFoundCacheTTL>15</notFoundCacheTTL> + <userManaged>true</userManaged> + <exposed>true</exposed> + <browseable>true</browseable> + <writePolicy>READ_ONLY</writePolicy> + <localStorage> + <provider>file</provider> + </localStorage> + <externalConfiguration> + <masterRepositoryId>central</masterRepositoryId> + <syncAtStartup>false</syncAtStartup> + </externalConfiguration> + </repository> + <repository> + <id>public</id> + <name>Public Repositories</name> + <providerRole>org.sonatype.nexus.proxy.repository.GroupRepository</providerRole> + <providerHint>maven2</providerHint> + <localStatus>IN_SERVICE</localStatus> + <notFoundCacheTTL>15</notFoundCacheTTL> + <userManaged>true</userManaged> + <exposed>true</exposed> + <browseable>true</browseable> + <writePolicy>READ_ONLY</writePolicy> + <indexable>true</indexable> + <localStorage> + <provider>file</provider> + </localStorage> + <externalConfiguration> + <mergeMetadata>true</mergeMetadata> + <memberRepositories> + <memberRepository>releases</memberRepository> + <memberRepository>snapshots</memberRepository> + <memberRepository>thirdparty</memberRepository> + <memberRepository>central</memberRepository> + </memberRepositories> + </externalConfiguration> + </repository> + </repositories> + <repositoryGrouping> + <pathMappings> + <pathMapping> + <id>inhouse-stuff</id> + <groupId>*</groupId> + <routeType>inclusive</routeType> + <routePatterns> + <routePattern>^/(com|org)/somecompany/.*</routePattern> + </routePatterns> + <repositories> + <repository>snapshots</repository> + <repository>releases</repository> + </repositories> + </pathMapping> + <pathMapping> + <id>apache-stuff</id> + <groupId>*</groupId> + <routeType>exclusive</routeType> + <routePatterns> + <routePattern>^/org/some-oss/.*</routePattern> + </routePatterns> + <repositories> + <repository>releases</repository> + <repository>snapshots</repository> + </repositories> + </pathMapping> + </pathMappings> + </repositoryGrouping> + <repositoryTargets> + <repositoryTarget> + <id>1</id> + <name>All (Maven2)</name> + <contentClass>maven2</contentClass> + <patterns> + <pattern>.*</pattern> + </patterns> + </repositoryTarget> + <repositoryTarget> + <id>2</id> + <name>All (Maven1)</name> + <contentClass>maven1</contentClass> + <patterns> + <pattern>.*</pattern> + </patterns> + </repositoryTarget> + <repositoryTarget> + <id>3</id> + <name>All but sources (Maven2)</name> + <contentClass>maven2</contentClass> + <patterns> + <pattern>(?!.*-sources.*).*</pattern> + </patterns> + </repositoryTarget> + <repositoryTarget> + <id>4</id> + <name>All Metadata (Maven2)</name> + <contentClass>maven2</contentClass> + <patterns> + <pattern>.*maven-metadata\.xml.*</pattern> + </patterns> + </repositoryTarget> + <repositoryTarget> + <id>any</id> + <name>All (Any Repository)</name> + <contentClass>any</contentClass> + <patterns> + <pattern>.*</pattern> + </patterns> + </repositoryTarget> + <repositoryTarget> + <id>site</id> + <name>All (site)</name> + <contentClass>site</contentClass> + <patterns> + <pattern>.*</pattern> + </patterns> + </repositoryTarget> + <repositoryTarget> + <id>npm</id> + <name>All (npm)</name> + <contentClass>npm</contentClass> + <patterns> + <pattern>.*</pattern> + </patterns> + </repositoryTarget> + <repositoryTarget> + <id>nuget</id> + <name>All (nuget)</name> + <contentClass>nuget</contentClass> + <patterns> + <pattern>.*</pattern> + </patterns> + </repositoryTarget> + <repositoryTarget> + <id>rubygems</id> + <name>All (rubygems)</name> + <contentClass>rubygems</contentClass> + <patterns> + <pattern>.*</pattern> + </patterns> + </repositoryTarget> + </repositoryTargets> + <smtpConfiguration> + <hostname>smtp-host</hostname> + <port>25</port> + <username>smtp-username</username> + <password>{jyU2gDFaNz8HQ4ybBAIdtJ6KL+YB08GXQs7vLPnia3o=}</password> + <systemEmailAddress>system@nexus.org</systemEmailAddress> + </smtpConfiguration> + <notification /> +</nexusConfiguration> diff --git a/taskcluster/scripts/misc/browsertime.sh b/taskcluster/scripts/misc/browsertime.sh new file mode 100755 index 0000000000..2bb1738edc --- /dev/null +++ b/taskcluster/scripts/misc/browsertime.sh @@ -0,0 +1,19 @@ +#!/bin/bash -vex + +set -x -e + +echo "running as" $(id) + +set -v + +cd $GECKO_PATH + +export PATH=$PATH:$MOZ_FETCHES_DIR/node/bin + +./mach browsertime --setup + +# We have tools/browsertime/{package.json,node_modules,...} and want +# browsertime/{package.json,node_modules}. +mkdir -p /builds/worker/artifacts +cd tools +tar cjf /builds/worker/artifacts/browsertime.tar.bz2 browsertime diff --git a/taskcluster/scripts/misc/build-binutils-linux.sh b/taskcluster/scripts/misc/build-binutils-linux.sh new file mode 100755 index 0000000000..30a733d019 --- /dev/null +++ b/taskcluster/scripts/misc/build-binutils-linux.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -x -e -v + +# This script is for building binutils for Linux. + +cd $GECKO_PATH + +build/unix/build-binutils/build-binutils.sh $MOZ_FETCHES_DIR + +# Put a tarball in the artifacts dir +mkdir -p $UPLOAD_DIR +cp $MOZ_FETCHES_DIR/binutils.tar.* $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/build-cbindgen.sh b/taskcluster/scripts/misc/build-cbindgen.sh new file mode 100755 index 0000000000..33127d90fb --- /dev/null +++ b/taskcluster/scripts/misc/build-cbindgen.sh @@ -0,0 +1,46 @@ +#!/bin/bash +set -x -e -v + +# Needed by osx-cross-linker. +export TARGET="$1" + +case "$(uname -s)" in +Linux) + COMPRESS_EXT=xz + ;; +MINGW*) + UPLOAD_DIR=$PWD/public/build + COMPRESS_EXT=bz2 + + . $GECKO_PATH/taskcluster/scripts/misc/vs-setup.sh + + export CC=clang-cl + ;; +esac + +cd $GECKO_PATH + +if [ -n "$TOOLTOOL_MANIFEST" ]; then + . taskcluster/scripts/misc/tooltool-download.sh +fi + +# OSX cross builds are a bit harder +if [ "$TARGET" == "x86_64-apple-darwin" ]; then + export PATH="$MOZ_FETCHES_DIR/llvm-dsymutil/bin:$PATH" + export PATH="$MOZ_FETCHES_DIR/cctools/bin:$PATH" + export RUSTFLAGS="-C linker=$GECKO_PATH/taskcluster/scripts/misc/osx-cross-linker" +fi + +export PATH="$(cd $MOZ_FETCHES_DIR && pwd)/rustc/bin:$PATH" + +cd $MOZ_FETCHES_DIR/cbindgen + +cargo build --verbose --release --target "$TARGET" + +mkdir cbindgen +cp target/$TARGET/release/cbindgen* cbindgen/ +tar -acf cbindgen.tar.$COMPRESS_EXT cbindgen +mkdir -p $UPLOAD_DIR +cp cbindgen.tar.$COMPRESS_EXT $UPLOAD_DIR + +. $GECKO_PATH/taskcluster/scripts/misc/vs-cleanup.sh diff --git a/taskcluster/scripts/misc/build-cctools-port.sh b/taskcluster/scripts/misc/build-cctools-port.sh new file mode 100755 index 0000000000..7ae789c1ca --- /dev/null +++ b/taskcluster/scripts/misc/build-cctools-port.sh @@ -0,0 +1,91 @@ +#!/bin/bash + +# cctools sometimes needs to be rebuilt when clang is modified. +# Until bug 1471905 is addressed, increase the following number +# when a forced rebuild of cctools is necessary: 1 + +set -x -e -v + +# This script is for building cctools (Apple's binutils) for Linux using +# cctools-port (https://github.com/tpoechtrager/cctools-port). +WORKSPACE=$HOME/workspace + +# Set some crosstools-port and libtapi directories +CROSSTOOLS_SOURCE_DIR=$MOZ_FETCHES_DIR/cctools-port +CROSSTOOLS_CCTOOLS_DIR=$CROSSTOOLS_SOURCE_DIR/cctools +CROSSTOOLS_BUILD_DIR=$WORKSPACE/cctools +LIBTAPI_SOURCE_DIR=$MOZ_FETCHES_DIR/apple-libtapi +LIBTAPI_BUILD_DIR=$WORKSPACE/libtapi-build +CLANG_DIR=$MOZ_FETCHES_DIR/clang + +# Create our directories +mkdir -p $CROSSTOOLS_BUILD_DIR $LIBTAPI_BUILD_DIR + +cd $GECKO_PATH + +export PATH="$MOZ_FETCHES_DIR/binutils/bin:$PATH" + +# Common setup for libtapi and cctools +export CC=$CLANG_DIR/bin/clang +export CXX=$CLANG_DIR/bin/clang++ +# We also need this LD_LIBRARY_PATH at build time, since tapi builds bits of +# clang build tools, and then executes those tools. +export LD_LIBRARY_PATH=$CLANG_DIR/lib + +# Build libtapi; the included build.sh is not sufficient for our purposes. +cd $LIBTAPI_BUILD_DIR + +# Values taken from build.sh +TAPI_REPOSITORY=tapi-1000.10.8 +TAPI_VERSION=10.0.0 + +INCLUDE_FIX="-I $LIBTAPI_SOURCE_DIR/src/llvm/projects/clang/include -I $PWD/projects/clang/include" + +cmake $LIBTAPI_SOURCE_DIR/src/llvm \ + -GNinja \ + -DCMAKE_CXX_FLAGS="$INCLUDE_FIX" \ + -DLLVM_INCLUDE_TESTS=OFF \ + -DCMAKE_BUILD_TYPE=RELEASE \ + -DCMAKE_INSTALL_PREFIX=$CROSSTOOLS_BUILD_DIR \ + -DLLVM_TARGETS_TO_BUILD="X86;ARM;AArch64" \ + -DTAPI_REPOSITORY_STRING=$TAPI_REPOSITORY \ + -DTAPI_FULL_VERSION=$TAPI_VERSION + +ninja clangBasic +ninja libtapi install-libtapi install-tapi-headers + +# Setup LDFLAGS late so run-at-build-time tools in the basic clang build don't +# pick up the possibly-incompatible libstdc++ from clang. +# Also set it up such that loading libtapi doesn't require a LD_LIBRARY_PATH. +# (this requires two dollars and extra backslashing because it's used verbatim +# via a Makefile) +export LDFLAGS="-lpthread -Wl,-rpath-link,$CLANG_DIR/lib -Wl,-rpath,\\\$\$ORIGIN/../lib,-rpath,\\\$\$ORIGIN/../../clang/lib" + +# Configure crosstools-port +cd $CROSSTOOLS_CCTOOLS_DIR +# Force re-libtoolization to overwrite files with the new libtool bits. +perl -pi -e 's/(LIBTOOLIZE -c)/\1 -f/' autogen.sh +./autogen.sh +./configure \ + --prefix=$CROSSTOOLS_BUILD_DIR \ + --target=x86_64-apple-darwin \ + --with-llvm-config=$CLANG_DIR/bin/llvm-config \ + --enable-lto-support \ + --enable-tapi-support \ + --with-libtapi=$CROSSTOOLS_BUILD_DIR + +# Build cctools +make -j `nproc --all` install +strip $CROSSTOOLS_BUILD_DIR/bin/* +# cctools-port doesn't include dsymutil but clang will need to find it. +cp $CLANG_DIR/bin/dsymutil $CROSSTOOLS_BUILD_DIR/bin/x86_64-apple-darwin-dsymutil +# various build scripts based on cmake want to find `lipo` without a prefix +cp $CROSSTOOLS_BUILD_DIR/bin/x86_64-apple-darwin-lipo $CROSSTOOLS_BUILD_DIR/bin/lipo + +(cd $CROSSTOOLS_BUILD_DIR/bin/; for i in x86_64-apple-darwin-*; do + ln $i aarch64${i#x86_64} +done) + +# Put a tarball in the artifacts dir +mkdir -p $UPLOAD_DIR +tar cJf $UPLOAD_DIR/cctools.tar.xz -C $CROSSTOOLS_BUILD_DIR/.. `basename $CROSSTOOLS_BUILD_DIR` diff --git a/taskcluster/scripts/misc/build-clang-mingw.sh b/taskcluster/scripts/misc/build-clang-mingw.sh new file mode 100755 index 0000000000..7dc7843de7 --- /dev/null +++ b/taskcluster/scripts/misc/build-clang-mingw.sh @@ -0,0 +1,311 @@ +#!/bin/bash +set -x -e -v + +# This script is for building a mingw-clang toolchain for use on Linux. + +if [[ $# -eq 0 ]]; then + echo "Provide either x86 or x64 to specify a toolchain." + exit 1; +elif [ "$1" == "x86" ]; then + machine="i686" + compiler_rt_machine="i386" + crt_flags="--enable-lib32 --disable-lib64" + WRAPPER_FLAGS="" +elif [ "$1" == "x64" ]; then + machine="x86_64" + compiler_rt_machine="x86_64" + crt_flags="--disable-lib32 --enable-lib64" + WRAPPER_FLAGS="" +else + echo "Provide either x86 or x64 to specify a toolchain." + exit 1; +fi + +TOOLCHAIN_DIR=$MOZ_FETCHES_DIR/llvm-project +INSTALL_DIR=$TOOLCHAIN_DIR/build/stage4/clang +CROSS_PREFIX_DIR=$INSTALL_DIR/$machine-w64-mingw32 + +make_flags="-j$(nproc)" + +if [ -d "$MOZ_FETCHES_DIR/binutils/bin" ]; then + export PATH="$MOZ_FETCHES_DIR/binutils/bin:$PATH" +fi + +# This is default value of _WIN32_WINNT. Gecko configure script explicitly sets this, +# so this is not used to build Gecko itself. We default to 0x601, which is Windows 7. +default_win32_winnt=0x601 + +cd $GECKO_PATH + +patch_file1="$(pwd)/taskcluster/scripts/misc/mingw-winrt.patch" +patch_file2="$(pwd)/taskcluster/scripts/misc/mingw-dwrite_3.patch" + +prepare() { + pushd $MOZ_FETCHES_DIR/mingw-w64 + patch -p1 <$patch_file1 + patch -p1 <$patch_file2 + popd +} + +install_wrappers() { + pushd $INSTALL_DIR/bin + + compiler_flags="--sysroot \$DIR/../$machine-w64-mingw32 -rtlib=compiler-rt -stdlib=libc++ -fuse-ld=lld $WRAPPER_FLAGS -fuse-cxa-atexit -Qunused-arguments" + + cat <<EOF >$machine-w64-mingw32-clang +#!/bin/sh +DIR="\$(cd "\$(dirname "\$0")" && pwd)" +\$DIR/clang -target $machine-w64-mingw32 $compiler_flags "\$@" +EOF + chmod +x $machine-w64-mingw32-clang + + cat <<EOF >$machine-w64-mingw32-clang++ +#!/bin/sh +DIR="\$(cd "\$(dirname "\$0")" && pwd)" +\$DIR/clang -target $machine-w64-mingw32 --driver-mode=g++ $compiler_flags "\$@" +EOF + chmod +x $machine-w64-mingw32-clang++ + + CC="$machine-w64-mingw32-clang" + CXX="$machine-w64-mingw32-clang++" + + popd +} + +build_mingw() { + mkdir mingw-w64-headers + pushd mingw-w64-headers + $MOZ_FETCHES_DIR/mingw-w64/mingw-w64-headers/configure \ + --host=$machine-w64-mingw32 \ + --enable-sdk=all \ + --enable-idl \ + --with-default-msvcrt=ucrt \ + --with-default-win32-winnt=$default_win32_winnt \ + --prefix=$CROSS_PREFIX_DIR + make $make_flags install + popd + + mkdir mingw-w64-crt + pushd mingw-w64-crt + $MOZ_FETCHES_DIR/mingw-w64/mingw-w64-crt/configure \ + --host=$machine-w64-mingw32 \ + $crt_flags \ + --with-default-msvcrt=ucrt \ + CC="$CC" \ + AR=llvm-ar \ + RANLIB=llvm-ranlib \ + DLLTOOL=llvm-dlltool \ + --prefix=$CROSS_PREFIX_DIR + make $make_flags + make $make_flags install + popd + + mkdir widl + pushd widl + $MOZ_FETCHES_DIR/mingw-w64/mingw-w64-tools/widl/configure --target=$machine-w64-mingw32 --prefix=$INSTALL_DIR + make $make_flags + make $make_flags install + popd +} + +build_compiler_rt() { + CLANG_VERSION=$(basename $(dirname $(dirname $(dirname $($CC --print-libgcc-file-name -rtlib=compiler-rt))))) + mkdir compiler-rt + pushd compiler-rt + cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_C_COMPILER=$CC \ + -DCMAKE_SYSTEM_NAME=Windows \ + -DCMAKE_AR=$INSTALL_DIR/bin/llvm-ar \ + -DCMAKE_RANLIB=$INSTALL_DIR/bin/llvm-ranlib \ + -DCMAKE_C_COMPILER_WORKS=1 \ + -DCMAKE_C_COMPILER_TARGET=$compiler_rt_machine-windows-gnu \ + -DCOMPILER_RT_DEFAULT_TARGET_ONLY=TRUE \ + $TOOLCHAIN_DIR/compiler-rt/lib/builtins + make $make_flags + mkdir -p $INSTALL_DIR/lib/clang/$CLANG_VERSION/lib/windows + cp lib/windows/libclang_rt.builtins-$compiler_rt_machine.a $INSTALL_DIR/lib/clang/$CLANG_VERSION/lib/windows/ + popd +} + +merge_libs() { + cat <<EOF |llvm-ar -M +CREATE tmp.a +ADDLIB $1 +ADDLIB $2 +SAVE +END +EOF + llvm-ranlib tmp.a + mv tmp.a $1 +} + +build_libcxx() { + # Below, we specify -g -gcodeview to build static libraries with debug information. + # Because we're not distributing these builds, this is fine. If one were to distribute + # the builds, perhaps one would want to make those flags conditional or investigation + # other options. + DEBUG_FLAGS="-g -gcodeview" + + mkdir libunwind + pushd libunwind + cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=$CROSS_PREFIX_DIR \ + -DCMAKE_C_COMPILER=$CC \ + -DCMAKE_CXX_COMPILER=$CXX \ + -DCMAKE_CROSSCOMPILING=TRUE \ + -DCMAKE_SYSROOT=$CROSS_PREFIX_DIR \ + -DCMAKE_SYSTEM_NAME=Windows \ + -DCMAKE_C_COMPILER_WORKS=TRUE \ + -DCMAKE_CXX_COMPILER_WORKS=TRUE \ + -DLLVM_COMPILER_CHECKED=TRUE \ + -DCMAKE_AR=$INSTALL_DIR/bin/llvm-ar \ + -DCMAKE_RANLIB=$INSTALL_DIR/bin/llvm-ranlib \ + -DLLVM_NO_OLD_LIBSTDCXX=TRUE \ + -DCXX_SUPPORTS_CXX11=TRUE \ + -DCXX_SUPPORTS_CXX_STD=TRUE \ + -DLIBUNWIND_USE_COMPILER_RT=TRUE \ + -DLIBUNWIND_ENABLE_THREADS=TRUE \ + -DLIBUNWIND_ENABLE_SHARED=FALSE \ + -DLIBUNWIND_ENABLE_CROSS_UNWINDING=FALSE \ + -DCMAKE_CXX_FLAGS="${DEBUG_FLAGS} -Wno-dll-attribute-on-redeclaration -nostdinc++ -I$TOOLCHAIN_DIR/libcxx/include -DPSAPI_VERSION=2" \ + -DCMAKE_C_FLAGS="-Wno-dll-attribute-on-redeclaration" \ + $MOZ_FETCHES_DIR/libunwind + make $make_flags + make $make_flags install + popd + + mkdir libcxxabi + pushd libcxxabi + cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=$CROSS_PREFIX_DIR \ + -DCMAKE_C_COMPILER=$CC \ + -DCMAKE_CXX_COMPILER=$CXX \ + -DCMAKE_CROSSCOMPILING=TRUE \ + -DCMAKE_SYSTEM_NAME=Windows \ + -DCMAKE_C_COMPILER_WORKS=TRUE \ + -DCMAKE_CXX_COMPILER_WORKS=TRUE \ + -DCMAKE_SYSROOT=$CROSS_PREFIX_DIR \ + -DLLVM_COMPILER_CHECKED=TRUE \ + -DCMAKE_AR=$INSTALL_DIR/bin/llvm-ar \ + -DCMAKE_RANLIB=$INSTALL_DIR/bin/llvm-ranlib \ + -DLIBCXXABI_USE_COMPILER_RT=ON \ + -DLIBCXXABI_ENABLE_EXCEPTIONS=ON \ + -DLIBCXXABI_ENABLE_THREADS=ON \ + -DLIBCXXABI_TARGET_TRIPLE=$machine-w64-mingw32 \ + -DLIBCXXABI_ENABLE_SHARED=OFF \ + -DLIBCXXABI_LIBCXX_INCLUDES=$TOOLCHAIN_DIR/libcxx/include \ + -DLLVM_NO_OLD_LIBSTDCXX=TRUE \ + -DCXX_SUPPORTS_CXX11=TRUE \ + -DCXX_SUPPORTS_CXX_STD=TRUE \ + -DCMAKE_CXX_FLAGS="${DEBUG_FLAGS} -D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS -D_LIBCPP_HAS_THREAD_API_WIN32" \ + $TOOLCHAIN_DIR/libcxxabi + make $make_flags VERBOSE=1 + popd + + mkdir libcxx + pushd libcxx + cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=$CROSS_PREFIX_DIR \ + -DCMAKE_C_COMPILER=$CC \ + -DCMAKE_CXX_COMPILER=$CXX \ + -DCMAKE_CROSSCOMPILING=TRUE \ + -DCMAKE_SYSTEM_NAME=Windows \ + -DCMAKE_C_COMPILER_WORKS=TRUE \ + -DCMAKE_CXX_COMPILER_WORKS=TRUE \ + -DLLVM_COMPILER_CHECKED=TRUE \ + -DCMAKE_AR=$INSTALL_DIR/bin/llvm-ar \ + -DCMAKE_RANLIB=$INSTALL_DIR/bin/llvm-ranlib \ + -DLIBCXX_USE_COMPILER_RT=ON \ + -DLIBCXX_INSTALL_HEADERS=ON \ + -DLIBCXX_ENABLE_EXCEPTIONS=ON \ + -DLIBCXX_ENABLE_THREADS=ON \ + -DLIBCXX_HAS_WIN32_THREAD_API=ON \ + -DLIBCXX_ENABLE_MONOTONIC_CLOCK=ON \ + -DLIBCXX_ENABLE_SHARED=OFF \ + -DLIBCXX_SUPPORTS_STD_EQ_CXX11_FLAG=TRUE \ + -DLIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB=TRUE \ + -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF \ + -DLIBCXX_ENABLE_FILESYSTEM=OFF \ + -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=TRUE \ + -DLIBCXX_CXX_ABI=libcxxabi \ + -DLIBCXX_CXX_ABI_INCLUDE_PATHS=$TOOLCHAIN_DIR/libcxxabi/include \ + -DLIBCXX_CXX_ABI_LIBRARY_PATH=../libcxxabi/lib \ + -DCMAKE_CXX_FLAGS="${DEBUG_FLAGS} -D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS" \ + $TOOLCHAIN_DIR/libcxx + make $make_flags VERBOSE=1 + make $make_flags install + + # libc++.a depends on libunwind.a. Whild linker will automatically link + # to libc++.a in C++ mode, it won't pick libunwind.a, requiring caller + # to explicitly pass -lunwind. Wo work around that, we merge libunwind.a + # into libc++.a. + merge_libs $CROSS_PREFIX_DIR/lib/libc++.a $CROSS_PREFIX_DIR/lib/libunwind.a + popd +} + +build_libssp() { + pushd $MOZ_FETCHES_DIR/gcc-source/ + + # Massage the environment for the build-libssp.sh script + mkdir -p ./$machine-w64-mingw32/lib + cp $MOZ_FETCHES_DIR/llvm-mingw/libssp-Makefile . + sed -i 's/set -e/set -x -e -v/' $MOZ_FETCHES_DIR/llvm-mingw/build-libssp.sh + sed -i 's/(CROSS)gcc/(CROSS)clang/' libssp-Makefile + sed -i 's/\$(CROSS)ar/llvm-ar/' libssp-Makefile + OLDPATH=$PATH + PATH=$INSTALL_DIR/clang/bin:$PATH + + # Run the script + TOOLCHAIN_ARCHS=$machine $MOZ_FETCHES_DIR/llvm-mingw/build-libssp.sh . + + # Grab the artifacts, cleanup + cp $MOZ_FETCHES_DIR/gcc-source/$machine-w64-mingw32/lib/{libssp.a,libssp_nonshared.a} $INSTALL_DIR/$machine-w64-mingw32/lib/ + unset TOOLCHAIN_ARCHS + PATH=$OLDPATH + popd +} + +build_utils() { + pushd $INSTALL_DIR/bin/ + ln -s llvm-nm $machine-w64-mingw32-nm + ln -s llvm-strip $machine-w64-mingw32-strip + ln -s llvm-readobj $machine-w64-mingw32-readobj + ln -s llvm-objcopy $machine-w64-mingw32-objcopy + ./clang $MOZ_FETCHES_DIR/llvm-mingw/wrappers/windres-wrapper.c -O2 -Wl,-s -o $machine-w64-mingw32-windres + popd +} + +export PATH=$INSTALL_DIR/bin:$PATH + +prepare + +# gets a bit too verbose here +set +x + +cd $TOOLCHAIN_DIR +python3 $GECKO_PATH/build/build-clang/build-clang.py -c $GECKO_PATH/$2 --skip-tar + +set -x + +pushd $TOOLCHAIN_DIR/build + +install_wrappers +build_mingw +build_compiler_rt +build_libcxx +build_libssp +build_utils + +popd + +# Put a tarball in the artifacts dir +mkdir -p $UPLOAD_DIR + +pushd $(dirname $INSTALL_DIR) +tar c clang | $GECKO_PATH/taskcluster/scripts/misc/zstdpy > clangmingw.tar.zst +mv clangmingw.tar.zst $UPLOAD_DIR +popd diff --git a/taskcluster/scripts/misc/build-clang-tidy-external.sh b/taskcluster/scripts/misc/build-clang-tidy-external.sh new file mode 100755 index 0000000000..e3503fe14a --- /dev/null +++ b/taskcluster/scripts/misc/build-clang-tidy-external.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -x + +# Because we specify a private artifact, UPLOAD_DIR is not populated for us +export UPLOAD_DIR="/builds/worker/private-artifacts/" + +# # Delete the external directory +rm -rf $GECKO_PATH/build/clang-plugin/external/* + +# Move external repository into its place +cp -r $MOZ_FETCHES_DIR/civet.git/* $GECKO_PATH/build/clang-plugin/external + +# Call build-clang.sh with this script's first argument (our JSON config) +$GECKO_PATH/taskcluster/scripts/misc/build-clang.sh $1 diff --git a/taskcluster/scripts/misc/build-clang.sh b/taskcluster/scripts/misc/build-clang.sh new file mode 100755 index 0000000000..e0f88150c6 --- /dev/null +++ b/taskcluster/scripts/misc/build-clang.sh @@ -0,0 +1,58 @@ +#!/bin/bash +set -x -e -v + +# This script is for building clang. + +ORIGPWD="$PWD" +JSON_CONFIG="$1" + +cd $GECKO_PATH + +if [ -n "$TOOLTOOL_MANIFEST" ]; then + . taskcluster/scripts/misc/tooltool-download.sh +fi + +if [ -d "$MOZ_FETCHES_DIR/binutils/bin" ]; then + export PATH="$MOZ_FETCHES_DIR/binutils/bin:$PATH" +fi + +case "$JSON_CONFIG" in +*macosx64*) + # these variables are used in build-clang.py + export CROSS_CCTOOLS_PATH=$MOZ_FETCHES_DIR/cctools + export CROSS_SYSROOT=$(ls -d $MOZ_FETCHES_DIR/MacOSX10.*.sdk) + export PATH=$PATH:$CROSS_CCTOOLS_PATH/bin + ;; +*win64*) + export UPLOAD_DIR=$ORIGPWD/public/build + # Set up all the Visual Studio paths. + . taskcluster/scripts/misc/vs-setup.sh + + # LLVM_ENABLE_DIA_SDK is set if the directory "$ENV{VSINSTALLDIR}DIA SDK" + # exists. + export VSINSTALLDIR="${VSPATH}/" + + export PATH="$(cd $MOZ_FETCHES_DIR/cmake && pwd)/bin:${PATH}" + export PATH="$(cd $MOZ_FETCHES_DIR/ninja && pwd)/bin:${PATH}" + ;; +*linux64*|*android*) + ;; +*) + echo Cannot figure out build configuration for $JSON_CONFIG + exit 1 + ;; +esac + +# gets a bit too verbose here +set +x + +cd $MOZ_FETCHES_DIR/llvm-project +python3 $GECKO_PATH/build/build-clang/build-clang.py -c $GECKO_PATH/$1 + +set -x + +# Put a tarball in the artifacts dir +mkdir -p $UPLOAD_DIR +cp clang*.tar.* $UPLOAD_DIR + +. $GECKO_PATH/taskcluster/scripts/misc/vs-cleanup.sh diff --git a/taskcluster/scripts/misc/build-compiler-rt.sh b/taskcluster/scripts/misc/build-compiler-rt.sh new file mode 100755 index 0000000000..1b2cb3df35 --- /dev/null +++ b/taskcluster/scripts/misc/build-compiler-rt.sh @@ -0,0 +1,78 @@ +#!/bin/sh + +set -e + +target=$1 +shift + +case "$target" in +aarch64-apple-darwin) + arch=arm64 + sdk=11.0 + extra_flags="-mcpu=apple-a12" + ;; +x86_64-apple-darwin) + arch=x86_64 + sdk=10.12 + ;; +*) + echo $target is not supported yet + exit 1 + ;; +esac + +export PATH="$MOZ_FETCHES_DIR/cctools/bin:$PATH" + +if [ -n "$TOOLTOOL_MANIFEST" ]; then + . $GECKO_PATH/taskcluster/scripts/misc/tooltool-download.sh +fi + +mkdir compiler-rt +cd compiler-rt + +compiler_wrapper() { +cat > $1 <<EOF +exec \$MOZ_FETCHES_DIR/clang/bin/$1 -target $target $extra_flags -isysroot \$MOZ_FETCHES_DIR/MacOSX$sdk.sdk "\$@" +EOF +chmod +x $1 +} +compiler_wrapper clang +compiler_wrapper clang++ + +for patchfile in "$@"; do + patch -d $MOZ_FETCHES_DIR/llvm-project -p1 < $GECKO_PATH/$patchfile +done + +cmake \ + $MOZ_FETCHES_DIR/llvm-project/compiler-rt \ + -GNinja \ + -DCMAKE_C_COMPILER=$PWD/clang \ + -DCMAKE_CXX_COMPILER=$PWD/clang++ \ + -DCMAKE_LINKER=$MOZ_FETCHES_DIR/cctools/bin/$target-ld \ + -DCMAKE_LIPO=$MOZ_FETCHES_DIR/cctools/bin/lipo \ + -DCMAKE_AR=$MOZ_FETCHES_DIR/cctools/bin/$target-ar \ + -DCMAKE_RANLIB=$MOZ_FETCHES_DIR/cctools/bin/$target-ranlib \ + -DCMAKE_BUILD_TYPE=Release \ + -DLLVM_ENABLE_ASSERTIONS=OFF \ + -DLLVM_CONFIG_PATH=$MOZ_FETCHES_DIR/clang/bin/llvm-config \ + -DCMAKE_SYSTEM_NAME=Darwin \ + -DCMAKE_SYSTEM_VERSION=$sdk \ + -DDARWIN_osx_ARCHS=$arch \ + -DDARWIN_osx_SYSROOT=$MOZ_FETCHES_DIR/MacOSX$sdk.sdk \ + -DLLVM_DEFAULT_TARGET_TRIPLE=$target \ + -DDARWIN_macosx_OVERRIDE_SDK_VERSION=$sdk \ + -DDARWIN_osx_BUILTIN_ARCHS=$arch + +# compiler-rt build script expects to find `codesign` in $PATH. +# Give it a fake one. +echo "#!/bin/sh" > codesign +chmod +x codesign + +PATH=$PATH:$PWD ninja -v + +cd .. + +tar -cf - compiler-rt/lib/darwin | python3 $GECKO_PATH/taskcluster/scripts/misc/zstdpy > "compiler-rt.tar.zst" + +mkdir -p "$UPLOAD_DIR" +mv "compiler-rt.tar.zst" "$UPLOAD_DIR" diff --git a/taskcluster/scripts/misc/build-custom-v8.sh b/taskcluster/scripts/misc/build-custom-v8.sh new file mode 100755 index 0000000000..11dbd5dd52 --- /dev/null +++ b/taskcluster/scripts/misc/build-custom-v8.sh @@ -0,0 +1,47 @@ +#!/bin/bash +set -x -e -v + +# This script is for building a custom version of V8 +ARTIFACT_NAME='d8.zip' +CONFIG='is_debug=false target_cpu="x64"' +if [[ $# -eq 0 ]]; then + echo "Using default configuration for v8 build." + CONFIG=$(echo $CONFIG | tr -d "'") +else + # First argument must be the artifact name + ARTIFACT_NAME="$1" + shift + + # Use the rest of the arguments as the build config + CONFIG=$(echo $* | tr -d "'") +fi + +echo "Config: $CONFIG" +echo "Artifact name: $ARTIFACT_NAME" + +cd $GECKO_PATH + +# Setup depot_tools +git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git +export PATH=$PATH:$GECKO_PATH/depot_tools + +# Get v8 source code and dependencies +fetch --force v8 +cd v8 + +# Build v8 +gn gen out/release --args="$CONFIG" +ninja -C out/release d8 + +# Gather binary and related files into a zip, and upload it +cd .. +mkdir d8 + +cp -R v8/out/release d8 +cp -R v8/include d8 +chmod -R +x d8 + +zip -r $ARTIFACT_NAME d8 + +mkdir -p $UPLOAD_DIR +cp $ARTIFACT_NAME $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/build-dist-toolchains.sh b/taskcluster/scripts/misc/build-dist-toolchains.sh new file mode 100755 index 0000000000..1ad1871775 --- /dev/null +++ b/taskcluster/scripts/misc/build-dist-toolchains.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -x -e -v + +# This script is for packaging toolchains suitable for use by distributed sccache. +TL_NAME="$1" + +mkdir -p $HOME/artifacts +mkdir -p $HOME/toolchains + +mv $MOZ_FETCHES_DIR/$TL_NAME $HOME/toolchains/$TL_NAME + +$MOZ_FETCHES_DIR/sccache/sccache --package-toolchain $HOME/toolchains/$TL_NAME/bin/$TL_NAME $HOME/artifacts/$TL_NAME-dist-toolchain.tar.xz diff --git a/taskcluster/scripts/misc/build-dump-syms.sh b/taskcluster/scripts/misc/build-dump-syms.sh new file mode 100755 index 0000000000..9f5415d636 --- /dev/null +++ b/taskcluster/scripts/misc/build-dump-syms.sh @@ -0,0 +1,66 @@ +#!/bin/bash +set -x -e -v + +PROJECT=dump_syms +# Needed by osx-cross-linker. +export TARGET=$1 + +# This script is for building dump_syms +case "$(uname -s)" in +Linux) + COMPRESS_EXT=xz + ;; +MINGW*) + UPLOAD_DIR=$PWD/public/build + COMPRESS_EXT=bz2 + + . $GECKO_PATH/taskcluster/scripts/misc/vs-setup.sh + ;; +esac + +cd $GECKO_PATH + +if [ -n "$TOOLTOOL_MANIFEST" ]; then + . taskcluster/scripts/misc/tooltool-download.sh +fi + +PATH="$(cd $MOZ_FETCHES_DIR && pwd)/rustc/bin:$PATH" + +cd $MOZ_FETCHES_DIR/$PROJECT + +case "$(uname -s)" in +Linux) + if [ "$TARGET" == "x86_64-apple-darwin" ]; then + export PATH="$MOZ_FETCHES_DIR/llvm-dsymutil/bin:$PATH" + export PATH="$MOZ_FETCHES_DIR/cctools/bin:$PATH" + export RUSTFLAGS="-C linker=$GECKO_PATH/taskcluster/scripts/misc/osx-cross-linker" + export CC="$MOZ_FETCHES_DIR/clang/bin/clang" + export TARGET_CC="$MOZ_FETCHES_DIR/clang/bin/clang -isysroot $MOZ_FETCHES_DIR/MacOSX10.12.sdk" + export TARGET_CXX="$MOZ_FETCHES_DIR/clang/bin/clang++ -isysroot $MOZ_FETCHES_DIR/MacOSX10.12.sdk -stdlib=libc++" + cargo build --verbose --release --target $TARGET + else + export RUSTFLAGS=-Clinker=clang++ + export CC=clang + export CXX=clang++ + export CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0 + export PATH="$MOZ_FETCHES_DIR/clang/bin:$MOZ_FETCHES_DIR/binutils/bin:$PATH" + cargo build --verbose --release --features "vendored-openssl" + fi + ;; +MINGW*) + cargo build --verbose --release + ;; +esac + +mkdir $PROJECT +PROJECT_OUT=target/release/${PROJECT}* +if [ -n "$TARGET" ]; then + PROJECT_OUT=target/${TARGET}/release/${PROJECT}* +fi +cp ${PROJECT_OUT} ${PROJECT}/ +tar -acf ${PROJECT}.tar.$COMPRESS_EXT $PROJECT +mkdir -p $UPLOAD_DIR +cp ${PROJECT}.tar.$COMPRESS_EXT $UPLOAD_DIR + +cd .. +. $GECKO_PATH/taskcluster/scripts/misc/vs-cleanup.sh diff --git a/taskcluster/scripts/misc/build-fix-stacks.sh b/taskcluster/scripts/misc/build-fix-stacks.sh new file mode 100755 index 0000000000..ab1b8028a4 --- /dev/null +++ b/taskcluster/scripts/misc/build-fix-stacks.sh @@ -0,0 +1,71 @@ +#!/bin/bash +set -x -e -v + +# This script is for building fix-stacks. +PROJECT=fix-stacks + +export TARGET="$1" + +case "$TARGET" in +x86_64-unknown-linux-gnu) + EXE= + COMPRESS_EXT=xz + # {CC,CXX} and TARGET_{CC,CXX} must be set because a build.rs file builds + # some C and C++ code. + export CC=$MOZ_FETCHES_DIR/clang/bin/clang + export CXX=$MOZ_FETCHES_DIR/clang/bin/clang++ + export PATH="$MOZ_FETCHES_DIR/binutils/bin:$PATH" + export RUSTFLAGS="-C linker=$CXX" + ;; +x86_64-apple-darwin) + # Cross-compiling for Mac on Linux. + EXE= + COMPRESS_EXT=xz + # {CC,CXX} and TARGET_{CC,CXX} must be set because a build.rs file builds + # some C and C++ code. + export CC=$MOZ_FETCHES_DIR/clang/bin/clang + export CXX=$MOZ_FETCHES_DIR/clang/bin/clang++ + export PATH="$MOZ_FETCHES_DIR/cctools/bin:$PATH" + export RUSTFLAGS="-C linker=$GECKO_PATH/taskcluster/scripts/misc/osx-cross-linker" + export TARGET_CC="$CC -isysroot $MOZ_FETCHES_DIR/MacOSX10.12.sdk" + export TARGET_CXX="$CXX -isysroot $MOZ_FETCHES_DIR/MacOSX10.12.sdk" + ;; +i686-pc-windows-msvc) + # Cross-compiling for Windows on Linux. + EXE=.exe + COMPRESS_EXT=bz2 + # Some magic that papers over differences in case-sensitivity/insensitivity on Linux + # and Windows file systems. + export LD_PRELOAD="/builds/worker/fetches/liblowercase/liblowercase.so" + export LOWERCASE_DIRS="/builds/worker/fetches/vs2017_15.8.4" + # {CC,CXX} and TARGET_{CC,CXX} must be set because a build.rs file builds + # some C and C++ code. + export CC=$MOZ_FETCHES_DIR/clang/bin/clang-cl + export CXX=$MOZ_FETCHES_DIR/clang/bin/clang-cl + export TARGET_AR=$MOZ_FETCHES_DIR/clang/bin/llvm-lib + . $GECKO_PATH/taskcluster/scripts/misc/vs-setup32.sh + export CARGO_TARGET_I686_PC_WINDOWS_MSVC_LINKER=$MOZ_FETCHES_DIR/clang/bin/lld-link + ;; +esac + +cd $GECKO_PATH + +if [ -n "$TOOLTOOL_MANIFEST" ]; then + . taskcluster/scripts/misc/tooltool-download.sh +fi + +PATH="$(cd $MOZ_FETCHES_DIR && pwd)/rustc/bin:$PATH" + +cd $MOZ_FETCHES_DIR/$PROJECT + +cargo build --verbose --release --target "$TARGET" + +mkdir $PROJECT +cp target/$TARGET/release/${PROJECT}${EXE} ${PROJECT}/ +tar -acf ${PROJECT}.tar.$COMPRESS_EXT $PROJECT +mkdir -p $UPLOAD_DIR +cp ${PROJECT}.tar.$COMPRESS_EXT $UPLOAD_DIR + +cd .. + +. $GECKO_PATH/taskcluster/scripts/misc/vs-cleanup.sh diff --git a/taskcluster/scripts/misc/build-gcc-linux.sh b/taskcluster/scripts/misc/build-gcc-linux.sh new file mode 100755 index 0000000000..42a7bc85e2 --- /dev/null +++ b/taskcluster/scripts/misc/build-gcc-linux.sh @@ -0,0 +1,23 @@ +#!/bin/bash +set -e + +# This script is for building GCC for Linux. + +root_dir=$MOZ_FETCHES_DIR +data_dir=$GECKO_PATH/build/unix/build-gcc + +. $data_dir/build-gcc.sh + +pushd $root_dir/gcc-source +ln -sf ../gmp-source gmp +ln -sf ../isl-source isl +ln -sf ../mpc-source mpc +ln -sf ../mpfr-source mpfr +popd + +build_binutils +build_gcc + +# Put a tarball in the artifacts dir +mkdir -p $UPLOAD_DIR +cp $MOZ_FETCHES_DIR/gcc.tar.* $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/build-gcc-mingw32.sh b/taskcluster/scripts/misc/build-gcc-mingw32.sh new file mode 100755 index 0000000000..7d8525fc76 --- /dev/null +++ b/taskcluster/scripts/misc/build-gcc-mingw32.sh @@ -0,0 +1,27 @@ +#!/bin/bash +set -e + +# This script is for building a MinGW GCC (and headers) to be used on Linux to compile for Windows. + +root_dir=$MOZ_FETCHES_DIR +data_dir=$GECKO_PATH/build/unix/build-gcc + +. $data_dir/build-gcc.sh + +binutils_configure_flags="--target=i686-w64-mingw32" +mingw_version=bcf1f29d6dc80b6025b416bef104d2314fa9be57 + +pushd $root_dir/gcc-source +ln -sf ../gmp-source gmp +ln -sf ../isl-source isl +ln -sf ../mpc-source mpc +ln -sf ../mpfr-source mpfr +popd + +prepare_mingw +build_binutils +build_gcc_and_mingw + +# Put a tarball in the artifacts dir +mkdir -p $UPLOAD_DIR +cp $root_dir/mingw32.tar.* $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/build-gcc-sixgill-plugin-linux.sh b/taskcluster/scripts/misc/build-gcc-sixgill-plugin-linux.sh new file mode 100755 index 0000000000..b3d15b3c8b --- /dev/null +++ b/taskcluster/scripts/misc/build-gcc-sixgill-plugin-linux.sh @@ -0,0 +1,81 @@ +#!/bin/bash + +set -e +set -x + +# This script is for building the sixgill GCC plugin for Linux. It relies on +# the gcc checkout because it needs to recompile gmp and the gcc build script +# determines the version of gmp to download. + +root_dir=$MOZ_FETCHES_DIR +build_dir=$GECKO_PATH/build +data_dir=$GECKO_PATH/build/unix/build-gcc + +sixgill_rev=88d1a251c92a +sixgill_repo=https://hg.mozilla.org/users/sfink_mozilla.com/sixgill + +. $data_dir/build-gcc.sh + +mkdir $root_dir/gcc-source || true +pushd $root_dir/gcc-source +ln -sf ../binutils-source binutils +ln -sf ../gmp-source gmp +ln -sf ../isl-source isl +ln -sf ../mpc-source mpc +ln -sf ../mpfr-source mpfr +popd + +export TMPDIR=${TMPDIR:-/tmp/} +export gcc_bindir=$MOZ_FETCHES_DIR/gcc/bin +export gmp_prefix=/tools/gmp +export gmp_dir=$root_dir$gmp_prefix + +prepare_sixgill() {( + cd $root_dir + hg clone -r $sixgill_rev $sixgill_repo || ( cd sixgill && hg update -r $sixgill_rev ) +)} + +build_gmp() { + if ! [ -x $gcc_bindir/gcc ]; then + echo "GCC not found in $gcc_bindir/gcc" >&2 + exit 1 + fi + + # The sixgill plugin uses some gmp symbols, including some not exported by + # cc1/cc1plus. So link the plugin statically to libgmp. Except that the + # default static build does not have -fPIC, and will result in a relocation + # error, so build our own. This requires the gcc and related source to be + # in $root_dir/gcc-source. + + mkdir $root_dir/gmp-objdir || true + ( + cd $root_dir/gmp-objdir + $root_dir/gcc-source/gmp/configure --disable-shared --with-pic --prefix=$gmp_prefix + make -j8 + make install DESTDIR=$root_dir + ) +} + +build_sixgill() {( + cd $root_dir/sixgill + export CC=$gcc_bindir/gcc + export CXX=$gcc_bindir/g++ + export PATH="$gcc_bindir:$PATH" + export LD_LIBRARY_PATH="${gcc_bindir%/bin}/lib64" + export TARGET_CC=$CC + export CPPFLAGS=-I$gmp_dir/include + export EXTRA_LDFLAGS=-L$gmp_dir/lib + export HOST_CFLAGS=$CPPFLAGS + + ./release.sh --build-and-package --with-gmp=$gmp_dir + tarball=$(ls -td *-sixgill | head -1)/sixgill.tar.xz + cp $tarball $root_dir/sixgill.tar.xz +)} + +prepare_sixgill +build_gmp +build_sixgill + +# Put a tarball in the artifacts dir +mkdir -p $UPLOAD_DIR +cp $MOZ_FETCHES_DIR/sixgill.tar.* $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/build-geckodriver.sh b/taskcluster/scripts/misc/build-geckodriver.sh new file mode 100755 index 0000000000..d9bfd4d911 --- /dev/null +++ b/taskcluster/scripts/misc/build-geckodriver.sh @@ -0,0 +1,66 @@ +#!/bin/bash +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +set -x -e -v + +# Needed by osx-cross-linker. +export TARGET="$1" + +cd $GECKO_PATH + +if [ -n "$TOOLTOOL_MANIFEST" ]; then + . taskcluster/scripts/misc/tooltool-download.sh +fi + +EXE= +COMPRESS_EXT=gz + +case "$TARGET" in +*windows-msvc) + EXE=.exe + COMPRESS_EXT=zip + if [[ $TARGET == "i686-pc-windows-msvc" ]]; then + . $GECKO_PATH/taskcluster/scripts/misc/vs-setup32.sh + export CARGO_TARGET_I686_PC_WINDOWS_MSVC_LINKER=$MOZ_FETCHES_DIR/clang/bin/lld-link + else + . $GECKO_PATH/taskcluster/scripts/misc/vs-setup.sh + export CARGO_TARGET_X86_64_PC_WINDOWS_MSVC_LINKER=$MOZ_FETCHES_DIR/clang/bin/lld-link + fi + ( IFS=\; + for d in $LIB; do + (cd "$d"; rename y/A-Z/a-z/ *) + done + ) + # Bug 1584530: don't require the Microsoft MSVC runtime to be installed. + export RUSTFLAGS="-Ctarget-feature=+crt-static" + ;; +# OSX cross builds are a bit harder +x86_64-apple-darwin) + export PATH="$MOZ_FETCHES_DIR/llvm-dsymutil/bin:$PATH" + export PATH="$MOZ_FETCHES_DIR/cctools/bin:$PATH" + export RUSTFLAGS="-C linker=$GECKO_PATH/taskcluster/scripts/misc/osx-cross-linker" + ;; +esac + +export PATH="$MOZ_FETCHES_DIR/rustc/bin:$PATH" + +cd $GECKO_PATH/testing/geckodriver + +cp $GECKO_PATH/.cargo/config.in $GECKO_PATH/.cargo/config + +cargo build --frozen --verbose --release --target "$TARGET" + +cd $GECKO_PATH +mkdir -p $UPLOAD_DIR + +cp target/$TARGET/release/geckodriver$EXE . +if [ "$COMPRESS_EXT" = "zip" ]; then + zip geckodriver.zip geckodriver$EXE + cp geckodriver.zip $UPLOAD_DIR +else + tar -acf geckodriver.tar.$COMPRESS_EXT geckodriver$EXE + cp geckodriver.tar.$COMPRESS_EXT $UPLOAD_DIR +fi + +. $GECKO_PATH/taskcluster/scripts/misc/vs-cleanup.sh diff --git a/taskcluster/scripts/misc/build-gn-common.sh b/taskcluster/scripts/misc/build-gn-common.sh new file mode 100755 index 0000000000..66e74914c5 --- /dev/null +++ b/taskcluster/scripts/misc/build-gn-common.sh @@ -0,0 +1,63 @@ +#!/bin/bash +set -e -v + +# This is shared code for building GN. +cd $MOZ_FETCHES_DIR/gn + +# We remove /WC because of https://bugs.chromium.org/p/gn/issues/detail?id=51 +# And /MACHINE:x64 because we just let the PATH decide what cl and link are +# used, and if cl is targetting x86, we don't want linkage to fail because of +# /MACHINE:x64. +patch -p1 <<'EOF' +diff --git a/build/gen.py b/build/gen.py +index a7142fab..78d0fd56 100755 +--- a/build/gen.py ++++ b/build/gen.py +@@ -357,7 +357,6 @@ def WriteGNNinja(path, platform, host, options): + '/D_WIN32_WINNT=0x0A00', + '/FS', + '/W4', +- '/WX', + '/Zi', + '/wd4099', + '/wd4100', +@@ -373,7 +372,7 @@ def WriteGNNinja(path, platform, host, options): + '/D_HAS_EXCEPTIONS=0', + ]) + +- ldflags.extend(['/DEBUG', '/MACHINE:x64']) ++ ldflags.extend(['/DEBUG']) + + static_libraries = { + 'base': {'sources': [ +EOF + +if test -n "$MAC_CROSS"; then + python build/gen.py --platform darwin --no-last-commit-position +else + python build/gen.py --no-last-commit-position +fi + +cat > out/last_commit_position.h <<EOF +#ifndef OUT_LAST_COMMIT_POSITION_H_ +#define OUT_LAST_COMMIT_POSITION_H_ + +#define LAST_COMMIT_POSITION "unknown" + +#endif // OUT_LAST_COMMIT_POSITION_H_ +EOF + +ninja -C out -v + +STAGE=gn +mkdir -p $UPLOAD_DIR $STAGE + +# At this point, the resulting binary is at: +# $WORKSPACE/out/Release/gn +if test "$MAC_CROSS" = "" -a "$(uname)" = "Linux"; then + strip out/gn +fi +cp out/gn $STAGE + +tar -acf gn.tar.$COMPRESS_EXT $STAGE +cp gn.tar.$COMPRESS_EXT $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/build-gn-linux.sh b/taskcluster/scripts/misc/build-gn-linux.sh new file mode 100755 index 0000000000..578b8a8984 --- /dev/null +++ b/taskcluster/scripts/misc/build-gn-linux.sh @@ -0,0 +1,21 @@ +#!/bin/bash +set -e -v + +# This script is for building GN on Linux. + +WORKSPACE=$HOME/workspace +COMPRESS_EXT=xz +export CC=$MOZ_FETCHES_DIR/gcc/bin/gcc +export CXX=$MOZ_FETCHES_DIR/gcc/bin/g++ +export LDFLAGS=-lrt + +# Gn build scripts use #!/usr/bin/env python, which will be python 2.6 on +# the worker and cause failures. Work around this by putting python2.7 +# ahead of it in PATH. +mkdir -p $WORKSPACE/python_bin +ln -s /usr/bin/python2.7 $WORKSPACE/python_bin/python +export PATH=$WORKSPACE/python_bin:$PATH + +cd $GECKO_PATH + +. taskcluster/scripts/misc/build-gn-common.sh diff --git a/taskcluster/scripts/misc/build-gn-macosx.sh b/taskcluster/scripts/misc/build-gn-macosx.sh new file mode 100755 index 0000000000..e745141516 --- /dev/null +++ b/taskcluster/scripts/misc/build-gn-macosx.sh @@ -0,0 +1,38 @@ +#!/bin/bash +set -e -v + +# This script is for building GN. + +WORKSPACE=$HOME/workspace +COMPRESS_EXT=xz + +CROSS_CCTOOLS_PATH=$MOZ_FETCHES_DIR/cctools +CROSS_SYSROOT=$MOZ_FETCHES_DIR/MacOSX10.12.sdk + +export CC=$MOZ_FETCHES_DIR/clang/bin/clang +export CXX=$MOZ_FETCHES_DIR/clang/bin/clang++ +export AR=$MOZ_FETCHES_DIR/clang/bin/llvm-ar +export CFLAGS="-target x86_64-apple-darwin -mlinker-version=137 -B ${CROSS_CCTOOLS_PATH}/bin -isysroot ${CROSS_SYSROOT} -I${CROSS_SYSROOT}/usr/include -iframework ${CROSS_SYSROOT}/System/Library/Frameworks" +export CXXFLAGS="-stdlib=libc++ ${CFLAGS}" +export LDFLAGS="${CXXFLAGS} -Wl,-syslibroot,${CROSS_SYSROOT} -Wl,-dead_strip" + +# We patch tools/gn/bootstrap/bootstrap.py to detect this. +export MAC_CROSS=1 + +# Gn build scripts use #!/usr/bin/env python, which will be python 2.6 on +# the worker and cause failures. Work around this by putting python2.7 +# ahead of it in PATH. +mkdir -p $WORKSPACE/python_bin +ln -s /usr/bin/python2.7 $WORKSPACE/python_bin/python +export PATH=$WORKSPACE/python_bin:$PATH + +cd $GECKO_PATH + +. taskcluster/scripts/misc/tooltool-download.sh + +# The ninja templates used to bootstrap gn have hard-coded references to +# 'libtool', make sure we find the right one. +ln -s $CROSS_CCTOOLS_PATH/bin/x86_64-apple-darwin-libtool $CROSS_CCTOOLS_PATH/bin/libtool +export PATH=$CROSS_CCTOOLS_PATH/bin:$PATH + +. taskcluster/scripts/misc/build-gn-common.sh diff --git a/taskcluster/scripts/misc/build-gn-win32.sh b/taskcluster/scripts/misc/build-gn-win32.sh new file mode 100755 index 0000000000..8eb5a8ad03 --- /dev/null +++ b/taskcluster/scripts/misc/build-gn-win32.sh @@ -0,0 +1,18 @@ +#!/bin/bash +set -e -v -x + +# This script is for building GN on Windows. + +UPLOAD_DIR=$PWD/public/build +COMPRESS_EXT=bz2 + +cd $GECKO_PATH + +export PATH="$(cd $MOZ_FETCHES_DIR && pwd)/ninja/bin:$PATH" +export PATH="$(cd $MOZ_FETCHES_DIR && pwd)/mingw64/bin:$PATH" + +. taskcluster/scripts/misc/vs-setup.sh +. taskcluster/scripts/misc/tooltool-download.sh +. taskcluster/scripts/misc/build-gn-common.sh + +. $GECKO_PATH/taskcluster/scripts/misc/vs-cleanup.sh diff --git a/taskcluster/scripts/misc/build-grcov.sh b/taskcluster/scripts/misc/build-grcov.sh new file mode 100755 index 0000000000..3fd770c0e4 --- /dev/null +++ b/taskcluster/scripts/misc/build-grcov.sh @@ -0,0 +1,48 @@ +#!/bin/bash +set -x -e -v + +# This script is for building grcov + +PROJECT=grcov + +case "$(uname -s)" in +Linux) + COMPRESS_EXT=xz + + export CC=clang + export CXX=clang++ + export RUSTFLAGS=-Clinker=clang++ + + export PATH="$MOZ_FETCHES_DIR/clang/bin:$MOZ_FETCHES_DIR/binutils/bin:$PATH" + ;; +MINGW*) + UPLOAD_DIR=$PWD/public/build + COMPRESS_EXT=bz2 + + . $GECKO_PATH/taskcluster/scripts/misc/vs-setup.sh + ;; +esac + +cd $GECKO_PATH + +if [ -n "$TOOLTOOL_MANIFEST" ]; then + . taskcluster/scripts/misc/tooltool-download.sh +fi + +PATH="$(cd $MOZ_FETCHES_DIR && pwd)/rustc/bin:$PATH" + +pushd $MOZ_FETCHES_DIR/$PROJECT + +cargo build --verbose --release + +mkdir $PROJECT +cp target/release/${PROJECT}* ${PROJECT}/ +pushd $PROJECT +tar -acf ../${PROJECT}.tar.$COMPRESS_EXT * +popd +mkdir -p $UPLOAD_DIR +cp ${PROJECT}.tar.$COMPRESS_EXT $UPLOAD_DIR + +popd + +. $GECKO_PATH/taskcluster/scripts/misc/vs-cleanup.sh diff --git a/taskcluster/scripts/misc/build-hfsplus-linux.sh b/taskcluster/scripts/misc/build-hfsplus-linux.sh new file mode 100755 index 0000000000..32f12d5b8f --- /dev/null +++ b/taskcluster/scripts/misc/build-hfsplus-linux.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -x -e -v + +# This script is for building hfsplus for Linux. + +cd $GECKO_PATH + +export PATH=$PATH:$MOZ_FETCHES_DIR/clang/bin + +build/unix/build-hfsplus/build-hfsplus.sh $MOZ_FETCHES_DIR + +# Put a tarball in the artifacts dir +mkdir -p $UPLOAD_DIR +cp $MOZ_FETCHES_DIR/hfsplus-tools.tar.* $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/build-infer-linux.sh b/taskcluster/scripts/misc/build-infer-linux.sh new file mode 100755 index 0000000000..89780f6284 --- /dev/null +++ b/taskcluster/scripts/misc/build-infer-linux.sh @@ -0,0 +1,18 @@ +#!/bin/bash +set -x -e -v + +# This script is for building infer for Linux. + +cd $GECKO_PATH + +# gets a bit too verbose here +set +x + +cd build/build-infer +./build-infer.py -c infer-linux64.json + +set -x + +# Put a tarball in the artifacts dir +mkdir -p $UPLOAD_DIR +cp infer.tar.* $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/build-libdmg-hfsplus.sh b/taskcluster/scripts/misc/build-libdmg-hfsplus.sh new file mode 100755 index 0000000000..c76b722d8d --- /dev/null +++ b/taskcluster/scripts/misc/build-libdmg-hfsplus.sh @@ -0,0 +1,28 @@ +#!/bin/bash +set -x -e -v + +# This script is for building libdmg-hfsplus to get the `dmg` and `hfsplus` +# tools for producing DMG archives on Linux. + +WORKSPACE=$HOME/workspace +STAGE=$WORKSPACE/dmg + +mkdir -p $UPLOAD_DIR $STAGE + +cd $MOZ_FETCHES_DIR/libdmg-hfsplus + +cmake -DOPENSSL_USE_STATIC_LIBS=1 . +make -j$(nproc) + +# We only need the dmg and hfsplus tools. +strip dmg/dmg hfs/hfsplus +cp dmg/dmg hfs/hfsplus $STAGE + +# duplicate the functionality of taskcluster-lib-urls, but in bash.. +queue_base="$TASKCLUSTER_ROOT_URL/api/queue/v1" + +cat >$STAGE/README<<EOF +Source is available as a taskcluster artifact: +$queue_base/task/$(python -c 'import json, os; print "{task}/artifacts/{artifact}".format(**next(f for f in json.loads(os.environ["MOZ_FETCHES"]) if "libdmg-hfsplus" in f["artifact"]))') +EOF +tar cf - -C $WORKSPACE `basename $STAGE` | xz > $UPLOAD_DIR/dmg.tar.xz diff --git a/taskcluster/scripts/misc/build-liblowercase.sh b/taskcluster/scripts/misc/build-liblowercase.sh new file mode 100755 index 0000000000..0846a60c4d --- /dev/null +++ b/taskcluster/scripts/misc/build-liblowercase.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -x -e -v + +: WORKSPACE ${WORKSPACE:=/builds/worker/workspace} + +# This script is for building liblowercase + +PATH="$MOZ_FETCHES_DIR/rustc/bin:$PATH" + +cd $GECKO_PATH/build/liblowercase + +cargo build --verbose --release --target-dir $WORKSPACE/obj + +mkdir $WORKSPACE/liblowercase +cp $WORKSPACE/obj/release/liblowercase.so $WORKSPACE/liblowercase +strip $WORKSPACE/liblowercase/liblowercase.so +tar -C $WORKSPACE -acf $WORKSPACE/liblowercase.tar.xz liblowercase +mkdir -p $UPLOAD_DIR +cp $WORKSPACE/liblowercase.tar.xz $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/build-llvm-dsymutil.sh b/taskcluster/scripts/misc/build-llvm-dsymutil.sh new file mode 100755 index 0000000000..aeafb6acf2 --- /dev/null +++ b/taskcluster/scripts/misc/build-llvm-dsymutil.sh @@ -0,0 +1,27 @@ +#!/bin/bash +set -x -e -v + +# This script is for building clang for Linux. + +cd $GECKO_PATH + +cd $MOZ_FETCHES_DIR/llvm-project/llvm + +mkdir build +cd build + +cmake \ + -GNinja \ + -DCMAKE_BUILD_TYPE=Release \ + -DLLVM_TARGETS_TO_BUILD="X86;AArch64" \ + -DCMAKE_C_COMPILER=$MOZ_FETCHES_DIR/gcc/bin/gcc \ + .. + +export LD_LIBRARY_PATH=$MOZ_FETCHES_DIR/gcc/lib64 + +ninja dsymutil llvm-symbolizer + +tar --xform='s,^,llvm-dsymutil/,' -Jcf llvm-dsymutil.tar.xz bin/dsymutil bin/llvm-symbolizer + +mkdir -p $UPLOAD_DIR +cp llvm-dsymutil.tar.xz $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/build-lucetc.sh b/taskcluster/scripts/misc/build-lucetc.sh new file mode 100755 index 0000000000..b4a8d17629 --- /dev/null +++ b/taskcluster/scripts/misc/build-lucetc.sh @@ -0,0 +1,20 @@ +#!/bin/bash +set -x -e -v + +cd $MOZ_FETCHES_DIR/lucet_sandbox_compiler + +export PATH=$MOZ_FETCHES_DIR/binutils/bin:$MOZ_FETCHES_DIR/clang/bin:$PATH:$MOZ_FETCHES_DIR/rustc/bin:$MOZ_FETCHES_DIR/cmake/bin +export CC=$MOZ_FETCHES_DIR/clang/bin/clang +export CFLAGS="-L$MOZ_FETCHES_DIR/clang/lib" +export CXXFLAGS=$CFLAGS +export CXX=$MOZ_FETCHES_DIR/clang/bin/clang++ +export AR=$MOZ_FETCHES_DIR/clang/bin/llvm-ar +export RUSTFLAGS="-C linker=$CXX -C link-arg=$CXXFLAGS" +make build + +# Put the lucetc binary in a directory called "lucetc", which is where consumers +# will expect it. +mkdir -p $UPLOAD_DIR/lucetc +mv target/release/lucetc $UPLOAD_DIR/lucetc +tar -C $UPLOAD_DIR --xz -cf $UPLOAD_DIR/lucetc.tar.xz lucetc +rm -rf $UPLOAD_DIR/lucetc diff --git a/taskcluster/scripts/misc/build-makecab.sh b/taskcluster/scripts/misc/build-makecab.sh new file mode 100755 index 0000000000..4d8d2ade3e --- /dev/null +++ b/taskcluster/scripts/misc/build-makecab.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +set -x -e -v + +export PATH="$MOZ_FETCHES_DIR/rustc/bin:$PATH" + +cd $MOZ_FETCHES_DIR/rust-makecab + +cargo build --verbose --release + +mkdir makecab +cp target/release/makecab makecab/ +tar -c makecab | $GECKO_PATH/taskcluster/scripts/misc/zstdpy > makecab.tar.zst +mkdir -p $UPLOAD_DIR +cp makecab.tar.zst $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/build-mar-tools.sh b/taskcluster/scripts/misc/build-mar-tools.sh new file mode 100755 index 0000000000..42b4639978 --- /dev/null +++ b/taskcluster/scripts/misc/build-mar-tools.sh @@ -0,0 +1,27 @@ +#!/bin/bash +set -x -e -v + +# This script is for building mar and mbsdiff + +COMPRESS_EXT=xz + +cd $GECKO_PATH + +export MOZ_OBJDIR=obj-mar + +echo ac_add_options --enable-project=tools/update-packaging > .mozconfig + +TOOLCHAINS="binutils clang" + +for t in $TOOLCHAINS; do + PATH="$MOZ_FETCHES_DIR/$t/bin:$PATH" +done + +./mach build -v + +mkdir mar-tools +cp $MOZ_OBJDIR/dist/host/bin/{mar,mbsdiff} mar-tools/ + +tar -acf mar-tools.tar.$COMPRESS_EXT mar-tools/ +mkdir -p $UPLOAD_DIR +cp mar-tools.tar.$COMPRESS_EXT $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/build-mingw-fxc2-x86.sh b/taskcluster/scripts/misc/build-mingw-fxc2-x86.sh new file mode 100755 index 0000000000..4cdeb13e02 --- /dev/null +++ b/taskcluster/scripts/misc/build-mingw-fxc2-x86.sh @@ -0,0 +1,25 @@ +#!/bin/bash +set -x -e -v + +WORKSPACE=$HOME/workspace +INSTALL_DIR=$WORKSPACE/fxc2 + +mkdir -p $INSTALL_DIR/bin + +export PATH="$MOZ_FETCHES_DIR/clang/bin:$PATH" + +# -------------- + +cd $MOZ_FETCHES_DIR/fxc2 +make -j$(nproc) x86 + +cp fxc2.exe $INSTALL_DIR/bin/ +cp dll/d3dcompiler_47_32.dll $INSTALL_DIR/bin/d3dcompiler_47.dll + +# -------------- + +cd $WORKSPACE +tar caf fxc2.tar.xz fxc2 + +mkdir -p $UPLOAD_DIR +cp fxc2.tar.* $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/build-mingw32-nsis.sh b/taskcluster/scripts/misc/build-mingw32-nsis.sh new file mode 100755 index 0000000000..0c6fcca284 --- /dev/null +++ b/taskcluster/scripts/misc/build-mingw32-nsis.sh @@ -0,0 +1,47 @@ +#!/bin/bash +set -x -e -v + +# We set the INSTALL_DIR to match the directory that it will run in exactly, +# otherwise we get an NSIS error of the form: +# checking for NSIS version... +# DEBUG: Executing: `/home/worker/workspace/build/src/mingw32/ +# DEBUG: The command returned non-zero exit status 1. +# DEBUG: Its error output was: +# DEBUG: | Error: opening stub "/home/worker/workspace/mingw32/ +# DEBUG: | Error initalizing CEXEBuild: error setting +# ERROR: Failed to get nsis version. + +INSTALL_DIR=$MOZ_FETCHES_DIR/mingw32 + +mkdir -p $INSTALL_DIR + +cd $MOZ_FETCHES_DIR + +# As explained above, we have to build nsis to the directory it +# will eventually be run from, which is the same place we just +# installed our compiler. But at the end of the script we want +# to package up what we just built. If we don't move the compiler, +# we will package up the compiler we downloaded along with the +# stuff we just built. +mv mingw32 mingw32-gcc +export PATH="$MOZ_FETCHES_DIR/mingw32-gcc/bin:$PATH" + +# -------------- + +cd zlib-1.2.11 +make -f win32/Makefile.gcc PREFIX=i686-w64-mingw32- + +cd ../nsis-3.01-src +patch -p1 < $GECKO_PATH/build/win32/nsis-no-insert-timestamp.patch +# I don't know how to make the version work with the environment variables/config flags the way the author appears to +sed -i "s/'VERSION', 'Version of NSIS', cvs_version/'VERSION', 'Version of NSIS', '3.01'/" SConstruct +scons XGCC_W32_PREFIX=i686-w64-mingw32- ZLIB_W32=../zlib-1.2.11 SKIPUTILS="NSIS Menu" PREFIX=$INSTALL_DIR/ install + +# -------------- + +cd $MOZ_FETCHES_DIR + +tar caf nsis.tar.xz mingw32 + +mkdir -p $UPLOAD_DIR +cp nsis.tar.* $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/build-minidump-stackwalk.sh b/taskcluster/scripts/misc/build-minidump-stackwalk.sh new file mode 100755 index 0000000000..277faa37ff --- /dev/null +++ b/taskcluster/scripts/misc/build-minidump-stackwalk.sh @@ -0,0 +1,49 @@ +#!/bin/bash +set -x -e -v + +# This script is for building minidump_stackwalk + +COMPRESS_EXT=xz + +cd $GECKO_PATH + +if [ -n "$TOOLTOOL_MANIFEST" ]; then + . taskcluster/scripts/misc/tooltool-download.sh +fi + +export MOZ_OBJDIR=obj-minidump + +echo ac_add_options --enable-project=tools/crashreporter > .mozconfig + +MINIDUMP_STACKWALK=minidump_stackwalk + +case "$1" in +macosx64) + TOOLCHAINS="cctools rustc clang" + echo ac_add_options --target=x86_64-apple-darwin >> .mozconfig + echo ac_add_options --with-macos-sdk=$MOZ_FETCHES_DIR/MacOSX10.12.sdk >> .mozconfig + ;; +mingw32) + TOOLCHAINS="binutils rustc clang" + echo ac_add_options --target=i686-w64-mingw32 >> .mozconfig + echo export CC=i686-w64-mingw32-clang >> .mozconfig + echo export HOST_CC=clang >> .mozconfig + MINIDUMP_STACKWALK=minidump_stackwalk.exe + ;; +*) + TOOLCHAINS="binutils rustc clang" + ;; +esac + +for t in $TOOLCHAINS; do + PATH="$MOZ_FETCHES_DIR/$t/bin:$PATH" +done + +./mach build -v + +mkdir minidump_stackwalk +cp $MOZ_OBJDIR/dist/bin/$MINIDUMP_STACKWALK minidump_stackwalk/ + +tar -acf minidump_stackwalk.tar.$COMPRESS_EXT minidump_stackwalk/ +mkdir -p $UPLOAD_DIR +cp minidump_stackwalk.tar.$COMPRESS_EXT $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/build-nasm.sh b/taskcluster/scripts/misc/build-nasm.sh new file mode 100755 index 0000000000..2c1cd8de57 --- /dev/null +++ b/taskcluster/scripts/misc/build-nasm.sh @@ -0,0 +1,53 @@ +#!/bin/bash +set -x -e -v + +COMPRESS_EXT=bz2 + +if [ -n "$TOOLTOOL_MANIFEST" ]; then + . $GECKO_PATH/taskcluster/scripts/misc/tooltool-download.sh +fi + +cd $MOZ_FETCHES_DIR/nasm-* +case "$1" in + win64) + export PATH="$MOZ_FETCHES_DIR/clang/bin:$PATH" + ./configure CC=x86_64-w64-mingw32-clang AR=llvm-ar RANLIB=llvm-ranlib --host=x86_64-w64-mingw32 + EXE=.exe + ;; + macosx64) + export PATH="$MOZ_FETCHES_DIR/clang/bin:$MOZ_FETCHES_DIR/cctools/bin:$PATH" + export LD_LIBRARY_PATH="$MOZ_FETCHES_DIR/clang/lib" + ./configure CC="clang --target=x86_64-apple-darwin -isysroot $MOZ_FETCHES_DIR/MacOSX10.12.sdk" --host=x86_64-apple-darwin + cat config.log + EXE= + ;; + *) + # Fix for .debug_loc section containing garbage on elf32 + # https://bugzilla.nasm.us/show_bug.cgi?id=3392631 + patch -p1 <<'EOF' +diff --git a/output/outelf.c b/output/outelf.c +index de99d076..47031e12 100644 +--- a/output/outelf.c ++++ b/output/outelf.c +@@ -3275,7 +3275,7 @@ static void dwarf_generate(void) + WRITELONG(pbuf,framelen-4); /* initial length */ + + /* build loc section */ +- loclen = 16; ++ loclen = is_elf64() ? 16 : 8; + locbuf = pbuf = nasm_malloc(loclen); + if (is_elf32()) { + WRITELONG(pbuf,0); /* null beginning offset */ +EOF + ./configure + EXE= + ;; +esac +make -j$(nproc) + +mv nasm$EXE nasm-tmp +mkdir nasm +mv nasm-tmp nasm/nasm$EXE +tar -acf nasm.tar.$COMPRESS_EXT nasm +mkdir -p "$UPLOAD_DIR" +cp nasm.tar.$COMPRESS_EXT "$UPLOAD_DIR" diff --git a/taskcluster/scripts/misc/build-resourcemonitor.sh b/taskcluster/scripts/misc/build-resourcemonitor.sh new file mode 100755 index 0000000000..f12317012e --- /dev/null +++ b/taskcluster/scripts/misc/build-resourcemonitor.sh @@ -0,0 +1,40 @@ +#!/bin/bash +set -x -e -v + +cd "$MOZ_FETCHES_DIR"/resource-monitor/ || exit 1 +COMPRESS_EXT=xz + +PATH="$MOZ_FETCHES_DIR/go/bin:$PATH" +export PATH + +EXE_SUFFIX="" + +case "$1" in + linux64) GOOS=linux; GOARCH=amd64 ;; + macos64) GOOS=darwin; GOARCH=amd64 ;; + windows64) GOOS=windows; GOARCH=amd64; EXE_SUFFIX=".exe" ;; + windows32) GOOS=windows; GOARCH=386; EXE_SUFFIX=".exe" ;; + *) + echo "Unknown architecture $1 not recognized in build-resourcemonitor.sh" >&2 + exit 1 + ;; +esac + +export GOOS +export GOARCH +export EXE_SUFFIX + +echo "GOOS=$GOOS" +echo "GOARCH=$GOARCH" + +go build . + +STAGING_DIR="resource-monitor" +mv "resource-monitor${EXE_SUFFIX}" resource-monitor.tmp +mkdir "${STAGING_DIR}" + +cp resource-monitor.tmp "${STAGING_DIR}/resource-monitor${EXE_SUFFIX}" + +tar -acf "resource-monitor.tar.$COMPRESS_EXT" "${STAGING_DIR}"/ +mkdir -p "$UPLOAD_DIR" +cp "resource-monitor.tar.$COMPRESS_EXT" "$UPLOAD_DIR" diff --git a/taskcluster/scripts/misc/build-rust-size.sh b/taskcluster/scripts/misc/build-rust-size.sh new file mode 100755 index 0000000000..0d4f64bb52 --- /dev/null +++ b/taskcluster/scripts/misc/build-rust-size.sh @@ -0,0 +1,39 @@ +#!/bin/bash +set -x -e -v + +PROJECT=rust-size + +# This script is for building rust-size +case "$(uname -s)" in +Linux) + COMPRESS_EXT=xz + ;; +MINGW*) + UPLOAD_DIR=$PWD/public/build + COMPRESS_EXT=bz2 + + . $GECKO_PATH/taskcluster/scripts/misc/vs-setup.sh + ;; +esac + +cd $GECKO_PATH + +if [ -n "$TOOLTOOL_MANIFEST" ]; then + . taskcluster/scripts/misc/tooltool-download.sh +fi + +PATH="$(cd $MOZ_FETCHES_DIR && pwd)/rustc/bin:$PATH" + +cd $MOZ_FETCHES_DIR/$PROJECT + +cargo build --verbose --release + +mkdir $PROJECT +cp target/release/${PROJECT}* ${PROJECT}/ +tar -acf ${PROJECT}.tar.$COMPRESS_EXT $PROJECT +mkdir -p $UPLOAD_DIR +cp ${PROJECT}.tar.$COMPRESS_EXT $UPLOAD_DIR + +cd .. + +. $GECKO_PATH/taskcluster/scripts/misc/vs-cleanup.sh diff --git a/taskcluster/scripts/misc/build-sccache.sh b/taskcluster/scripts/misc/build-sccache.sh new file mode 100755 index 0000000000..a2df62ac2a --- /dev/null +++ b/taskcluster/scripts/misc/build-sccache.sh @@ -0,0 +1,64 @@ +#!/bin/bash +set -x -e -v + +# Needed by osx-cross-linker. +export TARGET="$1" + +# This script is for building sccache + +case "$(uname -s)" in +Linux) + COMPRESS_EXT=xz + PATH="$MOZ_FETCHES_DIR/binutils/bin:$PATH" + ;; +MINGW*) + UPLOAD_DIR=$PWD/public/build + COMPRESS_EXT=bz2 + + . $GECKO_PATH/taskcluster/scripts/misc/vs-setup.sh + ;; +esac + +cd $GECKO_PATH + +if [ -n "$TOOLTOOL_MANIFEST" ]; then + . taskcluster/scripts/misc/tooltool-download.sh +fi + +PATH="$(cd $MOZ_FETCHES_DIR && pwd)/rustc/bin:$PATH" + +cd $MOZ_FETCHES_DIR/sccache + +COMMON_FEATURES="native-zlib" + +case "$(uname -s)" in +Linux) + if [ "$TARGET" == "x86_64-apple-darwin" ]; then + export PATH="$MOZ_FETCHES_DIR/llvm-dsymutil/bin:$PATH" + export PATH="$MOZ_FETCHES_DIR/cctools/bin:$PATH" + export RUSTFLAGS="-C linker=$GECKO_PATH/taskcluster/scripts/misc/osx-cross-linker" + export CC="$MOZ_FETCHES_DIR/clang/bin/clang" + export TARGET_CC="$MOZ_FETCHES_DIR/clang/bin/clang -isysroot $MOZ_FETCHES_DIR/MacOSX10.12.sdk" + cargo build --features "all $COMMON_FEATURES" --verbose --release --target $TARGET + else + cargo build --features "all dist-server openssl/vendored $COMMON_FEATURES" --verbose --release + fi + + ;; +MINGW*) + cargo build --verbose --release --features="dist-client s3 gcs $COMMON_FEATURES" + ;; +esac + +SCCACHE_OUT=target/release/sccache* +if [ -n "$TARGET" ]; then + SCCACHE_OUT=target/$TARGET/release/sccache* +fi + +mkdir sccache +cp $SCCACHE_OUT sccache/ +tar -acf sccache.tar.$COMPRESS_EXT sccache +mkdir -p $UPLOAD_DIR +cp sccache.tar.$COMPRESS_EXT $UPLOAD_DIR + +. $GECKO_PATH/taskcluster/scripts/misc/vs-cleanup.sh diff --git a/taskcluster/scripts/misc/build-upx.sh b/taskcluster/scripts/misc/build-upx.sh new file mode 100755 index 0000000000..22272926dd --- /dev/null +++ b/taskcluster/scripts/misc/build-upx.sh @@ -0,0 +1,26 @@ +#!/bin/bash +set -x -e -v + +WORKSPACE=$HOME/workspace +INSTALL_DIR=$WORKSPACE/upx + +mkdir -p $INSTALL_DIR/bin + +cd $WORKSPACE + +git clone -n https://github.com/upx/upx.git upx-clone +cd upx-clone +# https://github.com/upx/upx/releases/tag/v3.95 +git checkout 7a3637ff5a800b8bcbad20ae7f668d8c8449b014 # Asserts integrity of the clone (right?) +git submodule update --init --recursive +cd src +make -j$(nproc) +cp upx.out $INSTALL_DIR/bin/upx + +# -------------- + +cd $WORKSPACE +tar caf upx.tar.xz upx + +mkdir -p $UPLOAD_DIR +cp upx.tar.* $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/build-wasi-sysroot.sh b/taskcluster/scripts/misc/build-wasi-sysroot.sh new file mode 100755 index 0000000000..db2de5651f --- /dev/null +++ b/taskcluster/scripts/misc/build-wasi-sysroot.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -x -e -v + +export PATH="$MOZ_FETCHES_DIR/gcc/bin:$MOZ_FETCHES_DIR/binutils/bin:$PATH" +export LD_LIBRARY_PATH="$MOZ_FETCHES_DIR/gcc/lib64/:$LD_LIBRARY_PATH" +cd $MOZ_FETCHES_DIR/wasi-sdk +PREFIX=$MOZ_FETCHES_DIR/wasi-sdk/wasi-sysroot +LLVM_PROJ_DIR=$MOZ_FETCHES_DIR/llvm-project +make LLVM_PROJ_DIR=$LLVM_PROJ_DIR PREFIX=$PREFIX +# Put a tarball in the artifacts dir +mkdir -p $UPLOAD_DIR +tar -C $MOZ_FETCHES_DIR/wasi-sdk/build/install/$PREFIX/../ -caf $UPLOAD_DIR/wasi-sysroot.tar.xz wasi-sysroot diff --git a/taskcluster/scripts/misc/build-winchecksec.sh b/taskcluster/scripts/misc/build-winchecksec.sh new file mode 100755 index 0000000000..5f9d8b0620 --- /dev/null +++ b/taskcluster/scripts/misc/build-winchecksec.sh @@ -0,0 +1,53 @@ +#!/bin/bash +set -e -v -x + +mkdir -p $UPLOAD_DIR + +cd $MOZ_FETCHES_DIR/winchecksec + +if test -n "$TOOLTOOL_MANIFEST"; then + export PATH="$MOZ_FETCHES_DIR/clang/bin:$PATH" + + export LD_PRELOAD=$MOZ_FETCHES_DIR/liblowercase/liblowercase.so + export LOWERCASE_DIRS=$MOZ_FETCHES_DIR/vs2017_15.8.4 + + . $GECKO_PATH/taskcluster/scripts/misc/vs-setup.sh + . $GECKO_PATH/taskcluster/scripts/misc/tooltool-download.sh + + # Patch pe-parse because clang-cl doesn't support /analyze. + patch -p1 <<'EOF' +--- a/pe-parse/cmake/compilation_flags.cmake ++++ b/pe-parse/cmake/compilation_flags.cmake +@@ -1,5 +1,5 @@ + if (MSVC) +- list(APPEND DEFAULT_CXX_FLAGS /W4 /analyze) ++ list(APPEND DEFAULT_CXX_FLAGS /W4) + + if (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") + list(APPEND DEFAULT_CXX_FLAGS /Zi) +EOF + + CMAKE_FLAGS=' + -DCMAKE_CXX_COMPILER=clang-cl + -DCMAKE_C_COMPILER=clang-cl + -DCMAKE_LINKER=lld-link + -DCMAKE_C_FLAGS=-fuse-ld=lld + -DCMAKE_CXX_FLAGS="-fuse-ld=lld -EHsc" + -DCMAKE_RC_COMPILER=llvm-rc + -DCMAKE_MT=llvm-mt + -DCMAKE_SYSTEM_NAME=Windows + -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded + ' +fi + +eval cmake \ + -GNinja \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=Off \ + $CMAKE_FLAGS + +ninja -v + +cd .. +tar -caf winchecksec.tar.bz2 winchecksec/winchecksec${TOOLTOOL_MANIFEST:+.exe} +cp winchecksec.tar.bz2 $UPLOAD_DIR/ diff --git a/taskcluster/scripts/misc/build-wine.sh b/taskcluster/scripts/misc/build-wine.sh new file mode 100755 index 0000000000..f1ebba7553 --- /dev/null +++ b/taskcluster/scripts/misc/build-wine.sh @@ -0,0 +1,29 @@ +#!/bin/bash +set -x -e -v + +WORKSPACE=$HOME/workspace +INSTALL_DIR=$WORKSPACE/wine + +mkdir -p $INSTALL_DIR +mkdir -p $WORKSPACE/build/wine +mkdir -p $WORKSPACE/build/wine64 + +cd $WORKSPACE/build/wine64 +$MOZ_FETCHES_DIR/wine-5.0/configure --enable-win64 --without-x --without-freetype --prefix=$INSTALL_DIR/ +make -j$(nproc) + +cd $WORKSPACE/build/wine +$MOZ_FETCHES_DIR/wine-5.0/configure --with-wine64=../wine64 --without-x --without-freetype --prefix=$INSTALL_DIR/ +make -j$(nproc) +make install + +cd $WORKSPACE/build/wine64 +make install + +# -------------- + +cd $WORKSPACE/ +tar caf wine.tar.xz wine + +mkdir -p $UPLOAD_DIR +cp wine.tar.* $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/exfiltrate-pdbstr.sh b/taskcluster/scripts/misc/exfiltrate-pdbstr.sh new file mode 100644 index 0000000000..301de5e363 --- /dev/null +++ b/taskcluster/scripts/misc/exfiltrate-pdbstr.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +set -x -e -v + +# Copy the file that already exists on Windows workers. +mkdir pdbstr +cp "c:/Program Files (x86)/Windows Kits/10/Debuggers/$1/srcsrv/pdbstr.exe" pdbstr + +tar -jcvf pdbstr.tar.bz2 pdbstr diff --git a/taskcluster/scripts/misc/fetch-chromium.py b/taskcluster/scripts/misc/fetch-chromium.py new file mode 100644 index 0000000000..c7eae1df5e --- /dev/null +++ b/taskcluster/scripts/misc/fetch-chromium.py @@ -0,0 +1,234 @@ +#!/usr/bin/python3 -u +# -*- coding: utf-8 -*- + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +""" +This script downloads the latest chromium build (or a manually +defined version) for a given platform. It then uploads the build, +with the revision of the build stored in a REVISION file. +""" + +from __future__ import absolute_import, print_function + +import argparse +import errno +import os +import shutil +import subprocess +import requests +import tempfile + + +LAST_CHANGE_URL = ( + # formatted with platform + "https://www.googleapis.com/download/storage/v1/b/" + "chromium-browser-snapshots/o/{}%2FLAST_CHANGE?alt=media" +) + +CHROMIUM_BASE_URL = ( + # formatted with (platform/revision/archive) + "https://www.googleapis.com/download/storage/v1/b/" + "chromium-browser-snapshots/o/{}%2F{}%2F{}?alt=media" +) + + +CHROMIUM_INFO = { + "linux": { + "platform": "Linux_x64", + "chromium": "chrome-linux.zip", + "result": "chromium-linux.tar.bz2", + "chromedriver": "chromedriver_linux64.zip", + }, + "win32": { + "platform": "Win", + "chromium": "chrome-win.zip", + "result": "chromium-win32.tar.bz2", + "chromedriver": "chromedriver_win32.zip", + }, + "win64": { + "platform": "Win", + "chromium": "chrome-win.zip", + "result": "chromium-win64.tar.bz2", + "chromedriver": "chromedriver_win32.zip", + }, + "mac": { + "platform": "Mac", + "chromium": "chrome-mac.zip", + "result": "chromium-mac.tar.bz2", + "chromedriver": "chromedriver_mac64.zip", + }, +} + + +def log(msg): + print("build-chromium: %s" % msg) + + +def fetch_file(url, filepath): + """Download a file from the given url to a given file.""" + size = 4096 + r = requests.get(url, stream=True) + r.raise_for_status() + + with open(filepath, "wb") as fd: + for chunk in r.iter_content(size): + fd.write(chunk) + + +def unzip(zippath, target): + """Unzips an archive to the target location.""" + log("Unpacking archive at: %s to: %s" % (zippath, target)) + unzip_command = ["unzip", "-q", "-o", zippath, "-d", target] + subprocess.check_call(unzip_command) + + +def fetch_chromium_revision(platform): + """Get the revision of the latest chromium build. """ + chromium_platform = CHROMIUM_INFO[platform]["platform"] + revision_url = LAST_CHANGE_URL.format(chromium_platform) + + log("Getting revision number for latest %s chromium build..." % chromium_platform) + + # Expecting a file with a single number indicating the latest + # chromium build with a chromedriver that we can download + r = requests.get(revision_url, timeout=30) + r.raise_for_status() + + chromium_revision = r.content.decode("utf-8") + return chromium_revision.strip() + + +def fetch_chromium_build(platform, revision, zippath): + """Download a chromium build for a given revision, or the latest. """ + if not revision: + revision = fetch_chromium_revision(platform) + + download_platform = CHROMIUM_INFO[platform]["platform"] + download_url = CHROMIUM_BASE_URL.format( + download_platform, revision, CHROMIUM_INFO[platform]["chromium"] + ) + + log("Downloading %s chromium build revision %s..." % (download_platform, revision)) + + fetch_file(download_url, zippath) + return revision + + +def fetch_chromedriver(platform, revision, chromium_dir): + """Get the chromedriver for the given revision and repackage it.""" + download_url = CHROMIUM_BASE_URL.format( + CHROMIUM_INFO[platform]["platform"], + revision, + CHROMIUM_INFO[platform]["chromedriver"], + ) + + tmpzip = os.path.join(tempfile.mkdtemp(), "cd-tmp.zip") + log("Downloading chromedriver from %s" % download_url) + fetch_file(download_url, tmpzip) + + tmppath = tempfile.mkdtemp() + unzip(tmpzip, tmppath) + + # Find the chromedriver then copy it to the chromium directory + cd_path = None + for dirpath, _, filenames in os.walk(tmppath): + for filename in filenames: + if filename == "chromedriver" or filename == "chromedriver.exe": + cd_path = os.path.join(dirpath, filename) + break + if cd_path is not None: + break + if cd_path is None: + raise Exception("Could not find chromedriver binary in %s" % tmppath) + log("Copying chromedriver from: %s to: %s" % (cd_path, chromium_dir)) + shutil.copy(cd_path, chromium_dir) + + +def build_chromium_archive(platform, revision=None): + """ + Download and store a chromium build for a given platform. + + Retrieves either the latest version, or uses a pre-defined version if + the `--revision` option is given a revision. + """ + upload_dir = os.environ.get("UPLOAD_DIR") + if upload_dir: + # Create the upload directory if it doesn't exist. + try: + log("Creating upload directory in %s..." % os.path.abspath(upload_dir)) + os.makedirs(upload_dir) + except OSError as e: + if e.errno != errno.EEXIST: + raise + + # Make a temporary location for the file + tmppath = tempfile.mkdtemp() + tmpzip = os.path.join(tmppath, "tmp-chromium.zip") + + revision = fetch_chromium_build(platform, revision, tmpzip) + + # Unpack archive in `tmpzip` to store the revision number and + # the chromedriver + unzip(tmpzip, tmppath) + + dirs = [ + d + for d in os.listdir(tmppath) + if os.path.isdir(os.path.join(tmppath, d)) and d.startswith("chrome-") + ] + + if len(dirs) > 1: + raise Exception( + "Too many directories starting with `chrome-` after extracting." + ) + elif len(dirs) == 0: + raise Exception( + "Could not find any directories after extraction of chromium zip." + ) + + chromium_dir = os.path.join(tmppath, dirs[0]) + revision_file = os.path.join(chromium_dir, ".REVISION") + with open(revision_file, "w+") as f: + f.write(str(revision)) + + # Get and store the chromedriver + fetch_chromedriver(platform, revision, chromium_dir) + + tar_file = CHROMIUM_INFO[platform]["result"] + tar_command = ["tar", "cjf", tar_file, "-C", tmppath, dirs[0]] + log("Added revision to %s file." % revision_file) + + log("Tarring with the command: %s" % str(tar_command)) + subprocess.check_call(tar_command) + + upload_dir = os.environ.get("UPLOAD_DIR") + if upload_dir: + # Move the tarball to the output directory for upload. + log("Moving %s to the upload directory..." % tar_file) + shutil.copy(tar_file, os.path.join(upload_dir, tar_file)) + + shutil.rmtree(tmppath) + + +def parse_args(): + """Read command line arguments and return options.""" + parser = argparse.ArgumentParser() + parser.add_argument( + "--platform", help="Platform version of chromium to build.", required=True + ) + parser.add_argument( + "--revision", + help="Revision of chromium to build to get. " + "(Defaults to the newest chromium build).", + default=None, + ) + + return parser.parse_args() + + +if __name__ == "__main__": + args = vars(parse_args()) + build_chromium_archive(**args) diff --git a/taskcluster/scripts/misc/fetch-content b/taskcluster/scripts/misc/fetch-content new file mode 100755 index 0000000000..11c7002592 --- /dev/null +++ b/taskcluster/scripts/misc/fetch-content @@ -0,0 +1,733 @@ +#!/usr/bin/python3 -u +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import argparse +import bz2 +import concurrent.futures +import contextlib +import datetime +import gzip +import hashlib +import json +import lzma +import multiprocessing +import os +import pathlib +import random +import stat +import subprocess +import sys +import tarfile +import tempfile +import time +import urllib.parse +import urllib.request +import zipfile + +try: + import zstandard +except ImportError: + zstandard = None + +try: + import certifi +except ImportError: + certifi = None + + +CONCURRENCY = multiprocessing.cpu_count() + + +def log(msg): + print(msg, file=sys.stderr) + sys.stderr.flush() + + +class IntegrityError(Exception): + """Represents an integrity error when downloading a URL.""" + + +def ZstdCompressor(*args, **kwargs): + if not zstandard: + raise ValueError('zstandard Python package not available') + return zstandard.ZstdCompressor(*args, **kwargs) + + +def ZstdDecompressor(*args, **kwargs): + if not zstandard: + raise ValueError('zstandard Python package not available') + return zstandard.ZstdDecompressor(*args, **kwargs) + + +@contextlib.contextmanager +def rename_after_close(fname, *args, **kwargs): + """ + Context manager that opens a temporary file to use as a writer, + and closes the file on context exit, renaming it to the expected + file name in case of success, or removing it in case of failure. + + Takes the same options as open(), but must be used as a context + manager. + """ + path = pathlib.Path(fname) + tmp = path.with_name('%s.tmp' % path.name) + try: + with tmp.open(*args, **kwargs) as fh: + yield fh + except Exception: + tmp.unlink() + raise + else: + tmp.rename(fname) + + +# The following is copied from +# https://github.com/mozilla-releng/redo/blob/6d07678a014e0c525e54a860381a165d34db10ff/redo/__init__.py#L15-L85 +def retrier(attempts=5, sleeptime=10, max_sleeptime=300, sleepscale=1.5, jitter=1): + """ + A generator function that sleeps between retries, handles exponential + backoff and jitter. The action you are retrying is meant to run after + retrier yields. + + At each iteration, we sleep for sleeptime + random.randint(-jitter, jitter). + Afterwards sleeptime is multiplied by sleepscale for the next iteration. + + Args: + attempts (int): maximum number of times to try; defaults to 5 + sleeptime (float): how many seconds to sleep between tries; defaults to + 60s (one minute) + max_sleeptime (float): the longest we'll sleep, in seconds; defaults to + 300s (five minutes) + sleepscale (float): how much to multiply the sleep time by each + iteration; defaults to 1.5 + jitter (int): random jitter to introduce to sleep time each iteration. + the amount is chosen at random between [-jitter, +jitter] + defaults to 1 + + Yields: + None, a maximum of `attempts` number of times + + Example: + >>> n = 0 + >>> for _ in retrier(sleeptime=0, jitter=0): + ... if n == 3: + ... # We did the thing! + ... break + ... n += 1 + >>> n + 3 + + >>> n = 0 + >>> for _ in retrier(sleeptime=0, jitter=0): + ... if n == 6: + ... # We did the thing! + ... break + ... n += 1 + ... else: + ... print("max tries hit") + max tries hit + """ + jitter = jitter or 0 # py35 barfs on the next line if jitter is None + if jitter > sleeptime: + # To prevent negative sleep times + raise Exception('jitter ({}) must be less than sleep time ({})'.format(jitter, sleeptime)) + + sleeptime_real = sleeptime + for _ in range(attempts): + log("attempt %i/%i" % (_ + 1, attempts)) + + yield sleeptime_real + + if jitter: + sleeptime_real = sleeptime + random.randint(-jitter, jitter) + # our jitter should scale along with the sleeptime + jitter = int(jitter * sleepscale) + else: + sleeptime_real = sleeptime + + sleeptime *= sleepscale + + if sleeptime_real > max_sleeptime: + sleeptime_real = max_sleeptime + + # Don't need to sleep the last time + if _ < attempts - 1: + log("sleeping for %.2fs (attempt %i/%i)" % (sleeptime_real, _ + 1, attempts)) + time.sleep(sleeptime_real) + + +def stream_download(url, sha256=None, size=None): + """Download a URL to a generator, optionally with content verification. + + If ``sha256`` or ``size`` are defined, the downloaded URL will be + validated against those requirements and ``IntegrityError`` will be + raised if expectations do not match. + + Because verification cannot occur until the file is completely downloaded + it is recommended for consumers to not do anything meaningful with the + data if content verification is being used. To securely handle retrieved + content, it should be streamed to a file or memory and only operated + on after the generator is exhausted without raising. + """ + log('Downloading %s' % url) + + h = hashlib.sha256() + length = 0 + + t0 = time.time() + with urllib.request.urlopen(url, cafile=certifi.where()) if certifi else urllib.request.urlopen(url) as fh: + if not url.endswith('.gz') and fh.info().get('Content-Encoding') == 'gzip': + fh = gzip.GzipFile(fileobj=fh) + + while True: + chunk = fh.read(65536) + if not chunk: + break + + h.update(chunk) + length += len(chunk) + + yield chunk + + duration = time.time() - t0 + digest = h.hexdigest() + + log('%s resolved to %d bytes with sha256 %s in %.3fs' % ( + url, length, digest, duration)) + + if size: + if size == length: + log('Verified size of %s' % url) + else: + raise IntegrityError('size mismatch on %s: wanted %d; got %d' % ( + url, size, length)) + + if sha256: + if digest == sha256: + log('Verified sha256 integrity of %s' % url) + else: + raise IntegrityError('sha256 mismatch on %s: wanted %s; got %s' % ( + url, sha256, digest)) + + +def download_to_path(url, path, sha256=None, size=None): + """Download a URL to a filesystem path, possibly with verification.""" + + # We download to a temporary file and rename at the end so there's + # no chance of the final file being partially written or containing + # bad data. + try: + path.unlink() + except FileNotFoundError: + pass + + for _ in retrier(attempts=5, sleeptime=60): + try: + log('Downloading %s to %s' % (url, path)) + + with rename_after_close(path, 'wb') as fh: + for chunk in stream_download(url, sha256=sha256, size=size): + fh.write(chunk) + + return + except IntegrityError: + raise + except Exception as e: + log("Download failed: {}".format(e)) + continue + + raise Exception("Download failed, no more retries!") + + +def download_to_memory(url, sha256=None, size=None): + """Download a URL to memory, possibly with verification.""" + + data = b"" + for _ in retrier(attempts=5, sleeptime=60): + try: + log('Downloading %s' % (url)) + + for chunk in stream_download(url, sha256=sha256, size=size): + data += chunk + + return data + except IntegrityError: + raise + except Exception as e: + log("Download failed: {}".format(e)) + continue + + raise Exception("Download failed, no more retries!") + + +def gpg_verify_path(path: pathlib.Path, public_key_data: bytes, + signature_data: bytes): + """Verify that a filesystem path verifies using GPG. + + Takes a Path defining a file to verify. ``public_key_data`` contains + bytes with GPG public key data. ``signature_data`` contains a signed + GPG document to use with ``gpg --verify``. + """ + log('Validating GPG signature of %s' % path) + log('GPG key data:\n%s' % public_key_data.decode('ascii')) + + with tempfile.TemporaryDirectory() as td: + try: + # --batch since we're running unattended. + gpg_args = ['gpg', '--homedir', td, '--batch'] + + log('Importing GPG key...') + subprocess.run(gpg_args + ['--import'], + input=public_key_data, + check=True) + + log('Verifying GPG signature...') + subprocess.run(gpg_args + ['--verify', '-', '%s' % path], + input=signature_data, + check=True) + + log('GPG signature verified!') + finally: + # There is a race between the agent self-terminating and + # shutil.rmtree() from the temporary directory cleanup that can + # lead to exceptions. Kill the agent before cleanup to prevent this. + env = dict(os.environ) + env['GNUPGHOME'] = td + subprocess.run(['gpgconf', '--kill', 'gpg-agent'], env=env) + + +def open_tar_stream(path: pathlib.Path): + """""" + if path.suffix == '.bz2': + return bz2.open(str(path), 'rb') + elif path.suffix == '.gz': + return gzip.open(str(path), 'rb') + elif path.suffix == '.xz': + return lzma.open(str(path), 'rb') + elif path.suffix == '.zst': + dctx = ZstdDecompressor() + return dctx.stream_reader(path.open('rb')) + elif path.suffix == '.tar': + return path.open('rb') + else: + raise ValueError('unknown archive format for tar file: %s' % path) + + +def archive_type(path: pathlib.Path): + """Attempt to identify a path as an extractable archive.""" + if path.suffixes[-2:-1] == ['.tar']: + return 'tar' + elif path.suffix == '.zip': + return 'zip' + else: + return None + + +def extract_archive(path, dest_dir, typ): + """Extract an archive to a destination directory.""" + + # Resolve paths to absolute variants. + path = path.resolve() + dest_dir = dest_dir.resolve() + + log('Extracting %s to %s' % (path, dest_dir)) + t0 = time.time() + + # We pipe input to the decompressor program so that we can apply + # custom decompressors that the program may not know about. + if typ == 'tar': + ifh = open_tar_stream(path) + # On Windows, the tar program doesn't support things like symbolic + # links, while Windows actually support them. The tarfile module in + # python does. So use that. But since it's significantly slower than + # the tar program on Linux, only use tarfile on Windows (tarfile is + # also not much slower on Windows, presumably because of the + # notoriously bad I/O). + if sys.platform == 'win32': + tar = tarfile.open(fileobj=ifh, mode='r|') + tar.extractall(str(dest_dir)) + args = [] + else: + args = ['tar', 'xf', '-'] + pipe_stdin = True + elif typ == 'zip': + # unzip from stdin has wonky behavior. We don't use a pipe for it. + ifh = open(os.devnull, 'rb') + args = ['unzip', '-o', str(path)] + pipe_stdin = False + else: + raise ValueError('unknown archive format: %s' % path) + + if args: + with ifh, subprocess.Popen(args, cwd=str(dest_dir), bufsize=0, + stdin=subprocess.PIPE) as p: + while True: + if not pipe_stdin: + break + + chunk = ifh.read(131072) + if not chunk: + break + + p.stdin.write(chunk) + + if p.returncode: + raise Exception('%r exited %d' % (args, p.returncode)) + + log('%s extracted in %.3fs' % (path, time.time() - t0)) + + +def repack_archive(orig: pathlib.Path, dest: pathlib.Path, + strip_components=0, prefix=''): + assert orig != dest + log('Repacking as %s' % dest) + orig_typ = archive_type(orig) + typ = archive_type(dest) + if not orig_typ: + raise Exception('Archive type not supported for %s' % orig.name) + if not typ: + raise Exception('Archive type not supported for %s' % dest.name) + + if dest.suffixes[-2:] != ['.tar', '.zst']: + raise Exception('Only producing .tar.zst archives is supported.') + + if strip_components or prefix: + def filter(name): + if strip_components: + stripped = '/'.join(name.split('/')[strip_components:]) + if not stripped: + raise Exception( + 'Stripping %d components would remove files' + % strip_components) + name = stripped + return prefix + name + else: + filter = None + + with rename_after_close(dest, 'wb') as fh: + ctx = ZstdCompressor() + if orig_typ == 'zip': + assert typ == 'tar' + zip = zipfile.ZipFile(orig) + # Convert the zip stream to a tar on the fly. + with ctx.stream_writer(fh) as compressor, \ + tarfile.open(fileobj=compressor, mode='w:') as tar: + for zipinfo in zip.infolist(): + if zipinfo.is_dir(): + continue + tarinfo = tarfile.TarInfo() + filename = zipinfo.filename + tarinfo.name = filter(filename) if filter else filename + tarinfo.size = zipinfo.file_size + # Zip files don't have any knowledge of the timezone + # they were created in. Which is not really convenient to + # reliably convert to a timestamp. But we don't really + # care about accuracy, but rather about reproducibility, + # so we pick UTC. + time = datetime.datetime( + *zipinfo.date_time, tzinfo=datetime.timezone.utc) + tarinfo.mtime = time.timestamp() + # 0 is MS-DOS, 3 is UNIX. Only in the latter case do we + # get anything useful for the tar file mode. + if zipinfo.create_system == 3: + mode = zipinfo.external_attr >> 16 + else: + mode = 0o0644 + tarinfo.mode = stat.S_IMODE(mode) + if stat.S_ISLNK(mode): + tarinfo.type = tarfile.SYMTYPE + tarinfo.linkname = zip.read(filename).decode() + tar.addfile(tarinfo, zip.open(filename)) + elif stat.S_ISREG(mode) or stat.S_IFMT(mode) == 0: + tar.addfile(tarinfo, zip.open(filename)) + else: + raise Exception('Unsupported file mode %o' + % stat.S_IFMT(mode)) + + elif orig_typ == 'tar': + if typ == 'zip': + raise Exception('Repacking a tar to zip is not supported') + assert typ == 'tar' + + ifh = open_tar_stream(orig) + if filter: + # To apply the filter, we need to open the tar stream and + # tweak it. + origtar = tarfile.open(fileobj=ifh, mode='r|') + with ctx.stream_writer(fh) as compressor, \ + tarfile.open(fileobj=compressor, mode='w:') as tar: + for tarinfo in origtar: + if tarinfo.isdir(): + continue + tarinfo.name = filter(tarinfo.name) + tar.addfile(tarinfo, origtar.extractfile(tarinfo)) + else: + # We only change compression here. The tar stream is unchanged. + ctx.copy_stream(ifh, fh) + + +def fetch_and_extract(url, dest_dir, extract=True, sha256=None, size=None): + """Fetch a URL and extract it to a destination path. + + If the downloaded URL is an archive, it is extracted automatically + and the archive is deleted. Otherwise the file remains in place in + the destination directory. + """ + + basename = urllib.parse.urlparse(url).path.split('/')[-1] + dest_path = dest_dir / basename + + download_to_path(url, dest_path, sha256=sha256, size=size) + + if not extract: + return + + typ = archive_type(dest_path) + if typ: + extract_archive(dest_path, dest_dir, typ) + log('Removing %s' % dest_path) + dest_path.unlink() + + +def fetch_urls(downloads): + """Fetch URLs pairs to a pathlib.Path.""" + with concurrent.futures.ThreadPoolExecutor(CONCURRENCY) as e: + fs = [] + + for download in downloads: + fs.append(e.submit(fetch_and_extract, *download)) + + for f in fs: + f.result() + + +def git_checkout_archive(dest_path: pathlib.Path, repo: str, commit: str, + prefix=None, ssh_key=None): + """Produce an archive of the files comprising a Git checkout.""" + dest_path.parent.mkdir(parents=True, exist_ok=True) + + if dest_path.suffixes[-2:] != ['.tar', '.zst']: + raise Exception('Only producing .tar.zst archives is supported.') + + with tempfile.TemporaryDirectory() as td: + temp_dir = pathlib.Path(td) + + if not prefix: + prefix = repo.rstrip('/').rsplit('/', 1)[-1] + git_dir = temp_dir / prefix + + # This could be faster with a shallow clone. However, Git requires a ref + # to initiate a clone. Since the commit-ish may not refer to a ref, we + # simply perform a full clone followed by a checkout. + print('cloning %s to %s' % (repo, git_dir)) + + env = os.environ.copy() + keypath = "" + if ssh_key: + taskcluster_secret_url = api(os.environ.get('TASKCLUSTER_PROXY_URL'), "secrets", "v1", "secret/{keypath}".format(keypath=ssh_key)) + taskcluster_secret = b''.join(stream_download(taskcluster_secret_url)) + taskcluster_secret = json.loads(taskcluster_secret) + sshkey = taskcluster_secret['secret']['ssh_privkey'] + + keypath = temp_dir.joinpath("ssh-key") + keypath.write_text(sshkey) + keypath.chmod(0o600) + + env = {"GIT_SSH_COMMAND": "ssh -o 'StrictHostKeyChecking no' -i {keypath}".format(keypath=keypath)} + + subprocess.run(['git', 'clone', '-n', repo, str(git_dir)], + check=True, env=env) + + subprocess.run(['git', 'checkout', commit], + cwd=str(git_dir), check=True) + + subprocess.run(['git', 'submodule', 'update', '--init'], + cwd=str(git_dir), check=True) + + if keypath: + os.remove(keypath) + + print('creating archive %s of commit %s' % (dest_path, commit)) + proc = subprocess.Popen([ + 'tar', 'cf', '-', '--exclude=.git', '-C', str(temp_dir), prefix, + ], stdout=subprocess.PIPE) + + with rename_after_close(dest_path, 'wb') as out: + ctx = ZstdCompressor() + ctx.copy_stream(proc.stdout, out) + + proc.wait() + + +def command_git_checkout_archive(args): + dest = pathlib.Path(args.dest) + + try: + git_checkout_archive(dest, args.repo, args.commit, + prefix=args.path_prefix, ssh_key=args.ssh_key_secret) + except Exception: + try: + dest.unlink() + except FileNotFoundError: + pass + + raise + + +def command_static_url(args): + gpg_sig_url = args.gpg_sig_url + gpg_env_key = args.gpg_key_env + + if bool(gpg_sig_url) != bool(gpg_env_key): + print('--gpg-sig-url and --gpg-key-env must both be defined') + return 1 + + if gpg_sig_url: + gpg_signature = b''.join(stream_download(gpg_sig_url)) + gpg_key = os.environb[gpg_env_key.encode('ascii')] + + dest = pathlib.Path(args.dest) + dest.parent.mkdir(parents=True, exist_ok=True) + + basename = urllib.parse.urlparse(args.url).path.split('/')[-1] + if basename.endswith(''.join(dest.suffixes)): + dl_dest = dest + else: + dl_dest = dest.parent / basename + + try: + download_to_path(args.url, dl_dest, sha256=args.sha256, size=args.size) + + if gpg_sig_url: + gpg_verify_path(dl_dest, gpg_key, gpg_signature) + + if dl_dest != dest or args.strip_components or args.add_prefix: + repack_archive(dl_dest, dest, args.strip_components, args.add_prefix) + except Exception: + try: + dl_dest.unlink() + except FileNotFoundError: + pass + + raise + + if dl_dest != dest: + log('Removing %s' % dl_dest) + dl_dest.unlink() + + +def api(root_url, service, version, path): + # taskcluster-lib-urls is not available when this script runs, so + # simulate its behavior: + return '{root_url}/api/{service}/{version}/{path}'.format( + root_url=root_url, service=service, version=version, path=path) + + +def get_hash(fetch, root_url): + path = 'task/{task}/artifacts/{artifact}'.format( + task=fetch['task'], artifact='public/chain-of-trust.json') + url = api(root_url, 'queue', 'v1', path) + cot = json.loads(download_to_memory(url)) + return cot['artifacts'][fetch['artifact']]['sha256'] + + +def command_task_artifacts(args): + start = time.monotonic() + fetches = json.loads(os.environ['MOZ_FETCHES']) + downloads = [] + for fetch in fetches: + extdir = pathlib.Path(args.dest) + if 'dest' in fetch: + # Note: normpath doesn't like pathlib.Path in python 3.5 + extdir = pathlib.Path(os.path.normpath(str(extdir.joinpath(fetch['dest'])))) + extdir.mkdir(parents=True, exist_ok=True) + root_url = os.environ['TASKCLUSTER_ROOT_URL'] + sha256 = None + if fetch.get('verify-hash'): + sha256 = get_hash(fetch, root_url) + if fetch['artifact'].startswith('public/'): + path = 'task/{task}/artifacts/{artifact}'.format( + task=fetch['task'], artifact=fetch['artifact']) + url = api(root_url, 'queue', 'v1', path) + else: + url = ('{proxy_url}/api/queue/v1/task/{task}/artifacts/{artifact}').format( + proxy_url=os.environ['TASKCLUSTER_PROXY_URL'], + task=fetch['task'], + artifact=fetch['artifact']) + downloads.append((url, extdir, fetch['extract'], sha256)) + + fetch_urls(downloads) + end = time.monotonic() + + perfherder_data = { + 'framework': {'name': 'build_metrics'}, + 'suites': [{ + 'name': 'fetch_content', + 'value': end - start, + 'lowerIsBetter': True, + 'shouldAlert': False, + 'subtests': [], + }], + } + print('PERFHERDER_DATA: {}'.format(json.dumps(perfherder_data)), file=sys.stderr) + + +def main(): + parser = argparse.ArgumentParser() + subparsers = parser.add_subparsers(title='sub commands') + + git_checkout = subparsers.add_parser( + 'git-checkout-archive', + help='Obtain an archive of files from a Git repository checkout') + git_checkout.set_defaults(func=command_git_checkout_archive) + git_checkout.add_argument('--path-prefix', + help='Prefix for paths in produced archive') + git_checkout.add_argument('repo', + help='URL to Git repository to be cloned') + git_checkout.add_argument('commit', + help='Git commit to check out') + git_checkout.add_argument('dest', + help='Destination path of archive') + git_checkout.add_argument('--ssh-key-secret', + help='The scope path of the ssh key to used for checkout') + + url = subparsers.add_parser('static-url', help='Download a static URL') + url.set_defaults(func=command_static_url) + url.add_argument('--sha256', required=True, + help='SHA-256 of downloaded content') + url.add_argument('--size', required=True, type=int, + help='Size of downloaded content, in bytes') + url.add_argument('--gpg-sig-url', + help='URL containing signed GPG document validating ' + 'URL to fetch') + url.add_argument('--gpg-key-env', + help='Environment variable containing GPG key to validate') + url.add_argument('--strip-components', type=int, default=0, + help='Number of leading components to strip from file ' + 'names in the downloaded archive') + url.add_argument('--add-prefix', default='', + help='Prefix to add to file names in the downloaded ' + 'archive') + url.add_argument('url', help='URL to fetch') + url.add_argument('dest', help='Destination path') + + artifacts = subparsers.add_parser('task-artifacts', + help='Fetch task artifacts') + artifacts.set_defaults(func=command_task_artifacts) + artifacts.add_argument('-d', '--dest', default=os.environ.get('MOZ_FETCHES_DIR'), + help='Destination directory which will contain all ' + 'artifacts (defaults to $MOZ_FETCHES_DIR)') + + args = parser.parse_args() + + if not args.dest: + parser.error('no destination directory specified, either pass in --dest ' + 'or set $MOZ_FETCHES_DIR') + + return args.func(args) + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/taskcluster/scripts/misc/generate-codeql-db-cpp.sh b/taskcluster/scripts/misc/generate-codeql-db-cpp.sh new file mode 100755 index 0000000000..57d72fd426 --- /dev/null +++ b/taskcluster/scripts/misc/generate-codeql-db-cpp.sh @@ -0,0 +1,19 @@ +#! /bin/bash -vex + +set -x -e + +#### +# Wrapper for building the CodeQL database with the build-linux script +#### + +cd /builds/worker + +$MOZ_FETCHES_DIR/codeql/codeql database create \ + --language=cpp \ + -J=-Xmx32768M \ + --command="${GECKO_PATH}/taskcluster/scripts/builder/build-linux.sh" \ + codeql-database + +# TODO Switch this to zst per 1637381 when this is used for static analysis jobs +tar cf codeql-db-cpp.tar codeql-database +xz codeql-db-cpp.tar diff --git a/taskcluster/scripts/misc/generate-codeql-db-javascript.sh b/taskcluster/scripts/misc/generate-codeql-db-javascript.sh new file mode 100755 index 0000000000..329a472140 --- /dev/null +++ b/taskcluster/scripts/misc/generate-codeql-db-javascript.sh @@ -0,0 +1,17 @@ +#! /bin/bash -vex + +set -x -e + +export PATH=$MOZ_FETCHES_DIR/node/bin:$PATH + +cd /builds/worker + +$MOZ_FETCHES_DIR/codeql/codeql database create \ + --language=javascript \ + -J=-Xmx32768M \ + --source-root=$GECKO_PATH \ + codeql-database + +# TODO Switch this to zst per 1637381 when this is used for static analysis jobs +tar cf codeql-db-javascript.tar codeql-database +xz codeql-db-javascript.tar diff --git a/taskcluster/scripts/misc/mingw-dwrite_3.patch b/taskcluster/scripts/misc/mingw-dwrite_3.patch new file mode 100644 index 0000000000..7c7b8c968a --- /dev/null +++ b/taskcluster/scripts/misc/mingw-dwrite_3.patch @@ -0,0 +1,84 @@ +From 86f4e9cbb5d3099179dc51332970d61d394116f6 Mon Sep 17 00:00:00 2001 +From: Sanketh Menda <me@snkth.com> +Date: Sat, 17 Oct 2020 15:39:42 -0400 +Subject: [PATCH] dwrite_3.h: rename GetGlyphImageFormats_ to + GetGlyphImageFormats + +Wine's WIDL currently doesn't support overloading functions, so till +that is fixed patch dwrite_3.h to rename GlyphImageFormats_ to +GetGlyphImageFormats. +--- + mingw-w64-headers/include/dwrite_3.h | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +diff --git a/mingw-w64-headers/include/dwrite_3.h b/mingw-w64-headers/include/dwrite_3.h +index 427c39e3b..dd894a8b1 100644 +--- a/mingw-w64-headers/include/dwrite_3.h ++++ b/mingw-w64-headers/include/dwrite_3.h +@@ -8168,7 +8168,7 @@ DEFINE_GUID(IID_IDWriteFontFace4, 0x27f2a904, 0x4eb8, 0x441d, 0x96,0x78, 0x05,0x + MIDL_INTERFACE("27f2a904-4eb8-441d-9678-0563f53e3e2f") + IDWriteFontFace4 : public IDWriteFontFace3 + { +- virtual HRESULT STDMETHODCALLTYPE GetGlyphImageFormats_( ++ virtual HRESULT STDMETHODCALLTYPE GetGlyphImageFormats( + UINT16 glyph, + UINT32 ppem_first, + UINT32 ppem_last, +@@ -8468,7 +8468,7 @@ typedef struct IDWriteFontFace4Vtbl { + WINBOOL *are_local); + + /*** IDWriteFontFace4 methods ***/ +- HRESULT (STDMETHODCALLTYPE *GetGlyphImageFormats_)( ++ HRESULT (STDMETHODCALLTYPE *GetGlyphImageFormats)( + IDWriteFontFace4 *This, + UINT16 glyph, + UINT32 ppem_first, +@@ -8549,7 +8549,7 @@ interface IDWriteFontFace4 { + #define IDWriteFontFace4_AreCharactersLocal(This,characters,count,enqueue_if_not,are_local) (This)->lpVtbl->AreCharactersLocal(This,characters,count,enqueue_if_not,are_local) + #define IDWriteFontFace4_AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local) (This)->lpVtbl->AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local) + /*** IDWriteFontFace4 methods ***/ +-#define IDWriteFontFace4_GetGlyphImageFormats_(This,glyph,ppem_first,ppem_last,formats) (This)->lpVtbl->GetGlyphImageFormats_(This,glyph,ppem_first,ppem_last,formats) ++#define IDWriteFontFace4_GetGlyphImageFormats(This,glyph,ppem_first,ppem_last,formats) (This)->lpVtbl->GetGlyphImageFormats(This,glyph,ppem_first,ppem_last,formats) + #define IDWriteFontFace4_GetGlyphImageFormats(This) (This)->lpVtbl->GetGlyphImageFormats(This) + #define IDWriteFontFace4_GetGlyphImageData(This,glyph,ppem,format,data,context) (This)->lpVtbl->GetGlyphImageData(This,glyph,ppem,format,data,context) + #define IDWriteFontFace4_ReleaseGlyphImageData(This,context) (This)->lpVtbl->ReleaseGlyphImageData(This,context) +@@ -8692,8 +8692,8 @@ static FORCEINLINE HRESULT IDWriteFontFace4_AreGlyphsLocal(IDWriteFontFace4* Thi + return This->lpVtbl->AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local); + } + /*** IDWriteFontFace4 methods ***/ +-static FORCEINLINE HRESULT IDWriteFontFace4_GetGlyphImageFormats_(IDWriteFontFace4* This,UINT16 glyph,UINT32 ppem_first,UINT32 ppem_last,DWRITE_GLYPH_IMAGE_FORMATS *formats) { +- return This->lpVtbl->GetGlyphImageFormats_(This,glyph,ppem_first,ppem_last,formats); ++static FORCEINLINE HRESULT IDWriteFontFace4_GetGlyphImageFormats(IDWriteFontFace4* This,UINT16 glyph,UINT32 ppem_first,UINT32 ppem_last,DWRITE_GLYPH_IMAGE_FORMATS *formats) { ++ return This->lpVtbl->GetGlyphImageFormats(This,glyph,ppem_first,ppem_last,formats); + } + static FORCEINLINE DWRITE_GLYPH_IMAGE_FORMATS IDWriteFontFace4_GetGlyphImageFormats(IDWriteFontFace4* This) { + return This->lpVtbl->GetGlyphImageFormats(This); +@@ -9020,7 +9020,7 @@ typedef struct IDWriteFontFace5Vtbl { + WINBOOL *are_local); + + /*** IDWriteFontFace4 methods ***/ +- HRESULT (STDMETHODCALLTYPE *GetGlyphImageFormats_)( ++ HRESULT (STDMETHODCALLTYPE *GetGlyphImageFormats)( + IDWriteFontFace5 *This, + UINT16 glyph, + UINT32 ppem_first, +@@ -9121,7 +9121,7 @@ interface IDWriteFontFace5 { + #define IDWriteFontFace5_AreCharactersLocal(This,characters,count,enqueue_if_not,are_local) (This)->lpVtbl->AreCharactersLocal(This,characters,count,enqueue_if_not,are_local) + #define IDWriteFontFace5_AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local) (This)->lpVtbl->AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local) + /*** IDWriteFontFace4 methods ***/ +-#define IDWriteFontFace5_GetGlyphImageFormats_(This,glyph,ppem_first,ppem_last,formats) (This)->lpVtbl->GetGlyphImageFormats_(This,glyph,ppem_first,ppem_last,formats) ++#define IDWriteFontFace5_GetGlyphImageFormats(This,glyph,ppem_first,ppem_last,formats) (This)->lpVtbl->GetGlyphImageFormats(This,glyph,ppem_first,ppem_last,formats) + #define IDWriteFontFace5_GetGlyphImageFormats(This) (This)->lpVtbl->GetGlyphImageFormats(This) + #define IDWriteFontFace5_GetGlyphImageData(This,glyph,ppem,format,data,context) (This)->lpVtbl->GetGlyphImageData(This,glyph,ppem,format,data,context) + #define IDWriteFontFace5_ReleaseGlyphImageData(This,context) (This)->lpVtbl->ReleaseGlyphImageData(This,context) +@@ -9270,8 +9270,8 @@ static FORCEINLINE HRESULT IDWriteFontFace5_AreGlyphsLocal(IDWriteFontFace5* Thi + return This->lpVtbl->AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local); + } + /*** IDWriteFontFace4 methods ***/ +-static FORCEINLINE HRESULT IDWriteFontFace5_GetGlyphImageFormats_(IDWriteFontFace5* This,UINT16 glyph,UINT32 ppem_first,UINT32 ppem_last,DWRITE_GLYPH_IMAGE_FORMATS *formats) { +- return This->lpVtbl->GetGlyphImageFormats_(This,glyph,ppem_first,ppem_last,formats); ++static FORCEINLINE HRESULT IDWriteFontFace5_GetGlyphImageFormats(IDWriteFontFace5* This,UINT16 glyph,UINT32 ppem_first,UINT32 ppem_last,DWRITE_GLYPH_IMAGE_FORMATS *formats) { ++ return This->lpVtbl->GetGlyphImageFormats(This,glyph,ppem_first,ppem_last,formats); + } + static FORCEINLINE DWRITE_GLYPH_IMAGE_FORMATS IDWriteFontFace5_GetGlyphImageFormats(IDWriteFontFace5* This) { + return This->lpVtbl->GetGlyphImageFormats(This); diff --git a/taskcluster/scripts/misc/mingw-winrt.patch b/taskcluster/scripts/misc/mingw-winrt.patch new file mode 100644 index 0000000000..e7124e156b --- /dev/null +++ b/taskcluster/scripts/misc/mingw-winrt.patch @@ -0,0 +1,5525 @@ +commit 07fff0900d668fbd75e0ac0a6382a86d486cee88 +Author: Jacek Caban <jacek@codeweavers.com> +Date: Sun Mar 24 21:20:55 2019 +0100 + + winrt headers + +diff --git a/mingw-w64-headers/include/intsafe.h b/mingw-w64-headers/include/intsafe.h +index 701d4cef..daaedb83 100644 +--- a/mingw-w64-headers/include/intsafe.h ++++ b/mingw-w64-headers/include/intsafe.h +@@ -411,5 +411,8 @@ __MINGW_INTSAFE_API __MINGW_INTSAFE_MATH(ULongLongMult, ULONGLONG, mul) + __MINGW_INTSAFE_API __MINGW_INTSAFE_MATH(LongLongMult, LONGLONG, mul) + + #endif /* __GNUC__ >= 5 */ ++ ++#define SizeTToUInt32 UIntPtrToUInt ++ + #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */ + #endif /* _INTSAFE_H_INCLUDED_ */ +diff --git a/mingw-w64-headers/include/windows.foundation.h b/mingw-w64-headers/include/windows.foundation.h +index 6c4d3ec8..59797984 100644 +--- a/mingw-w64-headers/include/windows.foundation.h ++++ b/mingw-w64-headers/include/windows.foundation.h +@@ -1,11 +1,12 @@ +-/*** Autogenerated by WIDL 1.5.31 from include/windows.foundation.idl - Do not edit ***/ ++/*** Autogenerated by WIDL 4.4 from windows.foundation.idl - Do not edit ***/ + ++#ifdef _WIN32 + #ifndef __REQUIRED_RPCNDR_H_VERSION__ + #define __REQUIRED_RPCNDR_H_VERSION__ 475 + #endif +- + #include <rpc.h> + #include <rpcndr.h> ++#endif + + #ifndef COM_NO_WINDOWS_H + #include <windows.h> +@@ -17,24 +18,18 @@ + + /* Forward declarations */ + +-#ifndef __IAsyncInfo_FWD_DEFINED__ +-#define __IAsyncInfo_FWD_DEFINED__ +-typedef interface IAsyncInfo IAsyncInfo; +-#endif +- +-#ifndef __IASyncAction_FWD_DEFINED__ +-#define __IASyncAction_FWD_DEFINED__ +-typedef interface IASyncAction IASyncAction; +-#endif +- +-#ifndef __AsyncActionCompletedHandler_FWD_DEFINED__ +-#define __AsyncActionCompletedHandler_FWD_DEFINED__ +-typedef interface AsyncActionCompletedHandler AsyncActionCompletedHandler; +-#endif +- +-#ifndef __IAsyncOperation_FWD_DEFINED__ +-#define __IAsyncOperation_FWD_DEFINED__ +-typedef interface IAsyncOperation IAsyncOperation; ++#ifndef ____x_ABI_CWindows_CFoundation_CIStringable_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CFoundation_CIStringable_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CFoundation_CIStringable __x_ABI_CWindows_CFoundation_CIStringable; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace Foundation { ++ interface IStringable; ++ } ++ } ++} ++#endif /* __cplusplus */ + #endif + + /* Headers for imported files */ +@@ -45,667 +40,331 @@ typedef interface IAsyncOperation IAsyncOperation; + extern "C" { + #endif + +-#ifndef __IAsyncInfo_FWD_DEFINED__ +-#define __IAsyncInfo_FWD_DEFINED__ +-typedef interface IAsyncInfo IAsyncInfo; +-#endif +- +-#ifndef __IAsyncAction_FWD_DEFINED__ +-#define __IAsyncAction_FWD_DEFINED__ +-typedef interface IAsyncAction IAsyncAction; +-#endif +- +-#ifndef __IAsyncOperation_FWD_DEFINED__ +-#define __IAsyncOperation_FWD_DEFINED__ +-typedef interface IAsyncOperation IAsyncOperation; +-#endif +- +-#ifndef __AsyncActionCompletedHandler_FWD_DEFINED__ +-#define __AsyncActionCompletedHandler_FWD_DEFINED__ +-typedef interface AsyncActionCompletedHandler AsyncActionCompletedHandler; +-#endif +- +-#ifndef __TypedEventHandler_FWD_DEFINED__ +-#define __TypedEventHandler_FWD_DEFINED__ +-typedef interface TypedEventHandler TypedEventHandler; +-#endif +- +-struct DateTime; +- +-struct EventRegistrationToken; +- +-#ifndef __IVectorView_FWD_DEFINED__ +-#define __IVectorView_FWD_DEFINED__ +-typedef interface IVectorView IVectorView; +-#endif +- +-#ifndef __IPropertySet_FWD_DEFINED__ +-#define __IPropertySet_FWD_DEFINED__ +-typedef interface IPropertySet IPropertySet; +-#endif +- +-typedef enum AsyncStatus { +- Started = 0, +- Completed = 1, +- Canceled = 2, +- Error = 3 +-} AsyncStatus; +-typedef struct DateTime { +- UINT64 UniversalTime; +-} DateTime; +-typedef struct EventRegistrationToken { +- UINT64 Value; +-} EventRegistrationToken; +-/***************************************************************************** +- * IAsyncInfo interface +- */ +-#ifndef __IAsyncInfo_INTERFACE_DEFINED__ +-#define __IAsyncInfo_INTERFACE_DEFINED__ +- +-DEFINE_GUID(IID_IAsyncInfo, 0x00000036, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); +-#if defined(__cplusplus) && !defined(CINTERFACE) +-MIDL_INTERFACE("00000036-0000-0000-c000-000000000046") +-IAsyncInfo : public IInspectable +-{ +- virtual HRESULT STDMETHODCALLTYPE get_Id( +- unsigned int *id) = 0; +- +- virtual HRESULT STDMETHODCALLTYPE get_Status( +- AsyncStatus *status) = 0; +- +- virtual HRESULT STDMETHODCALLTYPE get_ErrorCode( +- HRESULT *errorCode) = 0; +- +- virtual HRESULT STDMETHODCALLTYPE Cancel( +- ) = 0; +- +- virtual HRESULT STDMETHODCALLTYPE Close( +- ) = 0; +- +-}; +-#ifdef __CRT_UUID_DECL +-__CRT_UUID_DECL(IAsyncInfo, 0x00000036, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +-#endif ++#ifdef __cplusplus ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace Foundation { ++ enum PropertyType { ++ PropertyType_Empty = 0, ++ PropertyType_UInt8 = 1, ++ PropertyType_Int16 = 2, ++ PropertyType_UInt16 = 3, ++ PropertyType_Int32 = 4, ++ PropertyType_UInt32 = 5, ++ PropertyType_Int64 = 6, ++ PropertyType_UInt64 = 7, ++ PropertyType_Single = 8, ++ PropertyType_Double = 9, ++ PropertyType_Char16 = 10, ++ PropertyType_Boolean = 11, ++ PropertyType_String = 12, ++ PropertyType_Inspectable = 13, ++ PropertyType_DateTime = 14, ++ PropertyType_TimeSpan = 15, ++ PropertyType_Guid = 16, ++ PropertyType_Point = 17, ++ PropertyType_Size = 18, ++ PropertyType_Rect = 19, ++ PropertyType_OtherType = 20, ++ PropertyType_UInt8Array = 1025, ++ PropertyType_Int16Array = 1026, ++ PropertyType_UInt16Array = 1027, ++ PropertyType_Int32Array = 1028, ++ PropertyType_UInt32Array = 1029, ++ PropertyType_Int64Array = 1030, ++ PropertyType_UInt64Array = 1031, ++ PropertyType_SingleArray = 1032, ++ PropertyType_DoubleArray = 1033, ++ PropertyType_Char16Array = 1034, ++ PropertyType_BooleanArray = 1035, ++ PropertyType_StringArray = 1036, ++ PropertyType_InspectableArray = 1037, ++ PropertyType_DateTimeArray = 1038, ++ PropertyType_TimeSpanArray = 1039, ++ PropertyType_GuidArray = 1040, ++ PropertyType_PointArray = 1041, ++ PropertyType_SizeArray = 1042, ++ PropertyType_RectArray = 1043, ++ PropertyType_OtherTypeArray = 1044 ++ }; ++ } ++ } ++} ++extern "C" { + #else +-typedef struct IAsyncInfoVtbl { +- BEGIN_INTERFACE +- +- /*** IUnknown methods ***/ +- HRESULT (STDMETHODCALLTYPE *QueryInterface)( +- IAsyncInfo* This, +- REFIID riid, +- void **ppvObject); +- +- ULONG (STDMETHODCALLTYPE *AddRef)( +- IAsyncInfo* This); +- +- ULONG (STDMETHODCALLTYPE *Release)( +- IAsyncInfo* This); +- +- /*** IInspectable methods ***/ +- HRESULT (STDMETHODCALLTYPE *GetIids)( +- IAsyncInfo* This, +- ULONG *iidCount, +- IID **iids); +- +- HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)( +- IAsyncInfo* This, +- HSTRING *className); +- +- HRESULT (STDMETHODCALLTYPE *GetTrustLevel)( +- IAsyncInfo* This, +- TrustLevel *trustLevel); +- +- /*** IAsyncInfo methods ***/ +- HRESULT (STDMETHODCALLTYPE *get_Id)( +- IAsyncInfo* This, +- unsigned int *id); +- +- HRESULT (STDMETHODCALLTYPE *get_Status)( +- IAsyncInfo* This, +- AsyncStatus *status); +- +- HRESULT (STDMETHODCALLTYPE *get_ErrorCode)( +- IAsyncInfo* This, +- HRESULT *errorCode); +- +- HRESULT (STDMETHODCALLTYPE *Cancel)( +- IAsyncInfo* This); +- +- HRESULT (STDMETHODCALLTYPE *Close)( +- IAsyncInfo* This); +- +- END_INTERFACE +-} IAsyncInfoVtbl; +-interface IAsyncInfo { +- CONST_VTBL IAsyncInfoVtbl* lpVtbl; ++enum __x_ABI_CWindows_CFoundation_CPropertyType { ++ PropertyType_Empty = 0, ++ PropertyType_UInt8 = 1, ++ PropertyType_Int16 = 2, ++ PropertyType_UInt16 = 3, ++ PropertyType_Int32 = 4, ++ PropertyType_UInt32 = 5, ++ PropertyType_Int64 = 6, ++ PropertyType_UInt64 = 7, ++ PropertyType_Single = 8, ++ PropertyType_Double = 9, ++ PropertyType_Char16 = 10, ++ PropertyType_Boolean = 11, ++ PropertyType_String = 12, ++ PropertyType_Inspectable = 13, ++ PropertyType_DateTime = 14, ++ PropertyType_TimeSpan = 15, ++ PropertyType_Guid = 16, ++ PropertyType_Point = 17, ++ PropertyType_Size = 18, ++ PropertyType_Rect = 19, ++ PropertyType_OtherType = 20, ++ PropertyType_UInt8Array = 1025, ++ PropertyType_Int16Array = 1026, ++ PropertyType_UInt16Array = 1027, ++ PropertyType_Int32Array = 1028, ++ PropertyType_UInt32Array = 1029, ++ PropertyType_Int64Array = 1030, ++ PropertyType_UInt64Array = 1031, ++ PropertyType_SingleArray = 1032, ++ PropertyType_DoubleArray = 1033, ++ PropertyType_Char16Array = 1034, ++ PropertyType_BooleanArray = 1035, ++ PropertyType_StringArray = 1036, ++ PropertyType_InspectableArray = 1037, ++ PropertyType_DateTimeArray = 1038, ++ PropertyType_TimeSpanArray = 1039, ++ PropertyType_GuidArray = 1040, ++ PropertyType_PointArray = 1041, ++ PropertyType_SizeArray = 1042, ++ PropertyType_RectArray = 1043, ++ PropertyType_OtherTypeArray = 1044 + }; +- +-#ifdef COBJMACROS +-#ifndef WIDL_C_INLINE_WRAPPERS +-/*** IUnknown methods ***/ +-#define IAsyncInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +-#define IAsyncInfo_AddRef(This) (This)->lpVtbl->AddRef(This) +-#define IAsyncInfo_Release(This) (This)->lpVtbl->Release(This) +-/*** IInspectable methods ***/ +-#define IAsyncInfo_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids) +-#define IAsyncInfo_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className) +-#define IAsyncInfo_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel) +-/*** IAsyncInfo methods ***/ +-#define IAsyncInfo_get_Id(This,id) (This)->lpVtbl->get_Id(This,id) +-#define IAsyncInfo_get_Status(This,status) (This)->lpVtbl->get_Status(This,status) +-#define IAsyncInfo_get_ErrorCode(This,errorCode) (This)->lpVtbl->get_ErrorCode(This,errorCode) +-#define IAsyncInfo_Cancel(This) (This)->lpVtbl->Cancel(This) +-#define IAsyncInfo_Close(This) (This)->lpVtbl->Close(This) +-#else +-/*** IUnknown methods ***/ +-static FORCEINLINE HRESULT IAsyncInfo_QueryInterface(IAsyncInfo* This,REFIID riid,void **ppvObject) { +- return This->lpVtbl->QueryInterface(This,riid,ppvObject); +-} +-static FORCEINLINE ULONG IAsyncInfo_AddRef(IAsyncInfo* This) { +- return This->lpVtbl->AddRef(This); +-} +-static FORCEINLINE ULONG IAsyncInfo_Release(IAsyncInfo* This) { +- return This->lpVtbl->Release(This); +-} +-/*** IInspectable methods ***/ +-static FORCEINLINE HRESULT IAsyncInfo_GetIids(IAsyncInfo* This,ULONG *iidCount,IID **iids) { +- return This->lpVtbl->GetIids(This,iidCount,iids); +-} +-static FORCEINLINE HRESULT IAsyncInfo_GetRuntimeClassName(IAsyncInfo* This,HSTRING *className) { +- return This->lpVtbl->GetRuntimeClassName(This,className); +-} +-static FORCEINLINE HRESULT IAsyncInfo_GetTrustLevel(IAsyncInfo* This,TrustLevel *trustLevel) { +- return This->lpVtbl->GetTrustLevel(This,trustLevel); +-} +-/*** IAsyncInfo methods ***/ +-static FORCEINLINE HRESULT IAsyncInfo_get_Id(IAsyncInfo* This,unsigned int *id) { +- return This->lpVtbl->get_Id(This,id); +-} +-static FORCEINLINE HRESULT IAsyncInfo_get_Status(IAsyncInfo* This,AsyncStatus *status) { +- return This->lpVtbl->get_Status(This,status); +-} +-static FORCEINLINE HRESULT IAsyncInfo_get_ErrorCode(IAsyncInfo* This,HRESULT *errorCode) { +- return This->lpVtbl->get_ErrorCode(This,errorCode); +-} +-static FORCEINLINE HRESULT IAsyncInfo_Cancel(IAsyncInfo* This) { +- return This->lpVtbl->Cancel(This); +-} +-static FORCEINLINE HRESULT IAsyncInfo_Close(IAsyncInfo* This) { +- return This->lpVtbl->Close(This); +-} + #endif +-#endif +- +-#endif +- +-HRESULT STDMETHODCALLTYPE IAsyncInfo_get_Id_Proxy( +- IAsyncInfo* This, +- unsigned int *id); +-void __RPC_STUB IAsyncInfo_get_Id_Stub( +- IRpcStubBuffer* This, +- IRpcChannelBuffer* pRpcChannelBuffer, +- PRPC_MESSAGE pRpcMessage, +- DWORD* pdwStubPhase); +-HRESULT STDMETHODCALLTYPE IAsyncInfo_get_Status_Proxy( +- IAsyncInfo* This, +- AsyncStatus *status); +-void __RPC_STUB IAsyncInfo_get_Status_Stub( +- IRpcStubBuffer* This, +- IRpcChannelBuffer* pRpcChannelBuffer, +- PRPC_MESSAGE pRpcMessage, +- DWORD* pdwStubPhase); +-HRESULT STDMETHODCALLTYPE IAsyncInfo_get_ErrorCode_Proxy( +- IAsyncInfo* This, +- HRESULT *errorCode); +-void __RPC_STUB IAsyncInfo_get_ErrorCode_Stub( +- IRpcStubBuffer* This, +- IRpcChannelBuffer* pRpcChannelBuffer, +- PRPC_MESSAGE pRpcMessage, +- DWORD* pdwStubPhase); +-HRESULT STDMETHODCALLTYPE IAsyncInfo_Cancel_Proxy( +- IAsyncInfo* This); +-void __RPC_STUB IAsyncInfo_Cancel_Stub( +- IRpcStubBuffer* This, +- IRpcChannelBuffer* pRpcChannelBuffer, +- PRPC_MESSAGE pRpcMessage, +- DWORD* pdwStubPhase); +-HRESULT STDMETHODCALLTYPE IAsyncInfo_Close_Proxy( +- IAsyncInfo* This); +-void __RPC_STUB IAsyncInfo_Close_Stub( +- IRpcStubBuffer* This, +- IRpcChannelBuffer* pRpcChannelBuffer, +- PRPC_MESSAGE pRpcMessage, +- DWORD* pdwStubPhase); +- +-#endif /* __IAsyncInfo_INTERFACE_DEFINED__ */ +- +-/***************************************************************************** +- * IASyncAction interface +- */ +-#ifndef __IASyncAction_INTERFACE_DEFINED__ +-#define __IASyncAction_INTERFACE_DEFINED__ +- +-DEFINE_GUID(IID_IASyncAction, 0x5a648006, 0x843a, 0x4da9, 0x86,0x5b, 0x9d,0x26,0xe5,0xdf,0xad,0x7b); +-#if defined(__cplusplus) && !defined(CINTERFACE) +-MIDL_INTERFACE("5a648006-843a-4da9-865b-9d26e5dfad7b") +-IASyncAction : public IInspectable +-{ +- virtual HRESULT STDMETHODCALLTYPE put_Completed( +- AsyncActionCompletedHandler *handler) = 0; +- +- virtual HRESULT STDMETHODCALLTYPE get_Completed( +- AsyncActionCompletedHandler **handler) = 0; +- +- virtual HRESULT STDMETHODCALLTYPE GetResults( +- ) = 0; + +-}; +-#ifdef __CRT_UUID_DECL +-__CRT_UUID_DECL(IASyncAction, 0x5a648006, 0x843a, 0x4da9, 0x86,0x5b, 0x9d,0x26,0xe5,0xdf,0xad,0x7b) +-#endif ++#ifdef __cplusplus ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace Foundation { ++ struct Point { ++ FLOAT X; ++ FLOAT Y; ++ }; ++ } ++ } ++} ++extern "C" { + #else +-typedef struct IASyncActionVtbl { +- BEGIN_INTERFACE +- +- /*** IUnknown methods ***/ +- HRESULT (STDMETHODCALLTYPE *QueryInterface)( +- IASyncAction* This, +- REFIID riid, +- void **ppvObject); +- +- ULONG (STDMETHODCALLTYPE *AddRef)( +- IASyncAction* This); +- +- ULONG (STDMETHODCALLTYPE *Release)( +- IASyncAction* This); +- +- /*** IInspectable methods ***/ +- HRESULT (STDMETHODCALLTYPE *GetIids)( +- IASyncAction* This, +- ULONG *iidCount, +- IID **iids); +- +- HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)( +- IASyncAction* This, +- HSTRING *className); +- +- HRESULT (STDMETHODCALLTYPE *GetTrustLevel)( +- IASyncAction* This, +- TrustLevel *trustLevel); +- +- /*** IASyncAction methods ***/ +- HRESULT (STDMETHODCALLTYPE *put_Completed)( +- IASyncAction* This, +- AsyncActionCompletedHandler *handler); +- +- HRESULT (STDMETHODCALLTYPE *get_Completed)( +- IASyncAction* This, +- AsyncActionCompletedHandler **handler); +- +- HRESULT (STDMETHODCALLTYPE *GetResults)( +- IASyncAction* This); +- +- END_INTERFACE +-} IASyncActionVtbl; +-interface IASyncAction { +- CONST_VTBL IASyncActionVtbl* lpVtbl; ++struct __x_ABI_CWindows_CFoundation_CPoint { ++ FLOAT X; ++ FLOAT Y; + }; +- +-#ifdef COBJMACROS +-#ifndef WIDL_C_INLINE_WRAPPERS +-/*** IUnknown methods ***/ +-#define IASyncAction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +-#define IASyncAction_AddRef(This) (This)->lpVtbl->AddRef(This) +-#define IASyncAction_Release(This) (This)->lpVtbl->Release(This) +-/*** IInspectable methods ***/ +-#define IASyncAction_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids) +-#define IASyncAction_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className) +-#define IASyncAction_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel) +-/*** IASyncAction methods ***/ +-#define IASyncAction_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler) +-#define IASyncAction_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler) +-#define IASyncAction_GetResults(This) (This)->lpVtbl->GetResults(This) +-#else +-/*** IUnknown methods ***/ +-static FORCEINLINE HRESULT IASyncAction_QueryInterface(IASyncAction* This,REFIID riid,void **ppvObject) { +- return This->lpVtbl->QueryInterface(This,riid,ppvObject); +-} +-static FORCEINLINE ULONG IASyncAction_AddRef(IASyncAction* This) { +- return This->lpVtbl->AddRef(This); +-} +-static FORCEINLINE ULONG IASyncAction_Release(IASyncAction* This) { +- return This->lpVtbl->Release(This); +-} +-/*** IInspectable methods ***/ +-static FORCEINLINE HRESULT IASyncAction_GetIids(IASyncAction* This,ULONG *iidCount,IID **iids) { +- return This->lpVtbl->GetIids(This,iidCount,iids); +-} +-static FORCEINLINE HRESULT IASyncAction_GetRuntimeClassName(IASyncAction* This,HSTRING *className) { +- return This->lpVtbl->GetRuntimeClassName(This,className); +-} +-static FORCEINLINE HRESULT IASyncAction_GetTrustLevel(IASyncAction* This,TrustLevel *trustLevel) { +- return This->lpVtbl->GetTrustLevel(This,trustLevel); +-} +-/*** IASyncAction methods ***/ +-static FORCEINLINE HRESULT IASyncAction_put_Completed(IASyncAction* This,AsyncActionCompletedHandler *handler) { +- return This->lpVtbl->put_Completed(This,handler); +-} +-static FORCEINLINE HRESULT IASyncAction_get_Completed(IASyncAction* This,AsyncActionCompletedHandler **handler) { +- return This->lpVtbl->get_Completed(This,handler); +-} +-static FORCEINLINE HRESULT IASyncAction_GetResults(IASyncAction* This) { +- return This->lpVtbl->GetResults(This); +-} +-#endif + #endif + +-#endif +- +-HRESULT STDMETHODCALLTYPE IASyncAction_put_Completed_Proxy( +- IASyncAction* This, +- AsyncActionCompletedHandler *handler); +-void __RPC_STUB IASyncAction_put_Completed_Stub( +- IRpcStubBuffer* This, +- IRpcChannelBuffer* pRpcChannelBuffer, +- PRPC_MESSAGE pRpcMessage, +- DWORD* pdwStubPhase); +-HRESULT STDMETHODCALLTYPE IASyncAction_get_Completed_Proxy( +- IASyncAction* This, +- AsyncActionCompletedHandler **handler); +-void __RPC_STUB IASyncAction_get_Completed_Stub( +- IRpcStubBuffer* This, +- IRpcChannelBuffer* pRpcChannelBuffer, +- PRPC_MESSAGE pRpcMessage, +- DWORD* pdwStubPhase); +-HRESULT STDMETHODCALLTYPE IASyncAction_GetResults_Proxy( +- IASyncAction* This); +-void __RPC_STUB IASyncAction_GetResults_Stub( +- IRpcStubBuffer* This, +- IRpcChannelBuffer* pRpcChannelBuffer, +- PRPC_MESSAGE pRpcMessage, +- DWORD* pdwStubPhase); +- +-#endif /* __IASyncAction_INTERFACE_DEFINED__ */ +- +-/***************************************************************************** +- * AsyncActionCompletedHandler interface +- */ +-#ifndef __AsyncActionCompletedHandler_INTERFACE_DEFINED__ +-#define __AsyncActionCompletedHandler_INTERFACE_DEFINED__ +- +-DEFINE_GUID(IID_AsyncActionCompletedHandler, 0xa4ed5c81, 0x76c9, 0x40bd, 0x8b,0xe6, 0xb1,0xd9,0x0f,0xb2,0x0a,0xe7); +-#if defined(__cplusplus) && !defined(CINTERFACE) +-MIDL_INTERFACE("a4ed5c81-76c9-40bd-8be6-b1d90fb20ae7") +-AsyncActionCompletedHandler : public IUnknown +-{ +- virtual HRESULT STDMETHODCALLTYPE Invoke( +- IInspectable *asyncAction, +- AsyncStatus status) = 0; +- ++#ifdef __cplusplus ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace Foundation { ++ struct Size { ++ FLOAT Width; ++ FLOAT Height; ++ }; ++ } ++ } ++} ++extern "C" { ++#else ++struct __x_ABI_CWindows_CFoundation_CSize { ++ FLOAT Width; ++ FLOAT Height; + }; +-#ifdef __CRT_UUID_DECL +-__CRT_UUID_DECL(AsyncActionCompletedHandler, 0xa4ed5c81, 0x76c9, 0x40bd, 0x8b,0xe6, 0xb1,0xd9,0x0f,0xb2,0x0a,0xe7) + #endif +-#else +-typedef struct AsyncActionCompletedHandlerVtbl { +- BEGIN_INTERFACE +- +- /*** IUnknown methods ***/ +- HRESULT (STDMETHODCALLTYPE *QueryInterface)( +- AsyncActionCompletedHandler* This, +- REFIID riid, +- void **ppvObject); +- +- ULONG (STDMETHODCALLTYPE *AddRef)( +- AsyncActionCompletedHandler* This); +- +- ULONG (STDMETHODCALLTYPE *Release)( +- AsyncActionCompletedHandler* This); +- +- /*** AsyncActionCompletedHandler methods ***/ +- HRESULT (STDMETHODCALLTYPE *Invoke)( +- AsyncActionCompletedHandler* This, +- IInspectable *asyncAction, +- AsyncStatus status); + +- END_INTERFACE +-} AsyncActionCompletedHandlerVtbl; +-interface AsyncActionCompletedHandler { +- CONST_VTBL AsyncActionCompletedHandlerVtbl* lpVtbl; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace Foundation { ++typedef struct Size Size; ++ } ++ } ++} ++#endif /* __cplusplus */ ++#ifdef __cplusplus ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace Foundation { ++ struct Rect { ++ FLOAT X; ++ FLOAT Y; ++ FLOAT Width; ++ FLOAT Height; ++ }; ++ } ++ } ++} ++extern "C" { ++#else ++struct __x_ABI_CWindows_CFoundation_CRect { ++ FLOAT X; ++ FLOAT Y; ++ FLOAT Width; ++ FLOAT Height; + }; ++#endif + +-#ifdef COBJMACROS +-#ifndef WIDL_C_INLINE_WRAPPERS +-/*** IUnknown methods ***/ +-#define AsyncActionCompletedHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +-#define AsyncActionCompletedHandler_AddRef(This) (This)->lpVtbl->AddRef(This) +-#define AsyncActionCompletedHandler_Release(This) (This)->lpVtbl->Release(This) +-/*** AsyncActionCompletedHandler methods ***/ +-#define AsyncActionCompletedHandler_Invoke(This,asyncAction,status) (This)->lpVtbl->Invoke(This,asyncAction,status) +-#else +-/*** IUnknown methods ***/ +-static FORCEINLINE HRESULT AsyncActionCompletedHandler_QueryInterface(AsyncActionCompletedHandler* This,REFIID riid,void **ppvObject) { +- return This->lpVtbl->QueryInterface(This,riid,ppvObject); +-} +-static FORCEINLINE ULONG AsyncActionCompletedHandler_AddRef(AsyncActionCompletedHandler* This) { +- return This->lpVtbl->AddRef(This); +-} +-static FORCEINLINE ULONG AsyncActionCompletedHandler_Release(AsyncActionCompletedHandler* This) { +- return This->lpVtbl->Release(This); +-} +-/*** AsyncActionCompletedHandler methods ***/ +-static FORCEINLINE HRESULT AsyncActionCompletedHandler_Invoke(AsyncActionCompletedHandler* This,IInspectable *asyncAction,AsyncStatus status) { +- return This->lpVtbl->Invoke(This,asyncAction,status); ++#ifdef __cplusplus ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace Foundation { ++ struct DateTime { ++ INT64 UniversalTime; ++ }; ++ } ++ } + } +-#endif ++extern "C" { ++#else ++struct __x_ABI_CWindows_CFoundation_CDateTime { ++ INT64 UniversalTime; ++}; + #endif + ++#ifdef __cplusplus ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace Foundation { ++ struct TimeSpan { ++ INT64 Duration; ++ }; ++ } ++ } ++} ++extern "C" { ++#else ++struct __x_ABI_CWindows_CFoundation_CTimeSpan { ++ INT64 Duration; ++}; + #endif + +-HRESULT STDMETHODCALLTYPE AsyncActionCompletedHandler_Invoke_Proxy( +- AsyncActionCompletedHandler* This, +- IInspectable *asyncAction, +- AsyncStatus status); +-void __RPC_STUB AsyncActionCompletedHandler_Invoke_Stub( +- IRpcStubBuffer* This, +- IRpcChannelBuffer* pRpcChannelBuffer, +- PRPC_MESSAGE pRpcMessage, +- DWORD* pdwStubPhase); +- +-#endif /* __AsyncActionCompletedHandler_INTERFACE_DEFINED__ */ +- + /***************************************************************************** +- * IAsyncOperation interface ++ * IStringable interface + */ +-#ifndef __IAsyncOperation_INTERFACE_DEFINED__ +-#define __IAsyncOperation_INTERFACE_DEFINED__ ++#ifndef ____x_ABI_CWindows_CFoundation_CIStringable_INTERFACE_DEFINED__ ++#define ____x_ABI_CWindows_CFoundation_CIStringable_INTERFACE_DEFINED__ + +-DEFINE_GUID(IID_IAsyncOperation, 0x9fc2b0bb, 0xe446, 0x44e2, 0xaa,0x61, 0x9c,0xab,0x8f,0x63,0x6a,0xf2); ++DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIStringable, 0x96369f54, 0x8eb6, 0x48f0, 0xab,0xce, 0xc1,0xb2,0x11,0xe6,0x27,0xc3); + #if defined(__cplusplus) && !defined(CINTERFACE) +-MIDL_INTERFACE("9fc2b0bb-e446-44e2-aa61-9cab8f636af2") +-IAsyncOperation : public IAsyncInfo +-{ +- virtual HRESULT STDMETHODCALLTYPE put_Completed( +- AsyncActionCompletedHandler *handler) = 0; +- +- virtual HRESULT STDMETHODCALLTYPE get_Completed( +- AsyncActionCompletedHandler **handler) = 0; +- +- virtual IInspectable * STDMETHODCALLTYPE GetResults( +- ) = 0; +- +-}; ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace Foundation { ++ MIDL_INTERFACE("96369f54-8eb6-48f0-abce-c1b211e627c3") ++ IStringable : public IInspectable ++ { ++ virtual HRESULT STDMETHODCALLTYPE ToString( ++ HSTRING *value) = 0; ++ ++ }; ++ } ++ } ++} ++extern "C" { + #ifdef __CRT_UUID_DECL +-__CRT_UUID_DECL(IAsyncOperation, 0x9fc2b0bb, 0xe446, 0x44e2, 0xaa,0x61, 0x9c,0xab,0x8f,0x63,0x6a,0xf2) ++__CRT_UUID_DECL(ABI::Windows::Foundation::IStringable, 0x96369f54, 0x8eb6, 0x48f0, 0xab,0xce, 0xc1,0xb2,0x11,0xe6,0x27,0xc3) + #endif + #else +-typedef struct IAsyncOperationVtbl { ++typedef struct __x_ABI_CWindows_CFoundation_CIStringableVtbl { + BEGIN_INTERFACE + + /*** IUnknown methods ***/ + HRESULT (STDMETHODCALLTYPE *QueryInterface)( +- IAsyncOperation* This, ++ __x_ABI_CWindows_CFoundation_CIStringable *This, + REFIID riid, + void **ppvObject); + + ULONG (STDMETHODCALLTYPE *AddRef)( +- IAsyncOperation* This); ++ __x_ABI_CWindows_CFoundation_CIStringable *This); + + ULONG (STDMETHODCALLTYPE *Release)( +- IAsyncOperation* This); ++ __x_ABI_CWindows_CFoundation_CIStringable *This); + + /*** IInspectable methods ***/ + HRESULT (STDMETHODCALLTYPE *GetIids)( +- IAsyncOperation* This, ++ __x_ABI_CWindows_CFoundation_CIStringable *This, + ULONG *iidCount, + IID **iids); + + HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)( +- IAsyncOperation* This, ++ __x_ABI_CWindows_CFoundation_CIStringable *This, + HSTRING *className); + + HRESULT (STDMETHODCALLTYPE *GetTrustLevel)( +- IAsyncOperation* This, ++ __x_ABI_CWindows_CFoundation_CIStringable *This, + TrustLevel *trustLevel); + +- /*** IAsyncInfo methods ***/ +- HRESULT (STDMETHODCALLTYPE *get_Id)( +- IAsyncOperation* This, +- unsigned int *id); +- +- HRESULT (STDMETHODCALLTYPE *get_Status)( +- IAsyncOperation* This, +- AsyncStatus *status); +- +- HRESULT (STDMETHODCALLTYPE *get_ErrorCode)( +- IAsyncOperation* This, +- HRESULT *errorCode); +- +- HRESULT (STDMETHODCALLTYPE *Cancel)( +- IAsyncOperation* This); +- +- HRESULT (STDMETHODCALLTYPE *Close)( +- IAsyncOperation* This); +- +- /*** IAsyncOperation methods ***/ +- HRESULT (STDMETHODCALLTYPE *put_Completed)( +- IAsyncOperation* This, +- AsyncActionCompletedHandler *handler); +- +- HRESULT (STDMETHODCALLTYPE *get_Completed)( +- IAsyncOperation* This, +- AsyncActionCompletedHandler **handler); +- +- IInspectable * (STDMETHODCALLTYPE *GetResults)( +- IAsyncOperation* This); ++ /*** IStringable methods ***/ ++ HRESULT (STDMETHODCALLTYPE *ToString)( ++ __x_ABI_CWindows_CFoundation_CIStringable *This, ++ HSTRING *value); + + END_INTERFACE +-} IAsyncOperationVtbl; +-interface IAsyncOperation { +- CONST_VTBL IAsyncOperationVtbl* lpVtbl; ++} __x_ABI_CWindows_CFoundation_CIStringableVtbl; ++ ++interface __x_ABI_CWindows_CFoundation_CIStringable { ++ CONST_VTBL __x_ABI_CWindows_CFoundation_CIStringableVtbl* lpVtbl; + }; + + #ifdef COBJMACROS + #ifndef WIDL_C_INLINE_WRAPPERS + /*** IUnknown methods ***/ +-#define IAsyncOperation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +-#define IAsyncOperation_AddRef(This) (This)->lpVtbl->AddRef(This) +-#define IAsyncOperation_Release(This) (This)->lpVtbl->Release(This) ++#define __x_ABI_CWindows_CFoundation_CIStringable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) ++#define __x_ABI_CWindows_CFoundation_CIStringable_AddRef(This) (This)->lpVtbl->AddRef(This) ++#define __x_ABI_CWindows_CFoundation_CIStringable_Release(This) (This)->lpVtbl->Release(This) + /*** IInspectable methods ***/ +-#define IAsyncOperation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids) +-#define IAsyncOperation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className) +-#define IAsyncOperation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel) +-/*** IAsyncInfo methods ***/ +-#define IAsyncOperation_get_Id(This,id) (This)->lpVtbl->get_Id(This,id) +-#define IAsyncOperation_get_Status(This,status) (This)->lpVtbl->get_Status(This,status) +-#define IAsyncOperation_get_ErrorCode(This,errorCode) (This)->lpVtbl->get_ErrorCode(This,errorCode) +-#define IAsyncOperation_Cancel(This) (This)->lpVtbl->Cancel(This) +-#define IAsyncOperation_Close(This) (This)->lpVtbl->Close(This) +-/*** IAsyncOperation methods ***/ +-#define IAsyncOperation_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler) +-#define IAsyncOperation_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler) +-#define IAsyncOperation_GetResults(This) (This)->lpVtbl->GetResults(This) ++#define __x_ABI_CWindows_CFoundation_CIStringable_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids) ++#define __x_ABI_CWindows_CFoundation_CIStringable_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className) ++#define __x_ABI_CWindows_CFoundation_CIStringable_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel) ++/*** IStringable methods ***/ ++#define __x_ABI_CWindows_CFoundation_CIStringable_ToString(This,value) (This)->lpVtbl->ToString(This,value) + #else + /*** IUnknown methods ***/ +-static FORCEINLINE HRESULT IAsyncOperation_QueryInterface(IAsyncOperation* This,REFIID riid,void **ppvObject) { ++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIStringable_QueryInterface(__x_ABI_CWindows_CFoundation_CIStringable* This,REFIID riid,void **ppvObject) { + return This->lpVtbl->QueryInterface(This,riid,ppvObject); + } +-static FORCEINLINE ULONG IAsyncOperation_AddRef(IAsyncOperation* This) { ++static FORCEINLINE ULONG __x_ABI_CWindows_CFoundation_CIStringable_AddRef(__x_ABI_CWindows_CFoundation_CIStringable* This) { + return This->lpVtbl->AddRef(This); + } +-static FORCEINLINE ULONG IAsyncOperation_Release(IAsyncOperation* This) { ++static FORCEINLINE ULONG __x_ABI_CWindows_CFoundation_CIStringable_Release(__x_ABI_CWindows_CFoundation_CIStringable* This) { + return This->lpVtbl->Release(This); + } + /*** IInspectable methods ***/ +-static FORCEINLINE HRESULT IAsyncOperation_GetIids(IAsyncOperation* This,ULONG *iidCount,IID **iids) { ++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIStringable_GetIids(__x_ABI_CWindows_CFoundation_CIStringable* This,ULONG *iidCount,IID **iids) { + return This->lpVtbl->GetIids(This,iidCount,iids); + } +-static FORCEINLINE HRESULT IAsyncOperation_GetRuntimeClassName(IAsyncOperation* This,HSTRING *className) { ++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIStringable_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIStringable* This,HSTRING *className) { + return This->lpVtbl->GetRuntimeClassName(This,className); + } +-static FORCEINLINE HRESULT IAsyncOperation_GetTrustLevel(IAsyncOperation* This,TrustLevel *trustLevel) { ++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIStringable_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIStringable* This,TrustLevel *trustLevel) { + return This->lpVtbl->GetTrustLevel(This,trustLevel); + } +-/*** IAsyncInfo methods ***/ +-static FORCEINLINE HRESULT IAsyncOperation_get_Id(IAsyncOperation* This,unsigned int *id) { +- return This->lpVtbl->get_Id(This,id); +-} +-static FORCEINLINE HRESULT IAsyncOperation_get_Status(IAsyncOperation* This,AsyncStatus *status) { +- return This->lpVtbl->get_Status(This,status); +-} +-static FORCEINLINE HRESULT IAsyncOperation_get_ErrorCode(IAsyncOperation* This,HRESULT *errorCode) { +- return This->lpVtbl->get_ErrorCode(This,errorCode); +-} +-static FORCEINLINE HRESULT IAsyncOperation_Cancel(IAsyncOperation* This) { +- return This->lpVtbl->Cancel(This); +-} +-static FORCEINLINE HRESULT IAsyncOperation_Close(IAsyncOperation* This) { +- return This->lpVtbl->Close(This); +-} +-/*** IAsyncOperation methods ***/ +-static FORCEINLINE HRESULT IAsyncOperation_put_Completed(IAsyncOperation* This,AsyncActionCompletedHandler *handler) { +- return This->lpVtbl->put_Completed(This,handler); +-} +-static FORCEINLINE HRESULT IAsyncOperation_get_Completed(IAsyncOperation* This,AsyncActionCompletedHandler **handler) { +- return This->lpVtbl->get_Completed(This,handler); +-} +-static FORCEINLINE IInspectable * IAsyncOperation_GetResults(IAsyncOperation* This) { +- return This->lpVtbl->GetResults(This); ++/*** IStringable methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIStringable_ToString(__x_ABI_CWindows_CFoundation_CIStringable* This,HSTRING *value) { ++ return This->lpVtbl->ToString(This,value); + } + #endif + #endif + + #endif + +-HRESULT STDMETHODCALLTYPE IAsyncOperation_put_Completed_Proxy( +- IAsyncOperation* This, +- AsyncActionCompletedHandler *handler); +-void __RPC_STUB IAsyncOperation_put_Completed_Stub( +- IRpcStubBuffer* This, +- IRpcChannelBuffer* pRpcChannelBuffer, +- PRPC_MESSAGE pRpcMessage, +- DWORD* pdwStubPhase); +-HRESULT STDMETHODCALLTYPE IAsyncOperation_get_Completed_Proxy( +- IAsyncOperation* This, +- AsyncActionCompletedHandler **handler); +-void __RPC_STUB IAsyncOperation_get_Completed_Stub( +- IRpcStubBuffer* This, +- IRpcChannelBuffer* pRpcChannelBuffer, +- PRPC_MESSAGE pRpcMessage, +- DWORD* pdwStubPhase); +-IInspectable * STDMETHODCALLTYPE IAsyncOperation_GetResults_Proxy( +- IAsyncOperation* This); +-void __RPC_STUB IAsyncOperation_GetResults_Stub( +- IRpcStubBuffer* This, +- IRpcChannelBuffer* pRpcChannelBuffer, +- PRPC_MESSAGE pRpcMessage, +- DWORD* pdwStubPhase); +- +-#endif /* __IAsyncOperation_INTERFACE_DEFINED__ */ ++#endif /* ____x_ABI_CWindows_CFoundation_CIStringable_INTERFACE_DEFINED__ */ + + /* Begin additional prototypes for all interfaces */ + ++ULONG __RPC_USER HSTRING_UserSize (ULONG *, ULONG, HSTRING *); ++unsigned char * __RPC_USER HSTRING_UserMarshal (ULONG *, unsigned char *, HSTRING *); ++unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *); ++void __RPC_USER HSTRING_UserFree (ULONG *, HSTRING *); + + /* End additional prototypes */ + +diff --git a/mingw-w64-headers/include/windows.foundation.metadata.h b/mingw-w64-headers/include/windows.foundation.metadata.h +new file mode 100644 +index 00000000..13262699 +--- /dev/null ++++ b/mingw-w64-headers/include/windows.foundation.metadata.h +@@ -0,0 +1,315 @@ ++/*** Autogenerated by WIDL 4.4 from windows.foundation.metadata.idl - Do not edit ***/ ++ ++#ifdef _WIN32 ++#ifndef __REQUIRED_RPCNDR_H_VERSION__ ++#define __REQUIRED_RPCNDR_H_VERSION__ 475 ++#endif ++#include <rpc.h> ++#include <rpcndr.h> ++#endif ++ ++#ifndef COM_NO_WINDOWS_H ++#include <windows.h> ++#include <ole2.h> ++#endif ++ ++#ifndef __windows_foundation_metadata_h__ ++#define __windows_foundation_metadata_h__ ++ ++/* Forward declarations */ ++ ++#ifndef ____x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace Foundation { ++ namespace Metadata { ++ interface IApiInformationStatics; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++/* Headers for imported files */ ++ ++#include <inspectable.h> ++#include <windows.foundation.h> ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/***************************************************************************** ++ * IApiInformationStatics interface ++ */ ++#ifndef ____x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_INTERFACE_DEFINED__ ++#define ____x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_INTERFACE_DEFINED__ ++ ++DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics, 0x997439fe, 0xf681, 0x4a11, 0xb4,0x16, 0xc1,0x3a,0x47,0xe8,0xba,0x36); ++#if defined(__cplusplus) && !defined(CINTERFACE) ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace Foundation { ++ namespace Metadata { ++ MIDL_INTERFACE("997439fe-f681-4a11-b416-c13a47e8ba36") ++ IApiInformationStatics : public IInspectable ++ { ++ virtual HRESULT STDMETHODCALLTYPE IsTypePresent( ++ HSTRING typeName, ++ boolean *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE IsMethodPresent( ++ HSTRING typeName, ++ HSTRING methodName, ++ boolean *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE IsMethodPresentWithArity( ++ HSTRING typeName, ++ HSTRING methodName, ++ UINT32 inputParameterCount, ++ boolean *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE IsEventPresent( ++ HSTRING typeName, ++ HSTRING eventName, ++ boolean *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE IsPropertyPresent( ++ HSTRING typeName, ++ HSTRING propertyName, ++ boolean *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE IsReadOnlyPropertyPresent( ++ HSTRING typeName, ++ HSTRING propertyName, ++ boolean *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE IsWriteablePropertyPresent( ++ HSTRING typeName, ++ HSTRING propertyName, ++ boolean *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE IsEnumNamedValuePresent( ++ HSTRING enumTypeName, ++ HSTRING valueName, ++ boolean *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE IsApiContractPresentByMajor( ++ HSTRING contractName, ++ UINT16 majorVersion, ++ boolean *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE IsApiContractPresentByMajorAndMinor( ++ HSTRING contractName, ++ UINT16 majorVersion, ++ UINT16 minorVersion, ++ boolean *value) = 0; ++ ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#ifdef __CRT_UUID_DECL ++__CRT_UUID_DECL(ABI::Windows::Foundation::Metadata::IApiInformationStatics, 0x997439fe, 0xf681, 0x4a11, 0xb4,0x16, 0xc1,0x3a,0x47,0xe8,0xba,0x36) ++#endif ++#else ++typedef struct __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStaticsVtbl { ++ BEGIN_INTERFACE ++ ++ /*** IUnknown methods ***/ ++ HRESULT (STDMETHODCALLTYPE *QueryInterface)( ++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This, ++ REFIID riid, ++ void **ppvObject); ++ ++ ULONG (STDMETHODCALLTYPE *AddRef)( ++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This); ++ ++ ULONG (STDMETHODCALLTYPE *Release)( ++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This); ++ ++ /*** IInspectable methods ***/ ++ HRESULT (STDMETHODCALLTYPE *GetIids)( ++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This, ++ ULONG *iidCount, ++ IID **iids); ++ ++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)( ++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This, ++ HSTRING *className); ++ ++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)( ++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This, ++ TrustLevel *trustLevel); ++ ++ /*** IApiInformationStatics methods ***/ ++ HRESULT (STDMETHODCALLTYPE *IsTypePresent)( ++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This, ++ HSTRING typeName, ++ boolean *value); ++ ++ HRESULT (STDMETHODCALLTYPE *IsMethodPresent)( ++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This, ++ HSTRING typeName, ++ HSTRING methodName, ++ boolean *value); ++ ++ HRESULT (STDMETHODCALLTYPE *IsMethodPresentWithArity)( ++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This, ++ HSTRING typeName, ++ HSTRING methodName, ++ UINT32 inputParameterCount, ++ boolean *value); ++ ++ HRESULT (STDMETHODCALLTYPE *IsEventPresent)( ++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This, ++ HSTRING typeName, ++ HSTRING eventName, ++ boolean *value); ++ ++ HRESULT (STDMETHODCALLTYPE *IsPropertyPresent)( ++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This, ++ HSTRING typeName, ++ HSTRING propertyName, ++ boolean *value); ++ ++ HRESULT (STDMETHODCALLTYPE *IsReadOnlyPropertyPresent)( ++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This, ++ HSTRING typeName, ++ HSTRING propertyName, ++ boolean *value); ++ ++ HRESULT (STDMETHODCALLTYPE *IsWriteablePropertyPresent)( ++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This, ++ HSTRING typeName, ++ HSTRING propertyName, ++ boolean *value); ++ ++ HRESULT (STDMETHODCALLTYPE *IsEnumNamedValuePresent)( ++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This, ++ HSTRING enumTypeName, ++ HSTRING valueName, ++ boolean *value); ++ ++ HRESULT (STDMETHODCALLTYPE *IsApiContractPresentByMajor)( ++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This, ++ HSTRING contractName, ++ UINT16 majorVersion, ++ boolean *value); ++ ++ HRESULT (STDMETHODCALLTYPE *IsApiContractPresentByMajorAndMinor)( ++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This, ++ HSTRING contractName, ++ UINT16 majorVersion, ++ UINT16 minorVersion, ++ boolean *value); ++ ++ END_INTERFACE ++} __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStaticsVtbl; ++ ++interface __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics { ++ CONST_VTBL __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStaticsVtbl* lpVtbl; ++}; ++ ++#ifdef COBJMACROS ++#ifndef WIDL_C_INLINE_WRAPPERS ++/*** IUnknown methods ***/ ++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) ++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_AddRef(This) (This)->lpVtbl->AddRef(This) ++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_Release(This) (This)->lpVtbl->Release(This) ++/*** IInspectable methods ***/ ++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids) ++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className) ++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel) ++/*** IApiInformationStatics methods ***/ ++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsTypePresent(This,typeName,value) (This)->lpVtbl->IsTypePresent(This,typeName,value) ++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsMethodPresent(This,typeName,methodName,value) (This)->lpVtbl->IsMethodPresent(This,typeName,methodName,value) ++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsMethodPresentWithArity(This,typeName,methodName,inputParameterCount,value) (This)->lpVtbl->IsMethodPresentWithArity(This,typeName,methodName,inputParameterCount,value) ++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsEventPresent(This,typeName,eventName,value) (This)->lpVtbl->IsEventPresent(This,typeName,eventName,value) ++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsPropertyPresent(This,typeName,propertyName,value) (This)->lpVtbl->IsPropertyPresent(This,typeName,propertyName,value) ++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsReadOnlyPropertyPresent(This,typeName,propertyName,value) (This)->lpVtbl->IsReadOnlyPropertyPresent(This,typeName,propertyName,value) ++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsWriteablePropertyPresent(This,typeName,propertyName,value) (This)->lpVtbl->IsWriteablePropertyPresent(This,typeName,propertyName,value) ++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsEnumNamedValuePresent(This,enumTypeName,valueName,value) (This)->lpVtbl->IsEnumNamedValuePresent(This,enumTypeName,valueName,value) ++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsApiContractPresentByMajor(This,contractName,majorVersion,value) (This)->lpVtbl->IsApiContractPresentByMajor(This,contractName,majorVersion,value) ++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsApiContractPresentByMajorAndMinor(This,contractName,majorVersion,minorVersion,value) (This)->lpVtbl->IsApiContractPresentByMajorAndMinor(This,contractName,majorVersion,minorVersion,value) ++#else ++/*** IUnknown methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_QueryInterface(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,REFIID riid,void **ppvObject) { ++ return This->lpVtbl->QueryInterface(This,riid,ppvObject); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_AddRef(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This) { ++ return This->lpVtbl->AddRef(This); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_Release(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This) { ++ return This->lpVtbl->Release(This); ++} ++/*** IInspectable methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_GetIids(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,ULONG *iidCount,IID **iids) { ++ return This->lpVtbl->GetIids(This,iidCount,iids); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING *className) { ++ return This->lpVtbl->GetRuntimeClassName(This,className); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_GetTrustLevel(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,TrustLevel *trustLevel) { ++ return This->lpVtbl->GetTrustLevel(This,trustLevel); ++} ++/*** IApiInformationStatics methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsTypePresent(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING typeName,boolean *value) { ++ return This->lpVtbl->IsTypePresent(This,typeName,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsMethodPresent(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING typeName,HSTRING methodName,boolean *value) { ++ return This->lpVtbl->IsMethodPresent(This,typeName,methodName,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsMethodPresentWithArity(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING typeName,HSTRING methodName,UINT32 inputParameterCount,boolean *value) { ++ return This->lpVtbl->IsMethodPresentWithArity(This,typeName,methodName,inputParameterCount,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsEventPresent(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING typeName,HSTRING eventName,boolean *value) { ++ return This->lpVtbl->IsEventPresent(This,typeName,eventName,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsPropertyPresent(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING typeName,HSTRING propertyName,boolean *value) { ++ return This->lpVtbl->IsPropertyPresent(This,typeName,propertyName,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsReadOnlyPropertyPresent(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING typeName,HSTRING propertyName,boolean *value) { ++ return This->lpVtbl->IsReadOnlyPropertyPresent(This,typeName,propertyName,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsWriteablePropertyPresent(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING typeName,HSTRING propertyName,boolean *value) { ++ return This->lpVtbl->IsWriteablePropertyPresent(This,typeName,propertyName,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsEnumNamedValuePresent(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING enumTypeName,HSTRING valueName,boolean *value) { ++ return This->lpVtbl->IsEnumNamedValuePresent(This,enumTypeName,valueName,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsApiContractPresentByMajor(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING contractName,UINT16 majorVersion,boolean *value) { ++ return This->lpVtbl->IsApiContractPresentByMajor(This,contractName,majorVersion,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsApiContractPresentByMajorAndMinor(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING contractName,UINT16 majorVersion,UINT16 minorVersion,boolean *value) { ++ return This->lpVtbl->IsApiContractPresentByMajorAndMinor(This,contractName,majorVersion,minorVersion,value); ++} ++#endif ++#endif ++ ++#endif ++ ++#endif /* ____x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_INTERFACE_DEFINED__ */ ++ ++extern const __declspec(selectany) WCHAR RuntimeClass_Windows_Foundation_Metadata_ApiInformation[] = L"Windows.Foundation.Metadata.ApiInformation"; ++/* Begin additional prototypes for all interfaces */ ++ ++ULONG __RPC_USER HSTRING_UserSize (ULONG *, ULONG, HSTRING *); ++unsigned char * __RPC_USER HSTRING_UserMarshal (ULONG *, unsigned char *, HSTRING *); ++unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *); ++void __RPC_USER HSTRING_UserFree (ULONG *, HSTRING *); ++ ++/* End additional prototypes */ ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* __windows_foundation_metadata_h__ */ +diff --git a/mingw-w64-headers/include/windows.foundation.numerics.h b/mingw-w64-headers/include/windows.foundation.numerics.h +new file mode 100644 +index 00000000..e20017ce +--- /dev/null ++++ b/mingw-w64-headers/include/windows.foundation.numerics.h +@@ -0,0 +1,204 @@ ++/*** Autogenerated by WIDL 4.4 from windows.foundation.numerics.idl - Do not edit ***/ ++ ++#ifdef _WIN32 ++#ifndef __REQUIRED_RPCNDR_H_VERSION__ ++#define __REQUIRED_RPCNDR_H_VERSION__ 475 ++#endif ++#include <rpc.h> ++#include <rpcndr.h> ++#endif ++ ++#ifndef COM_NO_WINDOWS_H ++#include <windows.h> ++#include <ole2.h> ++#endif ++ ++#ifndef __windows_foundation_numerics_h__ ++#define __windows_foundation_numerics_h__ ++ ++/* Forward declarations */ ++ ++/* Headers for imported files */ ++ ++#include <inspectable.h> ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace Foundation { ++ namespace Numerics { ++typedef struct Vector2 Vector2; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace Foundation { ++ namespace Numerics { ++typedef struct Vector3 Vector3; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace Foundation { ++ namespace Numerics { ++typedef struct Matrix4x4 Matrix4x4; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace Foundation { ++ namespace Numerics { ++typedef struct Quaternion Quaternion; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#ifdef __cplusplus ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace Foundation { ++ namespace Numerics { ++ struct Vector2 { ++ FLOAT X; ++ FLOAT Y; ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#else ++struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 { ++ FLOAT X; ++ FLOAT Y; ++}; ++#endif ++ ++#ifdef __cplusplus ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace Foundation { ++ namespace Numerics { ++ struct Vector3 { ++ FLOAT X; ++ FLOAT Y; ++ FLOAT Z; ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#else ++struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 { ++ FLOAT X; ++ FLOAT Y; ++ FLOAT Z; ++}; ++#endif ++ ++#ifdef __cplusplus ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace Foundation { ++ namespace Numerics { ++ struct Matrix4x4 { ++ FLOAT M11; ++ FLOAT M12; ++ FLOAT M13; ++ FLOAT M14; ++ FLOAT M21; ++ FLOAT M22; ++ FLOAT M23; ++ FLOAT M24; ++ FLOAT M31; ++ FLOAT M32; ++ FLOAT M33; ++ FLOAT M34; ++ FLOAT M41; ++ FLOAT M42; ++ FLOAT M43; ++ FLOAT M44; ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#else ++struct __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 { ++ FLOAT M11; ++ FLOAT M12; ++ FLOAT M13; ++ FLOAT M14; ++ FLOAT M21; ++ FLOAT M22; ++ FLOAT M23; ++ FLOAT M24; ++ FLOAT M31; ++ FLOAT M32; ++ FLOAT M33; ++ FLOAT M34; ++ FLOAT M41; ++ FLOAT M42; ++ FLOAT M43; ++ FLOAT M44; ++}; ++#endif ++ ++#ifdef __cplusplus ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace Foundation { ++ namespace Numerics { ++ struct Quaternion { ++ FLOAT X; ++ FLOAT Y; ++ FLOAT Z; ++ FLOAT W; ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#else ++struct __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion { ++ FLOAT X; ++ FLOAT Y; ++ FLOAT Z; ++ FLOAT W; ++}; ++#endif ++ ++/* Begin additional prototypes for all interfaces */ ++ ++ ++/* End additional prototypes */ ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* __windows_foundation_numerics_h__ */ +diff --git a/mingw-w64-headers/include/windows.graphics.directx.h b/mingw-w64-headers/include/windows.graphics.directx.h +new file mode 100644 +index 00000000..4bc4cb44 +--- /dev/null ++++ b/mingw-w64-headers/include/windows.graphics.directx.h +@@ -0,0 +1,343 @@ ++/*** Autogenerated by WIDL 4.4 from windows.graphics.directx.idl - Do not edit ***/ ++ ++#ifdef _WIN32 ++#ifndef __REQUIRED_RPCNDR_H_VERSION__ ++#define __REQUIRED_RPCNDR_H_VERSION__ 475 ++#endif ++#include <rpc.h> ++#include <rpcndr.h> ++#endif ++ ++#ifndef COM_NO_WINDOWS_H ++#include <windows.h> ++#include <ole2.h> ++#endif ++ ++#ifndef __windows_graphics_directx_h__ ++#define __windows_graphics_directx_h__ ++ ++/* Forward declarations */ ++ ++/* Headers for imported files */ ++ ++#include <inspectable.h> ++#include <windows.foundation.h> ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#ifdef __cplusplus ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace Graphics { ++ namespace DirectX { ++ enum DirectXAlphaMode { ++ DirectXAlphaMode_Unspecified = 0, ++ DirectXAlphaMode_Premultiplied = 1, ++ DirectXAlphaMode_Straight = 2, ++ DirectXAlphaMode_Ignore = 3 ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#else ++enum __x_ABI_CWindows_CGraphics_CDirectX_CDirectXAlphaMode { ++ DirectXAlphaMode_Unspecified = 0, ++ DirectXAlphaMode_Premultiplied = 1, ++ DirectXAlphaMode_Straight = 2, ++ DirectXAlphaMode_Ignore = 3 ++}; ++#endif ++ ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace Graphics { ++ namespace DirectX { ++typedef enum DirectXAlphaMode DirectXAlphaMode; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#ifdef __cplusplus ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace Graphics { ++ namespace DirectX { ++ enum DirectXPixelFormat { ++ DirectXPixelFormat_Unknown = 0, ++ DirectXPixelFormat_R32G32B32A32Typeless = 1, ++ DirectXPixelFormat_R32G32B32A32Float = 2, ++ DirectXPixelFormat_R32G32B32A32UInt = 3, ++ DirectXPixelFormat_R32G32B32A32Int = 4, ++ DirectXPixelFormat_R32G32B32Typeless = 5, ++ DirectXPixelFormat_R32G32B32Float = 6, ++ DirectXPixelFormat_R32G32B32UInt = 7, ++ DirectXPixelFormat_R32G32B32Int = 8, ++ DirectXPixelFormat_R16G16B16A16Typeless = 9, ++ DirectXPixelFormat_R16G16B16A16Float = 10, ++ DirectXPixelFormat_R16G16B16A16UIntNormalized = 11, ++ DirectXPixelFormat_R16G16B16A16UInt = 12, ++ DirectXPixelFormat_R16G16B16A16IntNormalized = 13, ++ DirectXPixelFormat_R16G16B16A16Int = 14, ++ DirectXPixelFormat_R32G32Typeless = 15, ++ DirectXPixelFormat_R32G32Float = 16, ++ DirectXPixelFormat_R32G32UInt = 17, ++ DirectXPixelFormat_R32G32Int = 18, ++ DirectXPixelFormat_R32G8X24Typeless = 19, ++ DirectXPixelFormat_D32FloatS8X24UInt = 20, ++ DirectXPixelFormat_R32FloatX8X24Typeless = 21, ++ DirectXPixelFormat_X32TypelessG8X24UInt = 22, ++ DirectXPixelFormat_R10G10B10A2Typeless = 23, ++ DirectXPixelFormat_R10G10B10A2UIntNormalized = 24, ++ DirectXPixelFormat_R10G10B10A2UInt = 25, ++ DirectXPixelFormat_R11G11B10Float = 26, ++ DirectXPixelFormat_R8G8B8A8Typeless = 27, ++ DirectXPixelFormat_R8G8B8A8UIntNormalized = 28, ++ DirectXPixelFormat_R8G8B8A8UIntNormalizedSrgb = 29, ++ DirectXPixelFormat_R8G8B8A8UInt = 30, ++ DirectXPixelFormat_R8G8B8A8IntNormalized = 31, ++ DirectXPixelFormat_R8G8B8A8Int = 32, ++ DirectXPixelFormat_R16G16Typeless = 33, ++ DirectXPixelFormat_R16G16Float = 34, ++ DirectXPixelFormat_R16G16UIntNormalized = 35, ++ DirectXPixelFormat_R16G16UInt = 36, ++ DirectXPixelFormat_R16G16IntNormalized = 37, ++ DirectXPixelFormat_R16G16Int = 38, ++ DirectXPixelFormat_R32Typeless = 39, ++ DirectXPixelFormat_D32Float = 40, ++ DirectXPixelFormat_R32Float = 41, ++ DirectXPixelFormat_R32UInt = 42, ++ DirectXPixelFormat_R32Int = 43, ++ DirectXPixelFormat_R24G8Typeless = 44, ++ DirectXPixelFormat_D24UIntNormalizedS8UInt = 45, ++ DirectXPixelFormat_R24UIntNormalizedX8Typeless = 46, ++ DirectXPixelFormat_X24TypelessG8UInt = 47, ++ DirectXPixelFormat_R8G8Typeless = 48, ++ DirectXPixelFormat_R8G8UIntNormalized = 49, ++ DirectXPixelFormat_R8G8UInt = 50, ++ DirectXPixelFormat_R8G8IntNormalized = 51, ++ DirectXPixelFormat_R8G8Int = 52, ++ DirectXPixelFormat_R16Typeless = 53, ++ DirectXPixelFormat_R16Float = 54, ++ DirectXPixelFormat_D16UIntNormalized = 55, ++ DirectXPixelFormat_R16UIntNormalized = 56, ++ DirectXPixelFormat_R16UInt = 57, ++ DirectXPixelFormat_R16IntNormalized = 58, ++ DirectXPixelFormat_R16Int = 59, ++ DirectXPixelFormat_R8Typeless = 60, ++ DirectXPixelFormat_R8UIntNormalized = 61, ++ DirectXPixelFormat_R8UInt = 62, ++ DirectXPixelFormat_R8IntNormalized = 63, ++ DirectXPixelFormat_R8Int = 64, ++ DirectXPixelFormat_A8UIntNormalized = 65, ++ DirectXPixelFormat_R1UIntNormalized = 66, ++ DirectXPixelFormat_R9G9B9E5SharedExponent = 67, ++ DirectXPixelFormat_R8G8B8G8UIntNormalized = 68, ++ DirectXPixelFormat_G8R8G8B8UIntNormalized = 69, ++ DirectXPixelFormat_BC1Typeless = 70, ++ DirectXPixelFormat_BC1UIntNormalized = 71, ++ DirectXPixelFormat_BC1UIntNormalizedSrgb = 72, ++ DirectXPixelFormat_BC2Typeless = 73, ++ DirectXPixelFormat_BC2UIntNormalized = 74, ++ DirectXPixelFormat_BC2UIntNormalizedSrgb = 75, ++ DirectXPixelFormat_BC3Typeless = 76, ++ DirectXPixelFormat_BC3UIntNormalized = 77, ++ DirectXPixelFormat_BC3UIntNormalizedSrgb = 78, ++ DirectXPixelFormat_BC4Typeless = 79, ++ DirectXPixelFormat_BC4UIntNormalized = 80, ++ DirectXPixelFormat_BC4IntNormalized = 81, ++ DirectXPixelFormat_BC5Typeless = 82, ++ DirectXPixelFormat_BC5UIntNormalized = 83, ++ DirectXPixelFormat_BC5IntNormalized = 84, ++ DirectXPixelFormat_B5G6R5UIntNormalized = 85, ++ DirectXPixelFormat_B5G5R5A1UIntNormalized = 86, ++ DirectXPixelFormat_B8G8R8A8UIntNormalized = 87, ++ DirectXPixelFormat_B8G8R8X8UIntNormalized = 88, ++ DirectXPixelFormat_R10G10B10XRBiasA2UIntNormalized = 89, ++ DirectXPixelFormat_B8G8R8A8Typeless = 90, ++ DirectXPixelFormat_B8G8R8A8UIntNormalizedSrgb = 91, ++ DirectXPixelFormat_B8G8R8X8Typeless = 92, ++ DirectXPixelFormat_B8G8R8X8UIntNormalizedSrgb = 93, ++ DirectXPixelFormat_BC6HTypeless = 94, ++ DirectXPixelFormat_BC6H16UnsignedFloat = 95, ++ DirectXPixelFormat_BC6H16Float = 96, ++ DirectXPixelFormat_BC7Typeless = 97, ++ DirectXPixelFormat_BC7UIntNormalized = 98, ++ DirectXPixelFormat_BC7UIntNormalizedSrgb = 99, ++ DirectXPixelFormat_Ayuv = 100, ++ DirectXPixelFormat_Y410 = 101, ++ DirectXPixelFormat_Y416 = 102, ++ DirectXPixelFormat_NV12 = 103, ++ DirectXPixelFormat_P010 = 104, ++ DirectXPixelFormat_P016 = 105, ++ DirectXPixelFormat_Opaque420 = 106, ++ DirectXPixelFormat_Yuy2 = 107, ++ DirectXPixelFormat_Y210 = 108, ++ DirectXPixelFormat_Y216 = 109, ++ DirectXPixelFormat_NV11 = 110, ++ DirectXPixelFormat_AI44 = 111, ++ DirectXPixelFormat_IA44 = 112, ++ DirectXPixelFormat_P8 = 113, ++ DirectXPixelFormat_A8P8 = 114, ++ DirectXPixelFormat_B4G4R4A4UIntNormalized = 115, ++ DirectXPixelFormat_P208 = 130, ++ DirectXPixelFormat_V208 = 131, ++ DirectXPixelFormat_V408 = 132 ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#else ++enum __x_ABI_CWindows_CGraphics_CDirectX_CDirectXPixelFormat { ++ DirectXPixelFormat_Unknown = 0, ++ DirectXPixelFormat_R32G32B32A32Typeless = 1, ++ DirectXPixelFormat_R32G32B32A32Float = 2, ++ DirectXPixelFormat_R32G32B32A32UInt = 3, ++ DirectXPixelFormat_R32G32B32A32Int = 4, ++ DirectXPixelFormat_R32G32B32Typeless = 5, ++ DirectXPixelFormat_R32G32B32Float = 6, ++ DirectXPixelFormat_R32G32B32UInt = 7, ++ DirectXPixelFormat_R32G32B32Int = 8, ++ DirectXPixelFormat_R16G16B16A16Typeless = 9, ++ DirectXPixelFormat_R16G16B16A16Float = 10, ++ DirectXPixelFormat_R16G16B16A16UIntNormalized = 11, ++ DirectXPixelFormat_R16G16B16A16UInt = 12, ++ DirectXPixelFormat_R16G16B16A16IntNormalized = 13, ++ DirectXPixelFormat_R16G16B16A16Int = 14, ++ DirectXPixelFormat_R32G32Typeless = 15, ++ DirectXPixelFormat_R32G32Float = 16, ++ DirectXPixelFormat_R32G32UInt = 17, ++ DirectXPixelFormat_R32G32Int = 18, ++ DirectXPixelFormat_R32G8X24Typeless = 19, ++ DirectXPixelFormat_D32FloatS8X24UInt = 20, ++ DirectXPixelFormat_R32FloatX8X24Typeless = 21, ++ DirectXPixelFormat_X32TypelessG8X24UInt = 22, ++ DirectXPixelFormat_R10G10B10A2Typeless = 23, ++ DirectXPixelFormat_R10G10B10A2UIntNormalized = 24, ++ DirectXPixelFormat_R10G10B10A2UInt = 25, ++ DirectXPixelFormat_R11G11B10Float = 26, ++ DirectXPixelFormat_R8G8B8A8Typeless = 27, ++ DirectXPixelFormat_R8G8B8A8UIntNormalized = 28, ++ DirectXPixelFormat_R8G8B8A8UIntNormalizedSrgb = 29, ++ DirectXPixelFormat_R8G8B8A8UInt = 30, ++ DirectXPixelFormat_R8G8B8A8IntNormalized = 31, ++ DirectXPixelFormat_R8G8B8A8Int = 32, ++ DirectXPixelFormat_R16G16Typeless = 33, ++ DirectXPixelFormat_R16G16Float = 34, ++ DirectXPixelFormat_R16G16UIntNormalized = 35, ++ DirectXPixelFormat_R16G16UInt = 36, ++ DirectXPixelFormat_R16G16IntNormalized = 37, ++ DirectXPixelFormat_R16G16Int = 38, ++ DirectXPixelFormat_R32Typeless = 39, ++ DirectXPixelFormat_D32Float = 40, ++ DirectXPixelFormat_R32Float = 41, ++ DirectXPixelFormat_R32UInt = 42, ++ DirectXPixelFormat_R32Int = 43, ++ DirectXPixelFormat_R24G8Typeless = 44, ++ DirectXPixelFormat_D24UIntNormalizedS8UInt = 45, ++ DirectXPixelFormat_R24UIntNormalizedX8Typeless = 46, ++ DirectXPixelFormat_X24TypelessG8UInt = 47, ++ DirectXPixelFormat_R8G8Typeless = 48, ++ DirectXPixelFormat_R8G8UIntNormalized = 49, ++ DirectXPixelFormat_R8G8UInt = 50, ++ DirectXPixelFormat_R8G8IntNormalized = 51, ++ DirectXPixelFormat_R8G8Int = 52, ++ DirectXPixelFormat_R16Typeless = 53, ++ DirectXPixelFormat_R16Float = 54, ++ DirectXPixelFormat_D16UIntNormalized = 55, ++ DirectXPixelFormat_R16UIntNormalized = 56, ++ DirectXPixelFormat_R16UInt = 57, ++ DirectXPixelFormat_R16IntNormalized = 58, ++ DirectXPixelFormat_R16Int = 59, ++ DirectXPixelFormat_R8Typeless = 60, ++ DirectXPixelFormat_R8UIntNormalized = 61, ++ DirectXPixelFormat_R8UInt = 62, ++ DirectXPixelFormat_R8IntNormalized = 63, ++ DirectXPixelFormat_R8Int = 64, ++ DirectXPixelFormat_A8UIntNormalized = 65, ++ DirectXPixelFormat_R1UIntNormalized = 66, ++ DirectXPixelFormat_R9G9B9E5SharedExponent = 67, ++ DirectXPixelFormat_R8G8B8G8UIntNormalized = 68, ++ DirectXPixelFormat_G8R8G8B8UIntNormalized = 69, ++ DirectXPixelFormat_BC1Typeless = 70, ++ DirectXPixelFormat_BC1UIntNormalized = 71, ++ DirectXPixelFormat_BC1UIntNormalizedSrgb = 72, ++ DirectXPixelFormat_BC2Typeless = 73, ++ DirectXPixelFormat_BC2UIntNormalized = 74, ++ DirectXPixelFormat_BC2UIntNormalizedSrgb = 75, ++ DirectXPixelFormat_BC3Typeless = 76, ++ DirectXPixelFormat_BC3UIntNormalized = 77, ++ DirectXPixelFormat_BC3UIntNormalizedSrgb = 78, ++ DirectXPixelFormat_BC4Typeless = 79, ++ DirectXPixelFormat_BC4UIntNormalized = 80, ++ DirectXPixelFormat_BC4IntNormalized = 81, ++ DirectXPixelFormat_BC5Typeless = 82, ++ DirectXPixelFormat_BC5UIntNormalized = 83, ++ DirectXPixelFormat_BC5IntNormalized = 84, ++ DirectXPixelFormat_B5G6R5UIntNormalized = 85, ++ DirectXPixelFormat_B5G5R5A1UIntNormalized = 86, ++ DirectXPixelFormat_B8G8R8A8UIntNormalized = 87, ++ DirectXPixelFormat_B8G8R8X8UIntNormalized = 88, ++ DirectXPixelFormat_R10G10B10XRBiasA2UIntNormalized = 89, ++ DirectXPixelFormat_B8G8R8A8Typeless = 90, ++ DirectXPixelFormat_B8G8R8A8UIntNormalizedSrgb = 91, ++ DirectXPixelFormat_B8G8R8X8Typeless = 92, ++ DirectXPixelFormat_B8G8R8X8UIntNormalizedSrgb = 93, ++ DirectXPixelFormat_BC6HTypeless = 94, ++ DirectXPixelFormat_BC6H16UnsignedFloat = 95, ++ DirectXPixelFormat_BC6H16Float = 96, ++ DirectXPixelFormat_BC7Typeless = 97, ++ DirectXPixelFormat_BC7UIntNormalized = 98, ++ DirectXPixelFormat_BC7UIntNormalizedSrgb = 99, ++ DirectXPixelFormat_Ayuv = 100, ++ DirectXPixelFormat_Y410 = 101, ++ DirectXPixelFormat_Y416 = 102, ++ DirectXPixelFormat_NV12 = 103, ++ DirectXPixelFormat_P010 = 104, ++ DirectXPixelFormat_P016 = 105, ++ DirectXPixelFormat_Opaque420 = 106, ++ DirectXPixelFormat_Yuy2 = 107, ++ DirectXPixelFormat_Y210 = 108, ++ DirectXPixelFormat_Y216 = 109, ++ DirectXPixelFormat_NV11 = 110, ++ DirectXPixelFormat_AI44 = 111, ++ DirectXPixelFormat_IA44 = 112, ++ DirectXPixelFormat_P8 = 113, ++ DirectXPixelFormat_A8P8 = 114, ++ DirectXPixelFormat_B4G4R4A4UIntNormalized = 115, ++ DirectXPixelFormat_P208 = 130, ++ DirectXPixelFormat_V208 = 131, ++ DirectXPixelFormat_V408 = 132 ++}; ++#endif ++ ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace Graphics { ++ namespace DirectX { ++typedef enum DirectXPixelFormat DirectXPixelFormat; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++/* Begin additional prototypes for all interfaces */ ++ ++ ++/* End additional prototypes */ ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* __windows_graphics_directx_h__ */ +diff --git a/mingw-w64-headers/include/windows.graphics.effects.h b/mingw-w64-headers/include/windows.graphics.effects.h +new file mode 100644 +index 00000000..7c6e62a5 +--- /dev/null ++++ b/mingw-w64-headers/include/windows.graphics.effects.h +@@ -0,0 +1,184 @@ ++/*** Autogenerated by WIDL 4.4 from windows.graphics.effects.idl - Do not edit ***/ ++ ++#ifdef _WIN32 ++#ifndef __REQUIRED_RPCNDR_H_VERSION__ ++#define __REQUIRED_RPCNDR_H_VERSION__ 475 ++#endif ++#include <rpc.h> ++#include <rpcndr.h> ++#endif ++ ++#ifndef COM_NO_WINDOWS_H ++#include <windows.h> ++#include <ole2.h> ++#endif ++ ++#ifndef __windows_graphics_effects_h__ ++#define __windows_graphics_effects_h__ ++ ++/* Forward declarations */ ++ ++#ifndef ____x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace Graphics { ++ namespace Effects { ++ interface IGraphicsEffect; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++/* Headers for imported files */ ++ ++#include <inspectable.h> ++#include <windows.foundation.h> ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/***************************************************************************** ++ * IGraphicsEffect interface ++ */ ++#ifndef ____x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_INTERFACE_DEFINED__ ++#define ____x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_INTERFACE_DEFINED__ ++ ++DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect, 0xcb51c0ce, 0x8fe6, 0x4636, 0xb2,0x02, 0x86,0x1f,0xaa,0x07,0xd8,0xf3); ++#if defined(__cplusplus) && !defined(CINTERFACE) ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace Graphics { ++ namespace Effects { ++ MIDL_INTERFACE("cb51c0ce-8fe6-4636-b202-861faa07d8f3") ++ IGraphicsEffect : public IInspectable ++ { ++ virtual HRESULT STDMETHODCALLTYPE get_Name( ++ HSTRING *name) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_Name( ++ HSTRING name) = 0; ++ ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#ifdef __CRT_UUID_DECL ++__CRT_UUID_DECL(ABI::Windows::Graphics::Effects::IGraphicsEffect, 0xcb51c0ce, 0x8fe6, 0x4636, 0xb2,0x02, 0x86,0x1f,0xaa,0x07,0xd8,0xf3) ++#endif ++#else ++typedef struct __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffectVtbl { ++ BEGIN_INTERFACE ++ ++ /*** IUnknown methods ***/ ++ HRESULT (STDMETHODCALLTYPE *QueryInterface)( ++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This, ++ REFIID riid, ++ void **ppvObject); ++ ++ ULONG (STDMETHODCALLTYPE *AddRef)( ++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This); ++ ++ ULONG (STDMETHODCALLTYPE *Release)( ++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This); ++ ++ /*** IInspectable methods ***/ ++ HRESULT (STDMETHODCALLTYPE *GetIids)( ++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This, ++ ULONG *iidCount, ++ IID **iids); ++ ++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)( ++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This, ++ HSTRING *className); ++ ++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)( ++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This, ++ TrustLevel *trustLevel); ++ ++ /*** IGraphicsEffect methods ***/ ++ HRESULT (STDMETHODCALLTYPE *get_Name)( ++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This, ++ HSTRING *name); ++ ++ HRESULT (STDMETHODCALLTYPE *put_Name)( ++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This, ++ HSTRING name); ++ ++ END_INTERFACE ++} __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffectVtbl; ++ ++interface __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect { ++ CONST_VTBL __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffectVtbl* lpVtbl; ++}; ++ ++#ifdef COBJMACROS ++#ifndef WIDL_C_INLINE_WRAPPERS ++/*** IUnknown methods ***/ ++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) ++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_AddRef(This) (This)->lpVtbl->AddRef(This) ++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_Release(This) (This)->lpVtbl->Release(This) ++/*** IInspectable methods ***/ ++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids) ++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className) ++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel) ++/*** IGraphicsEffect methods ***/ ++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_get_Name(This,name) (This)->lpVtbl->get_Name(This,name) ++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_put_Name(This,name) (This)->lpVtbl->put_Name(This,name) ++#else ++/*** IUnknown methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_QueryInterface(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This,REFIID riid,void **ppvObject) { ++ return This->lpVtbl->QueryInterface(This,riid,ppvObject); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_AddRef(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This) { ++ return This->lpVtbl->AddRef(This); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_Release(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This) { ++ return This->lpVtbl->Release(This); ++} ++/*** IInspectable methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_GetIids(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This,ULONG *iidCount,IID **iids) { ++ return This->lpVtbl->GetIids(This,iidCount,iids); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This,HSTRING *className) { ++ return This->lpVtbl->GetRuntimeClassName(This,className); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_GetTrustLevel(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This,TrustLevel *trustLevel) { ++ return This->lpVtbl->GetTrustLevel(This,trustLevel); ++} ++/*** IGraphicsEffect methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_get_Name(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This,HSTRING *name) { ++ return This->lpVtbl->get_Name(This,name); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_put_Name(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This,HSTRING name) { ++ return This->lpVtbl->put_Name(This,name); ++} ++#endif ++#endif ++ ++#endif ++ ++#endif /* ____x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_INTERFACE_DEFINED__ */ ++ ++/* Begin additional prototypes for all interfaces */ ++ ++ULONG __RPC_USER HSTRING_UserSize (ULONG *, ULONG, HSTRING *); ++unsigned char * __RPC_USER HSTRING_UserMarshal (ULONG *, unsigned char *, HSTRING *); ++unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *); ++void __RPC_USER HSTRING_UserFree (ULONG *, HSTRING *); ++ ++/* End additional prototypes */ ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* __windows_graphics_effects_h__ */ +diff --git a/mingw-w64-headers/include/windows.ui.composition.h b/mingw-w64-headers/include/windows.ui.composition.h +new file mode 100644 +index 00000000..9410a3ce +--- /dev/null ++++ b/mingw-w64-headers/include/windows.ui.composition.h +@@ -0,0 +1,3212 @@ ++/*** Autogenerated by WIDL 4.4 from windows.ui.composition.idl - Do not edit ***/ ++ ++#ifdef _WIN32 ++#ifndef __REQUIRED_RPCNDR_H_VERSION__ ++#define __REQUIRED_RPCNDR_H_VERSION__ 475 ++#endif ++#include <rpc.h> ++#include <rpcndr.h> ++#endif ++ ++#ifndef COM_NO_WINDOWS_H ++#include <windows.h> ++#include <ole2.h> ++#endif ++ ++#ifndef __windows_ui_composition_h__ ++#define __windows_ui_composition_h__ ++ ++/* Forward declarations */ ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionBrush_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionBrush_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionBrush __x_ABI_CWindows_CUI_CComposition_CICompositionBrush; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface ICompositionBrush; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionSurface_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionSurface_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionSurface __x_ABI_CWindows_CUI_CComposition_CICompositionSurface; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface ICompositionSurface; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface ICompositionSurfaceBrush; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionBrush_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionBrush_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionBrush __x_ABI_CWindows_CUI_CComposition_CCompositionBrush; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface CompositionBrush; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CISpriteVisual __x_ABI_CWindows_CUI_CComposition_CISpriteVisual; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface ISpriteVisual; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CSpriteVisual_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CSpriteVisual_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CSpriteVisual __x_ABI_CWindows_CUI_CComposition_CSpriteVisual; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface SpriteVisual; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionClip_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionClip_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionClip __x_ABI_CWindows_CUI_CComposition_CCompositionClip; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface CompositionClip; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CContainerVisual_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CContainerVisual_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CContainerVisual __x_ABI_CWindows_CUI_CComposition_CContainerVisual; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface ContainerVisual; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVisual_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CIVisual_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CIVisual __x_ABI_CWindows_CUI_CComposition_CIVisual; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface IVisual; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositor_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CCompositor_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositor __x_ABI_CWindows_CUI_CComposition_CCompositor; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface Compositor; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface CompositionPropertySet; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface CompositionAnimation; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionObject_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionObject_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionObject __x_ABI_CWindows_CUI_CComposition_CICompositionObject; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface ICompositionObject; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface ColorKeyFrameAnimation; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface CompositionColorBrush; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface CubicBezierEasingFunction; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositor_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CICompositor_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositor __x_ABI_CWindows_CUI_CComposition_CICompositor; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface ICompositor; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface ICompositionGraphicsDevice; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++/* Headers for imported files */ ++ ++#include <inspectable.h> ++#include <windows.foundation.h> ++#include <windows.foundation.numerics.h> ++#include <windows.graphics.directx.h> ++#include <windows.graphics.effects.h> ++#include <windows.ui.h> ++#include <windows.ui.core.h> ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#ifdef __cplusplus ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ enum CompositionBitmapInterpolationMode { ++ CompositionBitmapInterpolationMode_NearestNeighbor = 0, ++ CompositionBitmapInterpolationMode_Linear = 1 ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#else ++enum __x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode { ++ CompositionBitmapInterpolationMode_NearestNeighbor = 0, ++ CompositionBitmapInterpolationMode_Linear = 1 ++}; ++#endif ++ ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++typedef enum CompositionBitmapInterpolationMode CompositionBitmapInterpolationMode; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#ifdef __cplusplus ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ enum CompositionStretch { ++ CompositionStretch_None = 0, ++ CompositionStretch_Fill = 1, ++ CompositionStretch_Uniform = 2, ++ CompositionStretch_UniformToFill = 3 ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#else ++enum __x_ABI_CWindows_CUI_CComposition_CCompositionStretch { ++ CompositionStretch_None = 0, ++ CompositionStretch_Fill = 1, ++ CompositionStretch_Uniform = 2, ++ CompositionStretch_UniformToFill = 3 ++}; ++#endif ++ ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++typedef enum CompositionStretch CompositionStretch; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#ifdef __cplusplus ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ enum CompositionBackfaceVisibility { ++ CompositionBackfaceVisibility_Inherit = 0, ++ CompositionBackfaceVisibility_Visible = 1, ++ CompositionBackfaceVisibility_Hidden = 2 ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#else ++enum __x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility { ++ CompositionBackfaceVisibility_Inherit = 0, ++ CompositionBackfaceVisibility_Visible = 1, ++ CompositionBackfaceVisibility_Hidden = 2 ++}; ++#endif ++ ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++typedef enum CompositionBackfaceVisibility CompositionBackfaceVisibility; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#ifdef __cplusplus ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ enum CompositionBorderMode { ++ CompositionBorderMode_Inherit = 0, ++ CompositionBorderMode_Soft = 1, ++ CompositionBorderMode_Hard = 2 ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#else ++enum __x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode { ++ CompositionBorderMode_Inherit = 0, ++ CompositionBorderMode_Soft = 1, ++ CompositionBorderMode_Hard = 2 ++}; ++#endif ++ ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++typedef enum CompositionBorderMode CompositionBorderMode; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#ifdef __cplusplus ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ enum CompositionCompositeMode { ++ CompositionCompositeMode_Inherit = 0, ++ CompositionCompositeMode_SourceOver = 1, ++ CompositionCompositeMode_DestinationInvert = 2, ++ CompositionCompositeMode_MinBlend = 3 ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#else ++enum __x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode { ++ CompositionCompositeMode_Inherit = 0, ++ CompositionCompositeMode_SourceOver = 1, ++ CompositionCompositeMode_DestinationInvert = 2, ++ CompositionCompositeMode_MinBlend = 3 ++}; ++#endif ++ ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++typedef enum CompositionCompositeMode CompositionCompositeMode; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#ifdef __cplusplus ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ enum CompositionBatchTypes { ++ CompositionBatchTypes_None = 0x0, ++ CompositionBatchTypes_Animation = 0x1, ++ CompositionBatchTypes_Effect = 0x2 ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#else ++enum __x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes { ++ CompositionBatchTypes_None = 0x0, ++ CompositionBatchTypes_Animation = 0x1, ++ CompositionBatchTypes_Effect = 0x2 ++}; ++#endif ++ ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++typedef enum CompositionBatchTypes CompositionBatchTypes; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++/***************************************************************************** ++ * ICompositionBrush interface ++ */ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionBrush_INTERFACE_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionBrush_INTERFACE_DEFINED__ ++ ++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionBrush, 0xab0d7608, 0x30c0, 0x40e9, 0xb5,0x68, 0xb6,0x0a,0x6b,0xd1,0xfb,0x46); ++#if defined(__cplusplus) && !defined(CINTERFACE) ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ MIDL_INTERFACE("ab0d7608-30c0-40e9-b568-b60a6bd1fb46") ++ ICompositionBrush : public IInspectable ++ { ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#ifdef __CRT_UUID_DECL ++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ICompositionBrush, 0xab0d7608, 0x30c0, 0x40e9, 0xb5,0x68, 0xb6,0x0a,0x6b,0xd1,0xfb,0x46) ++#endif ++#else ++typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionBrushVtbl { ++ BEGIN_INTERFACE ++ ++ /*** IUnknown methods ***/ ++ HRESULT (STDMETHODCALLTYPE *QueryInterface)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *This, ++ REFIID riid, ++ void **ppvObject); ++ ++ ULONG (STDMETHODCALLTYPE *AddRef)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *This); ++ ++ ULONG (STDMETHODCALLTYPE *Release)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *This); ++ ++ /*** IInspectable methods ***/ ++ HRESULT (STDMETHODCALLTYPE *GetIids)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *This, ++ ULONG *iidCount, ++ IID **iids); ++ ++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *This, ++ HSTRING *className); ++ ++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *This, ++ TrustLevel *trustLevel); ++ ++ END_INTERFACE ++} __x_ABI_CWindows_CUI_CComposition_CICompositionBrushVtbl; ++ ++interface __x_ABI_CWindows_CUI_CComposition_CICompositionBrush { ++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionBrushVtbl* lpVtbl; ++}; ++ ++#ifdef COBJMACROS ++#ifndef WIDL_C_INLINE_WRAPPERS ++/*** IUnknown methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_AddRef(This) (This)->lpVtbl->AddRef(This) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_Release(This) (This)->lpVtbl->Release(This) ++/*** IInspectable methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel) ++#else ++/*** IUnknown methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This,REFIID riid,void **ppvObject) { ++ return This->lpVtbl->QueryInterface(This,riid,ppvObject); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This) { ++ return This->lpVtbl->AddRef(This); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This) { ++ return This->lpVtbl->Release(This); ++} ++/*** IInspectable methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This,ULONG *iidCount,IID **iids) { ++ return This->lpVtbl->GetIids(This,iidCount,iids); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This,HSTRING *className) { ++ return This->lpVtbl->GetRuntimeClassName(This,className); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This,TrustLevel *trustLevel) { ++ return This->lpVtbl->GetTrustLevel(This,trustLevel); ++} ++#endif ++#endif ++ ++#endif ++ ++#endif /* ____x_ABI_CWindows_CUI_CComposition_CICompositionBrush_INTERFACE_DEFINED__ */ ++ ++/***************************************************************************** ++ * ICompositionSurface interface ++ */ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionSurface_INTERFACE_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionSurface_INTERFACE_DEFINED__ ++ ++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionSurface, 0x1527540d, 0x42c7, 0x47a6, 0xa4,0x08, 0x66,0x8f,0x79,0xa9,0x0d,0xfb); ++#if defined(__cplusplus) && !defined(CINTERFACE) ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ MIDL_INTERFACE("1527540d-42c7-47a6-a408-668f79a90dfb") ++ ICompositionSurface : public IInspectable ++ { ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#ifdef __CRT_UUID_DECL ++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ICompositionSurface, 0x1527540d, 0x42c7, 0x47a6, 0xa4,0x08, 0x66,0x8f,0x79,0xa9,0x0d,0xfb) ++#endif ++#else ++typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceVtbl { ++ BEGIN_INTERFACE ++ ++ /*** IUnknown methods ***/ ++ HRESULT (STDMETHODCALLTYPE *QueryInterface)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *This, ++ REFIID riid, ++ void **ppvObject); ++ ++ ULONG (STDMETHODCALLTYPE *AddRef)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *This); ++ ++ ULONG (STDMETHODCALLTYPE *Release)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *This); ++ ++ /*** IInspectable methods ***/ ++ HRESULT (STDMETHODCALLTYPE *GetIids)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *This, ++ ULONG *iidCount, ++ IID **iids); ++ ++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *This, ++ HSTRING *className); ++ ++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *This, ++ TrustLevel *trustLevel); ++ ++ END_INTERFACE ++} __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceVtbl; ++ ++interface __x_ABI_CWindows_CUI_CComposition_CICompositionSurface { ++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceVtbl* lpVtbl; ++}; ++ ++#ifdef COBJMACROS ++#ifndef WIDL_C_INLINE_WRAPPERS ++/*** IUnknown methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_AddRef(This) (This)->lpVtbl->AddRef(This) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_Release(This) (This)->lpVtbl->Release(This) ++/*** IInspectable methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel) ++#else ++/*** IUnknown methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This,REFIID riid,void **ppvObject) { ++ return This->lpVtbl->QueryInterface(This,riid,ppvObject); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This) { ++ return This->lpVtbl->AddRef(This); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This) { ++ return This->lpVtbl->Release(This); ++} ++/*** IInspectable methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This,ULONG *iidCount,IID **iids) { ++ return This->lpVtbl->GetIids(This,iidCount,iids); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This,HSTRING *className) { ++ return This->lpVtbl->GetRuntimeClassName(This,className); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This,TrustLevel *trustLevel) { ++ return This->lpVtbl->GetTrustLevel(This,trustLevel); ++} ++#endif ++#endif ++ ++#endif ++ ++#endif /* ____x_ABI_CWindows_CUI_CComposition_CICompositionSurface_INTERFACE_DEFINED__ */ ++ ++/***************************************************************************** ++ * ICompositionSurfaceBrush interface ++ */ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_INTERFACE_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_INTERFACE_DEFINED__ ++ ++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush, 0xad016d79, 0x1e4c, 0x4c0d, 0x9c,0x29, 0x83,0x33,0x8c,0x87,0xc1,0x62); ++#if defined(__cplusplus) && !defined(CINTERFACE) ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ MIDL_INTERFACE("ad016d79-1e4c-4c0d-9c29-83338c87c162") ++ ICompositionSurfaceBrush : public IInspectable ++ { ++ virtual HRESULT STDMETHODCALLTYPE get_BitmapInterpolationMode( ++ ABI::Windows::UI::Composition::CompositionBitmapInterpolationMode *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_BitmapInterpolationMode( ++ ABI::Windows::UI::Composition::CompositionBitmapInterpolationMode value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE get_HorizontalAlignmentRatio( ++ FLOAT *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_HorizontalAlignmentRatio( ++ FLOAT value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE get_Stretch( ++ ABI::Windows::UI::Composition::CompositionStretch *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_Stretch( ++ ABI::Windows::UI::Composition::CompositionStretch value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE get_Surface( ++ ABI::Windows::UI::Composition::ICompositionSurface **value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_Surface( ++ ABI::Windows::UI::Composition::ICompositionSurface *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE get_VerticalAlignmentRatio( ++ FLOAT *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_VerticalAlignmentRatio( ++ FLOAT value) = 0; ++ ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#ifdef __CRT_UUID_DECL ++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ICompositionSurfaceBrush, 0xad016d79, 0x1e4c, 0x4c0d, 0x9c,0x29, 0x83,0x33,0x8c,0x87,0xc1,0x62) ++#endif ++#else ++typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrushVtbl { ++ BEGIN_INTERFACE ++ ++ /*** IUnknown methods ***/ ++ HRESULT (STDMETHODCALLTYPE *QueryInterface)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This, ++ REFIID riid, ++ void **ppvObject); ++ ++ ULONG (STDMETHODCALLTYPE *AddRef)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This); ++ ++ ULONG (STDMETHODCALLTYPE *Release)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This); ++ ++ /*** IInspectable methods ***/ ++ HRESULT (STDMETHODCALLTYPE *GetIids)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This, ++ ULONG *iidCount, ++ IID **iids); ++ ++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This, ++ HSTRING *className); ++ ++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This, ++ TrustLevel *trustLevel); ++ ++ /*** ICompositionSurfaceBrush methods ***/ ++ HRESULT (STDMETHODCALLTYPE *get_BitmapInterpolationMode)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode *value); ++ ++ HRESULT (STDMETHODCALLTYPE *put_BitmapInterpolationMode)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode value); ++ ++ HRESULT (STDMETHODCALLTYPE *get_HorizontalAlignmentRatio)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This, ++ FLOAT *value); ++ ++ HRESULT (STDMETHODCALLTYPE *put_HorizontalAlignmentRatio)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This, ++ FLOAT value); ++ ++ HRESULT (STDMETHODCALLTYPE *get_Stretch)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionStretch *value); ++ ++ HRESULT (STDMETHODCALLTYPE *put_Stretch)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionStretch value); ++ ++ HRESULT (STDMETHODCALLTYPE *get_Surface)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This, ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface **value); ++ ++ HRESULT (STDMETHODCALLTYPE *put_Surface)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This, ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *value); ++ ++ HRESULT (STDMETHODCALLTYPE *get_VerticalAlignmentRatio)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This, ++ FLOAT *value); ++ ++ HRESULT (STDMETHODCALLTYPE *put_VerticalAlignmentRatio)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This, ++ FLOAT value); ++ ++ END_INTERFACE ++} __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrushVtbl; ++ ++interface __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush { ++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrushVtbl* lpVtbl; ++}; ++ ++#ifdef COBJMACROS ++#ifndef WIDL_C_INLINE_WRAPPERS ++/*** IUnknown methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_AddRef(This) (This)->lpVtbl->AddRef(This) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_Release(This) (This)->lpVtbl->Release(This) ++/*** IInspectable methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel) ++/*** ICompositionSurfaceBrush methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_BitmapInterpolationMode(This,value) (This)->lpVtbl->get_BitmapInterpolationMode(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_BitmapInterpolationMode(This,value) (This)->lpVtbl->put_BitmapInterpolationMode(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_HorizontalAlignmentRatio(This,value) (This)->lpVtbl->get_HorizontalAlignmentRatio(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_HorizontalAlignmentRatio(This,value) (This)->lpVtbl->put_HorizontalAlignmentRatio(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_Stretch(This,value) (This)->lpVtbl->get_Stretch(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_Stretch(This,value) (This)->lpVtbl->put_Stretch(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_Surface(This,value) (This)->lpVtbl->get_Surface(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_Surface(This,value) (This)->lpVtbl->put_Surface(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_VerticalAlignmentRatio(This,value) (This)->lpVtbl->get_VerticalAlignmentRatio(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_VerticalAlignmentRatio(This,value) (This)->lpVtbl->put_VerticalAlignmentRatio(This,value) ++#else ++/*** IUnknown methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,REFIID riid,void **ppvObject) { ++ return This->lpVtbl->QueryInterface(This,riid,ppvObject); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This) { ++ return This->lpVtbl->AddRef(This); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This) { ++ return This->lpVtbl->Release(This); ++} ++/*** IInspectable methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,ULONG *iidCount,IID **iids) { ++ return This->lpVtbl->GetIids(This,iidCount,iids); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,HSTRING *className) { ++ return This->lpVtbl->GetRuntimeClassName(This,className); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,TrustLevel *trustLevel) { ++ return This->lpVtbl->GetTrustLevel(This,trustLevel); ++} ++/*** ICompositionSurfaceBrush methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_BitmapInterpolationMode(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode *value) { ++ return This->lpVtbl->get_BitmapInterpolationMode(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_BitmapInterpolationMode(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode value) { ++ return This->lpVtbl->put_BitmapInterpolationMode(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_HorizontalAlignmentRatio(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,FLOAT *value) { ++ return This->lpVtbl->get_HorizontalAlignmentRatio(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_HorizontalAlignmentRatio(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,FLOAT value) { ++ return This->lpVtbl->put_HorizontalAlignmentRatio(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_Stretch(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CCompositionStretch *value) { ++ return This->lpVtbl->get_Stretch(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_Stretch(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CCompositionStretch value) { ++ return This->lpVtbl->put_Stretch(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_Surface(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CICompositionSurface **value) { ++ return This->lpVtbl->get_Surface(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_Surface(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CICompositionSurface *value) { ++ return This->lpVtbl->put_Surface(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_VerticalAlignmentRatio(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,FLOAT *value) { ++ return This->lpVtbl->get_VerticalAlignmentRatio(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_VerticalAlignmentRatio(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,FLOAT value) { ++ return This->lpVtbl->put_VerticalAlignmentRatio(This,value); ++} ++#endif ++#endif ++ ++#endif ++ ++#endif /* ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_INTERFACE_DEFINED__ */ ++ ++/***************************************************************************** ++ * CompositionBrush interface ++ */ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionBrush_INTERFACE_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionBrush_INTERFACE_DEFINED__ ++ ++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CCompositionBrush, 0x08e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3c); ++#if defined(__cplusplus) && !defined(CINTERFACE) ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ MIDL_INTERFACE("08e05581-1ad1-4f97-9666-402d76e4233c") ++ CompositionBrush : public IUnknown ++ { ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#ifdef __CRT_UUID_DECL ++__CRT_UUID_DECL(ABI::Windows::UI::Composition::CompositionBrush, 0x08e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3c) ++#endif ++#else ++typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionBrushVtbl { ++ BEGIN_INTERFACE ++ ++ /*** IUnknown methods ***/ ++ HRESULT (STDMETHODCALLTYPE *QueryInterface)( ++ __x_ABI_CWindows_CUI_CComposition_CCompositionBrush *This, ++ REFIID riid, ++ void **ppvObject); ++ ++ ULONG (STDMETHODCALLTYPE *AddRef)( ++ __x_ABI_CWindows_CUI_CComposition_CCompositionBrush *This); ++ ++ ULONG (STDMETHODCALLTYPE *Release)( ++ __x_ABI_CWindows_CUI_CComposition_CCompositionBrush *This); ++ ++ END_INTERFACE ++} __x_ABI_CWindows_CUI_CComposition_CCompositionBrushVtbl; ++ ++interface __x_ABI_CWindows_CUI_CComposition_CCompositionBrush { ++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CCompositionBrushVtbl* lpVtbl; ++}; ++ ++#ifdef COBJMACROS ++#ifndef WIDL_C_INLINE_WRAPPERS ++/*** IUnknown methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CCompositionBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) ++#define __x_ABI_CWindows_CUI_CComposition_CCompositionBrush_AddRef(This) (This)->lpVtbl->AddRef(This) ++#define __x_ABI_CWindows_CUI_CComposition_CCompositionBrush_Release(This) (This)->lpVtbl->Release(This) ++#else ++/*** IUnknown methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CCompositionBrush_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CCompositionBrush* This,REFIID riid,void **ppvObject) { ++ return This->lpVtbl->QueryInterface(This,riid,ppvObject); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionBrush_AddRef(__x_ABI_CWindows_CUI_CComposition_CCompositionBrush* This) { ++ return This->lpVtbl->AddRef(This); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionBrush_Release(__x_ABI_CWindows_CUI_CComposition_CCompositionBrush* This) { ++ return This->lpVtbl->Release(This); ++} ++#endif ++#endif ++ ++#endif ++ ++#endif /* ____x_ABI_CWindows_CUI_CComposition_CCompositionBrush_INTERFACE_DEFINED__ */ ++ ++/***************************************************************************** ++ * ISpriteVisual interface ++ */ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual_INTERFACE_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual_INTERFACE_DEFINED__ ++ ++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CISpriteVisual, 0x08e05581, 0x1ad1, 0x4f97, 0x97,0x57, 0x40,0x2d,0x76,0xe4,0x23,0x3b); ++#if defined(__cplusplus) && !defined(CINTERFACE) ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ MIDL_INTERFACE("08e05581-1ad1-4f97-9757-402d76e4233b") ++ ISpriteVisual : public IInspectable ++ { ++ virtual HRESULT STDMETHODCALLTYPE get_Brush( ++ ABI::Windows::UI::Composition::CompositionBrush **value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_Brush( ++ ABI::Windows::UI::Composition::ICompositionBrush *value) = 0; ++ ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#ifdef __CRT_UUID_DECL ++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ISpriteVisual, 0x08e05581, 0x1ad1, 0x4f97, 0x97,0x57, 0x40,0x2d,0x76,0xe4,0x23,0x3b) ++#endif ++#else ++typedef struct __x_ABI_CWindows_CUI_CComposition_CISpriteVisualVtbl { ++ BEGIN_INTERFACE ++ ++ /*** IUnknown methods ***/ ++ HRESULT (STDMETHODCALLTYPE *QueryInterface)( ++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This, ++ REFIID riid, ++ void **ppvObject); ++ ++ ULONG (STDMETHODCALLTYPE *AddRef)( ++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This); ++ ++ ULONG (STDMETHODCALLTYPE *Release)( ++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This); ++ ++ /*** IInspectable methods ***/ ++ HRESULT (STDMETHODCALLTYPE *GetIids)( ++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This, ++ ULONG *iidCount, ++ IID **iids); ++ ++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)( ++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This, ++ HSTRING *className); ++ ++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)( ++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This, ++ TrustLevel *trustLevel); ++ ++ /*** ISpriteVisual methods ***/ ++ HRESULT (STDMETHODCALLTYPE *get_Brush)( ++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionBrush **value); ++ ++ HRESULT (STDMETHODCALLTYPE *put_Brush)( ++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This, ++ __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *value); ++ ++ END_INTERFACE ++} __x_ABI_CWindows_CUI_CComposition_CISpriteVisualVtbl; ++ ++interface __x_ABI_CWindows_CUI_CComposition_CISpriteVisual { ++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CISpriteVisualVtbl* lpVtbl; ++}; ++ ++#ifdef COBJMACROS ++#ifndef WIDL_C_INLINE_WRAPPERS ++/*** IUnknown methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) ++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_AddRef(This) (This)->lpVtbl->AddRef(This) ++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_Release(This) (This)->lpVtbl->Release(This) ++/*** IInspectable methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids) ++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className) ++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel) ++/*** ISpriteVisual methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_get_Brush(This,value) (This)->lpVtbl->get_Brush(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_put_Brush(This,value) (This)->lpVtbl->put_Brush(This,value) ++#else ++/*** IUnknown methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,REFIID riid,void **ppvObject) { ++ return This->lpVtbl->QueryInterface(This,riid,ppvObject); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_AddRef(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This) { ++ return This->lpVtbl->AddRef(This); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_Release(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This) { ++ return This->lpVtbl->Release(This); ++} ++/*** IInspectable methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetIids(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,ULONG *iidCount,IID **iids) { ++ return This->lpVtbl->GetIids(This,iidCount,iids); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,HSTRING *className) { ++ return This->lpVtbl->GetRuntimeClassName(This,className); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,TrustLevel *trustLevel) { ++ return This->lpVtbl->GetTrustLevel(This,trustLevel); ++} ++/*** ISpriteVisual methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_get_Brush(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBrush **value) { ++ return This->lpVtbl->get_Brush(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_put_Brush(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,__x_ABI_CWindows_CUI_CComposition_CICompositionBrush *value) { ++ return This->lpVtbl->put_Brush(This,value); ++} ++#endif ++#endif ++ ++#endif ++ ++#endif /* ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual_INTERFACE_DEFINED__ */ ++ ++/***************************************************************************** ++ * SpriteVisual interface ++ */ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CSpriteVisual_INTERFACE_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CSpriteVisual_INTERFACE_DEFINED__ ++ ++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CSpriteVisual, 0x08e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b); ++#if defined(__cplusplus) && !defined(CINTERFACE) ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ MIDL_INTERFACE("08e05581-1ad1-4f97-9666-402d76e4233b") ++ SpriteVisual : public IUnknown ++ { ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#ifdef __CRT_UUID_DECL ++__CRT_UUID_DECL(ABI::Windows::UI::Composition::SpriteVisual, 0x08e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b) ++#endif ++#else ++typedef struct __x_ABI_CWindows_CUI_CComposition_CSpriteVisualVtbl { ++ BEGIN_INTERFACE ++ ++ /*** IUnknown methods ***/ ++ HRESULT (STDMETHODCALLTYPE *QueryInterface)( ++ __x_ABI_CWindows_CUI_CComposition_CSpriteVisual *This, ++ REFIID riid, ++ void **ppvObject); ++ ++ ULONG (STDMETHODCALLTYPE *AddRef)( ++ __x_ABI_CWindows_CUI_CComposition_CSpriteVisual *This); ++ ++ ULONG (STDMETHODCALLTYPE *Release)( ++ __x_ABI_CWindows_CUI_CComposition_CSpriteVisual *This); ++ ++ END_INTERFACE ++} __x_ABI_CWindows_CUI_CComposition_CSpriteVisualVtbl; ++ ++interface __x_ABI_CWindows_CUI_CComposition_CSpriteVisual { ++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CSpriteVisualVtbl* lpVtbl; ++}; ++ ++#ifdef COBJMACROS ++#ifndef WIDL_C_INLINE_WRAPPERS ++/*** IUnknown methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CSpriteVisual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) ++#define __x_ABI_CWindows_CUI_CComposition_CSpriteVisual_AddRef(This) (This)->lpVtbl->AddRef(This) ++#define __x_ABI_CWindows_CUI_CComposition_CSpriteVisual_Release(This) (This)->lpVtbl->Release(This) ++#else ++/*** IUnknown methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CSpriteVisual_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CSpriteVisual* This,REFIID riid,void **ppvObject) { ++ return This->lpVtbl->QueryInterface(This,riid,ppvObject); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CSpriteVisual_AddRef(__x_ABI_CWindows_CUI_CComposition_CSpriteVisual* This) { ++ return This->lpVtbl->AddRef(This); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CSpriteVisual_Release(__x_ABI_CWindows_CUI_CComposition_CSpriteVisual* This) { ++ return This->lpVtbl->Release(This); ++} ++#endif ++#endif ++ ++#endif ++ ++#endif /* ____x_ABI_CWindows_CUI_CComposition_CSpriteVisual_INTERFACE_DEFINED__ */ ++ ++/***************************************************************************** ++ * CompositionClip interface ++ */ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionClip_INTERFACE_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionClip_INTERFACE_DEFINED__ ++ ++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CCompositionClip, 0x18e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b); ++#if defined(__cplusplus) && !defined(CINTERFACE) ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ MIDL_INTERFACE("18e05581-1ad1-4f97-9666-402d76e4233b") ++ CompositionClip : public IUnknown ++ { ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#ifdef __CRT_UUID_DECL ++__CRT_UUID_DECL(ABI::Windows::UI::Composition::CompositionClip, 0x18e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b) ++#endif ++#else ++typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionClipVtbl { ++ BEGIN_INTERFACE ++ ++ /*** IUnknown methods ***/ ++ HRESULT (STDMETHODCALLTYPE *QueryInterface)( ++ __x_ABI_CWindows_CUI_CComposition_CCompositionClip *This, ++ REFIID riid, ++ void **ppvObject); ++ ++ ULONG (STDMETHODCALLTYPE *AddRef)( ++ __x_ABI_CWindows_CUI_CComposition_CCompositionClip *This); ++ ++ ULONG (STDMETHODCALLTYPE *Release)( ++ __x_ABI_CWindows_CUI_CComposition_CCompositionClip *This); ++ ++ END_INTERFACE ++} __x_ABI_CWindows_CUI_CComposition_CCompositionClipVtbl; ++ ++interface __x_ABI_CWindows_CUI_CComposition_CCompositionClip { ++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CCompositionClipVtbl* lpVtbl; ++}; ++ ++#ifdef COBJMACROS ++#ifndef WIDL_C_INLINE_WRAPPERS ++/*** IUnknown methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CCompositionClip_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) ++#define __x_ABI_CWindows_CUI_CComposition_CCompositionClip_AddRef(This) (This)->lpVtbl->AddRef(This) ++#define __x_ABI_CWindows_CUI_CComposition_CCompositionClip_Release(This) (This)->lpVtbl->Release(This) ++#else ++/*** IUnknown methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CCompositionClip_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CCompositionClip* This,REFIID riid,void **ppvObject) { ++ return This->lpVtbl->QueryInterface(This,riid,ppvObject); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionClip_AddRef(__x_ABI_CWindows_CUI_CComposition_CCompositionClip* This) { ++ return This->lpVtbl->AddRef(This); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionClip_Release(__x_ABI_CWindows_CUI_CComposition_CCompositionClip* This) { ++ return This->lpVtbl->Release(This); ++} ++#endif ++#endif ++ ++#endif ++ ++#endif /* ____x_ABI_CWindows_CUI_CComposition_CCompositionClip_INTERFACE_DEFINED__ */ ++ ++/***************************************************************************** ++ * ContainerVisual interface ++ */ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CContainerVisual_INTERFACE_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CContainerVisual_INTERFACE_DEFINED__ ++ ++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CContainerVisual, 0x28e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b); ++#if defined(__cplusplus) && !defined(CINTERFACE) ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ MIDL_INTERFACE("28e05581-1ad1-4f97-9666-402d76e4233b") ++ ContainerVisual : public IUnknown ++ { ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#ifdef __CRT_UUID_DECL ++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ContainerVisual, 0x28e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b) ++#endif ++#else ++typedef struct __x_ABI_CWindows_CUI_CComposition_CContainerVisualVtbl { ++ BEGIN_INTERFACE ++ ++ /*** IUnknown methods ***/ ++ HRESULT (STDMETHODCALLTYPE *QueryInterface)( ++ __x_ABI_CWindows_CUI_CComposition_CContainerVisual *This, ++ REFIID riid, ++ void **ppvObject); ++ ++ ULONG (STDMETHODCALLTYPE *AddRef)( ++ __x_ABI_CWindows_CUI_CComposition_CContainerVisual *This); ++ ++ ULONG (STDMETHODCALLTYPE *Release)( ++ __x_ABI_CWindows_CUI_CComposition_CContainerVisual *This); ++ ++ END_INTERFACE ++} __x_ABI_CWindows_CUI_CComposition_CContainerVisualVtbl; ++ ++interface __x_ABI_CWindows_CUI_CComposition_CContainerVisual { ++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CContainerVisualVtbl* lpVtbl; ++}; ++ ++#ifdef COBJMACROS ++#ifndef WIDL_C_INLINE_WRAPPERS ++/*** IUnknown methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CContainerVisual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) ++#define __x_ABI_CWindows_CUI_CComposition_CContainerVisual_AddRef(This) (This)->lpVtbl->AddRef(This) ++#define __x_ABI_CWindows_CUI_CComposition_CContainerVisual_Release(This) (This)->lpVtbl->Release(This) ++#else ++/*** IUnknown methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CContainerVisual_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CContainerVisual* This,REFIID riid,void **ppvObject) { ++ return This->lpVtbl->QueryInterface(This,riid,ppvObject); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CContainerVisual_AddRef(__x_ABI_CWindows_CUI_CComposition_CContainerVisual* This) { ++ return This->lpVtbl->AddRef(This); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CContainerVisual_Release(__x_ABI_CWindows_CUI_CComposition_CContainerVisual* This) { ++ return This->lpVtbl->Release(This); ++} ++#endif ++#endif ++ ++#endif ++ ++#endif /* ____x_ABI_CWindows_CUI_CComposition_CContainerVisual_INTERFACE_DEFINED__ */ ++ ++/***************************************************************************** ++ * IVisual interface ++ */ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVisual_INTERFACE_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CIVisual_INTERFACE_DEFINED__ ++ ++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CIVisual, 0x117e202d, 0xa859, 0x4c89, 0x87,0x3b, 0xc2,0xaa,0x56,0x67,0x88,0xe3); ++#if defined(__cplusplus) && !defined(CINTERFACE) ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ MIDL_INTERFACE("117e202d-a859-4c89-873b-c2aa566788e3") ++ IVisual : public IInspectable ++ { ++ virtual HRESULT STDMETHODCALLTYPE get_AnchorPoint( ++ ABI::Windows::Foundation::Numerics::Vector2 *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_AnchorPoint( ++ ABI::Windows::Foundation::Numerics::Vector2 value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE get_BackfaceVisibility( ++ ABI::Windows::UI::Composition::CompositionBackfaceVisibility *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_BackfaceVisibility( ++ ABI::Windows::UI::Composition::CompositionBackfaceVisibility value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE get_BorderMode( ++ ABI::Windows::UI::Composition::CompositionBorderMode *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_BorderMode( ++ ABI::Windows::UI::Composition::CompositionBorderMode value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE get_CenterPoint( ++ ABI::Windows::Foundation::Numerics::Vector3 *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_CenterPoint( ++ ABI::Windows::Foundation::Numerics::Vector3 value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE get_Clip( ++ ABI::Windows::UI::Composition::CompositionClip **value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_Clip( ++ ABI::Windows::UI::Composition::CompositionClip *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE get_CompositeMode( ++ ABI::Windows::UI::Composition::CompositionCompositeMode *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_CompositeMode( ++ ABI::Windows::UI::Composition::CompositionCompositeMode value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE get_IsVisible( ++ boolean *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_IsVisible( ++ boolean value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE get_Offset( ++ ABI::Windows::Foundation::Numerics::Vector3 *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_Offset( ++ ABI::Windows::Foundation::Numerics::Vector3 value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE get_Opacity( ++ FLOAT *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_Opacity( ++ FLOAT value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE get_Orientation( ++ ABI::Windows::Foundation::Numerics::Quaternion *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_Orientation( ++ ABI::Windows::Foundation::Numerics::Quaternion value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE get_Parent( ++ ABI::Windows::UI::Composition::ContainerVisual **value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE get_RotationAngle( ++ FLOAT *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_RotationAngle( ++ FLOAT value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE get_RotationAngleInDegrees( ++ FLOAT *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_RotationAngleInDegrees( ++ FLOAT value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE get_RotationAxis( ++ ABI::Windows::Foundation::Numerics::Vector3 *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_RotationAxis( ++ ABI::Windows::Foundation::Numerics::Vector3 value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE get_Scale( ++ ABI::Windows::Foundation::Numerics::Vector3 *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_Scale( ++ ABI::Windows::Foundation::Numerics::Vector3 value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE get_Size( ++ ABI::Windows::Foundation::Numerics::Vector2 *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_Size( ++ ABI::Windows::Foundation::Numerics::Vector2 value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE get_TransformMatrix( ++ ABI::Windows::Foundation::Numerics::Matrix4x4 *value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE put_TransformMatrix( ++ ABI::Windows::Foundation::Numerics::Matrix4x4 value) = 0; ++ ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#ifdef __CRT_UUID_DECL ++__CRT_UUID_DECL(ABI::Windows::UI::Composition::IVisual, 0x117e202d, 0xa859, 0x4c89, 0x87,0x3b, 0xc2,0xaa,0x56,0x67,0x88,0xe3) ++#endif ++#else ++typedef struct __x_ABI_CWindows_CUI_CComposition_CIVisualVtbl { ++ BEGIN_INTERFACE ++ ++ /*** IUnknown methods ***/ ++ HRESULT (STDMETHODCALLTYPE *QueryInterface)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ REFIID riid, ++ void **ppvObject); ++ ++ ULONG (STDMETHODCALLTYPE *AddRef)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This); ++ ++ ULONG (STDMETHODCALLTYPE *Release)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This); ++ ++ /*** IInspectable methods ***/ ++ HRESULT (STDMETHODCALLTYPE *GetIids)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ ULONG *iidCount, ++ IID **iids); ++ ++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ HSTRING *className); ++ ++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ TrustLevel *trustLevel); ++ ++ /*** IVisual methods ***/ ++ HRESULT (STDMETHODCALLTYPE *get_AnchorPoint)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value); ++ ++ HRESULT (STDMETHODCALLTYPE *put_AnchorPoint)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value); ++ ++ HRESULT (STDMETHODCALLTYPE *get_BackfaceVisibility)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility *value); ++ ++ HRESULT (STDMETHODCALLTYPE *put_BackfaceVisibility)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility value); ++ ++ HRESULT (STDMETHODCALLTYPE *get_BorderMode)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode *value); ++ ++ HRESULT (STDMETHODCALLTYPE *put_BorderMode)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode value); ++ ++ HRESULT (STDMETHODCALLTYPE *get_CenterPoint)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value); ++ ++ HRESULT (STDMETHODCALLTYPE *put_CenterPoint)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value); ++ ++ HRESULT (STDMETHODCALLTYPE *get_Clip)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionClip **value); ++ ++ HRESULT (STDMETHODCALLTYPE *put_Clip)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionClip *value); ++ ++ HRESULT (STDMETHODCALLTYPE *get_CompositeMode)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode *value); ++ ++ HRESULT (STDMETHODCALLTYPE *put_CompositeMode)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode value); ++ ++ HRESULT (STDMETHODCALLTYPE *get_IsVisible)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ boolean *value); ++ ++ HRESULT (STDMETHODCALLTYPE *put_IsVisible)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ boolean value); ++ ++ HRESULT (STDMETHODCALLTYPE *get_Offset)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value); ++ ++ HRESULT (STDMETHODCALLTYPE *put_Offset)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value); ++ ++ HRESULT (STDMETHODCALLTYPE *get_Opacity)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ FLOAT *value); ++ ++ HRESULT (STDMETHODCALLTYPE *put_Opacity)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ FLOAT value); ++ ++ HRESULT (STDMETHODCALLTYPE *get_Orientation)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion *value); ++ ++ HRESULT (STDMETHODCALLTYPE *put_Orientation)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion value); ++ ++ HRESULT (STDMETHODCALLTYPE *get_Parent)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CUI_CComposition_CContainerVisual **value); ++ ++ HRESULT (STDMETHODCALLTYPE *get_RotationAngle)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ FLOAT *value); ++ ++ HRESULT (STDMETHODCALLTYPE *put_RotationAngle)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ FLOAT value); ++ ++ HRESULT (STDMETHODCALLTYPE *get_RotationAngleInDegrees)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ FLOAT *value); ++ ++ HRESULT (STDMETHODCALLTYPE *put_RotationAngleInDegrees)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ FLOAT value); ++ ++ HRESULT (STDMETHODCALLTYPE *get_RotationAxis)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value); ++ ++ HRESULT (STDMETHODCALLTYPE *put_RotationAxis)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value); ++ ++ HRESULT (STDMETHODCALLTYPE *get_Scale)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value); ++ ++ HRESULT (STDMETHODCALLTYPE *put_Scale)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value); ++ ++ HRESULT (STDMETHODCALLTYPE *get_Size)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value); ++ ++ HRESULT (STDMETHODCALLTYPE *put_Size)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value); ++ ++ HRESULT (STDMETHODCALLTYPE *get_TransformMatrix)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 *value); ++ ++ HRESULT (STDMETHODCALLTYPE *put_TransformMatrix)( ++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This, ++ __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 value); ++ ++ END_INTERFACE ++} __x_ABI_CWindows_CUI_CComposition_CIVisualVtbl; ++ ++interface __x_ABI_CWindows_CUI_CComposition_CIVisual { ++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CIVisualVtbl* lpVtbl; ++}; ++ ++#ifdef COBJMACROS ++#ifndef WIDL_C_INLINE_WRAPPERS ++/*** IUnknown methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_AddRef(This) (This)->lpVtbl->AddRef(This) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_Release(This) (This)->lpVtbl->Release(This) ++/*** IInspectable methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel) ++/*** IVisual methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_AnchorPoint(This,value) (This)->lpVtbl->get_AnchorPoint(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_AnchorPoint(This,value) (This)->lpVtbl->put_AnchorPoint(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_BackfaceVisibility(This,value) (This)->lpVtbl->get_BackfaceVisibility(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_BackfaceVisibility(This,value) (This)->lpVtbl->put_BackfaceVisibility(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_BorderMode(This,value) (This)->lpVtbl->get_BorderMode(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_BorderMode(This,value) (This)->lpVtbl->put_BorderMode(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_CenterPoint(This,value) (This)->lpVtbl->get_CenterPoint(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_CenterPoint(This,value) (This)->lpVtbl->put_CenterPoint(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Clip(This,value) (This)->lpVtbl->get_Clip(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Clip(This,value) (This)->lpVtbl->put_Clip(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_CompositeMode(This,value) (This)->lpVtbl->get_CompositeMode(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_CompositeMode(This,value) (This)->lpVtbl->put_CompositeMode(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_IsVisible(This,value) (This)->lpVtbl->get_IsVisible(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_IsVisible(This,value) (This)->lpVtbl->put_IsVisible(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Offset(This,value) (This)->lpVtbl->get_Offset(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Offset(This,value) (This)->lpVtbl->put_Offset(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Opacity(This,value) (This)->lpVtbl->get_Opacity(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Opacity(This,value) (This)->lpVtbl->put_Opacity(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Orientation(This,value) (This)->lpVtbl->get_Orientation(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Orientation(This,value) (This)->lpVtbl->put_Orientation(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Parent(This,value) (This)->lpVtbl->get_Parent(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAngle(This,value) (This)->lpVtbl->get_RotationAngle(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAngle(This,value) (This)->lpVtbl->put_RotationAngle(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAngleInDegrees(This,value) (This)->lpVtbl->get_RotationAngleInDegrees(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAngleInDegrees(This,value) (This)->lpVtbl->put_RotationAngleInDegrees(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAxis(This,value) (This)->lpVtbl->get_RotationAxis(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAxis(This,value) (This)->lpVtbl->put_RotationAxis(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Scale(This,value) (This)->lpVtbl->get_Scale(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Scale(This,value) (This)->lpVtbl->put_Scale(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Size(This,value) (This)->lpVtbl->get_Size(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Size(This,value) (This)->lpVtbl->put_Size(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_TransformMatrix(This,value) (This)->lpVtbl->get_TransformMatrix(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_TransformMatrix(This,value) (This)->lpVtbl->put_TransformMatrix(This,value) ++#else ++/*** IUnknown methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,REFIID riid,void **ppvObject) { ++ return This->lpVtbl->QueryInterface(This,riid,ppvObject); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIVisual_AddRef(__x_ABI_CWindows_CUI_CComposition_CIVisual* This) { ++ return This->lpVtbl->AddRef(This); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIVisual_Release(__x_ABI_CWindows_CUI_CComposition_CIVisual* This) { ++ return This->lpVtbl->Release(This); ++} ++/*** IInspectable methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_GetIids(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,ULONG *iidCount,IID **iids) { ++ return This->lpVtbl->GetIids(This,iidCount,iids); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,HSTRING *className) { ++ return This->lpVtbl->GetRuntimeClassName(This,className); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,TrustLevel *trustLevel) { ++ return This->lpVtbl->GetTrustLevel(This,trustLevel); ++} ++/*** IVisual methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_AnchorPoint(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value) { ++ return This->lpVtbl->get_AnchorPoint(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_AnchorPoint(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 value) { ++ return This->lpVtbl->put_AnchorPoint(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_BackfaceVisibility(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility *value) { ++ return This->lpVtbl->get_BackfaceVisibility(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_BackfaceVisibility(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility value) { ++ return This->lpVtbl->put_BackfaceVisibility(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_BorderMode(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode *value) { ++ return This->lpVtbl->get_BorderMode(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_BorderMode(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode value) { ++ return This->lpVtbl->put_BorderMode(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_CenterPoint(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value) { ++ return This->lpVtbl->get_CenterPoint(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_CenterPoint(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) { ++ return This->lpVtbl->put_CenterPoint(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Clip(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionClip **value) { ++ return This->lpVtbl->get_Clip(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Clip(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionClip *value) { ++ return This->lpVtbl->put_Clip(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_CompositeMode(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode *value) { ++ return This->lpVtbl->get_CompositeMode(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_CompositeMode(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode value) { ++ return This->lpVtbl->put_CompositeMode(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_IsVisible(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,boolean *value) { ++ return This->lpVtbl->get_IsVisible(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_IsVisible(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,boolean value) { ++ return This->lpVtbl->put_IsVisible(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Offset(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value) { ++ return This->lpVtbl->get_Offset(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Offset(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) { ++ return This->lpVtbl->put_Offset(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Opacity(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT *value) { ++ return This->lpVtbl->get_Opacity(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Opacity(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT value) { ++ return This->lpVtbl->put_Opacity(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Orientation(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CQuaternion *value) { ++ return This->lpVtbl->get_Orientation(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Orientation(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CQuaternion value) { ++ return This->lpVtbl->put_Orientation(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Parent(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CContainerVisual **value) { ++ return This->lpVtbl->get_Parent(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAngle(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT *value) { ++ return This->lpVtbl->get_RotationAngle(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAngle(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT value) { ++ return This->lpVtbl->put_RotationAngle(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAngleInDegrees(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT *value) { ++ return This->lpVtbl->get_RotationAngleInDegrees(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAngleInDegrees(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT value) { ++ return This->lpVtbl->put_RotationAngleInDegrees(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAxis(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value) { ++ return This->lpVtbl->get_RotationAxis(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAxis(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) { ++ return This->lpVtbl->put_RotationAxis(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Scale(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value) { ++ return This->lpVtbl->get_Scale(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Scale(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) { ++ return This->lpVtbl->put_Scale(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Size(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value) { ++ return This->lpVtbl->get_Size(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Size(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 value) { ++ return This->lpVtbl->put_Size(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_TransformMatrix(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 *value) { ++ return This->lpVtbl->get_TransformMatrix(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_TransformMatrix(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 value) { ++ return This->lpVtbl->put_TransformMatrix(This,value); ++} ++#endif ++#endif ++ ++#endif ++ ++#endif /* ____x_ABI_CWindows_CUI_CComposition_CIVisual_INTERFACE_DEFINED__ */ ++ ++/***************************************************************************** ++ * Compositor interface ++ */ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositor_INTERFACE_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CCompositor_INTERFACE_DEFINED__ ++ ++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CCompositor, 0x38e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b); ++#if defined(__cplusplus) && !defined(CINTERFACE) ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ MIDL_INTERFACE("38e05581-1ad1-4f97-9666-402d76e4233b") ++ Compositor : public IUnknown ++ { ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#ifdef __CRT_UUID_DECL ++__CRT_UUID_DECL(ABI::Windows::UI::Composition::Compositor, 0x38e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b) ++#endif ++#else ++typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositorVtbl { ++ BEGIN_INTERFACE ++ ++ /*** IUnknown methods ***/ ++ HRESULT (STDMETHODCALLTYPE *QueryInterface)( ++ __x_ABI_CWindows_CUI_CComposition_CCompositor *This, ++ REFIID riid, ++ void **ppvObject); ++ ++ ULONG (STDMETHODCALLTYPE *AddRef)( ++ __x_ABI_CWindows_CUI_CComposition_CCompositor *This); ++ ++ ULONG (STDMETHODCALLTYPE *Release)( ++ __x_ABI_CWindows_CUI_CComposition_CCompositor *This); ++ ++ END_INTERFACE ++} __x_ABI_CWindows_CUI_CComposition_CCompositorVtbl; ++ ++interface __x_ABI_CWindows_CUI_CComposition_CCompositor { ++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CCompositorVtbl* lpVtbl; ++}; ++ ++#ifdef COBJMACROS ++#ifndef WIDL_C_INLINE_WRAPPERS ++/*** IUnknown methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CCompositor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) ++#define __x_ABI_CWindows_CUI_CComposition_CCompositor_AddRef(This) (This)->lpVtbl->AddRef(This) ++#define __x_ABI_CWindows_CUI_CComposition_CCompositor_Release(This) (This)->lpVtbl->Release(This) ++#else ++/*** IUnknown methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CCompositor_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CCompositor* This,REFIID riid,void **ppvObject) { ++ return This->lpVtbl->QueryInterface(This,riid,ppvObject); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositor_AddRef(__x_ABI_CWindows_CUI_CComposition_CCompositor* This) { ++ return This->lpVtbl->AddRef(This); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositor_Release(__x_ABI_CWindows_CUI_CComposition_CCompositor* This) { ++ return This->lpVtbl->Release(This); ++} ++#endif ++#endif ++ ++#endif ++ ++#endif /* ____x_ABI_CWindows_CUI_CComposition_CCompositor_INTERFACE_DEFINED__ */ ++ ++/***************************************************************************** ++ * CompositionPropertySet interface ++ */ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_INTERFACE_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_INTERFACE_DEFINED__ ++ ++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet, 0x38e05582, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b); ++#if defined(__cplusplus) && !defined(CINTERFACE) ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ MIDL_INTERFACE("38e05582-1ad1-4f97-9666-402d76e4233b") ++ CompositionPropertySet : public IUnknown ++ { ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#ifdef __CRT_UUID_DECL ++__CRT_UUID_DECL(ABI::Windows::UI::Composition::CompositionPropertySet, 0x38e05582, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b) ++#endif ++#else ++typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySetVtbl { ++ BEGIN_INTERFACE ++ ++ /*** IUnknown methods ***/ ++ HRESULT (STDMETHODCALLTYPE *QueryInterface)( ++ __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet *This, ++ REFIID riid, ++ void **ppvObject); ++ ++ ULONG (STDMETHODCALLTYPE *AddRef)( ++ __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet *This); ++ ++ ULONG (STDMETHODCALLTYPE *Release)( ++ __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet *This); ++ ++ END_INTERFACE ++} __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySetVtbl; ++ ++interface __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet { ++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySetVtbl* lpVtbl; ++}; ++ ++#ifdef COBJMACROS ++#ifndef WIDL_C_INLINE_WRAPPERS ++/*** IUnknown methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) ++#define __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_AddRef(This) (This)->lpVtbl->AddRef(This) ++#define __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_Release(This) (This)->lpVtbl->Release(This) ++#else ++/*** IUnknown methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet* This,REFIID riid,void **ppvObject) { ++ return This->lpVtbl->QueryInterface(This,riid,ppvObject); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_AddRef(__x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet* This) { ++ return This->lpVtbl->AddRef(This); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_Release(__x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet* This) { ++ return This->lpVtbl->Release(This); ++} ++#endif ++#endif ++ ++#endif ++ ++#endif /* ____x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_INTERFACE_DEFINED__ */ ++ ++/***************************************************************************** ++ * CompositionAnimation interface ++ */ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_INTERFACE_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_INTERFACE_DEFINED__ ++ ++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CCompositionAnimation, 0x38e05582, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b); ++#if defined(__cplusplus) && !defined(CINTERFACE) ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ MIDL_INTERFACE("38e05582-1ad2-4f97-9666-402d76e4233b") ++ CompositionAnimation : public IUnknown ++ { ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#ifdef __CRT_UUID_DECL ++__CRT_UUID_DECL(ABI::Windows::UI::Composition::CompositionAnimation, 0x38e05582, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b) ++#endif ++#else ++typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionAnimationVtbl { ++ BEGIN_INTERFACE ++ ++ /*** IUnknown methods ***/ ++ HRESULT (STDMETHODCALLTYPE *QueryInterface)( ++ __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation *This, ++ REFIID riid, ++ void **ppvObject); ++ ++ ULONG (STDMETHODCALLTYPE *AddRef)( ++ __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation *This); ++ ++ ULONG (STDMETHODCALLTYPE *Release)( ++ __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation *This); ++ ++ END_INTERFACE ++} __x_ABI_CWindows_CUI_CComposition_CCompositionAnimationVtbl; ++ ++interface __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation { ++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CCompositionAnimationVtbl* lpVtbl; ++}; ++ ++#ifdef COBJMACROS ++#ifndef WIDL_C_INLINE_WRAPPERS ++/*** IUnknown methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) ++#define __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_AddRef(This) (This)->lpVtbl->AddRef(This) ++#define __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_Release(This) (This)->lpVtbl->Release(This) ++#else ++/*** IUnknown methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CCompositionAnimation* This,REFIID riid,void **ppvObject) { ++ return This->lpVtbl->QueryInterface(This,riid,ppvObject); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_AddRef(__x_ABI_CWindows_CUI_CComposition_CCompositionAnimation* This) { ++ return This->lpVtbl->AddRef(This); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_Release(__x_ABI_CWindows_CUI_CComposition_CCompositionAnimation* This) { ++ return This->lpVtbl->Release(This); ++} ++#endif ++#endif ++ ++#endif ++ ++#endif /* ____x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_INTERFACE_DEFINED__ */ ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositor_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CICompositor_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositor __x_ABI_CWindows_CUI_CComposition_CICompositor; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface ICompositor; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++/***************************************************************************** ++ * ICompositionObject interface ++ */ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionObject_INTERFACE_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionObject_INTERFACE_DEFINED__ ++ ++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionObject, 0xbcb4ad45, 0x7609, 0x4550, 0x93,0x4f, 0x16,0x00,0x2a,0x68,0xfd,0xed); ++#if defined(__cplusplus) && !defined(CINTERFACE) ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ MIDL_INTERFACE("bcb4ad45-7609-4550-934f-16002a68fded") ++ ICompositionObject : public IInspectable ++ { ++ virtual HRESULT STDMETHODCALLTYPE get_Compositor( ++ ABI::Windows::UI::Composition::ICompositor **value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE get_Dispatcher( ++ ABI::Windows::UI::Core::CoreDispatcher **value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE get_Properties( ++ ABI::Windows::UI::Composition::CompositionPropertySet **value) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE StartAnimation( ++ HSTRING propertyName, ++ ABI::Windows::UI::Composition::CompositionAnimation *animation) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE StopAnimation( ++ HSTRING propertyName) = 0; ++ ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#ifdef __CRT_UUID_DECL ++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ICompositionObject, 0xbcb4ad45, 0x7609, 0x4550, 0x93,0x4f, 0x16,0x00,0x2a,0x68,0xfd,0xed) ++#endif ++#else ++typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionObjectVtbl { ++ BEGIN_INTERFACE ++ ++ /*** IUnknown methods ***/ ++ HRESULT (STDMETHODCALLTYPE *QueryInterface)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This, ++ REFIID riid, ++ void **ppvObject); ++ ++ ULONG (STDMETHODCALLTYPE *AddRef)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This); ++ ++ ULONG (STDMETHODCALLTYPE *Release)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This); ++ ++ /*** IInspectable methods ***/ ++ HRESULT (STDMETHODCALLTYPE *GetIids)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This, ++ ULONG *iidCount, ++ IID **iids); ++ ++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This, ++ HSTRING *className); ++ ++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This, ++ TrustLevel *trustLevel); ++ ++ /*** ICompositionObject methods ***/ ++ HRESULT (STDMETHODCALLTYPE *get_Compositor)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This, ++ __x_ABI_CWindows_CUI_CComposition_CICompositor **value); ++ ++ HRESULT (STDMETHODCALLTYPE *get_Dispatcher)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This, ++ __x_ABI_CWindows_CUI_CCore_CCoreDispatcher **value); ++ ++ HRESULT (STDMETHODCALLTYPE *get_Properties)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet **value); ++ ++ HRESULT (STDMETHODCALLTYPE *StartAnimation)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This, ++ HSTRING propertyName, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation *animation); ++ ++ HRESULT (STDMETHODCALLTYPE *StopAnimation)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This, ++ HSTRING propertyName); ++ ++ END_INTERFACE ++} __x_ABI_CWindows_CUI_CComposition_CICompositionObjectVtbl; ++ ++interface __x_ABI_CWindows_CUI_CComposition_CICompositionObject { ++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionObjectVtbl* lpVtbl; ++}; ++ ++#ifdef COBJMACROS ++#ifndef WIDL_C_INLINE_WRAPPERS ++/*** IUnknown methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_AddRef(This) (This)->lpVtbl->AddRef(This) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_Release(This) (This)->lpVtbl->Release(This) ++/*** IInspectable methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel) ++/*** ICompositionObject methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Compositor(This,value) (This)->lpVtbl->get_Compositor(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Dispatcher(This,value) (This)->lpVtbl->get_Dispatcher(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Properties(This,value) (This)->lpVtbl->get_Properties(This,value) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_StartAnimation(This,propertyName,animation) (This)->lpVtbl->StartAnimation(This,propertyName,animation) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_StopAnimation(This,propertyName) (This)->lpVtbl->StopAnimation(This,propertyName) ++#else ++/*** IUnknown methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,REFIID riid,void **ppvObject) { ++ return This->lpVtbl->QueryInterface(This,riid,ppvObject); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionObject_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This) { ++ return This->lpVtbl->AddRef(This); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionObject_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This) { ++ return This->lpVtbl->Release(This); ++} ++/*** IInspectable methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,ULONG *iidCount,IID **iids) { ++ return This->lpVtbl->GetIids(This,iidCount,iids); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,HSTRING *className) { ++ return This->lpVtbl->GetRuntimeClassName(This,className); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,TrustLevel *trustLevel) { ++ return This->lpVtbl->GetTrustLevel(This,trustLevel); ++} ++/*** ICompositionObject methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Compositor(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,__x_ABI_CWindows_CUI_CComposition_CICompositor **value) { ++ return This->lpVtbl->get_Compositor(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Dispatcher(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,__x_ABI_CWindows_CUI_CCore_CCoreDispatcher **value) { ++ return This->lpVtbl->get_Dispatcher(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Properties(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,__x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet **value) { ++ return This->lpVtbl->get_Properties(This,value); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_StartAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,HSTRING propertyName,__x_ABI_CWindows_CUI_CComposition_CCompositionAnimation *animation) { ++ return This->lpVtbl->StartAnimation(This,propertyName,animation); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_StopAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,HSTRING propertyName) { ++ return This->lpVtbl->StopAnimation(This,propertyName); ++} ++#endif ++#endif ++ ++#endif ++ ++#endif /* ____x_ABI_CWindows_CUI_CComposition_CICompositionObject_INTERFACE_DEFINED__ */ ++ ++/***************************************************************************** ++ * ColorKeyFrameAnimation interface ++ */ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_INTERFACE_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_INTERFACE_DEFINED__ ++ ++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation, 0x38e05682, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b); ++#if defined(__cplusplus) && !defined(CINTERFACE) ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ MIDL_INTERFACE("38e05682-1ad2-4f97-9666-402d76e4233b") ++ ColorKeyFrameAnimation : public IUnknown ++ { ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#ifdef __CRT_UUID_DECL ++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ColorKeyFrameAnimation, 0x38e05682, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b) ++#endif ++#else ++typedef struct __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimationVtbl { ++ BEGIN_INTERFACE ++ ++ /*** IUnknown methods ***/ ++ HRESULT (STDMETHODCALLTYPE *QueryInterface)( ++ __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation *This, ++ REFIID riid, ++ void **ppvObject); ++ ++ ULONG (STDMETHODCALLTYPE *AddRef)( ++ __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation *This); ++ ++ ULONG (STDMETHODCALLTYPE *Release)( ++ __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation *This); ++ ++ END_INTERFACE ++} __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimationVtbl; ++ ++interface __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation { ++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimationVtbl* lpVtbl; ++}; ++ ++#ifdef COBJMACROS ++#ifndef WIDL_C_INLINE_WRAPPERS ++/*** IUnknown methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) ++#define __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_AddRef(This) (This)->lpVtbl->AddRef(This) ++#define __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_Release(This) (This)->lpVtbl->Release(This) ++#else ++/*** IUnknown methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation* This,REFIID riid,void **ppvObject) { ++ return This->lpVtbl->QueryInterface(This,riid,ppvObject); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_AddRef(__x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation* This) { ++ return This->lpVtbl->AddRef(This); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_Release(__x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation* This) { ++ return This->lpVtbl->Release(This); ++} ++#endif ++#endif ++ ++#endif ++ ++#endif /* ____x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_INTERFACE_DEFINED__ */ ++ ++/***************************************************************************** ++ * CompositionColorBrush interface ++ */ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_INTERFACE_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_INTERFACE_DEFINED__ ++ ++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush, 0x33e05682, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b); ++#if defined(__cplusplus) && !defined(CINTERFACE) ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ MIDL_INTERFACE("33e05682-1ad2-4f97-9666-402d76e4233b") ++ CompositionColorBrush : public IUnknown ++ { ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#ifdef __CRT_UUID_DECL ++__CRT_UUID_DECL(ABI::Windows::UI::Composition::CompositionColorBrush, 0x33e05682, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b) ++#endif ++#else ++typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrushVtbl { ++ BEGIN_INTERFACE ++ ++ /*** IUnknown methods ***/ ++ HRESULT (STDMETHODCALLTYPE *QueryInterface)( ++ __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush *This, ++ REFIID riid, ++ void **ppvObject); ++ ++ ULONG (STDMETHODCALLTYPE *AddRef)( ++ __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush *This); ++ ++ ULONG (STDMETHODCALLTYPE *Release)( ++ __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush *This); ++ ++ END_INTERFACE ++} __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrushVtbl; ++ ++interface __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush { ++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrushVtbl* lpVtbl; ++}; ++ ++#ifdef COBJMACROS ++#ifndef WIDL_C_INLINE_WRAPPERS ++/*** IUnknown methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) ++#define __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_AddRef(This) (This)->lpVtbl->AddRef(This) ++#define __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_Release(This) (This)->lpVtbl->Release(This) ++#else ++/*** IUnknown methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush* This,REFIID riid,void **ppvObject) { ++ return This->lpVtbl->QueryInterface(This,riid,ppvObject); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_AddRef(__x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush* This) { ++ return This->lpVtbl->AddRef(This); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_Release(__x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush* This) { ++ return This->lpVtbl->Release(This); ++} ++#endif ++#endif ++ ++#endif ++ ++#endif /* ____x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_INTERFACE_DEFINED__ */ ++ ++/***************************************************************************** ++ * CubicBezierEasingFunction interface ++ */ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_INTERFACE_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_INTERFACE_DEFINED__ ++ ++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction, 0x43e05682, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b); ++#if defined(__cplusplus) && !defined(CINTERFACE) ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ MIDL_INTERFACE("43e05682-1ad2-4f97-9666-402d76e4233b") ++ CubicBezierEasingFunction : public IUnknown ++ { ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#ifdef __CRT_UUID_DECL ++__CRT_UUID_DECL(ABI::Windows::UI::Composition::CubicBezierEasingFunction, 0x43e05682, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b) ++#endif ++#else ++typedef struct __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunctionVtbl { ++ BEGIN_INTERFACE ++ ++ /*** IUnknown methods ***/ ++ HRESULT (STDMETHODCALLTYPE *QueryInterface)( ++ __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction *This, ++ REFIID riid, ++ void **ppvObject); ++ ++ ULONG (STDMETHODCALLTYPE *AddRef)( ++ __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction *This); ++ ++ ULONG (STDMETHODCALLTYPE *Release)( ++ __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction *This); ++ ++ END_INTERFACE ++} __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunctionVtbl; ++ ++interface __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction { ++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunctionVtbl* lpVtbl; ++}; ++ ++#ifdef COBJMACROS ++#ifndef WIDL_C_INLINE_WRAPPERS ++/*** IUnknown methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) ++#define __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_AddRef(This) (This)->lpVtbl->AddRef(This) ++#define __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_Release(This) (This)->lpVtbl->Release(This) ++#else ++/*** IUnknown methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction* This,REFIID riid,void **ppvObject) { ++ return This->lpVtbl->QueryInterface(This,riid,ppvObject); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_AddRef(__x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction* This) { ++ return This->lpVtbl->AddRef(This); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_Release(__x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction* This) { ++ return This->lpVtbl->Release(This); ++} ++#endif ++#endif ++ ++#endif ++ ++#endif /* ____x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_INTERFACE_DEFINED__ */ ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory __x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface CompositionEffectFactory; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CExpressionAnimation_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CExpressionAnimation_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CExpressionAnimation __x_ABI_CWindows_CUI_CComposition_CExpressionAnimation; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface ExpressionAnimation; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CInsetClip_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CInsetClip_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CInsetClip __x_ABI_CWindows_CUI_CComposition_CInsetClip; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface InsetClip; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction __x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface LinearEasingFunction; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface ScalarKeyFrameAnimation; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface QuaternionKeyFrameAnimation; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch __x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface CompositionScopedBatch; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush __x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface CompositionSurfaceBrush; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface Vector2KeyFrameAnimation; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface Vector3KeyFrameAnimation; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface Vector4KeyFrameAnimation; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionTarget_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionTarget_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionTarget __x_ABI_CWindows_CUI_CComposition_CCompositionTarget; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface CompositionTarget; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch __x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface CompositionCommitBatch; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface __x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ interface CompositionDrawingSurface; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++/***************************************************************************** ++ * ICompositor interface ++ */ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositor_INTERFACE_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CICompositor_INTERFACE_DEFINED__ ++ ++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositor, 0xb403ca50, 0x7f8c, 0x4e83, 0x98,0x5f, 0xcc,0x45,0x06,0x00,0x36,0xd8); ++#if defined(__cplusplus) && !defined(CINTERFACE) ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ MIDL_INTERFACE("b403ca50-7f8c-4e83-985f-cc45060036d8") ++ ICompositor : public IInspectable ++ { ++ virtual HRESULT STDMETHODCALLTYPE CreateColorKeyFrameAnimation( ++ ABI::Windows::UI::Composition::ColorKeyFrameAnimation **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE CreateColorBrush( ++ ABI::Windows::UI::Composition::CompositionColorBrush **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE CreateColorBrushWithColor( ++ ABI::Windows::UI::Color color, ++ ABI::Windows::UI::Composition::CompositionColorBrush **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE CreateContainerVisual( ++ ABI::Windows::UI::Composition::ContainerVisual **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE CreateCubicBezierEasingFunction( ++ ABI::Windows::Foundation::Numerics::Vector2 controlPoint1, ++ ABI::Windows::Foundation::Numerics::Vector2 controlPoint2, ++ ABI::Windows::UI::Composition::CubicBezierEasingFunction **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE CreateEffectFactory( ++ ABI::Windows::Graphics::Effects::IGraphicsEffect *graphicsEffect, ++ ABI::Windows::UI::Composition::CompositionEffectFactory **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE CreateEffectFactoryWithProperties( ++ ABI::Windows::Graphics::Effects::IGraphicsEffect *graphicsEffect, ++ int *animatableProperties, ++ ABI::Windows::UI::Composition::CompositionEffectFactory **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE CreateExpressionAnimation( ++ ABI::Windows::UI::Composition::ExpressionAnimation **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE CreateExpressionAnimationWithExpression( ++ HSTRING expression, ++ ABI::Windows::UI::Composition::ExpressionAnimation **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE CreateInsetClip( ++ ABI::Windows::UI::Composition::InsetClip **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE CreateInsetClipWithInsets( ++ FLOAT leftInset, ++ FLOAT topInset, ++ FLOAT rightInset, ++ FLOAT bottomInset, ++ ABI::Windows::UI::Composition::InsetClip **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE CreateLinearEasingFunction( ++ ABI::Windows::UI::Composition::LinearEasingFunction **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE CreatePropertySet( ++ ABI::Windows::UI::Composition::CompositionPropertySet **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE CreateQuaternionKeyFrameAnimation( ++ ABI::Windows::UI::Composition::QuaternionKeyFrameAnimation **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE CreateScalarKeyFrameAnimation( ++ ABI::Windows::UI::Composition::ScalarKeyFrameAnimation **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE CreateScopedBatch( ++ ABI::Windows::UI::Composition::CompositionBatchTypes batchType, ++ ABI::Windows::UI::Composition::CompositionScopedBatch **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE CreateSpriteVisual( ++ ABI::Windows::UI::Composition::SpriteVisual **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE CreateSurfaceBrush( ++ ABI::Windows::UI::Composition::CompositionSurfaceBrush **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE CreateSurfaceBrushWithSurface( ++ ABI::Windows::UI::Composition::ICompositionSurface *surface, ++ ABI::Windows::UI::Composition::ICompositionSurfaceBrush **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE CreateTargetForCurrentView( ++ ABI::Windows::UI::Composition::CompositionTarget **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE CreateVector2KeyFrameAnimation( ++ ABI::Windows::UI::Composition::Vector2KeyFrameAnimation **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE CreateVector3KeyFrameAnimation( ++ ABI::Windows::UI::Composition::Vector3KeyFrameAnimation **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE CreateVector4KeyFrameAnimation( ++ ABI::Windows::UI::Composition::Vector4KeyFrameAnimation **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE GetCommitBatch( ++ ABI::Windows::UI::Composition::CompositionBatchTypes batchType, ++ ABI::Windows::UI::Composition::CompositionCommitBatch **result) = 0; ++ ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#ifdef __CRT_UUID_DECL ++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ICompositor, 0xb403ca50, 0x7f8c, 0x4e83, 0x98,0x5f, 0xcc,0x45,0x06,0x00,0x36,0xd8) ++#endif ++#else ++typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositorVtbl { ++ BEGIN_INTERFACE ++ ++ /*** IUnknown methods ***/ ++ HRESULT (STDMETHODCALLTYPE *QueryInterface)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ REFIID riid, ++ void **ppvObject); ++ ++ ULONG (STDMETHODCALLTYPE *AddRef)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This); ++ ++ ULONG (STDMETHODCALLTYPE *Release)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This); ++ ++ /*** IInspectable methods ***/ ++ HRESULT (STDMETHODCALLTYPE *GetIids)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ ULONG *iidCount, ++ IID **iids); ++ ++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ HSTRING *className); ++ ++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ TrustLevel *trustLevel); ++ ++ /*** ICompositor methods ***/ ++ HRESULT (STDMETHODCALLTYPE *CreateColorKeyFrameAnimation)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation **result); ++ ++ HRESULT (STDMETHODCALLTYPE *CreateColorBrush)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush **result); ++ ++ HRESULT (STDMETHODCALLTYPE *CreateColorBrushWithColor)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ __x_ABI_CWindows_CUI_CColor color, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush **result); ++ ++ HRESULT (STDMETHODCALLTYPE *CreateContainerVisual)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ __x_ABI_CWindows_CUI_CComposition_CContainerVisual **result); ++ ++ HRESULT (STDMETHODCALLTYPE *CreateCubicBezierEasingFunction)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ __x_ABI_CWindows_CFoundation_CNumerics_CVector2 controlPoint1, ++ __x_ABI_CWindows_CFoundation_CNumerics_CVector2 controlPoint2, ++ __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction **result); ++ ++ HRESULT (STDMETHODCALLTYPE *CreateEffectFactory)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *graphicsEffect, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory **result); ++ ++ HRESULT (STDMETHODCALLTYPE *CreateEffectFactoryWithProperties)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *graphicsEffect, ++ int *animatableProperties, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory **result); ++ ++ HRESULT (STDMETHODCALLTYPE *CreateExpressionAnimation)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ __x_ABI_CWindows_CUI_CComposition_CExpressionAnimation **result); ++ ++ HRESULT (STDMETHODCALLTYPE *CreateExpressionAnimationWithExpression)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ HSTRING expression, ++ __x_ABI_CWindows_CUI_CComposition_CExpressionAnimation **result); ++ ++ HRESULT (STDMETHODCALLTYPE *CreateInsetClip)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ __x_ABI_CWindows_CUI_CComposition_CInsetClip **result); ++ ++ HRESULT (STDMETHODCALLTYPE *CreateInsetClipWithInsets)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ FLOAT leftInset, ++ FLOAT topInset, ++ FLOAT rightInset, ++ FLOAT bottomInset, ++ __x_ABI_CWindows_CUI_CComposition_CInsetClip **result); ++ ++ HRESULT (STDMETHODCALLTYPE *CreateLinearEasingFunction)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ __x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction **result); ++ ++ HRESULT (STDMETHODCALLTYPE *CreatePropertySet)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet **result); ++ ++ HRESULT (STDMETHODCALLTYPE *CreateQuaternionKeyFrameAnimation)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ __x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation **result); ++ ++ HRESULT (STDMETHODCALLTYPE *CreateScalarKeyFrameAnimation)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ __x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation **result); ++ ++ HRESULT (STDMETHODCALLTYPE *CreateScopedBatch)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes batchType, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch **result); ++ ++ HRESULT (STDMETHODCALLTYPE *CreateSpriteVisual)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ __x_ABI_CWindows_CUI_CComposition_CSpriteVisual **result); ++ ++ HRESULT (STDMETHODCALLTYPE *CreateSurfaceBrush)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush **result); ++ ++ HRESULT (STDMETHODCALLTYPE *CreateSurfaceBrushWithSurface)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *surface, ++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush **result); ++ ++ HRESULT (STDMETHODCALLTYPE *CreateTargetForCurrentView)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionTarget **result); ++ ++ HRESULT (STDMETHODCALLTYPE *CreateVector2KeyFrameAnimation)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ __x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation **result); ++ ++ HRESULT (STDMETHODCALLTYPE *CreateVector3KeyFrameAnimation)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ __x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation **result); ++ ++ HRESULT (STDMETHODCALLTYPE *CreateVector4KeyFrameAnimation)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ __x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation **result); ++ ++ HRESULT (STDMETHODCALLTYPE *GetCommitBatch)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes batchType, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch **result); ++ ++ END_INTERFACE ++} __x_ABI_CWindows_CUI_CComposition_CICompositorVtbl; ++ ++interface __x_ABI_CWindows_CUI_CComposition_CICompositor { ++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositorVtbl* lpVtbl; ++}; ++ ++#ifdef COBJMACROS ++#ifndef WIDL_C_INLINE_WRAPPERS ++/*** IUnknown methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_AddRef(This) (This)->lpVtbl->AddRef(This) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_Release(This) (This)->lpVtbl->Release(This) ++/*** IInspectable methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel) ++/*** ICompositor methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorKeyFrameAnimation(This,result) (This)->lpVtbl->CreateColorKeyFrameAnimation(This,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorBrush(This,result) (This)->lpVtbl->CreateColorBrush(This,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorBrushWithColor(This,color,result) (This)->lpVtbl->CreateColorBrushWithColor(This,color,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateContainerVisual(This,result) (This)->lpVtbl->CreateContainerVisual(This,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateCubicBezierEasingFunction(This,controlPoint1,controlPoint2,result) (This)->lpVtbl->CreateCubicBezierEasingFunction(This,controlPoint1,controlPoint2,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateEffectFactory(This,graphicsEffect,result) (This)->lpVtbl->CreateEffectFactory(This,graphicsEffect,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateEffectFactoryWithProperties(This,graphicsEffect,animatableProperties,result) (This)->lpVtbl->CreateEffectFactoryWithProperties(This,graphicsEffect,animatableProperties,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateExpressionAnimation(This,result) (This)->lpVtbl->CreateExpressionAnimation(This,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateExpressionAnimationWithExpression(This,expression,result) (This)->lpVtbl->CreateExpressionAnimationWithExpression(This,expression,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateInsetClip(This,result) (This)->lpVtbl->CreateInsetClip(This,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateInsetClipWithInsets(This,leftInset,topInset,rightInset,bottomInset,result) (This)->lpVtbl->CreateInsetClipWithInsets(This,leftInset,topInset,rightInset,bottomInset,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateLinearEasingFunction(This,result) (This)->lpVtbl->CreateLinearEasingFunction(This,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreatePropertySet(This,result) (This)->lpVtbl->CreatePropertySet(This,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateQuaternionKeyFrameAnimation(This,result) (This)->lpVtbl->CreateQuaternionKeyFrameAnimation(This,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateScalarKeyFrameAnimation(This,result) (This)->lpVtbl->CreateScalarKeyFrameAnimation(This,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateScopedBatch(This,batchType,result) (This)->lpVtbl->CreateScopedBatch(This,batchType,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSpriteVisual(This,result) (This)->lpVtbl->CreateSpriteVisual(This,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSurfaceBrush(This,result) (This)->lpVtbl->CreateSurfaceBrush(This,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSurfaceBrushWithSurface(This,surface,result) (This)->lpVtbl->CreateSurfaceBrushWithSurface(This,surface,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateTargetForCurrentView(This,result) (This)->lpVtbl->CreateTargetForCurrentView(This,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector2KeyFrameAnimation(This,result) (This)->lpVtbl->CreateVector2KeyFrameAnimation(This,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector3KeyFrameAnimation(This,result) (This)->lpVtbl->CreateVector3KeyFrameAnimation(This,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector4KeyFrameAnimation(This,result) (This)->lpVtbl->CreateVector4KeyFrameAnimation(This,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_GetCommitBatch(This,batchType,result) (This)->lpVtbl->GetCommitBatch(This,batchType,result) ++#else ++/*** IUnknown methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,REFIID riid,void **ppvObject) { ++ return This->lpVtbl->QueryInterface(This,riid,ppvObject); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositor_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositor* This) { ++ return This->lpVtbl->AddRef(This); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositor_Release(__x_ABI_CWindows_CUI_CComposition_CICompositor* This) { ++ return This->lpVtbl->Release(This); ++} ++/*** IInspectable methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,ULONG *iidCount,IID **iids) { ++ return This->lpVtbl->GetIids(This,iidCount,iids); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,HSTRING *className) { ++ return This->lpVtbl->GetRuntimeClassName(This,className); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,TrustLevel *trustLevel) { ++ return This->lpVtbl->GetTrustLevel(This,trustLevel); ++} ++/*** ICompositor methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorKeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation **result) { ++ return This->lpVtbl->CreateColorKeyFrameAnimation(This,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorBrush(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush **result) { ++ return This->lpVtbl->CreateColorBrush(This,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorBrushWithColor(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CColor color,__x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush **result) { ++ return This->lpVtbl->CreateColorBrushWithColor(This,color,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateContainerVisual(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CContainerVisual **result) { ++ return This->lpVtbl->CreateContainerVisual(This,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateCubicBezierEasingFunction(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 controlPoint1,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 controlPoint2,__x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction **result) { ++ return This->lpVtbl->CreateCubicBezierEasingFunction(This,controlPoint1,controlPoint2,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateEffectFactory(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *graphicsEffect,__x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory **result) { ++ return This->lpVtbl->CreateEffectFactory(This,graphicsEffect,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateEffectFactoryWithProperties(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *graphicsEffect,int *animatableProperties,__x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory **result) { ++ return This->lpVtbl->CreateEffectFactoryWithProperties(This,graphicsEffect,animatableProperties,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateExpressionAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CExpressionAnimation **result) { ++ return This->lpVtbl->CreateExpressionAnimation(This,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateExpressionAnimationWithExpression(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,HSTRING expression,__x_ABI_CWindows_CUI_CComposition_CExpressionAnimation **result) { ++ return This->lpVtbl->CreateExpressionAnimationWithExpression(This,expression,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateInsetClip(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CInsetClip **result) { ++ return This->lpVtbl->CreateInsetClip(This,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateInsetClipWithInsets(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,FLOAT leftInset,FLOAT topInset,FLOAT rightInset,FLOAT bottomInset,__x_ABI_CWindows_CUI_CComposition_CInsetClip **result) { ++ return This->lpVtbl->CreateInsetClipWithInsets(This,leftInset,topInset,rightInset,bottomInset,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateLinearEasingFunction(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction **result) { ++ return This->lpVtbl->CreateLinearEasingFunction(This,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreatePropertySet(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet **result) { ++ return This->lpVtbl->CreatePropertySet(This,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateQuaternionKeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation **result) { ++ return This->lpVtbl->CreateQuaternionKeyFrameAnimation(This,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateScalarKeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation **result) { ++ return This->lpVtbl->CreateScalarKeyFrameAnimation(This,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateScopedBatch(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes batchType,__x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch **result) { ++ return This->lpVtbl->CreateScopedBatch(This,batchType,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSpriteVisual(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CSpriteVisual **result) { ++ return This->lpVtbl->CreateSpriteVisual(This,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSurfaceBrush(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush **result) { ++ return This->lpVtbl->CreateSurfaceBrush(This,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSurfaceBrushWithSurface(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CICompositionSurface *surface,__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush **result) { ++ return This->lpVtbl->CreateSurfaceBrushWithSurface(This,surface,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateTargetForCurrentView(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CCompositionTarget **result) { ++ return This->lpVtbl->CreateTargetForCurrentView(This,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector2KeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation **result) { ++ return This->lpVtbl->CreateVector2KeyFrameAnimation(This,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector3KeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation **result) { ++ return This->lpVtbl->CreateVector3KeyFrameAnimation(This,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector4KeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation **result) { ++ return This->lpVtbl->CreateVector4KeyFrameAnimation(This,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_GetCommitBatch(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes batchType,__x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch **result) { ++ return This->lpVtbl->GetCommitBatch(This,batchType,result); ++} ++#endif ++#endif ++ ++#endif ++ ++#endif /* ____x_ABI_CWindows_CUI_CComposition_CICompositor_INTERFACE_DEFINED__ */ ++ ++/***************************************************************************** ++ * ICompositionGraphicsDevice interface ++ */ ++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_INTERFACE_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_INTERFACE_DEFINED__ ++ ++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice, 0xfb22c6e1, 0x80a2, 0x4667, 0x99,0x36, 0xdb,0xea,0xf6,0xee,0xfe,0x95); ++#if defined(__cplusplus) && !defined(CINTERFACE) ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Composition { ++ MIDL_INTERFACE("fb22c6e1-80a2-4667-9936-dbeaf6eefe95") ++ ICompositionGraphicsDevice : public IInspectable ++ { ++ virtual HRESULT STDMETHODCALLTYPE CreateDrawingSurface( ++ ABI::Windows::Foundation::Size sizePixels, ++ ABI::Windows::Graphics::DirectX::DirectXPixelFormat pixelFormat, ++ ABI::Windows::Graphics::DirectX::DirectXAlphaMode alphaMode, ++ ABI::Windows::UI::Composition::CompositionDrawingSurface **result) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE RenderingDeviceReplaced( ++ int *handler, ++ int *token) = 0; ++ ++ virtual HRESULT STDMETHODCALLTYPE RenderingDeviceReplaced( ++ int token) = 0; ++ ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#ifdef __CRT_UUID_DECL ++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ICompositionGraphicsDevice, 0xfb22c6e1, 0x80a2, 0x4667, 0x99,0x36, 0xdb,0xea,0xf6,0xee,0xfe,0x95) ++#endif ++#else ++typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDeviceVtbl { ++ BEGIN_INTERFACE ++ ++ /*** IUnknown methods ***/ ++ HRESULT (STDMETHODCALLTYPE *QueryInterface)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This, ++ REFIID riid, ++ void **ppvObject); ++ ++ ULONG (STDMETHODCALLTYPE *AddRef)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This); ++ ++ ULONG (STDMETHODCALLTYPE *Release)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This); ++ ++ /*** IInspectable methods ***/ ++ HRESULT (STDMETHODCALLTYPE *GetIids)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This, ++ ULONG *iidCount, ++ IID **iids); ++ ++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This, ++ HSTRING *className); ++ ++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This, ++ TrustLevel *trustLevel); ++ ++ /*** ICompositionGraphicsDevice methods ***/ ++ HRESULT (STDMETHODCALLTYPE *CreateDrawingSurface)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This, ++ __x_ABI_CWindows_CFoundation_CSize sizePixels, ++ __x_ABI_CWindows_CGraphics_CDirectX_CDirectXPixelFormat pixelFormat, ++ __x_ABI_CWindows_CGraphics_CDirectX_CDirectXAlphaMode alphaMode, ++ __x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface **result); ++ ++ HRESULT (STDMETHODCALLTYPE *RenderingDeviceReplaced)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This, ++ int *handler, ++ int *token); ++ ++ HRESULT (STDMETHODCALLTYPE *RenderingDeviceReplaced)( ++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This, ++ int token); ++ ++ END_INTERFACE ++} __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDeviceVtbl; ++ ++interface __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice { ++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDeviceVtbl* lpVtbl; ++}; ++ ++#ifdef COBJMACROS ++#ifndef WIDL_C_INLINE_WRAPPERS ++/*** IUnknown methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_AddRef(This) (This)->lpVtbl->AddRef(This) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_Release(This) (This)->lpVtbl->Release(This) ++/*** IInspectable methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel) ++/*** ICompositionGraphicsDevice methods ***/ ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_CreateDrawingSurface(This,sizePixels,pixelFormat,alphaMode,result) (This)->lpVtbl->CreateDrawingSurface(This,sizePixels,pixelFormat,alphaMode,result) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_RenderingDeviceReplaced(This,handler,token) (This)->lpVtbl->RenderingDeviceReplaced(This,handler,token) ++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_RenderingDeviceReplaced(This,token) (This)->lpVtbl->RenderingDeviceReplaced(This,token) ++#else ++/*** IUnknown methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,REFIID riid,void **ppvObject) { ++ return This->lpVtbl->QueryInterface(This,riid,ppvObject); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This) { ++ return This->lpVtbl->AddRef(This); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This) { ++ return This->lpVtbl->Release(This); ++} ++/*** IInspectable methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,ULONG *iidCount,IID **iids) { ++ return This->lpVtbl->GetIids(This,iidCount,iids); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,HSTRING *className) { ++ return This->lpVtbl->GetRuntimeClassName(This,className); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,TrustLevel *trustLevel) { ++ return This->lpVtbl->GetTrustLevel(This,trustLevel); ++} ++/*** ICompositionGraphicsDevice methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_CreateDrawingSurface(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,__x_ABI_CWindows_CFoundation_CSize sizePixels,__x_ABI_CWindows_CGraphics_CDirectX_CDirectXPixelFormat pixelFormat,__x_ABI_CWindows_CGraphics_CDirectX_CDirectXAlphaMode alphaMode,__x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface **result) { ++ return This->lpVtbl->CreateDrawingSurface(This,sizePixels,pixelFormat,alphaMode,result); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_RenderingDeviceReplaced(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,int *handler,int *token) { ++ return This->lpVtbl->RenderingDeviceReplaced(This,handler,token); ++} ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_RenderingDeviceReplaced(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,int token) { ++ return This->lpVtbl->RenderingDeviceReplaced(This,token); ++} ++#endif ++#endif ++ ++#endif ++ ++#endif /* ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_INTERFACE_DEFINED__ */ ++ ++extern const __declspec(selectany) WCHAR RuntimeClass_Windows_UI_Composition_SpriteVisual[] = L"Windows.UI.Composition.SpriteVisual"; ++/* Begin additional prototypes for all interfaces */ ++ ++ULONG __RPC_USER HSTRING_UserSize (ULONG *, ULONG, HSTRING *); ++unsigned char * __RPC_USER HSTRING_UserMarshal (ULONG *, unsigned char *, HSTRING *); ++unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *); ++void __RPC_USER HSTRING_UserFree (ULONG *, HSTRING *); ++ ++/* End additional prototypes */ ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* __windows_ui_composition_h__ */ +diff --git a/mingw-w64-headers/include/windows.ui.composition.interop.h b/mingw-w64-headers/include/windows.ui.composition.interop.h +new file mode 100644 +index 00000000..a82afdf1 +--- /dev/null ++++ b/mingw-w64-headers/include/windows.ui.composition.interop.h +@@ -0,0 +1,31 @@ ++#include <windows.ui.composition.h> ++ ++namespace ABI { ++namespace Windows { ++namespace UI { ++namespace Composition { ++ ++#undef INTERFACE ++#define INTERFACE ICompositorInterop ++ DECLARE_INTERFACE_IID_(ICompositorInterop, IUnknown, "25297d5c-3ad4-4c9c-b5cf-e36a38512330") ++ { ++ IFACEMETHOD(CreateCompositionSurfaceForHandle)( ++ HANDLE swapChain, ++ ICompositionSurface **result) PURE; ++ IFACEMETHOD(CreateCompositionSurfaceForSwapChain)( ++ IUnknown *swapChain, ++ ICompositionSurface **result) PURE; ++ ++ IFACEMETHOD(CreateGraphicsDevice)( ++ IUnknown *renderingDevice, ++ ICompositionGraphicsDevice **result) PURE; ++ }; ++} ++} ++} ++} ++ ++#ifdef __CRT_UUID_DECL ++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ICompositorInterop, 0x25297d5c,0x3ad4,0x4c9c,0xb5,0xcf,0xe3,0x6a,0x38,0x51,0x23,0x30) ++#endif ++ +diff --git a/mingw-w64-headers/include/windows.ui.core.h b/mingw-w64-headers/include/windows.ui.core.h +new file mode 100644 +index 00000000..a3c16ac2 +--- /dev/null ++++ b/mingw-w64-headers/include/windows.ui.core.h +@@ -0,0 +1,127 @@ ++/*** Autogenerated by WIDL 4.4 from windows.ui.core.idl - Do not edit ***/ ++ ++#ifdef _WIN32 ++#ifndef __REQUIRED_RPCNDR_H_VERSION__ ++#define __REQUIRED_RPCNDR_H_VERSION__ 475 ++#endif ++#include <rpc.h> ++#include <rpcndr.h> ++#endif ++ ++#ifndef COM_NO_WINDOWS_H ++#include <windows.h> ++#include <ole2.h> ++#endif ++ ++#ifndef __windows_ui_core_h__ ++#define __windows_ui_core_h__ ++ ++/* Forward declarations */ ++ ++#ifndef ____x_ABI_CWindows_CUI_CCore_CCoreDispatcher_FWD_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CCore_CCoreDispatcher_FWD_DEFINED__ ++typedef interface __x_ABI_CWindows_CUI_CCore_CCoreDispatcher __x_ABI_CWindows_CUI_CCore_CCoreDispatcher; ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Core { ++ interface CoreDispatcher; ++ } ++ } ++ } ++} ++#endif /* __cplusplus */ ++#endif ++ ++/* Headers for imported files */ ++ ++#include <inspectable.h> ++#include <windows.foundation.h> ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/***************************************************************************** ++ * CoreDispatcher interface ++ */ ++#ifndef ____x_ABI_CWindows_CUI_CCore_CCoreDispatcher_INTERFACE_DEFINED__ ++#define ____x_ABI_CWindows_CUI_CCore_CCoreDispatcher_INTERFACE_DEFINED__ ++ ++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CCore_CCoreDispatcher, 0x3fe05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b); ++#if defined(__cplusplus) && !defined(CINTERFACE) ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ namespace Core { ++ MIDL_INTERFACE("3fe05581-1ad1-4f97-9666-402d76e4233b") ++ CoreDispatcher : public IUnknown ++ { ++ }; ++ } ++ } ++ } ++} ++extern "C" { ++#ifdef __CRT_UUID_DECL ++__CRT_UUID_DECL(ABI::Windows::UI::Core::CoreDispatcher, 0x3fe05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b) ++#endif ++#else ++typedef struct __x_ABI_CWindows_CUI_CCore_CCoreDispatcherVtbl { ++ BEGIN_INTERFACE ++ ++ /*** IUnknown methods ***/ ++ HRESULT (STDMETHODCALLTYPE *QueryInterface)( ++ __x_ABI_CWindows_CUI_CCore_CCoreDispatcher *This, ++ REFIID riid, ++ void **ppvObject); ++ ++ ULONG (STDMETHODCALLTYPE *AddRef)( ++ __x_ABI_CWindows_CUI_CCore_CCoreDispatcher *This); ++ ++ ULONG (STDMETHODCALLTYPE *Release)( ++ __x_ABI_CWindows_CUI_CCore_CCoreDispatcher *This); ++ ++ END_INTERFACE ++} __x_ABI_CWindows_CUI_CCore_CCoreDispatcherVtbl; ++ ++interface __x_ABI_CWindows_CUI_CCore_CCoreDispatcher { ++ CONST_VTBL __x_ABI_CWindows_CUI_CCore_CCoreDispatcherVtbl* lpVtbl; ++}; ++ ++#ifdef COBJMACROS ++#ifndef WIDL_C_INLINE_WRAPPERS ++/*** IUnknown methods ***/ ++#define __x_ABI_CWindows_CUI_CCore_CCoreDispatcher_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) ++#define __x_ABI_CWindows_CUI_CCore_CCoreDispatcher_AddRef(This) (This)->lpVtbl->AddRef(This) ++#define __x_ABI_CWindows_CUI_CCore_CCoreDispatcher_Release(This) (This)->lpVtbl->Release(This) ++#else ++/*** IUnknown methods ***/ ++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CCore_CCoreDispatcher_QueryInterface(__x_ABI_CWindows_CUI_CCore_CCoreDispatcher* This,REFIID riid,void **ppvObject) { ++ return This->lpVtbl->QueryInterface(This,riid,ppvObject); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CCore_CCoreDispatcher_AddRef(__x_ABI_CWindows_CUI_CCore_CCoreDispatcher* This) { ++ return This->lpVtbl->AddRef(This); ++} ++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CCore_CCoreDispatcher_Release(__x_ABI_CWindows_CUI_CCore_CCoreDispatcher* This) { ++ return This->lpVtbl->Release(This); ++} ++#endif ++#endif ++ ++#endif ++ ++#endif /* ____x_ABI_CWindows_CUI_CCore_CCoreDispatcher_INTERFACE_DEFINED__ */ ++ ++/* Begin additional prototypes for all interfaces */ ++ ++ ++/* End additional prototypes */ ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* __windows_ui_core_h__ */ +diff --git a/mingw-w64-headers/include/windows.ui.h b/mingw-w64-headers/include/windows.ui.h +new file mode 100644 +index 00000000..2e4abd54 +--- /dev/null ++++ b/mingw-w64-headers/include/windows.ui.h +@@ -0,0 +1,72 @@ ++/*** Autogenerated by WIDL 4.4 from windows.ui.idl - Do not edit ***/ ++ ++#ifdef _WIN32 ++#ifndef __REQUIRED_RPCNDR_H_VERSION__ ++#define __REQUIRED_RPCNDR_H_VERSION__ 475 ++#endif ++#include <rpc.h> ++#include <rpcndr.h> ++#endif ++ ++#ifndef COM_NO_WINDOWS_H ++#include <windows.h> ++#include <ole2.h> ++#endif ++ ++#ifndef __windows_ui_h__ ++#define __windows_ui_h__ ++ ++/* Forward declarations */ ++ ++/* Headers for imported files */ ++ ++#include <inspectable.h> ++#include <windows.foundation.h> ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#ifdef __cplusplus ++} /* extern "C" */ ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++ struct Color { ++ BYTE A; ++ BYTE R; ++ BYTE G; ++ BYTE B; ++ }; ++ } ++ } ++} ++extern "C" { ++#else ++struct __x_ABI_CWindows_CUI_CColor { ++ BYTE A; ++ BYTE R; ++ BYTE G; ++ BYTE B; ++}; ++#endif ++ ++#ifdef __cplusplus ++namespace ABI { ++ namespace Windows { ++ namespace UI { ++typedef struct Color Color; ++ } ++ } ++} ++#endif /* __cplusplus */ ++/* Begin additional prototypes for all interfaces */ ++ ++ ++/* End additional prototypes */ ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* __windows_ui_h__ */ diff --git a/taskcluster/scripts/misc/osx-cross-linker b/taskcluster/scripts/misc/osx-cross-linker new file mode 100755 index 0000000000..f0827b01fa --- /dev/null +++ b/taskcluster/scripts/misc/osx-cross-linker @@ -0,0 +1,7 @@ +exec $MOZ_FETCHES_DIR/clang/bin/clang -v \ + -fuse-ld=$MOZ_FETCHES_DIR/cctools/bin/x86_64-apple-darwin-ld \ + -mmacosx-version-min=10.12 \ + -target $TARGET \ + -B $MOZ_FETCHES_DIR/cctools/bin \ + -isysroot $MOZ_FETCHES_DIR/MacOSX10.12.sdk \ + "$@" diff --git a/taskcluster/scripts/misc/pack.sh b/taskcluster/scripts/misc/pack.sh new file mode 100755 index 0000000000..e6db0cb32a --- /dev/null +++ b/taskcluster/scripts/misc/pack.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +set -x + +[ -z "$1" ] && echo Missing argument && exit 1 + +dir=$(dirname "$1") +name=$(basename "$1") + +case "$(uname -s)" in +Darwin) + TAR_FLAGS=--no-fflags + ;; +*) + TAR_FLAGS= + ;; +esac + +(cd "$dir"; find "$name"/* -not -type d -print0 | tar $TAR_FLAGS -cf - --null -T -) | python3 $GECKO_PATH/taskcluster/scripts/misc/zstdpy > "$name.tar.zst" + +mkdir -p "$UPLOAD_DIR" +mv "$name.tar.zst" "$UPLOAD_DIR" diff --git a/taskcluster/scripts/misc/repack-android-emulator-linux.sh b/taskcluster/scripts/misc/repack-android-emulator-linux.sh new file mode 100755 index 0000000000..35596d1af1 --- /dev/null +++ b/taskcluster/scripts/misc/repack-android-emulator-linux.sh @@ -0,0 +1,23 @@ +#!/bin/bash +set -x -e -v + +# This script is for fetching and repacking the Android emulator (for +# Linux), the tools required to produce Android packages. + +UPLOAD_DIR=$HOME/project/gecko/android-emulator + +mkdir -p $HOME/artifacts $UPLOAD_DIR + +# Populate /builds/worker/.mozbuild/android-emulator-linux. +cd $GECKO_PATH +./mach python python/mozboot/mozboot/android.py --emulator-only --no-interactive + +# Remove extra files we don't need +rm -rfv /builds/worker/.mozbuild/android-sdk-linux/tools +mkdir /builds/worker/.mozbuild/android-sdk-linux/system-images +mkdir /builds/worker/.mozbuild/android-sdk-linux/platforms +find /builds/worker/.mozbuild/android-sdk-linux/emulator/qemu -type f -not -name "*x86*" -print -delete + +tar cv -C /builds/worker/.mozbuild android-sdk-linux | $GECKO_PATH/taskcluster/scripts/misc/zstdpy > $UPLOAD_DIR/android-emulator-linux.tar.zst + +ls -al $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/repack-android-ndk-linux.sh b/taskcluster/scripts/misc/repack-android-ndk-linux.sh new file mode 100755 index 0000000000..6a0fcd02a9 --- /dev/null +++ b/taskcluster/scripts/misc/repack-android-ndk-linux.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -x -e -v + +# This script is for fetching and repacking the Android NDK (for +# Linux), the tools required to produce native Android programs. + +UPLOAD_DIR=$HOME/project/gecko/android-ndk + +mkdir -p $HOME/artifacts $UPLOAD_DIR + +# Populate /builds/worker/.mozbuild/android-ndk-$VER. +cd $GECKO_PATH +./mach python python/mozboot/mozboot/android.py --ndk-only --no-interactive + +# Don't generate a tarball with a versioned NDK directory. +mv $HOME/.mozbuild/android-ndk-* $HOME/.mozbuild/android-ndk +tar cv -C /builds/worker/.mozbuild android-ndk | $GECKO_PATH/taskcluster/scripts/misc/zstdpy > $UPLOAD_DIR/android-ndk.tar.zst + +ls -al $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/repack-android-sdk-linux.sh b/taskcluster/scripts/misc/repack-android-sdk-linux.sh new file mode 100755 index 0000000000..08d9973677 --- /dev/null +++ b/taskcluster/scripts/misc/repack-android-sdk-linux.sh @@ -0,0 +1,21 @@ +#!/bin/bash +set -x -e -v + +# This script is for fetching and repacking the Android SDK (for +# Linux), the tools required to produce Android packages. + +UPLOAD_DIR=$HOME/project/gecko/android-sdk + +mkdir -p $HOME/artifacts $UPLOAD_DIR + +# Populate /builds/worker/.mozbuild/android-sdk-linux. +cd $GECKO_PATH +./mach python python/mozboot/mozboot/android.py --artifact-mode --no-interactive + +# It's nice to have the build logs include the state of the world upon +# completion. +/builds/worker/.mozbuild/android-sdk-linux/tools/bin/sdkmanager --list + +tar cv -C /builds/worker/.mozbuild android-sdk-linux | $GECKO_PATH/taskcluster/scripts/misc/zstdpy > $UPLOAD_DIR/android-sdk-linux.tar.zst + +ls -al $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/repack-clang-linux-macosx-cross.sh b/taskcluster/scripts/misc/repack-clang-linux-macosx-cross.sh new file mode 100755 index 0000000000..c06ddd1411 --- /dev/null +++ b/taskcluster/scripts/misc/repack-clang-linux-macosx-cross.sh @@ -0,0 +1,30 @@ +#!/bin/bash +set -x -e -v + +# This script is for building clang for macOS targets on a Linux host, +# including native macOS Compiler-RT libraries. + +cd $MOZ_FETCHES_DIR + +# We have a native linux64 toolchain in $MOZ_FETCHES_DIR/clang +# We have a native aarch64 macos compiler-rt in $MOZ_FETCHES_DIR/aarch64/compiler-rt +# We have a native x86_64 macos compiler-rt in $MOZ_FETCHES_DIR/x86_64/compiler-rt +clang_lib=$(echo clang/lib/clang/*/lib) +mkdir -p $clang_lib/darwin +find {aarch64,x86_64}/compiler-rt/lib/darwin -type f -printf '%f\n' | sort -u | while read f; do + f=compiler-rt/lib/darwin/$f + if [ -f aarch64/$f -a -f x86_64/$f ]; then + # For compiler-rt files that exist on both ends, merge them + $MOZ_FETCHES_DIR/cctools/bin/lipo -create {aarch64,x86_64}/$f -output $clang_lib/darwin/${f##*/} + elif [ -f aarch64/$f ]; then + # For compiler-rt files that exist on either end, copy the existing one + cp aarch64/$f $clang_lib/darwin + else + cp x86_64/$f $clang_lib/darwin + fi +done + +tar -cf - clang | python3 $GECKO_PATH/taskcluster/scripts/misc/zstdpy > clang.tar.zst + +mkdir -p $UPLOAD_DIR +mv clang.tar.zst $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/repack-clang-linux-win-cross.sh b/taskcluster/scripts/misc/repack-clang-linux-win-cross.sh new file mode 100755 index 0000000000..a6dd88e37a --- /dev/null +++ b/taskcluster/scripts/misc/repack-clang-linux-win-cross.sh @@ -0,0 +1,18 @@ +#!/bin/bash +set -x -e -v + +# This script is to repack a linux clang with Windows clang-cl.exe and compiler runtime. + +cd $MOZ_FETCHES_DIR + +# We already have the Linux clang extracted in $MOZ_FETCHES_DIR/clang by fetch-content +# We have a non-extracted clang-cl/clang.tar.zst for Windows clang-cl that we need to extract +# files from. + +$GECKO_PATH/taskcluster/scripts/misc/zstdpy -d clang-cl/clang.tar.zst | tar -x --wildcards clang/lib/clang/*/lib/windows clang/bin/clang-cl.exe clang/bin/llvm-symbolizer.exe +chmod +x clang/bin/clang-cl.exe +tar -c clang | $GECKO_PATH/taskcluster/scripts/misc/zstdpy > clang.tar.zst + +# Put a tarball in the artifacts dir +mkdir -p $UPLOAD_DIR +cp clang.tar.zst $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/repack-llvm-symbolizer.sh b/taskcluster/scripts/misc/repack-llvm-symbolizer.sh new file mode 100755 index 0000000000..cba49db5e8 --- /dev/null +++ b/taskcluster/scripts/misc/repack-llvm-symbolizer.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -x -e -v + +# This script is creating an artifact containing llvm-symbolizer. + +mkdir llvm-symbolizer +cp $MOZ_FETCHES_DIR/clang/bin/llvm-symbolizer* llvm-symbolizer/ + +tar -cf - llvm-symbolizer | python3 $GECKO_PATH/taskcluster/scripts/misc/zstdpy > llvm-symbolizer.tar.zst + +mkdir -p $UPLOAD_DIR +mv llvm-symbolizer.tar.zst $UPLOAD_DIR diff --git a/taskcluster/scripts/misc/repack-node.sh b/taskcluster/scripts/misc/repack-node.sh new file mode 100755 index 0000000000..4cb413fd74 --- /dev/null +++ b/taskcluster/scripts/misc/repack-node.sh @@ -0,0 +1,74 @@ +#!/bin/bash +set -x -e -v + +# This script is for repacking Node (and NPM) from nodejs.org. + +WORKSPACE=$HOME/workspace + +case "$1" in +linux64) ARCH=linux-x64 ;; +macosx64) ARCH=darwin-x64 ;; +win64) ARCH=win-x64 ;; +win32) ARCH=win-x86 ;; +*) + echo "Unknown architecture $1 not recognized in repack-node.sh" >&2 + exit 1 + ;; +esac + +case "$ARCH" in +linux-x64|darwin-x64) + SUFFIX=tar.xz + UNARCHIVE="tar xaf" + REPACK_TAR_COMPRESSION_SWITCH=J + REPACK_SUFFIX=tar.xz + ;; + +win-x64|win-x86) + SUFFIX=zip + UNARCHIVE=unzip + REPACK_TAR_COMPRESSION_SWITCH=j + REPACK_SUFFIX=tar.bz2 + ;; +esac + +# Although we're only using one version at the moment, this infrastructure is +# useful for when we need to do upgrades and have multiple versions of node +# live in taskcluster at once. +case "$2" in +10) VERSION="10.23.1" ;; +*) + echo "Unknown version $2 not recognized in repack-node.sh" >&2 + exit 1 + ;; +esac + +case "$ARCH--$VERSION" in + # From https://nodejs.org/dist/v10.23.1/SHASUMS256.txt.asc + linux-x64--10.23.1) SHA256SUM=207e5ec77ca655ba6fcde922d6b329acbb09898b0bd793ccfcce6c27a36fdff0 ;; + darwin-x64--10.23.1) SHA256SUM=febfdabd98ab5b8f8fdff32ab8c111d834083805bf042ab65c923cc22609c99d ;; + win-x64--10.23.1) SHA256SUM=497996aa1037b6f7f492c1d275bb90140269223939525286b4e95babad16f0de ;; + win-x86--10.23.1) SHA256SUM=c3be0fd50c218cc52e85377c9e22d7d2110d72de95bdbc9447145b246330f818 ;; +esac + +# From https://nodejs.org/en/download/ +URL=https://nodejs.org/dist/v$VERSION/node-v$VERSION-$ARCH.$SUFFIX +ARCHIVE=node-v$VERSION-$ARCH.$SUFFIX + +mkdir -p "$UPLOAD_DIR" + +cd "$WORKSPACE" +wget --progress=dot:mega $URL + +# shasum is available on both Linux and Windows builders, but on +# Windows, reading from stdin doesn't work as expected. +echo "$SHA256SUM $ARCHIVE" > node.txt +shasum --algorithm 256 --check node.txt + +$UNARCHIVE $ARCHIVE +mv node-v$VERSION-$ARCH node +# npx doesn't have great security characteristics (it downloads and executes +# stuff directly out of npm at runtime), so let's not risk it getting into +# anyone's PATH who doesn't already have it there: +rm -f node/bin/npx node/bin/npx.exe +tar c${REPACK_TAR_COMPRESSION_SWITCH}f "$UPLOAD_DIR"/node.$REPACK_SUFFIX node diff --git a/taskcluster/scripts/misc/repack_rust.py b/taskcluster/scripts/misc/repack_rust.py new file mode 100755 index 0000000000..1e376e4eb4 --- /dev/null +++ b/taskcluster/scripts/misc/repack_rust.py @@ -0,0 +1,717 @@ +#!/usr/bin/env python3 +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +""" +This script downloads and repacks official rust language builds +with the necessary tool and target support for the Firefox +build environment. +""" + +from __future__ import absolute_import, print_function + +import argparse +import errno +import glob +import hashlib +import os +import shutil +import subprocess +from contextlib import contextmanager +import tarfile +import tempfile +import textwrap + +import requests +import pytoml as toml + +import zstandard + + +def log(msg): + print("repack: %s" % msg, flush=True) + + +def fetch_file(url): + """Download a file from the given url if it's not already present. + + Returns the SHA-2 256-bit hash of the received file.""" + filename = os.path.basename(url) + sha = hashlib.sha256() + size = 4096 + if os.path.exists(filename): + with open(filename, "rb") as fd: + while True: + block = fd.read(size) + if not block: + return sha.hexdigest() + sha.update(block) + log("Could not calculate checksum!") + return None + r = requests.get(url, stream=True) + r.raise_for_status() + with open(filename, "wb") as fd: + for chunk in r.iter_content(size): + fd.write(chunk) + sha.update(chunk) + return sha.hexdigest() + + +def check_call_with_input(cmd, input_data): + """Invoke a command, passing the input String over stdin. + + This is like subprocess.check_call, but allows piping + input to interactive commands.""" + p = subprocess.Popen(cmd, stdin=subprocess.PIPE) + p.communicate(input_data) + if p.wait(): + raise subprocess.CalledProcessError(p.returncode, cmd) + + +def setup_gpg(): + """Add the signing key to the current gpg config. + + Import a hard-coded copy of the release signing public key + and mark it trusted in the gpg database so subsequent + signature checks can succeed or fail cleanly.""" + keyid = "0x85AB96E6FA1BE5FE" + log("Importing signing key %s..." % keyid) + key = b""" +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQINBFJEwMkBEADlPACa2K7reD4x5zd8afKx75QYKmxqZwywRbgeICeD4bKiQoJZ +dUjmn1LgrGaXuBMKXJQhyA34e/1YZel/8et+HPE5XpljBfNYXWbVocE1UMUTnFU9 +CKXa4AhJ33f7we2/QmNRMUifw5adPwGMg4D8cDKXk02NdnqQlmFByv0vSaArR5kn +gZKnLY6o0zZ9Buyy761Im/ShXqv4ATUgYiFc48z33G4j+BDmn0ryGr1aFdP58tHp +gjWtLZs0iWeFNRDYDje6ODyu/MjOyuAWb2pYDH47Xu7XedMZzenH2TLM9yt/hyOV +xReDPhvoGkaO8xqHioJMoPQi1gBjuBeewmFyTSPS4deASukhCFOcTsw/enzJagiS +ZAq6Imehduke+peAL1z4PuRmzDPO2LPhVS7CDXtuKAYqUV2YakTq8MZUempVhw5n +LqVaJ5/XiyOcv405PnkT25eIVVVghxAgyz6bOU/UMjGQYlkUxI7YZ9tdreLlFyPR +OUL30E8q/aCd4PGJV24yJ1uit+yS8xjyUiMKm4J7oMP2XdBN98TUfLGw7SKeAxyU +92BHlxg7yyPfI4TglsCzoSgEIV6xoGOVRRCYlGzSjUfz0bCMCclhTQRBkegKcjB3 +sMTyG3SPZbjTlCqrFHy13e6hGl37Nhs8/MvXUysq2cluEISn5bivTKEeeQARAQAB +tERSdXN0IExhbmd1YWdlIChUYWcgYW5kIFJlbGVhc2UgU2lnbmluZyBLZXkpIDxy +dXN0LWtleUBydXN0LWxhbmcub3JnPokCOAQTAQIAIgUCUkTAyQIbAwYLCQgHAwIG +FQgCCQoLBBYCAwECHgECF4AACgkQhauW5vob5f5fYQ//b1DWK1NSGx5nZ3zYZeHJ +9mwGCftIaA2IRghAGrNf4Y8DaPqR+w1OdIegWn8kCoGfPfGAVW5XXJg+Oxk6QIaD +2hJojBUrq1DALeCZVewzTVw6BN4DGuUexsc53a8DcY2Yk5WE3ll6UKq/YPiWiPNX +9r8FE2MJwMABB6mWZLqJeg4RCrriBiCG26NZxGE7RTtPHyppoVxWKAFDiWyNdJ+3 +UnjldWrT9xFqjqfXWw9Bhz8/EoaGeSSbMIAQDkQQpp1SWpljpgqvctZlc5fHhsG6 +lmzW5RM4NG8OKvq3UrBihvgzwrIfoEDKpXbk3DXqaSs1o81NH5ftVWWbJp/ywM9Q +uMC6n0YWiMZMQ1cFBy7tukpMkd+VPbPkiSwBhPkfZIzUAWd74nanN5SKBtcnymgJ ++OJcxfZLiUkXRj0aUT1GLA9/7wnikhJI+RvwRfHBgrssXBKNPOfXGWajtIAmZc2t +kR1E8zjBVLId7r5M8g52HKk+J+y5fVgJY91nxG0zf782JjtYuz9+knQd55JLFJCO +hhbv3uRvhvkqgauHagR5X9vCMtcvqDseK7LXrRaOdOUDrK/Zg/abi5d+NIyZfEt/ +ObFsv3idAIe/zpU6xa1nYNe3+Ixlb6mlZm3WCWGxWe+GvNW/kq36jZ/v/8pYMyVO +p/kJqnf9y4dbufuYBg+RLqC5Ag0EUkTAyQEQANxy2tTSeRspfrpBk9+ju+KZ3zc4 +umaIsEa5DxJ2zIKHywVAR67Um0K1YRG07/F5+tD9TIRkdx2pcmpjmSQzqdk3zqa9 +2Zzeijjz2RNyBY8qYmyE08IncjTsFFB8OnvdXcsAgjCFmI1BKnePxrABL/2k8X18 +aysPb0beWqQVsi5FsSpAHu6k1kaLKc+130x6Hf/YJAjeo+S7HeU5NeOz3zD+h5bA +Q25qMiVHX3FwH7rFKZtFFog9Ogjzi0TkDKKxoeFKyADfIdteJWFjOlCI9KoIhfXq +Et9JMnxApGqsJElJtfQjIdhMN4Lnep2WkudHAfwJ/412fe7wiW0rcBMvr/BlBGRY +vM4sTgN058EwIuY9Qmc8RK4gbBf6GsfGNJjWozJ5XmXElmkQCAvbQFoAfi5TGfVb +77QQrhrQlSpfIYrvfpvjYoqj618SbU6uBhzh758gLllmMB8LOhxWtq9eyn1rMWyR +KL1fEkfvvMc78zP+Px6yDMa6UIez8jZXQ87Zou9EriLbzF4QfIYAqR9LUSMnLk6K +o61tSFmFEDobC3tc1jkSg4zZe/wxskn96KOlmnxgMGO0vJ7ASrynoxEnQE8k3WwA ++/YJDwboIR7zDwTy3Jw3mn1FgnH+c7Rb9h9geOzxKYINBFz5Hd0MKx7kZ1U6WobW +KiYYxcCmoEeguSPHABEBAAGJAh8EGAECAAkFAlJEwMkCGwwACgkQhauW5vob5f7f +FA//Ra+itJF4NsEyyhx4xYDOPq4uj0VWVjLdabDvFjQtbBLwIyh2bm8uO3AY4r/r +rM5WWQ8oIXQ2vvXpAQO9g8iNlFez6OLzbfdSG80AG74pQqVVVyCQxD7FanB/KGge +tAoOstFxaCAg4nxFlarMctFqOOXCFkylWl504JVIOvgbbbyj6I7qCUmbmqazBSMU +K8c/Nz+FNu2Uf/lYWOeGogRSBgS0CVBcbmPUpnDHLxZWNXDWQOCxbhA1Uf58hcyu +036kkiWHh2OGgJqlo2WIraPXx1cGw1Ey+U6exbtrZfE5kM9pZzRG7ZY83CXpYWMp +kyVXNWmf9JcIWWBrXvJmMi0FDvtgg3Pt1tnoxqdilk6yhieFc8LqBn6CZgFUBk0t +NSaWk3PsN0N6Ut8VXY6sai7MJ0Gih1gE1xadWj2zfZ9sLGyt2jZ6wK++U881YeXA +ryaGKJ8sIs182hwQb4qN7eiUHzLtIh8oVBHo8Q4BJSat88E5/gOD6IQIpxc42iRL +T+oNZw1hdwNyPOT1GMkkn86l3o7klwmQUWCPm6vl1aHp3omo+GHC63PpNFO5RncJ +Ilo3aBKKmoE5lDSMGE8KFso5awTo9z9QnVPkRsk6qeBYit9xE3x3S+iwjcSg0nie +aAkc0N00nc9V9jfPvt4z/5A5vjHh+NhFwH5h2vBJVPdsz6m5Ag0EVI9keAEQAL3R +oVsHncJTmjHfBOV4JJsvCum4DuJDZ/rDdxauGcjMUWZaG338ZehnDqG1Yn/ys7zE +aKYUmqyT+XP+M2IAQRTyxwlU1RsDlemQfWrESfZQCCmbnFScL0E7cBzy4xvtInQe +UaFgJZ1BmxbzQrx+eBBdOTDv7RLnNVygRmMzmkDhxO1IGEu1+3ETIg/DxFE7VQY0 +It/Ywz+nHu1o4Hemc/GdKxu9hcYvcRVc/Xhueq/zcIM96l0m+CFbs0HMKCj8dgMe +Ng6pbbDjNM+cV+5BgpRdIpE2l9W7ImpbLihqcZt47J6oWt/RDRVoKOzRxjhULVyV +2VP9ESr48HnbvxcpvUAEDCQUhsGpur4EKHFJ9AmQ4zf91gWLrDc6QmlACn9o9ARU +fOV5aFsZI9ni1MJEInJTP37stz/uDECRie4LTL4O6P4Dkto8ROM2wzZq5CiRNfnT +PP7ARfxlCkpg+gpLYRlxGUvRn6EeYwDtiMQJUQPfpGHSvThUlgDEsDrpp4SQSmdA +CB+rvaRqCawWKoXs0In/9wylGorRUupeqGC0I0/rh+f5mayFvORzwy/4KK4QIEV9 +aYTXTvSRl35MevfXU1Cumlaqle6SDkLr3ZnFQgJBqap0Y+Nmmz2HfO/pohsbtHPX +92SN3dKqaoSBvzNGY5WT3CsqxDtik37kR3f9/DHpABEBAAGJBD4EGAECAAkFAlSP +ZHgCGwICKQkQhauW5vob5f7BXSAEGQECAAYFAlSPZHgACgkQXLSpNHs7CdwemA/+ +KFoGuFqU0uKT9qblN4ugRyil5itmTRVffl4tm5OoWkW8uDnu7Ue3vzdzy+9NV8X2 +wRG835qjXijWP++AGuxgW6LB9nV5OWiKMCHOWnUjJQ6pNQMAgSN69QzkFXVF/q5f +bkma9TgSbwjrVMyPzLSRwq7HsT3V02Qfr4cyq39QeILGy/NHW5z6LZnBy3BaVSd0 +lGjCEc3yfH5OaB79na4W86WCV5n4IT7cojFM+LdL6P46RgmEtWSG3/CDjnJl6BLR +WqatRNBWLIMKMpn+YvOOL9TwuP1xbqWr1vZ66wksm53NIDcWhptpp0KEuzbU0/Dt +OltBhcX8tOmO36LrSadX9rwckSETCVYklmpAHNxPml011YNDThtBidvsicw1vZwR +HsXn+txlL6RAIRN+J/Rw3uOiJAqN9Qgedpx2q+E15t8MiTg/FXtB9SysnskFT/BH +z0USNKJUY0btZBw3eXWzUnZf59D8VW1M/9JwznCHAx0c9wy/gRDiwt9w4RoXryJD +VAwZg8rwByjldoiThUJhkCYvJ0R3xH3kPnPlGXDW49E9R8C2umRC3cYOL4U9dOQ1 +5hSlYydF5urFGCLIvodtE9q80uhpyt8L/5jj9tbwZWv6JLnfBquZSnCGqFZRfXlb +Jphk9+CBQWwiZSRLZRzqQ4ffl4xyLuolx01PMaatkQbRaw/+JpgRNlurKQ0PsTrO +8tztO/tpBBj/huc2DGkSwEWvkfWElS5RLDKdoMVs/j5CLYUJzZVikUJRm7m7b+OA +P3W1nbDhuID+XV1CSBmGifQwpoPTys21stTIGLgznJrIfE5moFviOLqD/LrcYlsq +CQg0yleu7SjOs//8dM3mC2FyLaE/dCZ8l2DCLhHw0+ynyRAvSK6aGCmZz6jMjmYF +MXgiy7zESksMnVFMulIJJhR3eB0wx2GitibjY/ZhQ7tD3i0yy9ILR07dFz4pgkVM +afxpVR7fmrMZ0t+yENd+9qzyAZs0ksxORoc2ze90SCx2jwEX/3K+m4I0hP2H/w5W +gqdvuRLiqf+4BGW4zqWkLLlNIe/okt0r82SwHtDN0Ui1asmZTGj6sm8SXtwx+5cE +38MttWqjDiibQOSthRVcETByRYM8KcjYSUCi4PoBc3NpDONkFbZm6XofR/f5mTcl +2jDw6fIeVc4Hd1jBGajNzEqtneqqbdAkPQaLsuD2TMkQfTDJfE/IljwjrhDa9Mi+ +odtnMWq8vlwOZZ24/8/BNK5qXuCYL67O7AJB4ZQ6BT+g4z96iRLbupzu/XJyXkQF +rOY/Ghegvn7fDrnt2KC9MpgeFBXzUp+k5rzUdF8jbCx5apVjA1sWXB9Kh3L+DUwF +Mve696B5tlHyc1KxjHR6w9GRsh4= +=5FXw +-----END PGP PUBLIC KEY BLOCK----- +""" + check_call_with_input(["gpg", "--import"], key) + check_call_with_input( + ["gpg", "--command-fd", "0", "--edit-key", keyid], b"trust\n5\ny\n" + ) + + +def verify_sha(filename, sha): + """Verify that the checksum file matches the given sha digest.""" + sha_filename = filename + ".sha256" + with open(sha_filename) as f: + # Older sha256 files would contain `sha filename`, but more recent + # ones only contain `sha`. + checksum = f.readline().split()[0] + if checksum != sha: + raise ValueError("Checksum mismatch in %s" % filename) + return True + log("No checksum file for %s!" % filename) + return False + + +def fetch(url, validate=True): + """Download and verify a package url.""" + base = os.path.basename(url) + log("Fetching %s..." % base) + if validate: + fetch_file(url + ".asc") + fetch_file(url + ".sha256") + sha = fetch_file(url) + if validate: + log("Verifying %s..." % base) + verify_sha(base, sha) + subprocess.check_call( + ["gpg", "--keyid-format", "0xlong", "--verify", base + ".asc", base] + ) + return sha + + +def install(filename, target): + """Run a package's installer script against the given target directory.""" + log("Unpacking %s..." % filename) + subprocess.check_call(["tar", "xf", filename]) + basename = filename.split(".tar")[0] + log("Installing %s..." % basename) + install_cmd = [os.path.join(basename, "install.sh")] + install_cmd += ["--prefix=" + os.path.abspath(target)] + install_cmd += ["--disable-ldconfig"] + subprocess.check_call(install_cmd) + log("Cleaning %s..." % basename) + shutil.rmtree(basename) + + +def package(manifest, pkg, target): + """Pull out the package dict for a particular package and target + from the given manifest.""" + version = manifest["pkg"][pkg]["version"] + if target in manifest["pkg"][pkg]["target"]: + info = manifest["pkg"][pkg]["target"][target] + else: + # rust-src is the same for all targets, and has a literal '*' in the + # section key/name instead of a target + info = manifest["pkg"][pkg]["target"]["*"] + if "xz_url" in info: + info["url"] = info.pop("xz_url") + info["hash"] = info.pop("xz_hash") + return (version, info) + + +def fetch_package(manifest, pkg, host): + version, info = package(manifest, pkg, host) + if not info["available"]: + log("%s marked unavailable for %s" % (pkg, host)) + raise KeyError + + log("%s %s\n %s\n %s" % (pkg, version, info["url"], info["hash"])) + sha = fetch(info["url"], info["hash"] is not None) + if info["hash"] and sha != info["hash"]: + log( + "Checksum mismatch: package resource is different from manifest" + "\n %s" % sha + ) + raise AssertionError + return info + + +def fetch_std(manifest, targets): + stds = [] + for target in targets: + stds.append(fetch_package(manifest, "rust-std", target)) + # not available for i686 + if target != "i686-unknown-linux-musl": + stds.append(fetch_package(manifest, "rust-analysis", target)) + return stds + + +def fetch_optional(manifest, pkg, host): + try: + return fetch_package(manifest, pkg, host) + except KeyError: + # The package is not available, oh well! + return None + + +@contextmanager +def chdir(path): + d = os.getcwd() + log('cd "%s"' % path) + os.chdir(path) + try: + yield + finally: + log('cd "%s"' % d) + os.chdir(d) + + +def build_tar_package(name, base, directory): + name = os.path.realpath(name) + log("tarring {} from {}/{}".format(name, base, directory)) + assert name.endswith(".tar.zst") + + cctx = zstandard.ZstdCompressor() + with open(name, "wb") as f, cctx.stream_writer(f) as z: + with tarfile.open(mode="w|", fileobj=z) as tf: + with chdir(base): + tf.add(directory) + + +def fetch_manifest(channel="stable", host=None, targets=()): + if channel.startswith("bors-"): + assert host + rev = channel[len("bors-") :] + base_url = "https://s3-us-west-1.amazonaws.com/rust-lang-ci2/rustc-builds" + manifest = { + "date": "some date", + "pkg": {}, + } + + def target(url): + return { + "url": url, + "hash": None, + "available": requests.head(url).status_code == 200, + } + + for pkg in ("cargo", "rustc", "rustfmt-preview"): + manifest["pkg"][pkg] = { + "version": "bors", + "target": { + host: target( + "{}/{}/{}-nightly-{}.tar.xz".format(base_url, rev, pkg, host) + ), + }, + } + manifest["pkg"]["rust-src"] = { + "version": "bors", + "target": { + "*": target("{}/{}/rust-src-nightly.tar.xz".format(base_url, rev)), + }, + } + for pkg in ("rust-std", "rust-analysis"): + manifest["pkg"][pkg] = { + "version": "bors", + "target": { + t: target( + "{}/{}/{}-nightly-{}.tar.xz".format(base_url, rev, pkg, t) + ) + for t in sorted(set(targets) | set([host])) + }, + } + return manifest + if "-" in channel: + channel, date = channel.split("-", 1) + prefix = "/" + date + else: + prefix = "" + url = "https://static.rust-lang.org/dist%s/channel-rust-%s.toml" % (prefix, channel) + req = requests.get(url) + req.raise_for_status() + manifest = toml.loads(req.content) + if manifest["manifest-version"] != "2": + raise NotImplementedError( + "Unrecognized manifest version %s." % manifest["manifest-version"] + ) + return manifest + + +def patch_src(patch, module): + log("Patching Rust src... {} with {}".format(module, patch)) + patch = os.path.realpath(patch) + subprocess.check_call(["patch", "-d", module, "-p1", "-i", patch, "--fuzz=0", "-s"]) + + +def build_src(install_dir, host, targets, patch): + install_dir = os.path.abspath(install_dir) + fetches = os.environ["MOZ_FETCHES_DIR"] + rust_dir = os.path.join(fetches, "rust") + patch_dir = os.path.join(os.environ["GECKO_PATH"], "build", "build-rust") + + # Clear and remake any previous install directory. + try: + shutil.rmtree(install_dir) + except OSError as e: + if e.errno != errno.ENOENT: + raise + os.makedirs(install_dir) + + # Patch the src (see the --patch flag's description for details) + if patch: + for p in patch: + module, colon, file = p.partition(":") + if not colon: + module, file = "", p + patch_file = os.path.join(patch_dir, file) + patch_module = os.path.join(rust_dir, module) + patch_src(patch_file, patch_module) + + log("Building Rust...") + + # Rust builds are configured primarily through a config.toml file. + # + # `sysconfdir` is overloaded to be relative instead of absolute. + # This is the default of `install.sh`, but for whatever reason + # `x.py install` has its own default of `/etc` which we don't want. + # + # `missing-tools` is set so `rustfmt` is allowed to fail. This means + # we can "succeed" at building Rust while failing to build, say, Cargo. + # Ideally the build system would have better granularity: + # https://github.com/rust-lang/rust/issues/79249 + base_config = textwrap.dedent( + """ + [build] + extended = true + tools = ["analysis", "cargo", "rustfmt", "src"] + + [install] + prefix = "{prefix}" + sysconfdir = "etc" + + [dist] + missing-tools = true + + """.format( + prefix=install_dir + ) + ) + + # Rust requires these to be specified per-target + target_config = textwrap.dedent( + """ + [target.{target}] + cc = "clang" + cxx = "clang++" + linker = "clang" + + """ + ) + + final_config = base_config + for target in sorted(set(targets) | set([host])): + final_config = final_config + target_config.format(target=target) + + with open(os.path.join(rust_dir, "config.toml"), "w") as file: + file.write(final_config) + + # Setup the env so compilers and toolchains are visible + binutils = os.path.join(fetches, "binutils", "bin") + clang = os.path.join(fetches, "clang") + clang_bin = os.path.join(clang, "bin") + clang_lib = os.path.join(clang, "lib") + + env = os.environ.copy() + env.update( + { + "PATH": os.pathsep.join((binutils, clang_bin, os.environ["PATH"])), + "LD_LIBRARY_PATH": clang_lib, + } + ) + + # x.py install does everything we need for us. + # If you're running into issues, consider using `-vv` to debug it. + command = ["python3", "x.py", "install", "-v", "--host", host] + for target in targets: + command.extend(["--target", target]) + + subprocess.check_call(command, stderr=subprocess.STDOUT, env=env, cwd=rust_dir) + + +def repack( + host, + targets, + channel="stable", + cargo_channel=None, + compiler_builtins_hack=False, + patch=None, +): + install_dir = "rustc" + if channel == "dev": + build_src(install_dir, host, targets, patch) + else: + if patch: + raise ValueError( + 'Patch specified, but channel "%s" is not "dev"!' + "\nPatches are only for building from source." % channel + ) + log("Repacking rust for %s supporting %s..." % (host, targets)) + manifest = fetch_manifest(channel, host, targets) + log("Using manifest for rust %s as of %s." % (channel, manifest["date"])) + if cargo_channel == channel: + cargo_manifest = manifest + else: + cargo_manifest = fetch_manifest(cargo_channel, host, targets) + log( + "Using manifest for cargo %s as of %s." + % (cargo_channel, cargo_manifest["date"]) + ) + + log("Fetching packages...") + rustc = fetch_package(manifest, "rustc", host) + cargo = fetch_package(cargo_manifest, "cargo", host) + stds = fetch_std(manifest, targets) + rustsrc = fetch_package(manifest, "rust-src", host) + rustfmt = fetch_optional(manifest, "rustfmt-preview", host) + + log("Installing packages...") + + # Clear any previous install directory. + try: + shutil.rmtree(install_dir) + except OSError as e: + if e.errno != errno.ENOENT: + raise + install(os.path.basename(rustc["url"]), install_dir) + install(os.path.basename(cargo["url"]), install_dir) + install(os.path.basename(rustsrc["url"]), install_dir) + if rustfmt: + install(os.path.basename(rustfmt["url"]), install_dir) + for std in stds: + install(os.path.basename(std["url"]), install_dir) + pass + # Workaround for https://github.com/rust-lang/rust/issues/74657: + # Remove the .llvmbc and .llvmcmd sections (sections for the LLVM bitcode) + # from the compiler_builtins rlib. + hack_targets = () + if compiler_builtins_hack: + hack_targets = ( + "x86_64-unknown-linux-gnu", + "i686-unknown-linux-gnu", + "thumbv7neon-linux-androideabi", + "aarch64-linux-android", + ) + llvm_bin = os.path.join(os.environ["MOZ_FETCHES_DIR"], "clang", "bin") + for t in hack_targets: + if t not in targets: + continue + for lib in glob.glob( + os.path.join( + install_dir, "lib", "rustlib", t, "lib", "libcompiler_builtins*" + ) + ): + log("Postprocessing %s" % lib) + with tempfile.TemporaryDirectory() as d: + # Extract all the files from the .rlib + subprocess.check_call( + [os.path.join(llvm_bin, "llvm-ar"), "x", os.path.abspath(lib)], + cwd=d, + ) + files = os.listdir(d) + for f in files: + if not f.endswith(".o"): + continue + # For each .o file, remove the aforementioned sections. + subprocess.check_call( + [ + os.path.join(llvm_bin, "llvm-objcopy"), + "-R", + ".llvmbc", + "-R", + ".llvmcmd", + f, + ], + cwd=d, + ) + # Create a new .rlib with the updated object files. + subprocess.check_call( + [os.path.join(llvm_bin, "llvm-ar"), "crv", os.path.abspath(lib)] + + files, + cwd=d, + ) + subprocess.check_call( + [os.path.join(llvm_bin, "llvm-ranlib"), os.path.abspath(lib)], cwd=d + ) + + log("Creating archive...") + tar_file = install_dir + ".tar.zst" + build_tar_package(tar_file, ".", install_dir) + shutil.rmtree(install_dir) + log("%s is ready." % tar_file) + + upload_dir = os.environ.get("UPLOAD_DIR") + if upload_dir: + # Create the upload directory if it doesn't exist. + try: + log("Creating upload directory in %s..." % os.path.abspath(upload_dir)) + os.makedirs(upload_dir) + except OSError as e: + if e.errno != errno.EEXIST: + raise + # Move the tarball to the output directory for upload. + log("Moving %s to the upload directory..." % tar_file) + shutil.move(tar_file, upload_dir) + + +def repack_cargo(host, channel="nightly"): + log("Repacking cargo for %s..." % host) + # Cargo doesn't seem to have a .toml manifest. + base_url = "https://static.rust-lang.org/cargo-dist/" + req = requests.get(os.path.join(base_url, "channel-cargo-" + channel)) + req.raise_for_status() + file = "" + for line in req.iter_lines(): + if line.find(host) != -1: + file = line.strip() + if not file: + log("No manifest entry for %s!" % host) + return + manifest = { + "date": req.headers["Last-Modified"], + "pkg": { + "cargo": { + "version": channel, + "target": { + host: { + "url": os.path.join(base_url, file), + "hash": None, + "available": True, + }, + }, + }, + }, + } + log("Using manifest for cargo %s." % channel) + log("Fetching packages...") + cargo = fetch_package(manifest, "cargo", host) + log("Installing packages...") + install_dir = "cargo" + shutil.rmtree(install_dir) + install(os.path.basename(cargo["url"]), install_dir) + tar_basename = "cargo-%s-repack" % host + log("Tarring %s..." % tar_basename) + tar_file = tar_basename + ".tar.zst" + build_tar_package(tar_file, ".", install_dir) + shutil.rmtree(install_dir) + + +def expand_platform(name): + """Expand a shortcut name to a full Rust platform string.""" + platforms = { + "android": "armv7-linux-androideabi", + "android_x86": "i686-linux-android", + "android_x86-64": "x86_64-linux-android", + "android_aarch64": "aarch64-linux-android", + "linux64": "x86_64-unknown-linux-gnu", + "linux32": "i686-unknown-linux-gnu", + "mac": "x86_64-apple-darwin", + "macos": "x86_64-apple-darwin", + "mac64": "x86_64-apple-darwin", + "mac32": "i686-apple-darwin", + "win64": "x86_64-pc-windows-msvc", + "win32": "i686-pc-windows-msvc", + "mingw32": "i686-pc-windows-gnu", + } + return platforms.get(name, name) + + +def validate_channel(channel): + """Require a specific release version. + + Packaging from meta-channels, like `stable`, `beta`, or `nightly` + doesn't give repeatable output. Reject such channels.""" + channel_prefixes = ("stable", "beta", "nightly") + if any([channel.startswith(c) for c in channel_prefixes]): + if "-" not in channel: + raise ValueError( + 'Generic channel "%s" specified!' + "\nPlease give a specific release version" + ' like "1.24.0" or "beta-2018-02-20".' % channel + ) + + +def args(): + """Read command line arguments and return options.""" + parser = argparse.ArgumentParser() + parser.add_argument( + "--channel", + help="Release channel to use:" + " 1.xx.y, beta-yyyy-mm-dd," + " nightly-yyyy-mm-dd," + " bors-$rev (grab a build from rust's CI)," + " or dev (build from source).", + required=True, + ) + parser.add_argument( + "--patch", + nargs="+", + help="apply the given patch file to a dev build." + " Patch files should be placed in /build/build-rust." + " Patches can be prefixed with `module-path:` to specify they" + " apply to that git submodule in the Rust source." + " e.g. `src/llvm-project:mypatch.diff` patches rust's llvm.", + ) + parser.add_argument( + "--cargo-channel", + help="Release channel version to use for cargo." + " Defaults to the same as --channel.", + ) + parser.add_argument( + "--compiler-builtins-hack", + action="store_true", + help="Enable workaround for " "https://github.com/rust-lang/rust/issues/74657.", + ) + parser.add_argument( + "--host", + help="Host platform for the toolchain executable:" + " e.g. linux64 or aarch64-linux-android." + " Defaults to linux64.", + ) + parser.add_argument( + "--target", + dest="targets", + action="append", + default=[], + help="Additional target platform to support:" + " e.g. linux32 or i686-pc-windows-gnu." + " can be given more than once.", + ) + args = parser.parse_args() + if not args.cargo_channel: + args.cargo_channel = args.channel + validate_channel(args.channel) + validate_channel(args.cargo_channel) + if not args.host: + args.host = "linux64" + args.host = expand_platform(args.host) + args.targets = [expand_platform(t) for t in args.targets] + + return args + + +if __name__ == "__main__": + args = vars(args()) + setup_gpg() + repack(**args) diff --git a/taskcluster/scripts/misc/run-profileserver-macos.sh b/taskcluster/scripts/misc/run-profileserver-macos.sh new file mode 100755 index 0000000000..61873a273a --- /dev/null +++ b/taskcluster/scripts/misc/run-profileserver-macos.sh @@ -0,0 +1,20 @@ +#! /bin/bash -vex +set -x -e + +#### +# Taskcluster friendly wrapper for running the profileserver on macOS +#### + +export UPLOAD_PATH=../../artifacts +mkdir -p $UPLOAD_PATH + +export JARLOG_FILE="en-US.log" + +export LLVM_PROFDATA=$MOZ_FETCHES_DIR/clang/bin/llvm-profdata + +set -v + +./mach python python/mozbuild/mozbuild/action/install.py $MOZ_FETCHES_DIR/target.dmg $MOZ_FETCHES_DIR +./mach python build/pgo/profileserver.py --binary $MOZ_FETCHES_DIR/*.app/Contents/MacOS/firefox + +tar -Jcvf $UPLOAD_PATH/profdata.tar.xz merged.profdata en-US.log diff --git a/taskcluster/scripts/misc/run-profileserver.sh b/taskcluster/scripts/misc/run-profileserver.sh new file mode 100755 index 0000000000..dd0ad31f05 --- /dev/null +++ b/taskcluster/scripts/misc/run-profileserver.sh @@ -0,0 +1,42 @@ +#! /bin/bash -vex + +set -x -e + +echo "running as" $(id) + +: NEED_XVFB ${NEED_XVFB:=false} +: UPLOAD_PATH ${UPLOAD_PATH:=$HOME/artifacts} +export UPLOAD_PATH + +#### +# Taskcluster friendly wrapper for running the profileserver +#### + +PGO_RUNDIR=obj-firefox/dist +export JARLOG_FILE="en-US.log" +export LLVM_PROFDATA=$MOZ_FETCHES_DIR/clang/bin/llvm-profdata + +set -v + +if $NEED_XVFB; then + # run XVfb in the background + . /builds/worker/scripts/xvfb.sh + + cleanup() { + local rv=$? + cleanup_xvfb + exit $rv + } + trap cleanup EXIT INT + + start_xvfb '1024x768x24' 2 +fi + +# Move our fetched firefox into objdir/dist so the jarlog entries will match +# the paths when the final PGO stage packages the build. +mkdir -p $PGO_RUNDIR +mkdir -p $UPLOAD_PATH +mv $MOZ_FETCHES_DIR/firefox $PGO_RUNDIR +./mach python build/pgo/profileserver.py --binary $PGO_RUNDIR/firefox/firefox + +tar -acvf $UPLOAD_PATH/profdata.tar.xz merged.profdata en-US.log diff --git a/taskcluster/scripts/misc/source-test-clang-non-unified.sh b/taskcluster/scripts/misc/source-test-clang-non-unified.sh new file mode 100755 index 0000000000..20a34abd14 --- /dev/null +++ b/taskcluster/scripts/misc/source-test-clang-non-unified.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +NON_UNIFIED_CFG=$GECKO_PATH/build/non-unified-compat + +cat "$NON_UNIFIED_CFG" | xargs ./mach static-analysis check-syntax diff --git a/taskcluster/scripts/misc/source-test-clang-setup.sh b/taskcluster/scripts/misc/source-test-clang-setup.sh new file mode 100755 index 0000000000..a8288e5a36 --- /dev/null +++ b/taskcluster/scripts/misc/source-test-clang-setup.sh @@ -0,0 +1,25 @@ +#!/bin/bash +source $HOME/checkouts/gecko/taskcluster/scripts/misc/source-test-common.sh + +# Add clang-tidy to PATH +export PATH=$MOZ_FETCHES_DIR/clang-tidy/bin:$PATH + +# Use toolchain clang +export LD_LIBRARY_PATH=$MOZ_FETCHES_DIR/clang/lib + +# Write custom mozconfig +export MOZCONFIG=$GECKO_PATH/mozconfig + +# Add to mozconfig all the appropriate options +cat <<EOT >> $MOZCONFIG +# Enable debug mode +ac_add_options --enable-debug +# Enable GC zeal, a testing and debugging feature that helps find GC-related bugs in JSAPI applications. +ac_add_options --enable-gczeal +# Do not treat warnings as errors +ac_add_options --disable-warnings-as-errors +EOT + +# Mach lookup clang-tidy in clang-tools +mkdir -p $MOZBUILD_STATE_PATH/clang-tools +ln -s $MOZ_FETCHES_DIR/clang-tidy $MOZBUILD_STATE_PATH/clang-tools/clang-tidy diff --git a/taskcluster/scripts/misc/source-test-common.sh b/taskcluster/scripts/misc/source-test-common.sh new file mode 100755 index 0000000000..eb2409cf4e --- /dev/null +++ b/taskcluster/scripts/misc/source-test-common.sh @@ -0,0 +1,16 @@ +#! /bin/bash -vex + +set -x -e + +export MOZBUILD_STATE_PATH=$HOME/workspace + +# Add toolchain binaries to PATH to run ./mach configure +export PATH=$MOZ_FETCHES_DIR/clang/bin:$PATH +export PATH=$MOZ_FETCHES_DIR/rustc/bin:$PATH +export PATH=$MOZ_FETCHES_DIR/cbindgen:$PATH +export PATH=$MOZ_FETCHES_DIR/nasm:$PATH +export PATH=$MOZ_FETCHES_DIR/node/bin:$PATH + +# Use clang as host compiler +export CC=$MOZ_FETCHES_DIR/clang/bin/clang +export CXX=$MOZ_FETCHES_DIR/clang/bin/clang++ diff --git a/taskcluster/scripts/misc/source-test-infer-setup.sh b/taskcluster/scripts/misc/source-test-infer-setup.sh new file mode 100755 index 0000000000..cfbb6abffc --- /dev/null +++ b/taskcluster/scripts/misc/source-test-infer-setup.sh @@ -0,0 +1,18 @@ +#!/bin/bash +source $GECKO_PATH/taskcluster/scripts/misc/source-test-common.sh + +# Write custom mozconfig +MOZCONFIG=$GECKO_PATH/mozconfig +echo "ac_add_options --enable-application=mobile/android" > $MOZCONFIG +echo "ac_add_options --target=arm-linux-androideabi" >> $MOZCONFIG +echo "ac_add_options --with-android-sdk=${MOZ_FETCHES_DIR}/android-sdk-linux" >> $MOZCONFIG +echo "ac_add_options --with-android-ndk=${MOZ_FETCHES_DIR}/android-ndk" >> $MOZCONFIG + +# Write custom grade properties +export GRADLE_USER_HOME=$HOME/workspace/gradle +mkdir -p $GRADLE_USER_HOME +echo "org.gradle.daemon=false" >> ${GRADLE_USER_HOME}/gradle.properties + +# Mach lookup infer in infer... +mkdir -p $MOZBUILD_STATE_PATH/infer/infer +mv $MOZ_FETCHES_DIR/infer/{bin,lib} $MOZBUILD_STATE_PATH/infer/infer diff --git a/taskcluster/scripts/misc/tooltool-download.sh b/taskcluster/scripts/misc/tooltool-download.sh new file mode 100644 index 0000000000..5f971d725a --- /dev/null +++ b/taskcluster/scripts/misc/tooltool-download.sh @@ -0,0 +1,21 @@ +# Fetch a tooltool manifest. + +cd $MOZ_FETCHES_DIR + +TOOLTOOL_DL_FLAGS= + +if [ -n "$UPLOAD_DIR" ]; then + TOOLTOOL_DL_FLAGS="${TOOLTOOL_DL_FLAGS=} --artifact-manifest $UPLOAD_DIR/toolchains.json" +fi + +: TOOLTOOL_CACHE ${TOOLTOOL_CACHE:=/builds/worker/tooltool-cache} +export TOOLTOOL_CACHE + +if [ -z "$TOOLTOOL_MANIFEST" ]; then + echo This script should not be used when there is no tooltool manifest set + exit 1 +fi + +${GECKO_PATH}/mach artifact toolchain -v${TOOLTOOL_DL_FLAGS} --tooltool-manifest "${GECKO_PATH}/${TOOLTOOL_MANIFEST}"${TOOLTOOL_CACHE:+ --cache-dir ${TOOLTOOL_CACHE}} --retry 5 + +cd $OLDPWD diff --git a/taskcluster/scripts/misc/unify.sh b/taskcluster/scripts/misc/unify.sh new file mode 100755 index 0000000000..94e30c33c1 --- /dev/null +++ b/taskcluster/scripts/misc/unify.sh @@ -0,0 +1,45 @@ +#!/bin/sh +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +set -x -e + +export LIPO=$MOZ_FETCHES_DIR/cctools/bin/x86_64-apple-darwin-lipo +export MKFSHFS=$MOZ_FETCHES_DIR/hfsplus-tools/newfs_hfs +export DMG_TOOL=$MOZ_FETCHES_DIR/dmg/dmg +export HFS_TOOL=$MOZ_FETCHES_DIR/dmg/hfsplus + +for i in x64 aarch64; do + $GECKO_PATH/mach python -m mozbuild.action.unpack_dmg $MOZ_FETCHES_DIR/$i/target.dmg $i +done +$GECKO_PATH/mach python $GECKO_PATH/toolkit/mozapps/installer/unify.py x64/*.app aarch64/*.app +$GECKO_PATH/mach python -m mozbuild.action.make_dmg x64 target.dmg + +mkdir -p $UPLOAD_DIR +mv target.dmg $UPLOAD_DIR/ + +python3 -c ' +import json +import os + +for artifact in json.loads(os.environ["MOZ_FETCHES"]): + if artifact.get("extract") and artifact.get("dest", "").startswith("x64"): + print(artifact["dest"], os.path.basename(artifact["artifact"])) +' | while read dir artifact; do + if [ "$artifact" = target.crashreporter-symbols.zip ]; then + $GECKO_PATH/mach python $GECKO_PATH/python/mozbuild/mozbuild/action/unify_symbols.py $MOZ_FETCHES_DIR/$dir $MOZ_FETCHES_DIR/aarch64${dir#x64} + else + $GECKO_PATH/mach python $GECKO_PATH/python/mozbuild/mozbuild/action/unify_tests.py $MOZ_FETCHES_DIR/$dir $MOZ_FETCHES_DIR/aarch64${dir#x64} + fi + + case $artifact in + *.tar.gz) + find $MOZ_FETCHES_DIR/$dir -not -type d -printf '%P\0' | tar -C $MOZ_FETCHES_DIR/$dir --owner=0:0 --group=0:0 -zcf $artifact --no-recursion --null -T - + ;; + *.zip) + $GECKO_PATH/mach python $GECKO_PATH/python/mozbuild/mozbuild/action/zip.py -C $MOZ_FETCHES_DIR/$dir $PWD/$artifact '*' + ;; + esac + mv $artifact $UPLOAD_DIR/ +done diff --git a/taskcluster/scripts/misc/verify-updatebot.py b/taskcluster/scripts/misc/verify-updatebot.py new file mode 100755 index 0000000000..f55b29150a --- /dev/null +++ b/taskcluster/scripts/misc/verify-updatebot.py @@ -0,0 +1,266 @@ +#!/usr/bin/env python3 +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, # You can obtain one at http://mozilla.org/MPL/2.0/. + +""" +The purpose of this job is to run on autoland and ensure that any commits +made by the Updatebot bot account are reproducible. Patches that aren't +reproducible indicate some sort of error in this script, or represent +concerns about the integrity of the patch made by Updatebot. + +More simply: If this job fails, any patches by Updatebot SHOULD NOT land + because they may represent a security indicent. +""" + +from __future__ import absolute_import, print_function + +import re +import os +import sys +import requests +import subprocess + +RE_BUG = re.compile("Bug (\d+)") +RE_COMMITMSG = re.compile("Update (.+) to new version (.+) from") + + +class Revision: + def __init__(self, line): + self.node = None + self.author = None + self.desc = None + self.bug = None + + line = line.strip() + if not line: + return + + components = line.split(" | ") + self.node, self.author, self.desc = components[0:3] + try: + self.bug = RE_BUG.search(self.desc).groups(0)[0] + except Exception: + pass + + def __str__(self): + bug_str = " (No Bug)" if not self.bug else " (Bug %s)" % self.bug + return self.node + " by " + self.author + bug_str + + +# ================================================================================================ +# Find all commits we are hopefully landing in this push + +assert os.environ.get("GECKO_HEAD_REV"), "No revision head in the environment" +assert os.environ.get("GECKO_HEAD_REPOSITORY"), "No repository in the environment" +url = "%s/json-pushes?changeset=%s&version=2" % ( + os.environ.get("GECKO_HEAD_REPOSITORY"), + os.environ.get("GECKO_HEAD_REV"), +) +response = requests.get(url) +revisions_json = response.json() + +assert len(revisions_json["pushes"]) >= 1, "Did not see a push in the autoland API" +pushid = list(revisions_json["pushes"].keys())[0] +rev_ids = revisions_json["pushes"][pushid]["changesets"] + +revisions = [] +for rev_id in rev_ids: + rev_detail = subprocess.check_output( + [ + "hg", + "log", + "--template", + "{node} | {author} | {desc|firstline}\n", + "-r", + rev_id, + ] + ) + revisions.append(rev_detail.decode("utf-8")) + +if not revisions: + msg = """ +Don't see any non-public revisions. This indicates that the mercurial +repositories may not be operating in an expected way, and a script +that performs security checks may fail to perform them properly. + +Sheriffs: This _does not_ mean the changesets involved need to be backed +out. You can continue with your usual operation. However; if this occurs +during a mercurial upgrade, or a refactring of how we treat try/autoland +or the landing process, it means that we need to revisit the operation +of this script. + +For now, we ask that you file a bug blocking 1618282 indicating the task +failed so we can investigate the circumstances that caused it to fail. + """ + print(msg) + sys.exit(-1) + +# ================================================================================================ +# Find all the Updatebot Revisions (there might be multiple updatebot +# landings in a single push some day!) +i = 1 +all_revisions = [] +updatebot_revisions = [] +print("There are %i revisions to be evaluated." % len(revisions)) +for r in revisions: + revision = Revision(r) + if not revision.node: + continue + + all_revisions.append(revision) + print(" ", i, revision) + i += 1 + + if revision.author == "Updatebot <updatebot@mozilla.com>": + updatebot_revisions.append(revision) + if not revision.bug: + raise Exception( + "Could not find a bug for revision %s (Description: %s)" + % (revision.node, revision.desc) + ) + +# ================================================================================================ +# Process each Updatebot revision +overall_failure = False +for u in updatebot_revisions: + try: + print("=" * 80) + print("Processing the Updatebot revision %s for Bug %s" % (u.node, u.bug)) + + try: + target_revision = RE_COMMITMSG.search(u.desc).groups(0)[1] + except Exception: + print("Could not parse the bug description for the revision: %s" % u.desc) + overall_failure = True + continue + + # Get the moz.yaml file for the updatebot revision + files_changed = subprocess.check_output(["hg", "status", "--change", u.node]) + files_changed = files_changed.decode("utf-8").split("\n") + + moz_yaml_file = None + for f in files_changed: + if "moz.yaml" in f: + if moz_yaml_file: + msg = ( + "Already had a moz.yaml file (%s) and then we found another? (%s)" + % (moz_yaml_file, f) + ) + raise Exception(msg) + moz_yaml_file = f[2:] + + # Find all the commits associated with this bug. + # They should be ordered with the first commit as the first element and so on. + all_commits_for_this_update = [r for r in all_revisions if r.bug == u.bug] + + print( + " Found %i commits associated with this bug." + % len(all_commits_for_this_update) + ) + + # Grab the updatebot commit and transform it into patch form + commitdiff = ( + subprocess.check_output(["hg", "export", u.node]) + .decode("utf-8") + .split("\n") + ) + start_index = 0 + for i in range(len(commitdiff)): + if "diff --git" in commitdiff[i]: + start_index = i + break + patch_diff = commitdiff[start_index:] + + # Okay, now go through in reverse order and backout all of the commits for this bug + all_commits_reversed = all_commits_for_this_update + all_commits_reversed.reverse() + for c in all_commits_reversed: + print(" Backing out", c.node) + # hg doesn't support the ability to commit a backout without prompting the + # user, but it does support not committing + subprocess.check_output(["hg", "backout", c.node, "--no-commit"]) + subprocess.check_output( + [ + "hg", + "--config", + "ui.username=Updatebot Verifier <updatebot@mozilla.com>", + "commit", + "-m", + "Backed out changeset %s" % c.node, + ] + ) + + # And now re-do the updatebot commit + print(" Vendoring", moz_yaml_file) + ret = subprocess.call( + ["./mach", "vendor", "--revision", target_revision, moz_yaml_file] + ) + if ret: + print(" Vendoring returned code %i, but we're going to continue..." % ret) + + # And now get the diff + recreated_diff = ( + subprocess.check_output(["hg", "diff"]).decode("utf-8").split("\n") + ) + + # Now compare it, print if needed, and return. + this_failure = False + if len(recreated_diff) != len(patch_diff): + print( + " The recreated diff is %i lines long and the original diff is %i lines long." + % (len(recreated_diff), len(patch_diff)) + ) + this_failure = True + + for i in range(min(len(recreated_diff), len(patch_diff))): + if recreated_diff[i] != patch_diff[i]: + if not this_failure: + print( + " Identified a difference between patches, starting on line %i." + % i + ) + this_failure = True + + # Cleanup so we can go to the next one + subprocess.check_output(["hg", "revert", "."]) + subprocess.check_output( + [ + "hg", + "--config", + "extensions.strip=", + "strip", + "tip~" + str(len(all_commits_for_this_update) - 1), + ] + ) + + # Now process the outcome + if not this_failure: + print(" This revision was recreated successfully.") + continue + + print("Original Diff:") + print("-" * 80) + for l in patch_diff: + print(l) + print("-" * 80) + print("Recreated Diff:") + print("-" * 80) + for l in recreated_diff: + print(l) + print("-" * 80) + overall_failure = True + except subprocess.CalledProcessError as e: + print("Caught an exception when running:", e.cmd) + print("Return Code:", e.returncode) + print("-------") + print("stdout:") + print(e.stdout) + print("-------") + print("stderr:") + print(e.stderr) + print("----------------------------------------------") + overall_failure = True + +if overall_failure: + sys.exit(1) diff --git a/taskcluster/scripts/misc/vs-cleanup.sh b/taskcluster/scripts/misc/vs-cleanup.sh new file mode 100644 index 0000000000..e60287b2fc --- /dev/null +++ b/taskcluster/scripts/misc/vs-cleanup.sh @@ -0,0 +1,13 @@ +case "$(uname -s)" in +MINGW*) + # For some reason, by the time the task finishes, and when run-task + # starts its cleanup, there is still a vctip.exe (MSVC telemetry-related + # process) running and using a dll that run-task can't then delete. + # "For some reason", because the same doesn't happen with other tasks. + # In fact, this used to happen with older versions of MSVC for other + # tasks, and stopped when upgrading to 15.8.4... + taskkill -f -im vctip.exe || true + # Same with the mspdbsrv process. + taskkill -f -im mspdbsrv.exe || true + ;; +esac diff --git a/taskcluster/scripts/misc/vs-setup.sh b/taskcluster/scripts/misc/vs-setup.sh new file mode 100644 index 0000000000..9da6ae9681 --- /dev/null +++ b/taskcluster/scripts/misc/vs-setup.sh @@ -0,0 +1,8 @@ +VSDIR=vs2017_15.8.4 +VSPATH="${MOZ_FETCHES_DIR}/${VSDIR}" +UNIX_VSPATH="$(cd ${MOZ_FETCHES_DIR} && pwd)/${VSDIR}" +SDK_VERSION=10.0.17134.0 + +export INCLUDE="${VSPATH}/VC/include;${VSPATH}/VC/atlmfc/include;${VSPATH}/SDK/Include/${SDK_VERSION}/ucrt;${VSPATH}/SDK/Include/${SDK_VERSION}/shared;${VSPATH}/SDK/Include/${SDK_VERSION}/um;${VSPATH}/SDK/Include/${SDK_VERSION}/winrt;${VSPATH}/DIA SDK/include" +export LIB="${VSPATH}/VC/lib/x64;${VSPATH}/VC/atlmfc/lib/x64;${VSPATH}/SDK/Lib/${SDK_VERSION}/um/x64;${VSPATH}/SDK/Lib/${SDK_VERSION}/ucrt/x64;${VSPATH}/DIA SDK/lib/amd64" +export PATH="${UNIX_VSPATH}/VC/bin/Hostx64/x64:${UNIX_VSPATH}/VC/bin/Hostx86/x86:${UNIX_VSPATH}/SDK/bin/${SDK_VERSION}/x64:${UNIX_VSPATH}/redist/x64/Microsoft.VC141.CRT:${UNIX_VSPATH}/SDK/Redist/ucrt/DLLs/x64:${UNIX_VSPATH}/DIA SDK/bin/amd64:$PATH" diff --git a/taskcluster/scripts/misc/vs-setup32.sh b/taskcluster/scripts/misc/vs-setup32.sh new file mode 100644 index 0000000000..e39bae36d9 --- /dev/null +++ b/taskcluster/scripts/misc/vs-setup32.sh @@ -0,0 +1,8 @@ +VSDIR=vs2017_15.8.4 +VSPATH="${MOZ_FETCHES_DIR}/${VSDIR}" +UNIX_VSPATH="$(cd ${MOZ_FETCHES_DIR} && pwd)/${VSDIR}" +SDK_VERSION=10.0.17134.0 + +export INCLUDE="${VSPATH}/VC/include;${VSPATH}/VC/atlmfc/include;${VSPATH}/SDK/Include/${SDK_VERSION}/ucrt;${VSPATH}/SDK/Include/${SDK_VERSION}/shared;${VSPATH}/SDK/Include/${SDK_VERSION}/um;${VSPATH}/SDK/Include/${SDK_VERSION}/winrt;${VSPATH}/DIA SDK/include" +export LIB="${VSPATH}/VC/lib/x86;${VSPATH}/VC/atlmfc/lib/x86;${VSPATH}/SDK/Lib/${SDK_VERSION}/um/x86;${VSPATH}/SDK/Lib/${SDK_VERSION}/ucrt/x86;${VSPATH}/DIA SDK/lib" +export PATH="${UNIX_VSPATH}/VC/bin/Hostx64/x86:${UNIX_VSPATH}/VC/bin/Hostx64/x64:${UNIX_VSPATH}/VC/bin/Hostx86/x86:${UNIX_VSPATH}/SDK/bin/${SDK_VERSION}/x86:${UNIX_VSPATH}/VC/redist/x86/Microsoft.VC141.CRT:${UNIX_VSPATH}/SDK/Redist/ucrt/DLLs/x86:${UNIX_VSPATH}/DIA SDK/bin:$PATH" diff --git a/taskcluster/scripts/misc/wgpu-deps-vendoring.sh b/taskcluster/scripts/misc/wgpu-deps-vendoring.sh new file mode 100755 index 0000000000..1b814b7e95 --- /dev/null +++ b/taskcluster/scripts/misc/wgpu-deps-vendoring.sh @@ -0,0 +1,26 @@ +#!/bin/bash +set -x -e -v + +# This scripts uses `cargo-vendor` to download all the dependencies needed +# to test `wgpu`, and exports those dependencies as a tarball. +# This avoids having to download these dependencies on every test job +# that tests `wgpu`. + +UPLOAD_DIR=$HOME/artifacts + +cd $GECKO_PATH +export PATH=$PATH:$MOZ_FETCHES_DIR/rustc/bin:$HOME/.cargo/bin +cd gfx/wgpu/ +mkdir .cargo +cargo vendor --sync ./Cargo.toml > .cargo/config +mkdir wgpu-deps +mv vendor .cargo wgpu-deps/ +mkdir wgpu-deps/cargo-apk +# Until there's a version of cargo-apk published on crates.io that has +# https://github.com/rust-windowing/android-rs-glue/pull/223, we need to use +# an unpublished version. +cargo install --path $MOZ_FETCHES_DIR/android-rs-glue/cargo-apk --root wgpu-deps/cargo-apk cargo-apk +tar caf wgpu-deps.tar.bz2 wgpu-deps + +mkdir -p $UPLOAD_DIR +mv wgpu-deps.tar.bz2 $UPLOAD_DIR/ diff --git a/taskcluster/scripts/misc/wr-cargotest-macos-build.sh b/taskcluster/scripts/misc/wr-cargotest-macos-build.sh new file mode 100755 index 0000000000..23b4ccedec --- /dev/null +++ b/taskcluster/scripts/misc/wr-cargotest-macos-build.sh @@ -0,0 +1,24 @@ +#!/bin/bash +set -x -e -v + +source ${GECKO_PATH}/taskcluster/scripts/misc/wr-macos-cross-build-setup.sh + +export UPLOAD_DIR="${HOME}/artifacts" +mkdir -p "${UPLOAD_DIR}" + +# Do a cross-build for cargo test run +pushd "${GECKO_PATH}/gfx/wr" +CARGOFLAGS="-vv --frozen --target=${TARGET_TRIPLE}" \ + CARGOTESTFLAGS="--no-run" \ + ci-scripts/macos-debug-tests.sh +# Package up the test binaries +cd "target/${TARGET_TRIPLE}" +mkdir cargo-test-binaries +mv debug cargo-test-binaries/ +find cargo-test-binaries/debug/deps -type f -maxdepth 1 -executable -print0 > binaries.lst +tar cjf cargo-test-binaries.tar.bz2 --null -T binaries.lst +mv cargo-test-binaries.tar.bz2 "${UPLOAD_DIR}" +# Clean the build +cd "${GECKO_PATH}/gfx/wr" +rm -rf target +popd diff --git a/taskcluster/scripts/misc/wr-macos-cross-build-setup.sh b/taskcluster/scripts/misc/wr-macos-cross-build-setup.sh new file mode 100755 index 0000000000..ab38fb0199 --- /dev/null +++ b/taskcluster/scripts/misc/wr-macos-cross-build-setup.sh @@ -0,0 +1,61 @@ +#!/bin/bash +set -x -e -v + +export TARGET_TRIPLE="x86_64-apple-darwin" + +source "${GECKO_PATH}/taskcluster/scripts/misc/tooltool-download.sh" + +MACOS_SYSROOT="${MOZ_FETCHES_DIR}/MacOSX10.12.sdk" +CLANGDIR="${MOZ_FETCHES_DIR}/clang" + +# Deploy the wrench dependencies +mv ${MOZ_FETCHES_DIR}/wrench-deps/{vendor,.cargo} "${GECKO_PATH}/gfx/wr/" + +# Building wrench with the `headless` feature also builds the osmesa-src crate, +# which includes building C++ code. We have to do a bunch of shenanigans +# to make this cross-compile properly. + +pushd "${MOZ_FETCHES_DIR}/cctools/bin" + +# Add a pkg-config cross-compile wrapper. Without this, the configure script +# will use pkg-config from the host, which will find host libraries that are +# not what we want. This script stolen from +# https://autotools.io/pkgconfig/cross-compiling.html +cat > ${TARGET_TRIPLE}-pkg-config <<END_PKGCONFIG_WRAPPER +#!/bin/sh +export PKG_CONFIG_DIR= +export PKG_CONFIG_LIBDIR=${MACOS_SYSROOT}/usr/lib/pkgconfig:${MACOS_SYSROOT}/usr/share/pkgconfig +export PKG_CONFIG_SYSROOT_DIR=${MACOS_SYSROOT} +exec pkg-config "$@" +END_PKGCONFIG_WRAPPER +chmod +x "${TARGET_TRIPLE}-pkg-config" +popd + +export PATH="${MOZ_FETCHES_DIR}/rustc/bin:${MOZ_FETCHES_DIR}/cctools/bin:${MOZ_FETCHES_DIR}/clang/bin:${MOZ_FETCHES_DIR}/llvm-dsymutil/bin:${MOZ_FETCHES_DIR}/wrench-deps/meson:${PATH}" + +# The x86_64-darwin11-ld linker from cctools requires libraries provided +# by clang, so we need to set LD_LIBRARY_PATH for that to work. +export LD_LIBRARY_PATH="${CLANGDIR}/lib:${LD_LIBRARY_PATH}" + +# Tell the configure script where to find zlib, because otherwise it tries +# to use pkg-config to find it, which fails (no .pc file in the macos SDK). +export ZLIB_CFLAGS="-I${MACOS_SYSROOT}/usr/include" +export ZLIB_LIBS="-L${MACOS_SYSROOT}/usr/lib -lz" + +# Set up compiler and flags for cross-compile. Careful to only export the +# target-specific CFLAGS/CXXFLAGS variables, to not break any host builds. +LDPATH="${MOZ_FETCHES_DIR}/cctools/bin/${TARGET_TRIPLE}-ld" +export CC="${CLANGDIR}/bin/clang" +TARGET_CFLAGS="-fuse-ld=${LDPATH} -target ${TARGET_TRIPLE} -mmacosx-version-min=10.7 --rtlib=compiler-rt --sysroot ${MACOS_SYSROOT}" +export CFLAGS_${TARGET_TRIPLE//-/_}="${TARGET_CFLAGS}" +export CXX="${CLANGDIR}/bin/clang++" +TARGET_CXXFLAGS="-fuse-ld=${LDPATH} -target ${TARGET_TRIPLE} -mmacosx-version-min=10.7 --rtlib=compiler-rt --sysroot ${MACOS_SYSROOT} -stdlib=libc++" +export CXXFLAGS_${TARGET_TRIPLE//-/_}="${TARGET_CXXFLAGS}" +export AR="${CLANGDIR}/bin/llvm-ar" + +# See documentation in cargo-linker for why we need this. TL;DR is that passing +# the right arguments to the linker when invoked by cargo is nigh impossible +# without this. +export MOZ_CARGO_WRAP_LD="${CC}" +export MOZ_CARGO_WRAP_LDFLAGS="${TARGET_CFLAGS}" +export CARGO_TARGET_X86_64_APPLE_DARWIN_LINKER="${GECKO_PATH}/build/cargo-linker" diff --git a/taskcluster/scripts/misc/wrench-android-build.sh b/taskcluster/scripts/misc/wrench-android-build.sh new file mode 100755 index 0000000000..87dc55eadb --- /dev/null +++ b/taskcluster/scripts/misc/wrench-android-build.sh @@ -0,0 +1,29 @@ +#!/bin/bash +set -x -e -v + +MODE=${1?"First argument must be debug|release"} + +pushd "${MOZ_FETCHES_DIR}" +mv wrench-deps/{vendor,.cargo,cargo-apk} ${GECKO_PATH}/gfx/wr +popd + +pushd "${GECKO_PATH}/gfx/wr/wrench" +# These things come from the toolchain dependencies of the job that invokes +# this script (webrender-wrench-android-build). +export PATH="${PATH}:${MOZ_FETCHES_DIR}/rustc/bin" +export ANDROID_HOME="${MOZ_FETCHES_DIR}/android-sdk-linux" +export NDK_HOME="${MOZ_FETCHES_DIR}/android-ndk" + +# `cargo apk build` fails whilst attempting to sign the output apk, +# unless the `.android` directory exists. +# See https://github.com/rust-windowing/android-rs-glue/issues/252 +mkdir /builds/worker/.android +if [ "$MODE" == "debug" ]; then + ../cargo-apk/bin/cargo-apk build --frozen --verbose +elif [ "$MODE" == "release" ]; then + ../cargo-apk/bin/cargo-apk build --frozen --verbose --release +else + echo "Unknown mode '${MODE}'; must be 'debug' or 'release'" + exit 1 +fi +popd diff --git a/taskcluster/scripts/misc/wrench-deps-vendoring.sh b/taskcluster/scripts/misc/wrench-deps-vendoring.sh new file mode 100755 index 0000000000..53769b8cff --- /dev/null +++ b/taskcluster/scripts/misc/wrench-deps-vendoring.sh @@ -0,0 +1,28 @@ +#!/bin/bash +set -x -e -v + +# This scripts uses `cargo-vendor` to download all the dependencies needed +# to build `wrench` (a tool used for standalone testing of webrender), and +# exports those dependencies as a tarball. This avoids having to download +# these dependencies on every test job that uses `wrench`. + +UPLOAD_DIR=$HOME/artifacts + +cd $GECKO_PATH +export PATH=$PATH:$MOZ_FETCHES_DIR/rustc/bin:$HOME/.cargo/bin +cd gfx/wr/ +mkdir .cargo +cargo vendor --sync ./Cargo.toml > .cargo/config +mkdir wrench-deps +mv vendor .cargo wrench-deps/ +mkdir wrench-deps/cargo-apk +# Until there's a version of cargo-apk published on crates.io that has +# https://github.com/rust-windowing/android-rs-glue/pull/223, we need to use +# an unpublished version. +cargo install --path $MOZ_FETCHES_DIR/android-rs-glue/cargo-apk --root wrench-deps/cargo-apk cargo-apk + +ci-scripts/install-meson.sh +mv meson wrench-deps/meson + +mkdir -p $UPLOAD_DIR +tar caf $UPLOAD_DIR/wrench-deps.tar.bz2 wrench-deps diff --git a/taskcluster/scripts/misc/wrench-macos-build.sh b/taskcluster/scripts/misc/wrench-macos-build.sh new file mode 100755 index 0000000000..43842d4510 --- /dev/null +++ b/taskcluster/scripts/misc/wrench-macos-build.sh @@ -0,0 +1,58 @@ +#!/bin/bash +set -x -e -v + +source ${GECKO_PATH}/taskcluster/scripts/misc/wr-macos-cross-build-setup.sh + +# The osmesa-src build which we do as part of the headless build below +# doesn't seem to always use CFLAGS/CXXFLAGS where expected. Instead we +# just squash those flags into CC/CXX and everything works out. +# Export HOST_CC and HOST_CXX without the squashed flags, so that host +# builds use them and don't see the target flags. +export HOST_CC="${CC}" +export HOST_CXX="${CXX}" +CFLAGS_VAR="CFLAGS_${TARGET_TRIPLE//-/_}" +CXXFLAGS_VAR="CXXFLAGS_${TARGET_TRIPLE//-/_}" +export CC="${CC} ${!CFLAGS_VAR}" +export ${CFLAGS_VAR}= +export CXX="${CXX} ${!CXXFLAGS_VAR}" +export ${CXXFLAGS_VAR}= + +export MESON_CROSSFILE=${GECKO_PATH}/gfx/wr/ci-scripts/etc/wr-darwin.meson +export UPLOAD_DIR="${HOME}/artifacts" +mkdir -p "${UPLOAD_DIR}" + +# Do a cross-build without the `headless` feature +pushd "${GECKO_PATH}/gfx/wr/wrench" +cargo build --release -vv --frozen --target=${TARGET_TRIPLE} +# Package up the resulting wrench binary +cd "../target/${TARGET_TRIPLE}" +mkdir -p wrench-macos/bin +mv release/wrench wrench-macos/bin/ +tar cjf wrench-macos.tar.bz2 wrench-macos +mv wrench-macos.tar.bz2 "${UPLOAD_DIR}" +# Clean the build +cd "${GECKO_PATH}/gfx/wr" +rm -rf target +popd + +# Do a cross-build with the `headless` feature +pushd "${GECKO_PATH}/gfx/wr/wrench" +cargo build --release -vv --frozen --target=${TARGET_TRIPLE} --features headless +# Package up the wrench binary and some libraries that we will need +cd "../target/${TARGET_TRIPLE}" + +# Copy the native macOS libLLVM as dynamic dependency +cp "${MOZ_FETCHES_DIR}/clang-mac/clang/lib/libLLVM.dylib" release/build/osmesa-src*/out/mesa/src/gallium/targets/osmesa/ + +mkdir wrench-macos-headless +mv release wrench-macos-headless/ +tar cjf wrench-macos-headless.tar.bz2 \ + wrench-macos-headless/release/wrench \ + wrench-macos-headless/release/build/osmesa-src*/out/mesa/src/gallium/targets/osmesa \ + wrench-macos-headless/release/build/osmesa-src*/out/mesa/src/mapi/shared-glapi +mv wrench-macos-headless.tar.bz2 "${UPLOAD_DIR}" + +# Clean the build +cd "${GECKO_PATH}/gfx/wr" +rm -rf target +popd diff --git a/taskcluster/scripts/misc/wrench-windows-tests.sh b/taskcluster/scripts/misc/wrench-windows-tests.sh new file mode 100644 index 0000000000..e3d0a84eae --- /dev/null +++ b/taskcluster/scripts/misc/wrench-windows-tests.sh @@ -0,0 +1,30 @@ +#!/bin/bash +set -x -e -v + +# This script runs the windows CI scripts for standalone WebRender. The CI +# scripts build WebRender in various "standalone" (without Gecko) +# configurations and also run WebRender's reftest suite using the `wrench` +# tool in the WebRender repository. +# The builds involved require a number of dependencies to be available, +# which is all handled below. + +cd $GECKO_PATH + +# This will download the rustc, MSVC, and wrench-deps artifacts. +. taskcluster/scripts/misc/tooltool-download.sh +export PATH=$PATH:$(cd $MOZ_FETCHES_DIR && pwd)/rustc/bin + +. taskcluster/scripts/misc/vs-setup.sh + +# Move the wrench-deps vendored crates into place +mv ${MOZ_FETCHES_DIR}/wrench-deps/{vendor,.cargo} gfx/wr +cd gfx/wr + +# This is needed for the WebRender standalone reftests +powershell.exe 'iex (Get-Content -Raw ci-scripts\set-screenresolution.ps1); Set-ScreenResolution 1920 1080' + +# Run the CI scripts +export CARGOFLAGS='--verbose --frozen' +cmd.exe /c 'ci-scripts\windows-tests.cmd' + +. $GECKO_PATH/taskcluster/scripts/misc/vs-cleanup.sh diff --git a/taskcluster/scripts/misc/zstdpy b/taskcluster/scripts/misc/zstdpy new file mode 100755 index 0000000000..7fc27fded6 --- /dev/null +++ b/taskcluster/scripts/misc/zstdpy @@ -0,0 +1,79 @@ +#!/usr/bin/env python3 +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +"""This script compresses and decompresses data using the zstandard compression +format, as provided by the python-zstandard module. + +Data is provided on stdin and output on stdout.""" + +import sys +import zstandard +from argparse import ArgumentParser + + +def main(argv=None): + parser = ArgumentParser(description=__doc__) + parser.set_defaults(mode="compress") + parser.add_argument( + "-z", + "--compress", + dest="mode", + action="store_const", + const="compress", + help="compress the data (this is the default)", + ) + parser.add_argument( + "-d", + "--decompress", + dest="mode", + action="store_const", + const="decompress", + help="decompress the data", + ) + parser.add_argument( + "-T", + "--threads", + dest="threads", + default=1, + type=int, + help="Compress using # working threads. If 0, use number of CPUs on the system. (default 1)", + ) + parser.add_argument( + "-l", + "--level", + dest="level", + default=3, + type=int, + help="Compression level from 1-22 (default 3)", + ) + parser.add_argument( + "file", + nargs="?", + help="File to compress/decompress. Default is stdin.", + ) + + args = parser.parse_args(argv) + + # The zstd commandline tool uses 0 to specify number of threads equal to + # the number of CPUs whereas the python module uses negative numbers to + # flag this behavior. Emulate the zstd commandline utility's behavior here + if args.threads == 0: + args.threads = -1 + + if args.file: + in_file = open(args.file, "rb") + else: + in_file = sys.stdin.buffer + + if args.mode == "compress": + ctx = zstandard.ZstdCompressor(level=args.level, threads=args.threads) + elif args.mode == "decompress": + ctx = zstandard.ZstdDecompressor() + + ctx.copy_stream(in_file, sys.stdout.buffer) + + +if __name__ == "__main__": + main() diff --git a/taskcluster/scripts/run-task b/taskcluster/scripts/run-task new file mode 100755 index 0000000000..ead4e6bb0d --- /dev/null +++ b/taskcluster/scripts/run-task @@ -0,0 +1,966 @@ +#!/usr/bin/python3 -u +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +"""Run a task after performing common actions. + +This script is meant to be the "driver" for TaskCluster based tasks. +It receives some common arguments to control the run-time environment. + +It performs actions as requested from the arguments. Then it executes +the requested process and prints its output, prefixing it with the +current time to improve log usefulness. +""" + +import sys + + +if sys.version_info[0:2] < (3, 5): + print('run-task requires Python 3.5+') + sys.exit(1) + + +import argparse +import datetime +import errno +import io +import json +import os +import platform +import random +import re +import shutil +import signal +import socket +import stat +import subprocess + +import urllib.error +import urllib.request + +from threading import Thread + +FINGERPRINT_URL = 'http://taskcluster/secrets/v1/secret/project/taskcluster/gecko/hgfingerprint' +FALLBACK_FINGERPRINT = { + 'fingerprints': + "sha256:FF:E7:8D:93:E9:56:3C:C0:19:FC:00:4C:18:B9:86:E5:08:E5:10:F5:E2" + ":EA:48:E8:22:D3:A3:3A:CA:99:C3:4C"} + +HGMOINTERNAL_CONFIG_URL = 'http://taskcluster/secrets/v1/secret/project/taskcluster/gecko/hgmointernal' + +CACHE_UID_GID_MISMATCH = ''' +There is a UID/GID mismatch on the cache. This likely means: + +a) different tasks are running as a different user/group +b) different Docker images have different UID/GID for the same user/group + +Our cache policy is that the UID/GID for ALL tasks must be consistent +for the lifetime of the cache. This eliminates permissions problems due +to file/directory user/group ownership. + +To make this error go away, ensure that all Docker images are use +a consistent UID/GID and that all tasks using this cache are running as +the same user/group. +''' + + +NON_EMPTY_VOLUME = ''' +error: volume %s is not empty + +Our Docker image policy requires volumes to be empty. + +The volume was likely populated as part of building the Docker image. +Change the Dockerfile and anything run from it to not create files in +any VOLUME. + +A lesser possibility is that you stumbled upon a TaskCluster platform bug +where it fails to use new volumes for tasks. +''' + + +FETCH_CONTENT_NOT_FOUND = ''' +error: fetch-content script not found + +The script at `taskcluster/scripts/misc/fetch-content` could not be +detected in the current environment. + +If this task clones gecko, make sure the GECKO_PATH environment variable +is set to proper location. Otherwise, the script may need to be mounted +or added to the task's docker image then added to the PATH. +''' + +# The exit code to use when caches should be purged and the task retried. +# This is EX_OSFILE (from sysexits.h): +# Some system file does not exist, cannot be opened, or has some +# sort of error (e.g., syntax error). +EXIT_PURGE_CACHE = 72 + + +IS_MACOSX = sys.platform == 'darwin' +IS_POSIX = os.name == 'posix' +IS_WINDOWS = os.name == 'nt' + + +def print_line(prefix, m): + now = datetime.datetime.utcnow().isoformat().encode('utf-8') + # slice microseconds to 3 decimals. + now = now[:-3] if now[-7:-6] == b'.' else now + bytes = b'[%s %sZ] %s' % (prefix, now, m) + written = 0 + while written < len(bytes): + written += (sys.stdout.buffer.write(bytes[written:]) or 0) + sys.stdout.buffer.flush() + + +def run_and_prefix_output(prefix, args, *, extra_env=None, cwd=None): + """Runs a process and prefixes its output with the time. + + Returns the process exit code. + """ + print_line( + prefix, + b"executing %r%s\n" % (args, b"in %s" % (cwd.encode("utf-8"),) if cwd else b""), + ) + + env = dict(os.environ) + env.update(extra_env or {}) + + # Note: TaskCluster's stdin is a TTY. This attribute is lost + # when we pass sys.stdin to the invoked process. If we cared + # to preserve stdin as a TTY, we could make this work. But until + # someone needs it, don't bother. + + # We want stdout to be bytes on Python 3. That means we can't use + # universal_newlines=True (because it implies text mode). But + # p.stdout.readline() won't work for bytes text streams. So, on Python 3, + # we manually install a latin1 stream wrapper. This allows us to readline() + # and preserves bytes, without losing any data. + + p = subprocess.Popen(args, + # Disable buffering because we want to receive output + # as it is generated so timestamps in logs are + # accurate. + bufsize=0, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + stdin=sys.stdin.fileno(), + env=env, + cwd=cwd) + + stdout = io.TextIOWrapper(p.stdout, encoding='latin1') + + while True: + data = stdout.readline().encode('latin1') + + if data == b'': + break + + print_line(prefix, data) + + return p.wait() + + +def get_posix_user_group(user, group): + import grp + import pwd + + try: + user_record = pwd.getpwnam(user) + except KeyError: + print('could not find user %s; specify a valid user with --user' % user) + sys.exit(1) + + try: + group_record = grp.getgrnam(group) + except KeyError: + print('could not find group %s; specify a valid group with --group' % + group) + sys.exit(1) + + # Most tasks use worker:worker. We require they have a specific numeric ID + # because otherwise it is too easy for files written to caches to have + # mismatched numeric IDs, which results in permissions errors. + if user_record.pw_name == 'worker' and user_record.pw_uid != 1000: + print('user `worker` must have uid=1000; got %d' % user_record.pw_uid) + sys.exit(1) + + if group_record.gr_name == 'worker' and group_record.gr_gid != 1000: + print('group `worker` must have gid=1000; got %d' % group_record.gr_gid) + sys.exit(1) + + # Find all groups to which this user is a member. + gids = [g.gr_gid for g in grp.getgrall() if group in g.gr_mem] + + return user_record, group_record, gids + + +def write_audit_entry(path, msg): + now = datetime.datetime.utcnow().isoformat().encode('utf-8') + with open(path, 'ab') as fh: + fh.write(b'[%sZ %s] %s\n' % ( + now, os.environb.get(b'TASK_ID', b'UNKNOWN'), msg)) + + +WANTED_DIR_MODE = stat.S_IXUSR | stat.S_IRUSR | stat.S_IWUSR + + +def set_dir_permissions(path, uid, gid): + st = os.lstat(path) + + if st.st_uid != uid or st.st_gid != gid: + os.chown(path, uid, gid) + + # Also make sure dirs are writable in case we need to delete + # them. + if st.st_mode & WANTED_DIR_MODE != WANTED_DIR_MODE: + os.chmod(path, st.st_mode | WANTED_DIR_MODE) + + +def chown_recursive(path, user, group, uid, gid): + print_line(b'chown', + b'recursively changing ownership of %s to %s:%s\n' % + (path.encode('utf-8'), user.encode('utf-8'), group.encode( + 'utf-8'))) + + set_dir_permissions(path, uid, gid) + + for root, dirs, files in os.walk(path): + for d in dirs: + set_dir_permissions(os.path.join(root, d), uid, gid) + + for f in files: + # File may be a symlink that points to nowhere. In which case + # os.chown() would fail because it attempts to follow the + # symlink. We only care about directory entries, not what + # they point to. So setting the owner of the symlink should + # be sufficient. + os.lchown(os.path.join(root, f), uid, gid) + + +def configure_cache_posix(cache, user, group, + untrusted_caches, running_as_root): + """Configure a cache path on POSIX platforms. + + For each cache, we write out a special file denoting attributes and + capabilities of run-task and the task being executed. These attributes + are used by subsequent run-task invocations to validate that use of + the cache is acceptable. + + We /could/ blow away the cache data on requirements mismatch. + While this would be convenient, this could result in "competing" tasks + effectively undoing the other's work. This would slow down task + execution in aggregate. Without monitoring for this, people may not notice + the problem and tasks would be slower than they could be. We follow the + principle of "fail fast" to ensure optimal task execution. + + We also write an audit log of who used the caches. This log is printed + during failures to help aid debugging. + """ + + our_requirements = { + # Include a version string that we can bump whenever to trigger + # fresh caches. The actual value is not relevant and doesn't need + # to follow any explicit order. Since taskgraph bakes this file's + # hash into cache names, any change to this file/version is sufficient + # to force the use of a new cache. + b'version=1', + # Include the UID and GID the task will run as to ensure that tasks + # with different UID and GID don't share the same cache. + b'uid=%d' % user.pw_uid, + b'gid=%d' % group.gr_gid, + } + + requires_path = os.path.join(cache, '.cacherequires') + audit_path = os.path.join(cache, '.cachelog') + + # The cache is empty. Configure it. + if not os.listdir(cache): + print_line(b'cache', b'cache %s is empty; writing requirements: ' + b'%s\n' % ( + cache.encode('utf-8'), b' '.join(sorted(our_requirements)))) + + # We write a requirements file so future invocations know what the + # requirements are. + with open(requires_path, 'wb') as fh: + fh.write(b'\n'.join(sorted(our_requirements))) + + # And make it read-only as a precaution against deletion. + os.chmod(requires_path, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH) + + write_audit_entry(audit_path, + b'created; requirements: %s' % + b', '.join(sorted(our_requirements))) + + set_dir_permissions(cache, user.pw_uid, group.gr_gid) + return + + # The cache has content and we have a requirements file. Validate + # requirements alignment. + if os.path.exists(requires_path): + with open(requires_path, 'rb') as fh: + wanted_requirements = set(fh.read().splitlines()) + + print_line(b'cache', b'cache %s exists; requirements: %s\n' % ( + cache.encode('utf-8'), b' '.join(sorted(wanted_requirements)))) + + missing = wanted_requirements - our_requirements + + # Allow requirements mismatch for uid/gid if and only if caches + # are untrusted. This allows cache behavior on Try to be + # reasonable. Otherwise, random tasks could "poison" cache + # usability by introducing uid/gid mismatches. For untrusted + # environments like Try, this is a perfectly reasonable thing to + # allow. + if missing and untrusted_caches and running_as_root and \ + all(s.startswith((b'uid=', b'gid=')) for s in missing): + print_line(b'cache', + b'cache %s uid/gid mismatch; this is acceptable ' + b'because caches for this task are untrusted; ' + b'changing ownership to facilitate cache use\n' % + cache.encode('utf-8')) + chown_recursive(cache, user.pw_name, group.gr_name, user.pw_uid, + group.gr_gid) + + # And write out the updated reality. + with open(requires_path, 'wb') as fh: + fh.write(b'\n'.join(sorted(our_requirements))) + + write_audit_entry(audit_path, + b'chown; requirements: %s' % + b', '.join(sorted(our_requirements))) + + elif missing: + print('error: requirements for populated cache %s differ from ' + 'this task' % cache) + print('cache requirements: %s' % ' '.join(sorted( + s.decode('utf-8') for s in wanted_requirements))) + print('our requirements: %s' % ' '.join(sorted( + s.decode('utf-8') for s in our_requirements))) + if any(s.startswith((b'uid=', b'gid=')) for s in missing): + print(CACHE_UID_GID_MISMATCH) + + write_audit_entry(audit_path, + b'requirements mismatch; wanted: %s' % + b', '.join(sorted(our_requirements))) + + print('') + print('audit log:') + with open(audit_path, 'r') as fh: + print(fh.read()) + + return True + else: + write_audit_entry(audit_path, b'used') + + # We don't need to adjust permissions here because the cache is + # associated with a uid/gid and the first task should have set + # a proper owner/group. + + return + + # The cache has content and no requirements file. This shouldn't + # happen because run-task should be the first thing that touches a + # cache. + print('error: cache %s is not empty and is missing a ' + '.cacherequires file; the cache names for this task are ' + 'likely mis-configured or TASKCLUSTER_CACHES is not set ' + 'properly' % cache) + + write_audit_entry(audit_path, b'missing .cacherequires') + return True + + +def configure_volume_posix(volume, user, group, running_as_root): + # The only time we should see files in the volume is if the Docker + # image build put files there. + # + # For the sake of simplicity, our policy is that volumes should be + # empty. This also has the advantage that an empty volume looks + # a lot like an empty cache. Tasks can rely on caches being + # swapped in and out on any volume without any noticeable change + # of behavior. + volume_files = os.listdir(volume) + if volume_files: + print(NON_EMPTY_VOLUME % volume) + print('entries in root directory: %s' % + ' '.join(sorted(volume_files))) + sys.exit(1) + + # The volume is almost certainly owned by root:root. Chown it so it + # is writable. + + if running_as_root: + print_line(b'volume', b'changing ownership of volume %s ' + b'to %d:%d\n' % (volume.encode('utf-8'), + user.pw_uid, + group.gr_gid)) + set_dir_permissions(volume, user.pw_uid, group.gr_gid) + + +def vcs_checkout(source_repo, dest, store_path, + base_repo=None, revision=None, branch=None, + fetch_hgfingerprint=False, sparse_profile=None): + # Specify method to checkout a revision. This defaults to revisions as + # SHA-1 strings, but also supports symbolic revisions like `tip` via the + # branch flag. + if revision: + revision_flag = '--revision' + revision_value = revision + elif branch: + revision_flag = '--branch' + revision_value = branch + else: + print('revision is not specified for checkout') + sys.exit(1) + + if IS_MACOSX or IS_POSIX: + hg_bin = 'hg' + elif IS_WINDOWS: + # This is where OCC installs it in the AMIs. + hg_bin = r'C:\Program Files\Mercurial\hg.exe' + if not os.path.exists(hg_bin): + print('could not find Mercurial executable: %s' % hg_bin) + sys.exit(1) + + store_path = os.path.abspath(store_path) + args = [ + hg_bin, + 'robustcheckout', + '--sharebase', store_path, + '--purge', + ] + + # Obtain certificate fingerprints. Without this, the checkout will use the fingerprint + # on the system, which is managed some other way (such as puppet) + if fetch_hgfingerprint: + try: + print_line(b'vcs', b'fetching hg.mozilla.org fingerprint from %s\n' % + FINGERPRINT_URL.encode('utf-8')) + res = urllib.request.urlopen(FINGERPRINT_URL, timeout=10) + secret = res.read() + try: + secret = json.loads(secret.decode('utf-8')) + except ValueError: + print_line(b'vcs', b'invalid JSON in hg fingerprint secret') + sys.exit(1) + except (urllib.error.URLError, socket.timeout): + print_line(b'vcs', b'Unable to retrieve current hg.mozilla.org fingerprint' + b'using the secret service, using fallback instead.') + # XXX This fingerprint will not be accurate if running on an old + # revision after the server fingerprint has changed. + secret = {'secret': FALLBACK_FINGERPRINT} + + hgmo_fingerprint = secret['secret']['fingerprints'] + args.extend([ + '--config', 'hostsecurity.hg.mozilla.org:fingerprints=%s' % hgmo_fingerprint, + ]) + + if base_repo: + args.extend(['--upstream', base_repo]) + if sparse_profile: + args.extend(['--sparseprofile', sparse_profile]) + + dest = os.path.abspath(dest) + args.extend([ + revision_flag, revision_value, + source_repo, dest, + ]) + + res = run_and_prefix_output(b'vcs', args, + extra_env={'PYTHONUNBUFFERED': '1'}) + if res: + sys.exit(res) + + # Update the current revision hash and ensure that it is well formed. + revision = subprocess.check_output( + [hg_bin, 'log', + '--rev', '.', + '--template', '{node}'], + cwd=dest, + # Triggers text mode on Python 3. + universal_newlines=True) + + assert re.match('^[a-f0-9]{40}$', revision) + + msg = ("TinderboxPrint:<a href={source_repo}/rev/{revision} " + "title='Built from {repo_name} revision {revision}'>" + "{revision}</a>\n".format(revision=revision, + source_repo=source_repo, + repo_name=source_repo.split('/')[-1])) + + print_line(b'vcs', msg.encode('utf-8')) + + return revision + + +def fetch_artifacts(): + print_line(b'fetches', b'fetching artifacts\n') + + fetch_content = shutil.which('fetch-content') + if not fetch_content and os.environ.get('GECKO_PATH'): + fetch_content = os.path.join(os.environ['GECKO_PATH'], 'taskcluster', + 'scripts', 'misc', 'fetch-content') + + if not fetch_content or not os.path.isfile(fetch_content): + fetch_content = os.path.join(os.path.dirname(__file__), + 'fetch-content') + + if not os.path.isfile(fetch_content): + print(FETCH_CONTENT_NOT_FOUND) + sys.exit(1) + + cmd = [sys.executable, '-u', fetch_content, 'task-artifacts'] + res = run_and_prefix_output(b'fetches', cmd) + if res: + sys.exit(res) + + print_line(b'fetches', b'finished fetching artifacts\n') + + +def add_vcs_arguments(parser, project, name): + """Adds arguments to ArgumentParser to control VCS options for a project.""" + + parser.add_argument('--%s-checkout' % project, + help='Directory where %s checkout should be created' % + name) + parser.add_argument('--%s-sparse-profile' % project, + help='Path to sparse profile for %s checkout' % name) + + +def resolve_checkout_url(base_repo, head_repo): + """Resolve the Mercurial URL to perform a checkout against, either the + public hg.mozilla.org service or a CI-only regional mirror. + + The config will be of the form: + { + "aws/us-west-2": { # key built from `TASKCLUSTER_WORKER_LOCATION` variable + "rate": 0.5, + "domain": "us-west-2.hgmointernal.net" + }, + "google/us-central1": {...} + } + """ + worker_location = os.getenv('TASKCLUSTER_WORKER_LOCATION') + if not worker_location: + print_line(b'vcs', b'TASKCLUSTER_WORKER_LOCATION environment variable not set; ' + b'using public hg.mozilla.org service\n') + return base_repo, head_repo + + try: + worker_location = json.loads(worker_location) + except json.JSONDecodeError: + print_line(b'vcs', b'Could not decode TASKCLUSTER_WORKER_LOCATION environment variable ' + b'as JSON. Content: %s\n' % worker_location.encode('utf-8')) + print_line(b'vcs', b'using public hg.mozilla.org service\n') + return base_repo, head_repo + + if 'cloud' not in worker_location or 'region' not in worker_location: + print_line(b'vcs', b'TASKCLUSTER_WORKER_LOCATION missing required keys; ' + b'using public hg.mozilla.org service\n') + return base_repo, head_repo + + config_key = '%(cloud)s/%(region)s' % worker_location + + try: + print_line(b'vcs', b'fetching hgmointernal config from %s\n' % + HGMOINTERNAL_CONFIG_URL.encode('utf-8')) + + # Get the hgmointernal config Taskcluster secret + res = urllib.request.urlopen(HGMOINTERNAL_CONFIG_URL, timeout=10) + hgmointernal_config = json.loads(res.read().decode('utf-8'))['secret'] + + # Use public hg service if region not yet supported + if config_key not in hgmointernal_config: + print_line(b'vcs', b'region %s not yet supported; using public ' + b'hg.mozilla.org service\n' % config_key.encode('utf-8')) + + return base_repo, head_repo + + # Only send a percentage of traffic to the internal mirror + rate = float(hgmointernal_config[config_key]['rate']) + + if random.random() > rate: + print_line(b'vcs', b'hgmointernal rate miss; using ' + b'public hg.mozilla.org service\n') + return base_repo, head_repo + + print_line(b'vcs', b'hgmointernal rate hit; cloning from ' + b'private hgweb mirror\n') + + mirror_domain = hgmointernal_config[config_key]['domain'] + + if base_repo and base_repo.startswith('https://hg.mozilla.org'): + base_repo = base_repo.replace('hg.mozilla.org', mirror_domain, 1) + + if head_repo and head_repo.startswith('https://hg.mozilla.org'): + head_repo = head_repo.replace('hg.mozilla.org', mirror_domain, 1) + + return base_repo, head_repo + + except (KeyError, ValueError): + print_line(b'vcs', b'invalid JSON in hgmointernal config; ' + b'falling back to public hg.mozilla.org service\n') + + except (urllib.error.URLError, socket.timeout): + print_line(b'vcs', b'Unable to retrieve hgmointernal config using ' + b'the secret service; falling back to public hg.mozilla.org ' + b'service\n') + + return base_repo, head_repo + + +def collect_vcs_options(args, project): + checkout = getattr(args, '%s_checkout' % project) + sparse_profile = getattr(args, '%s_sparse_profile' % project) + + env_prefix = project.upper() + + base_repo = os.environ.get('%s_BASE_REPOSITORY' % env_prefix) + head_repo = os.environ.get('%s_HEAD_REPOSITORY' % env_prefix) + revision = os.environ.get('%s_HEAD_REV' % env_prefix) + branch = os.environ.get('%s_HEAD_REF' % env_prefix) + + store_path = os.environ.get('HG_STORE_PATH') + + # Expand ~ in some paths. + if checkout: + checkout = os.path.expanduser(checkout) + if store_path: + store_path = os.path.expanduser(store_path) + + # Some callers set the base repository to mozilla-central for historical + # reasons. Switch to mozilla-unified because robustcheckout works best + # with it. + if base_repo == 'https://hg.mozilla.org/mozilla-central': + base_repo = 'https://hg.mozilla.org/mozilla-unified' + + # No need to check the hgmointernal config if we aren't performing + # a checkout. + if checkout: + base_repo, head_repo = resolve_checkout_url(base_repo, head_repo) + + return { + 'store-path': store_path, + 'project': project, + 'env-prefix': env_prefix, + 'checkout': checkout, + 'sparse-profile': sparse_profile, + 'base-repo': base_repo, + 'head-repo': head_repo, + 'revision': revision, + 'branch': branch, + } + + +def vcs_checkout_from_args(args, project): + options = collect_vcs_options(args, project) + + if not options['checkout']: + if options['branch'] and not options['revision']: + print('task should be defined in terms of non-symbolic revision') + sys.exit(1) + return + + os.environ['%s_HEAD_REV' % options['env-prefix']] = vcs_checkout( + options['head-repo'], + options['checkout'], + options['store-path'], + base_repo=options['base-repo'], + revision=options['revision'], + fetch_hgfingerprint=args.fetch_hgfingerprint, + branch=options['branch'], + sparse_profile=options['sparse-profile']) + + +def maybe_run_resource_monitoring(): + """Run the resource monitor if available. + + Discussion in https://github.com/taskcluster/taskcluster-rfcs/pull/160 + and https://bugzil.la/1648051 + """ + if 'MOZ_FETCHES' not in os.environ: + return + if 'RESOURCE_MONITOR_OUTPUT' not in os.environ: + return + + prefix = b'resource_monitor' + + executable = '{}/resource-monitor/resource-monitor{}'.format( + os.environ.get('MOZ_FETCHES_DIR'), '.exe' if IS_WINDOWS else '') + + if not os.path.exists(executable) or not os.access(executable, os.X_OK): + print_line(prefix, b"%s not executable\n" % executable.encode('utf-8')) + return + args = [ + executable, + '-process', + str(os.getpid()), + '-output', + os.environ["RESOURCE_MONITOR_OUTPUT"], + ] + print_line(prefix, b"Resource monitor starting: %s\n" % str(args).encode('utf-8')) + # Avoid environment variables the payload doesn't need. + del os.environ['RESOURCE_MONITOR_OUTPUT'] + + # Without CREATE_NEW_PROCESS_GROUP Windows signals will attempt to kill run-task, too. + process = subprocess.Popen(args, + bufsize=0, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + creationflags=subprocess.CREATE_NEW_PROCESS_GROUP if IS_WINDOWS else 0, + cwd=os.getcwd()) + + def capture_output(): + fh = io.TextIOWrapper(process.stdout, encoding='latin1') + while True: + data = fh.readline().encode('latin1') + if data == b'': + break + print_line(prefix, data) + + monitor_process = Thread(target=capture_output) + monitor_process.start() + return process + + +def main(args): + print_line(b'setup', b'run-task started in %s\n' % os.getcwd().encode('utf-8')) + running_as_root = IS_POSIX and os.getuid() == 0 + + # Set a reasonable limit to the number of open files. + # Running under docker inherits the system defaults, which are not subject + # to the "standard" limits set by pam_limits.so, and while they work well + # for servers that may receive a lot of connections, they cause performance + # problems for things that close file descriptors before forking (for good + # reasons), like python's `subprocess.Popen(..., close_fds=True)` (and while + # the default was close_fds=False in python2, that changed in python3). + # In some cases, Firefox does the same thing when spawning subprocesses. + # Processes spawned by this one will inherit the limit set here. + try: + import resource + # Keep the hard limit the same, though, allowing processes to change their + # soft limit if they need to (Firefox does, for instance). + (soft, hard) = resource.getrlimit(resource.RLIMIT_NOFILE) + limit = os.environ.get('MOZ_LIMIT_NOFILE') + if limit: + limit = int(limit) + else: + # If no explicit limit is given, use 1024 if it's less than the current + # soft limit. For instance, the default on macOS is 256, so we'd pick + # that rather than 1024. + limit = min(soft, 1024) + # Now apply the limit, if it's different from the original one. + if limit != soft: + resource.setrlimit(resource.RLIMIT_NOFILE, (limit, hard)) + except ImportError: + # The resource module is UNIX only. + pass + + # Arguments up to '--' are ours. After are for the main task + # to be executed. + try: + i = args.index('--') + our_args = args[0:i] + task_args = args[i + 1:] + except ValueError: + our_args = args + task_args = [] + + parser = argparse.ArgumentParser() + parser.add_argument('--user', default='worker', help='user to run as') + parser.add_argument('--group', default='worker', help='group to run as') + parser.add_argument('--task-cwd', help='directory to run the provided command in') + + add_vcs_arguments(parser, 'gecko', 'Firefox') + add_vcs_arguments(parser, 'comm', 'Comm') + + parser.add_argument('--fetch-hgfingerprint', action='store_true', + help='Fetch the latest hgfingerprint from the secrets store, ' + 'using the taskclsuerProxy') + + args = parser.parse_args(our_args) + + uid = gid = gids = None + if IS_POSIX and running_as_root: + user, group, gids = get_posix_user_group(args.user, args.group) + uid = user.pw_uid + gid = group.gr_gid + + if running_as_root and os.path.exists("/dev/kvm"): + # Ensure kvm permissions for worker, required for Android x86 + st = os.stat("/dev/kvm") + os.chmod("/dev/kvm", st.st_mode | 0o666) + + # Validate caches. + # + # Taskgraph should pass in a list of paths that are caches via an + # environment variable (which we don't want to pass down to child + # processes). + + if 'TASKCLUSTER_CACHES' in os.environ: + caches = os.environ['TASKCLUSTER_CACHES'].split(';') + del os.environ['TASKCLUSTER_CACHES'] + else: + caches = [] + + if 'TASKCLUSTER_UNTRUSTED_CACHES' in os.environ: + untrusted_caches = True + del os.environ['TASKCLUSTER_UNTRUSTED_CACHES'] + else: + untrusted_caches = False + + for cache in caches: + if not os.path.isdir(cache): + print('error: cache %s is not a directory; this should never ' + 'happen' % cache) + return 1 + + purge = configure_cache_posix(cache, user, group, untrusted_caches, + running_as_root) + + if purge: + return EXIT_PURGE_CACHE + + if 'TASKCLUSTER_VOLUMES' in os.environ: + volumes = os.environ['TASKCLUSTER_VOLUMES'].split(';') + del os.environ['TASKCLUSTER_VOLUMES'] + else: + volumes = [] + + if volumes and not IS_POSIX: + print('assertion failed: volumes not expected on Windows') + return 1 + + # Sanitize volumes. + for volume in volumes: + # If a volume is a cache, it was dealt with above. + if volume in caches: + print_line(b'volume', b'volume %s is a cache\n' % + volume.encode('utf-8')) + continue + + configure_volume_posix(volume, user, group, running_as_root) + + all_caches_and_volumes = set(map(os.path.normpath, caches)) + all_caches_and_volumes |= set(map(os.path.normpath, volumes)) + + def path_in_cache_or_volume(path): + path = os.path.normpath(path) + + while path: + if path in all_caches_and_volumes: + return True + + path, child = os.path.split(path) + if not child: + break + + return False + + def prepare_checkout_dir(checkout): + if not checkout: + return + + # The checkout path becomes the working directory. Since there are + # special cache files in the cache's root directory and working + # directory purging could blow them away, disallow this scenario. + if os.path.exists(os.path.join(checkout, '.cacherequires')): + print('error: cannot perform vcs checkout into cache root: %s' % + checkout) + sys.exit(1) + + # TODO given the performance implications, consider making this a fatal + # error. + if not path_in_cache_or_volume(checkout): + print_line(b'vcs', b'WARNING: vcs checkout path (%s) not in cache ' + b'or volume; performance will likely suffer\n' % + checkout.encode('utf-8')) + + # Ensure the directory for the source checkout exists. + try: + os.makedirs(os.path.dirname(checkout)) + except OSError as e: + if e.errno != errno.EEXIST: + raise + + # And that it is owned by the appropriate user/group. + if running_as_root: + os.chown(os.path.dirname(checkout), uid, gid) + + def prepare_hg_store_path(): + # And ensure the shared store path exists and has proper permissions. + if 'HG_STORE_PATH' not in os.environ: + print('error: HG_STORE_PATH environment variable not set') + sys.exit(1) + + store_path = os.environ['HG_STORE_PATH'] + + if not path_in_cache_or_volume(store_path): + print_line(b'vcs', b'WARNING: HG_STORE_PATH (%s) not in cache or ' + b'volume; performance will likely suffer\n' % + store_path.encode('utf-8')) + + try: + os.makedirs(store_path) + except OSError as e: + if e.errno != errno.EEXIST: + raise + + if running_as_root: + os.chown(store_path, uid, gid) + + prepare_checkout_dir(args.gecko_checkout) + if args.gecko_checkout or args.comm_checkout: + prepare_hg_store_path() + + if IS_POSIX and running_as_root: + # Drop permissions to requested user. + # This code is modeled after what `sudo` was observed to do in a Docker + # container. We do not bother calling setrlimit() because containers have + # their own limits. + print_line(b'setup', b'running as %s:%s\n' % ( + args.user.encode('utf-8'), args.group.encode('utf-8'))) + + os.setgroups(gids) + os.umask(0o22) + os.setresgid(gid, gid, gid) + os.setresuid(uid, uid, uid) + + vcs_checkout_from_args(args, 'gecko') + vcs_checkout_from_args(args, 'comm') + + resource_process = None + + try: + for k in ('GECKO_PATH', 'MOZ_FETCHES_DIR', 'UPLOAD_DIR'): + if k in os.environ: + # Normalize paths to use forward slashes. Some shell scripts + # tolerate that better on Windows. + os.environ[k] = os.path.abspath(os.environ[k]).replace(os.sep, '/') + print_line(b'setup', b'%s is %s\n' % ( + k.encode('utf-8'), + os.environ[k].encode('utf-8'))) + + if 'MOZ_FETCHES' in os.environ: + fetch_artifacts() + + resource_process = maybe_run_resource_monitoring() + + return run_and_prefix_output(b'task', task_args, cwd=args.task_cwd) + finally: + if resource_process: + print_line(b'resource_monitor', b'terminating\n') + if IS_WINDOWS: + # .terminate() on Windows is not a graceful shutdown, due to + # differences in signals. CTRL_BREAK_EVENT will work provided + # the subprocess is in a different process group, so this script + # isn't also killed. + os.kill(resource_process.pid, signal.CTRL_BREAK_EVENT) + else: + resource_process.terminate() + resource_process.wait() + + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:])) diff --git a/taskcluster/scripts/tester/run-wizard b/taskcluster/scripts/tester/run-wizard new file mode 100755 index 0000000000..9892737352 --- /dev/null +++ b/taskcluster/scripts/tester/run-wizard @@ -0,0 +1,178 @@ +#!/usr/bin/env python +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this, +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +from __future__ import print_function, unicode_literals + +import datetime +import os +import subprocess +import sys +import time +from distutils.spawn import find_executable +from textwrap import wrap + +here = os.path.dirname(os.path.abspath(__file__)) +MOZHARNESS_WORKDIR = os.path.expanduser(os.path.join('~', 'workspace', 'build')) + +MACH_SETUP_FINISHED = """ +Mozharness has finished downloading the build and tests to: +{} + +A limited mach environment has also been set up and added to the $PATH, but +it may be missing the command you need. To see a list of commands, run: + $ mach help +""".lstrip().format(MOZHARNESS_WORKDIR) + +MACH_SETUP_FAILED = """ +Could not set up mach environment, no mach binary detected. +""".lstrip() + + +def call(cmd, **kwargs): + print(" ".join(cmd)) + return subprocess.call(cmd, **kwargs) + + +def wait_for_run_mozharness(timeout=60): + starttime = datetime.datetime.now() + while datetime.datetime.now() - starttime < datetime.timedelta(seconds=timeout): + if os.path.isfile(os.path.join(here, 'run-mozharness')): + break + time.sleep(0.2) + else: + print("Timed out after %d seconds waiting for the 'run-mozharness' binary" % timeout) + return 1 + + +def setup_mach_environment(): + mach_src = os.path.join(MOZHARNESS_WORKDIR, 'tests', 'mach') + if not os.path.isfile(mach_src): + return 1 + + mach_dest = os.path.expanduser(os.path.join('~', 'bin', 'mach')) + if os.path.exists(mach_dest): + os.remove(mach_dest) + os.symlink(mach_src, mach_dest) + return 0 + + +def run_mozharness(*args): + wait_for_run_mozharness() + try: + return call(['run-mozharness'] + list(args)) + finally: + setup_mach_environment() + + +def setup(): + """Run the mozharness script without the 'run-tests' action. + + This will do all the necessary setup steps like creating a virtualenv and + downloading the tests and firefox binary. But it stops before running the + tests. + """ + status = run_mozharness('--no-run-tests') + + if find_executable('mach'): + print(MACH_SETUP_FINISHED) + else: + print(MACH_SETUP_FAILED) + + return status + + +def clone(): + """Clone the correct gecko repository and update to the proper revision.""" + base_repo = os.environ['GECKO_HEAD_REPOSITORY'] + dest = os.path.expanduser(os.path.join('~', 'gecko')) + + # Specify method to checkout a revision. This defaults to revisions as + # SHA-1 strings, but also supports symbolic revisions like `tip` via the + # branch flag. + if os.environ.get('GECKO_HEAD_REV'): + revision_flag = b'--revision' + revision = os.environ['GECKO_HEAD_REV'] + elif os.environ.get('GECKO_HEAD_REF'): + revision_flag = b'--branch' + revision = os.environ['GECKO_HEAD_REF'] + else: + print('revision is not specified for checkout') + return 1 + + # TODO Bug 1301382 - pin hg.mozilla.org fingerprint. + call([ + b'/usr/bin/hg', b'robustcheckout', + b'--sharebase', os.environ['HG_STORE_PATH'], + b'--purge', + b'--upstream', b'https://hg.mozilla.org/mozilla-unified', + revision_flag, revision, + base_repo, dest + ]) + print("Finished cloning to {} at revision {}.".format(dest, revision)) + + +def exit(): + pass + + +OPTIONS = [ + ('Resume task', run_mozharness, + "Resume the original task without modification. This can be useful for " + "passively monitoring it from another shell."), + ('Setup task', setup, + "Setup the task (download the application and tests) but don't run the " + "tests just yet. The tests can be run with a custom configuration later. " + "This will provide a mach environment (experimental)."), + ('Clone gecko', clone, + "Perform a clone of gecko using the task's repo and update it to the " + "task's revision."), + ('Exit', exit, "Exit this wizard and return to the shell.") +] + + +def _fmt_options(): + max_line_len = 60 + max_name_len = max(len(o[0]) for o in OPTIONS) + + # TODO Pad will be off if there are more than 9 options. + pad = ' ' * (max_name_len+6) + + msg = [] + for i, (name, _, desc) in enumerate(OPTIONS): + desc = wrap(desc, width=max_line_len) + desc = [desc[0]] + [pad + l for l in desc[1:]] + + optstr = '{}) {} - {}\n'.format( + i+1, name.ljust(max_name_len), '\n'.join(desc)) + msg.append(optstr) + msg.append("Select one of the above options: ") + return '\n'.join(msg) + + +def wizard(): + print("This wizard can help you get started with some common debugging " + "workflows.\nWhat would you like to do?\n") + print(_fmt_options(), end="") + choice = None + while True: + choice = raw_input().decode('utf8') + try: + choice = int(choice)-1 + if 0 <= choice < len(OPTIONS): + break + except ValueError: + pass + + print("Must provide an integer from 1-{}:".format(len(OPTIONS))) + + func = OPTIONS[choice][1] + ret = func() + + print("Use the 'run-wizard' command to start this wizard again.") + return ret + + +if __name__ == '__main__': + sys.exit(wizard()) diff --git a/taskcluster/scripts/tester/test-linux.sh b/taskcluster/scripts/tester/test-linux.sh new file mode 100755 index 0000000000..2367c0a390 --- /dev/null +++ b/taskcluster/scripts/tester/test-linux.sh @@ -0,0 +1,286 @@ +#! /bin/bash -xe + +set -x -e + +echo "running as" $(id) + +# Detect distribution +. /etc/os-release +if [ "${ID}" == "ubuntu" ]; then + DISTRIBUTION="Ubuntu" +elif [ "${ID}" == "debian" ]; then + DISTRIBUTION="Debian" +else + DISTRIBUTION="Unknown" +fi + +# Detect release version if supported +FILE="/etc/lsb-release" +if [ -e $FILE ] ; then + . /etc/lsb-release + RELEASE="${DISTRIB_RELEASE}" +else + RELEASE="unknown" +fi + +#### +# Taskcluster friendly wrapper for performing fx desktop tests via mozharness. +#### + +# Inputs, with defaults + +: GECKO_PATH ${GECKO_PATH} +: MOZHARNESS_PATH ${MOZHARNESS_PATH} +: MOZHARNESS_URL ${MOZHARNESS_URL} +: MOZHARNESS_SCRIPT ${MOZHARNESS_SCRIPT} +: MOZHARNESS_CONFIG ${MOZHARNESS_CONFIG} +: MOZHARNESS_OPTIONS ${MOZHARNESS_OPTIONS} +: NEED_XVFB ${NEED_XVFB:=true} +: NEED_WINDOW_MANAGER ${NEED_WINDOW_MANAGER:=false} +: NEED_PULSEAUDIO ${NEED_PULSEAUDIO:=false} +: NEED_COMPIZ ${NEED_COPMPIZ:=false} +: START_VNC ${START_VNC:=false} +: TASKCLUSTER_INTERACTIVE ${TASKCLUSTER_INTERACTIVE:=false} +: mozharness args "${@}" +: WORKING_DIR ${WORKING_DIR:=$(pwd)} +: WORKSPACE ${WORKSPACE:=${WORKING_DIR%/}/workspace} + +set -v +mkdir -p "$WORKSPACE" +cd "$WORKSPACE" + +fail() { + echo # make sure error message is on a new line + echo "[test-linux.sh:error]" "${@}" + exit 1 +} + +# start pulseaudio +maybe_start_pulse() { + if $NEED_PULSEAUDIO; then + # call pulseaudio for Ubuntu only + if [ $DISTRIBUTION == "Ubuntu" ]; then + pulseaudio --daemonize --log-level=4 --log-time=1 --log-target=stderr --start --fail -vvvvv --exit-idle-time=-1 --cleanup-shm --dump-conf + fi + fi +} + +# test required parameters are supplied +if [ -z "${MOZHARNESS_PATH}" -a -z "${MOZHARNESS_URL}" ]; then + fail "MOZHARNESS_PATH or MOZHARNESS_URL must be defined"; +fi + +if [[ -z ${MOZHARNESS_SCRIPT} ]]; then fail "MOZHARNESS_SCRIPT is not set"; fi +if [[ -z ${MOZHARNESS_CONFIG} ]]; then fail "MOZHARNESS_CONFIG is not set"; fi + +if [ $MOZ_ENABLE_WAYLAND ]; then + NEED_XVFB=true + NEED_WINDOW_MANAGER=true +fi + +# make sure artifact directories exist +mkdir -p "$WORKSPACE/logs" +mkdir -p "$WORKING_DIR/artifacts/public" +mkdir -p "$WORKSPACE/build/blobber_upload_dir" + +cleanup_mutter() { + local mutter_pids=`ps aux | grep 'mutter --wayland' | grep -v grep | awk '{print $2}'` + if [ "$mutter_pids" != "" ]; then + echo "Killing the following Mutter processes: $mutter_pids" + sudo kill $mutter_pids + else + echo "No Mutter processes to kill" + fi +} + +cleanup() { + local rv=$? + if [[ -s $HOME/.xsession-errors ]]; then + # To share X issues + cp "$HOME/.xsession-errors" "$WORKING_DIR/artifacts/public/xsession-errors.log" + fi + if [ $MOZ_ENABLE_WAYLAND ]; then + cleanup_mutter + fi + if $NEED_XVFB; then + cleanup_xvfb + fi + exit $rv +} +trap cleanup EXIT INT + +# Download mozharness with exponential backoff +# curl already applies exponential backoff, but not for all +# failed cases, apparently, as we keep getting failed downloads +# with 404 code. +download_mozharness() { + local max_attempts=10 + local timeout=1 + local attempt=0 + + echo "Downloading mozharness" + + while [[ $attempt < $max_attempts ]]; do + if curl --fail -o mozharness.zip --retry 10 -L $MOZHARNESS_URL; then + rm -rf mozharness + if unzip -q mozharness.zip -d mozharness; then + return 0 + fi + echo "error unzipping mozharness.zip" >&2 + else + echo "failed to download mozharness zip" >&2 + fi + echo "Download failed, retrying in $timeout seconds..." >&2 + sleep $timeout + timeout=$((timeout*2)) + attempt=$((attempt+1)) + done + + fail "Failed to download and unzip mozharness" +} + +# Download mozharness if we're told to. +if [ ${MOZHARNESS_URL} ]; then + download_mozharness + rm mozharness.zip + + if ! [ -d mozharness ]; then + fail "mozharness zip did not contain mozharness/" + fi + + MOZHARNESS_PATH=`pwd`/mozharness +fi + +# run XVfb in the background, if necessary +if $NEED_XVFB; then + # note that this file is not available when run under native-worker + . $HOME/scripts/xvfb.sh + start_xvfb '1600x1200x24' 0 +fi + +if $START_VNC; then + x11vnc > "$WORKING_DIR/artifacts/public/x11vnc.log" 2>&1 & +fi + +if $NEED_WINDOW_MANAGER; then + # This is read by xsession to select the window manager + . /etc/lsb-release + if [ $DISTRIBUTION == "Ubuntu" ] && [ $RELEASE == "16.04" ]; then + echo DESKTOP_SESSION=ubuntu > $HOME/.xsessionrc + elif [ $DISTRIBUTION == "Ubuntu" ] && [ $RELEASE == "18.04" ]; then + echo export DESKTOP_SESSION=gnome > $HOME/.xsessionrc + echo export XDG_CURRENT_DESKTOP=GNOME > $HOME/.xsessionrc + if [ $MOZ_ENABLE_WAYLAND ]; then + echo export XDG_SESSION_TYPE=wayland >> $HOME/.xsessionrc + else + echo export XDG_SESSION_TYPE=x11 >> $HOME/.xsessionrc + fi + else + : + fi + + # DISPLAY has already been set above + # XXX: it would be ideal to add a semaphore logic to make sure that the + # window manager is ready + /etc/X11/Xsession 2>&1 & + + # Turn off the screen saver and screen locking + gsettings set org.gnome.desktop.screensaver idle-activation-enabled false + gsettings set org.gnome.desktop.screensaver lock-enabled false + gsettings set org.gnome.desktop.screensaver lock-delay 3600 + + # Disable the screen saver + xset s off s reset + + # This starts the gnome-keyring-daemon with an unlocked login keyring. libsecret uses this to + # store secrets. Firefox uses libsecret to store a key that protects sensitive information like + # credit card numbers. + if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then + # if not found, launch a new one + eval `dbus-launch --sh-syntax` + fi + eval `echo '' | /usr/bin/gnome-keyring-daemon -r -d --unlock --components=secrets` + + # Run mutter as nested wayland compositor to provide Wayland environment + # on top of XVfb. + if [ $MOZ_ENABLE_WAYLAND ]; then + env | grep "DISPLAY" + export XDG_RUNTIME_DIR=$WORKING_DIR + mutter --display=:0 --wayland --nested & + export WAYLAND_DISPLAY=wayland-0 + retry_count=0 + max_retries=5 + until [ $retry_count -gt $max_retries ]; do + if [ -S "$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY" ]; then + retry_count=$(($max_retries + 1)) + else + retry_count=$(($retry_count + 1)) + echo "Waiting for Mutter, retry: $retry_count" + sleep 2 + fi + done + fi +fi + +if [[ $NEED_COMPIZ == true ]] && [[ $RELEASE == 16.04 ]]; then + compiz 2>&1 & +elif [[ $NEED_COMPIZ == true ]] && [[ $RELEASE == 18.04 ]]; then + compiz --replace 2>&1 & +fi + +# Bug 1607713 - set cursor position to 0,0 to avoid odd libx11 interaction +if [ $NEED_WINDOW_MANAGER ] && [ $DISPLAY == ':0' ]; then + xwit -root -warp 0 0 +fi + +maybe_start_pulse + +# For telemetry purposes, the build process wants information about the +# source it is running +export MOZ_SOURCE_REPO="${GECKO_HEAD_REPOSITORY}" +export MOZ_SOURCE_CHANGESET="${GECKO_HEAD_REV}" + +# support multiple, space delimited, config files +config_cmds="" +for cfg in $MOZHARNESS_CONFIG; do + config_cmds="${config_cmds} --config-file ${MOZHARNESS_PATH}/configs/${cfg}" +done + +if [ -n "$MOZHARNESS_OPTIONS" ]; then + options="" + for option in $MOZHARNESS_OPTIONS; do + options="$options --$option" + done +fi + +# Use |mach python| if a source checkout exists so in-tree packages are +# available. +[[ -x "${GECKO_PATH}/mach" ]] && python="${PYTHON:-python2.7} ${GECKO_PATH}/mach python" || python="${PYTHON:-python2.7}" + +# Save the computed mozharness command to a binary which is useful for +# interactive mode. +mozharness_bin="$HOME/bin/run-mozharness" +mkdir -p $(dirname $mozharness_bin) + +echo -e "#!/usr/bin/env bash +# Some mozharness scripts assume base_work_dir is in +# the current working directory, see bug 1279237 +cd "$WORKSPACE" +cmd=\"${python} ${MOZHARNESS_PATH}/scripts/${MOZHARNESS_SCRIPT} ${config_cmds} ${options} ${@} \${@}\" +echo \"Running: \${cmd}\" +exec \${cmd}" > ${mozharness_bin} +chmod +x ${mozharness_bin} + +# In interactive mode, the user will be prompted with options for what to do. +if ! $TASKCLUSTER_INTERACTIVE; then + # run the given mozharness script and configs, but pass the rest of the + # arguments in from our own invocation + ${mozharness_bin}; +fi + +# Run a custom mach command (this is typically used by action tasks to run +# harnesses in a particular way) +if [ "$CUSTOM_MACH_COMMAND" ]; then + eval "'$WORKSPACE/build/tests/mach' ${CUSTOM_MACH_COMMAND} ${@}" + exit $? +fi |