Ben Clayton | feb42e5 | 2022-04-07 19:22:21 +0000 | [diff] [blame] | 1 | #!/usr/bin/env bash |
Austin Eng | cc2516a | 2023-10-17 20:57:54 +0000 | [diff] [blame] | 2 | # Copyright 2022 The Dawn & Tint Authors |
Ben Clayton | feb42e5 | 2022-04-07 19:22:21 +0000 | [diff] [blame] | 3 | # |
Austin Eng | cc2516a | 2023-10-17 20:57:54 +0000 | [diff] [blame] | 4 | # Redistribution and use in source and binary forms, with or without |
| 5 | # modification, are permitted provided that the following conditions are met: |
Ben Clayton | feb42e5 | 2022-04-07 19:22:21 +0000 | [diff] [blame] | 6 | # |
Austin Eng | cc2516a | 2023-10-17 20:57:54 +0000 | [diff] [blame] | 7 | # 1. Redistributions of source code must retain the above copyright notice, this |
| 8 | # list of conditions and the following disclaimer. |
Ben Clayton | feb42e5 | 2022-04-07 19:22:21 +0000 | [diff] [blame] | 9 | # |
Austin Eng | cc2516a | 2023-10-17 20:57:54 +0000 | [diff] [blame] | 10 | # 2. Redistributions in binary form must reproduce the above copyright notice, |
| 11 | # this list of conditions and the following disclaimer in the documentation |
| 12 | # and/or other materials provided with the distribution. |
| 13 | # |
| 14 | # 3. Neither the name of the copyright holder nor the names of its |
| 15 | # contributors may be used to endorse or promote products derived from |
| 16 | # this software without specific prior written permission. |
| 17 | # |
| 18 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| 19 | # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 20 | # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| 21 | # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
| 22 | # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| 23 | # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
| 24 | # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
| 25 | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| 26 | # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 27 | # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
Ben Clayton | feb42e5 | 2022-04-07 19:22:21 +0000 | [diff] [blame] | 28 | |
| 29 | set -e # Fail on any error. |
| 30 | |
| 31 | SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd )" |
Ben Clayton | 138ddcc | 2022-10-13 12:55:42 +0000 | [diff] [blame] | 32 | ROOT_DIR="$( cd "$SCRIPT_DIR/.." >/dev/null 2>&1 && pwd )" |
| 33 | |
| 34 | POSSIBLE_BUILD_SYSTEMS="[gn|cmake]" |
| 35 | POSSIBLE_BUILD_TYPES="[debug|release]" |
| 36 | POSSIBLE_BUILD_ARCHS="[native|x86]" |
David Neto | 9ddefa8 | 2024-05-29 17:03:39 +0000 | [diff] [blame] | 37 | BUILD_FUZZER="" |
Ben Clayton | 138ddcc | 2022-10-13 12:55:42 +0000 | [diff] [blame] | 38 | |
| 39 | BUILD_SYSTEM="" |
| 40 | BUILD_TYPE="" |
| 41 | BUILD_ARCH="" |
David Neto | 00c3976 | 2024-06-19 21:28:55 +0000 | [diff] [blame] | 42 | FORCE="" |
| 43 | VERBOSE="" |
Peter McNeeley | 8156e43 | 2024-10-17 18:58:53 +0000 | [diff] [blame] | 44 | REMOTEEXEC="" |
Ben Clayton | feb42e5 | 2022-04-07 19:22:21 +0000 | [diff] [blame] | 45 | |
| 46 | function show_usage() { |
David Neto | 00c3976 | 2024-06-19 21:28:55 +0000 | [diff] [blame] | 47 | echo "setup-build [-f] $POSSIBLE_BUILD_SYSTEMS $POSSIBLE_BUILD_TYPES $POSSIBLE_BUILD_ARCHS [fuzz|fuzzer]" |
Ben Clayton | feb42e5 | 2022-04-07 19:22:21 +0000 | [diff] [blame] | 48 | echo |
David Neto | 00c3976 | 2024-06-19 21:28:55 +0000 | [diff] [blame] | 49 | echo "Creates a build directory in <dawn>/out using either GN or CMake, then" |
| 50 | echo "updates the '<dawn>/out/active' symlink to point to the build directory." |
| 51 | echo |
| 52 | echo "Options:" |
| 53 | echo " -h, --help Print this help, then exit" |
| 54 | echo " -v, --verbose Print the generate command" |
| 55 | echo " -f, --force Force rewrite of args.gn with specified options," |
| 56 | echo " even if args.gn exists" |
| 57 | echo " gn Create GN build configuration" |
| 58 | echo " cmake Create CMake build configuration" |
| 59 | echo " release Make a release build" |
| 60 | echo " debug Make a debug build" |
| 61 | echo " fuzz, fuzzer Build fuzzers. Forces Clang to be used" |
| 62 | echo " native Target the machine you're running on" |
| 63 | echo " x86 Target a 32-bit x86 (adds -m32 to compiler flags)" |
Peter McNeeley | 8156e43 | 2024-10-17 18:58:53 +0000 | [diff] [blame] | 64 | echo " remoteexec Use remoteexec to improve compile time" |
Ben Clayton | 138ddcc | 2022-10-13 12:55:42 +0000 | [diff] [blame] | 65 | if [[ ! -z "$1" ]]; then |
| 66 | echo |
| 67 | echo "$1" |
| 68 | fi |
Ben Clayton | feb42e5 | 2022-04-07 19:22:21 +0000 | [diff] [blame] | 69 | exit 1 |
| 70 | } |
| 71 | |
Ben Clayton | 138ddcc | 2022-10-13 12:55:42 +0000 | [diff] [blame] | 72 | function set_build_system() { |
| 73 | if [[ ! -z "$BUILD_SYSTEM" ]]; then |
| 74 | echo "conflicting build systems $BUILD_SYSTEM and $1" |
| 75 | exit 1 |
| 76 | fi |
| 77 | BUILD_SYSTEM=$1 |
| 78 | } |
| 79 | |
| 80 | function set_build_type() { |
| 81 | if [[ ! -z "$BUILD_TYPE" ]]; then |
| 82 | echo "conflicting build types $BUILD_TYPE and $1" |
| 83 | exit 1 |
| 84 | fi |
| 85 | BUILD_TYPE=$1 |
| 86 | } |
| 87 | |
| 88 | function set_build_arch() { |
| 89 | if [[ ! -z "$BUILD_ARCH" ]]; then |
| 90 | echo "conflicting build architectures $BUILD_ARCH and $1" |
| 91 | exit 1 |
| 92 | fi |
| 93 | BUILD_ARCH=$1 |
| 94 | } |
| 95 | |
| 96 | for arg in "$@"; do |
| 97 | lowered_arg=$(echo "$arg" | tr '[:upper:]' '[:lower:]') # lowercase |
| 98 | case $lowered_arg in |
| 99 | "gn") |
| 100 | set_build_system $lowered_arg |
| 101 | ;; |
| 102 | "cmake") |
| 103 | set_build_system $lowered_arg |
| 104 | ;; |
| 105 | "debug") |
| 106 | set_build_type $lowered_arg |
| 107 | ;; |
| 108 | "release") |
| 109 | set_build_type $lowered_arg |
| 110 | ;; |
| 111 | "x86") |
| 112 | set_build_arch $lowered_arg |
| 113 | ;; |
| 114 | "native") |
| 115 | ;; |
David Neto | 9ddefa8 | 2024-05-29 17:03:39 +0000 | [diff] [blame] | 116 | "fuzz" | "fuzzer") |
| 117 | BUILD_FUZZER=1 |
| 118 | ;; |
David Neto | 00c3976 | 2024-06-19 21:28:55 +0000 | [diff] [blame] | 119 | "--force" | "-f") |
| 120 | FORCE=1 |
| 121 | ;; |
| 122 | "--verbose" | "-v") |
| 123 | VERBOSE=1 |
| 124 | ;; |
Peter McNeeley | 8156e43 | 2024-10-17 18:58:53 +0000 | [diff] [blame] | 125 | "remoteexec") |
| 126 | REMOTEEXEC=1 |
| 127 | ;; |
Ben Clayton | 138ddcc | 2022-10-13 12:55:42 +0000 | [diff] [blame] | 128 | "--help" | "-help" | "-h") |
| 129 | show_usage |
| 130 | ;; |
| 131 | *) |
| 132 | show_usage "unknown argument '$arg'" |
| 133 | ;; |
| 134 | esac |
| 135 | done |
| 136 | |
| 137 | if [[ -z "$BUILD_SYSTEM" ]]; then |
| 138 | show_usage "build system $POSSIBLE_BUILD_SYSTEMS is required" |
| 139 | fi |
| 140 | |
| 141 | if [[ -z "$BUILD_TYPE" ]]; then |
| 142 | show_usage "build type $POSSIBLE_BUILD_TYPES required" |
| 143 | fi |
| 144 | |
| 145 | BUILD_DIR="$BUILD_SYSTEM-$BUILD_TYPE" |
| 146 | if [[ ! -z "$BUILD_ARCH" ]]; then |
| 147 | BUILD_DIR+="-$BUILD_ARCH" |
| 148 | fi |
David Neto | 9ddefa8 | 2024-05-29 17:03:39 +0000 | [diff] [blame] | 149 | if [[ ! -z "$BUILD_FUZZER" ]]; then |
| 150 | BUILD_DIR+="-fuzz" |
| 151 | fi |
Ben Clayton | 138ddcc | 2022-10-13 12:55:42 +0000 | [diff] [blame] | 152 | |
Ben Clayton | feb42e5 | 2022-04-07 19:22:21 +0000 | [diff] [blame] | 153 | function generate() { |
Ben Clayton | feb42e5 | 2022-04-07 19:22:21 +0000 | [diff] [blame] | 154 | pushd "$ROOT_DIR" > /dev/null |
David Neto | 00c3976 | 2024-06-19 21:28:55 +0000 | [diff] [blame] | 155 | test -n "$VERBOSE" && echo mkdir -p "out/$BUILD_DIR" |
Ben Clayton | 446166c | 2022-04-29 20:18:45 +0000 | [diff] [blame] | 156 | mkdir -p "out/$BUILD_DIR" |
| 157 | rm -fr "out/active" || true |
| 158 | ln -s "$BUILD_DIR" "out/active" |
David Neto | 00c3976 | 2024-06-19 21:28:55 +0000 | [diff] [blame] | 159 | test -n "$VERBOSE" && echo "$@" |
Ben Clayton | 138ddcc | 2022-10-13 12:55:42 +0000 | [diff] [blame] | 160 | "$@" |
Ben Clayton | feb42e5 | 2022-04-07 19:22:21 +0000 | [diff] [blame] | 161 | popd > /dev/null |
| 162 | } |
| 163 | |
| 164 | case $BUILD_SYSTEM in |
| 165 | "gn") |
Ben Clayton | 138ddcc | 2022-10-13 12:55:42 +0000 | [diff] [blame] | 166 | GN_ARGS="" |
Ben Clayton | feb42e5 | 2022-04-07 19:22:21 +0000 | [diff] [blame] | 167 | case $BUILD_TYPE in |
| 168 | "debug") |
Ben Clayton | 138ddcc | 2022-10-13 12:55:42 +0000 | [diff] [blame] | 169 | GN_ARGS+="is_debug=true" |
Ben Clayton | feb42e5 | 2022-04-07 19:22:21 +0000 | [diff] [blame] | 170 | ;; |
| 171 | "release") |
Ben Clayton | 138ddcc | 2022-10-13 12:55:42 +0000 | [diff] [blame] | 172 | GN_ARGS+="is_debug=false" |
Ben Clayton | feb42e5 | 2022-04-07 19:22:21 +0000 | [diff] [blame] | 173 | ;; |
| 174 | *) |
Ben Clayton | 138ddcc | 2022-10-13 12:55:42 +0000 | [diff] [blame] | 175 | show_usage "invalid build type '$BUILD_TYPE'" |
Ben Clayton | feb42e5 | 2022-04-07 19:22:21 +0000 | [diff] [blame] | 176 | ;; |
| 177 | esac |
Ben Clayton | 138ddcc | 2022-10-13 12:55:42 +0000 | [diff] [blame] | 178 | case $BUILD_ARCH in |
| 179 | "") |
| 180 | ;; |
| 181 | "x86") |
| 182 | GN_ARGS+=" target_cpu=\"x86\"" |
| 183 | ;; |
| 184 | *) |
| 185 | show_usage "invalid build architecture '$BUILD_ARCH'" |
| 186 | ;; |
| 187 | esac |
David Neto | 9ddefa8 | 2024-05-29 17:03:39 +0000 | [diff] [blame] | 188 | if [[ -n "$BUILD_FUZZER" ]]; then |
| 189 | GN_ARGS+=" use_libfuzzer=true" |
David Neto | 00c3976 | 2024-06-19 21:28:55 +0000 | [diff] [blame] | 190 | GN_ARGS+=" tint_build_ir_binary=true" |
| 191 | GN_ARGS+=" tint_build_ir_fuzzer=true" |
David Neto | 9ddefa8 | 2024-05-29 17:03:39 +0000 | [diff] [blame] | 192 | fi |
Peter McNeeley | 8156e43 | 2024-10-17 18:58:53 +0000 | [diff] [blame] | 193 | if [[ -n "$REMOTEEXEC" ]]; then |
| 194 | GN_ARGS+=" use_remoteexec=true" |
| 195 | fi |
David Neto | 00c3976 | 2024-06-19 21:28:55 +0000 | [diff] [blame] | 196 | if [[ -z "$FORCE" && -f "$ROOT_DIR/out/$BUILD_DIR/args.gn" ]]; then |
Ben Clayton | 7674986 | 2023-09-29 18:36:29 +0000 | [diff] [blame] | 197 | generate "gn" "gen" "out/active" # keep existing args |
| 198 | else |
| 199 | generate "gn" "gen" "out/active" "--args=$GN_ARGS" |
| 200 | fi |
Ben Clayton | feb42e5 | 2022-04-07 19:22:21 +0000 | [diff] [blame] | 201 | ;; |
| 202 | "cmake") |
Ben Clayton | 138ddcc | 2022-10-13 12:55:42 +0000 | [diff] [blame] | 203 | CMAKE_FLAGS=() |
| 204 | CMAKE_FLAGS+=("-DTINT_BUILD_GLSL_WRITER=1") |
| 205 | CMAKE_FLAGS+=("-DTINT_BUILD_HLSL_WRITER=1") |
| 206 | CMAKE_FLAGS+=("-DTINT_BUILD_MSL_WRITER=1") |
| 207 | CMAKE_FLAGS+=("-DTINT_BUILD_SPV_WRITER=1") |
| 208 | CMAKE_FLAGS+=("-DTINT_BUILD_WGSL_WRITER=1") |
Ben Clayton | 2f215d1 | 2024-03-23 10:18:00 +0000 | [diff] [blame] | 209 | CMAKE_FLAGS+=("-DTINT_BUILD_TINTD=1") |
Ben Clayton | 9d3ce3d | 2024-03-04 14:22:22 +0000 | [diff] [blame] | 210 | CMAKE_FLAGS+=("-DDAWN_BUILD_NODE_BINDINGS=1") |
David Neto | 9ddefa8 | 2024-05-29 17:03:39 +0000 | [diff] [blame] | 211 | if [[ -n "$BUILD_FUZZER" ]]; then |
| 212 | CMAKE_FLAGS+=("-DCMAKE_CXX_COMPILER=clang++") |
| 213 | CMAKE_FLAGS+=("-DCMAKE_C_COMPILER=clang") |
| 214 | CMAKE_FLAGS+=("-DTINT_BUILD_FUZZERS=ON") |
David Neto | 00c3976 | 2024-06-19 21:28:55 +0000 | [diff] [blame] | 215 | CMAKE_FLAGS+=("-DDAWN_BUILD_PROTOBUF=ON") |
| 216 | CMAKE_FLAGS+=("-DTINT_BUILD_IR_FUZZER=ON") |
| 217 | CMAKE_FLAGS+=("-DTINT_BUILD_IR_BINARY=ON") |
| 218 | CMAKE_FLAGS+=("-DDAWN_USE_BUILT_DXC=ON") # TODO(b/348200364) |
David Neto | 9ddefa8 | 2024-05-29 17:03:39 +0000 | [diff] [blame] | 219 | fi |
Ben Clayton | 446166c | 2022-04-29 20:18:45 +0000 | [diff] [blame] | 220 | if [[ -x $(command -v ccache) ]]; then |
Ben Clayton | 138ddcc | 2022-10-13 12:55:42 +0000 | [diff] [blame] | 221 | CMAKE_FLAGS+=("-DCMAKE_CXX_COMPILER_LAUNCHER=ccache") |
Ben Clayton | 446166c | 2022-04-29 20:18:45 +0000 | [diff] [blame] | 222 | fi |
Ben Clayton | feb42e5 | 2022-04-07 19:22:21 +0000 | [diff] [blame] | 223 | case $BUILD_TYPE in |
| 224 | "debug") |
Ben Clayton | 138ddcc | 2022-10-13 12:55:42 +0000 | [diff] [blame] | 225 | CMAKE_FLAGS+=("-DCMAKE_BUILD_TYPE=Debug") |
Ben Clayton | feb42e5 | 2022-04-07 19:22:21 +0000 | [diff] [blame] | 226 | ;; |
| 227 | "release") |
Ben Clayton | 138ddcc | 2022-10-13 12:55:42 +0000 | [diff] [blame] | 228 | CMAKE_FLAGS+=("-DCMAKE_BUILD_TYPE=RelWithDebInfo") |
Ben Clayton | feb42e5 | 2022-04-07 19:22:21 +0000 | [diff] [blame] | 229 | ;; |
| 230 | *) |
Ben Clayton | 138ddcc | 2022-10-13 12:55:42 +0000 | [diff] [blame] | 231 | show_usage "invalid build type '$BUILD_TYPE'" |
Ben Clayton | feb42e5 | 2022-04-07 19:22:21 +0000 | [diff] [blame] | 232 | ;; |
| 233 | esac |
Ben Clayton | 138ddcc | 2022-10-13 12:55:42 +0000 | [diff] [blame] | 234 | case $BUILD_ARCH in |
| 235 | "") |
| 236 | ;; |
| 237 | "x86") |
| 238 | CMAKE_FLAGS+=("-DCMAKE_CXX_FLAGS=-m32") |
| 239 | CMAKE_FLAGS+=("-DCMAKE_C_FLAGS=-m32") |
| 240 | ;; |
| 241 | *) |
| 242 | show_usage "invalid build architecture '$BUILD_ARCH'" |
| 243 | ;; |
| 244 | esac |
| 245 | generate "cmake" \ |
| 246 | "-S" "." \ |
| 247 | "-B" "out/active" \ |
| 248 | "-GNinja" \ |
| 249 | "${CMAKE_FLAGS[@]}" |
Ben Clayton | feb42e5 | 2022-04-07 19:22:21 +0000 | [diff] [blame] | 250 | ;; |
| 251 | *) |
Ben Clayton | 138ddcc | 2022-10-13 12:55:42 +0000 | [diff] [blame] | 252 | echo "invalid build system '$BUILD_SYSTEM'" |
Ben Clayton | feb42e5 | 2022-04-07 19:22:21 +0000 | [diff] [blame] | 253 | show_usage |
| 254 | ;; |
| 255 | esac |