|
| 1 | +#!/usr/bin/env bash |
| 2 | +# TEMPORARY PROBE (do not merge): mcpp built from main, on the cases the design |
| 3 | +# for #770 / #771 / #769 relies on. Prints; asserts nothing. |
| 4 | +set -u |
| 5 | +M="${MCPP_BUILT:?}" |
| 6 | +W="$RUNNER_TEMP/mcpp-probes"; rm -rf "$W"; mkdir -p "$W" |
| 7 | +run() { echo "\$ $*"; "$@" 2>&1; echo "rc=$?"; } |
| 8 | +section() { echo; echo "### $1"; } |
| 9 | +edges() { # the link edges of the generated build.ninja, with their link flags |
| 10 | + local n; n=$(find target -name build.ninja | head -1) |
| 11 | + [ -n "$n" ] || { echo "(no build.ninja)"; return; } |
| 12 | + python - "$n" <<'PY' |
| 13 | +import re, sys |
| 14 | +glob, edges, cur = {}, {}, None |
| 15 | +for line in open(sys.argv[1], encoding="utf-8", errors="replace"): |
| 16 | + line = line.rstrip("\n") |
| 17 | + if line.startswith("build "): |
| 18 | + cur = line.split(" : ")[0][6:].strip() |
| 19 | + rule = line.split(" : ", 1)[1].split()[0] if " : " in line else "?" |
| 20 | + edges[cur] = {"_rule": rule} |
| 21 | + continue |
| 22 | + if line.startswith(" ") and cur: |
| 23 | + k, _, v = line.strip().partition(" = "); edges[cur][k] = v; continue |
| 24 | + cur = None |
| 25 | + m = re.match(r"^(\w+)\s*=\s*(.*)$", line) |
| 26 | + if m: glob[m.group(1)] = m.group(2) |
| 27 | +for e, v in edges.items(): |
| 28 | + if v["_rule"] not in ("cxx_shared", "cxx_link"): continue |
| 29 | + src = "group" if "ldflags" in v else "plan-global" |
| 30 | + ld = v.get("ldflags", glob.get("ldflags", "")) + " | unit: " + v.get("unit_ldflags", "") |
| 31 | + print(f"{e} [{v['_rule']}, {src}]\n {ld}") |
| 32 | +PY |
| 33 | +} |
| 34 | +"$M" --version |
| 35 | + |
| 36 | +# ---------------------------------------------------------------- #771 |
| 37 | +section "771 workspace member's shared library and its build.mcpp link_lib (msvc@system)" |
| 38 | +mkdir -p "$W/ws771/player/src" "$W/ws771/other/src"; cd "$W/ws771" |
| 39 | +cat > mcpp.toml <<'EOF' |
| 40 | +[workspace] |
| 41 | +members = ["player", "other"] |
| 42 | +
|
| 43 | +[toolchain] |
| 44 | +windows = "msvc@system" |
| 45 | +EOF |
| 46 | +cat > player/mcpp.toml <<'EOF' |
| 47 | +[package] |
| 48 | +name = "player" |
| 49 | +version = "0.1.0" |
| 50 | +
|
| 51 | +[targets.player_dll] |
| 52 | +kind = "shared" |
| 53 | +
|
| 54 | +[targets.player] |
| 55 | +kind = "bin" |
| 56 | +main = "src/main.cpp" |
| 57 | +EOF |
| 58 | +cat > player/build.mcpp <<'EOF' |
| 59 | +import mcpp; |
| 60 | +int main() { mcpp::link_lib("ws2_32"); return 0; } |
| 61 | +EOF |
| 62 | +cat > player/src/net.cpp <<'EOF' |
| 63 | +#include <winsock2.h> |
| 64 | +int player_err() { return WSAGetLastError(); } |
| 65 | +EOF |
| 66 | +cat > player/src/main.cpp <<'EOF' |
| 67 | +int player_err(); |
| 68 | +int main() { return player_err() == 0 ? 0 : 0; } |
| 69 | +EOF |
| 70 | +cat > other/mcpp.toml <<'EOF' |
| 71 | +[package] |
| 72 | +name = "other" |
| 73 | +version = "0.1.0" |
| 74 | +
|
| 75 | +[build] |
| 76 | +ldflags = ["/IGNORE:4099"] |
| 77 | +
|
| 78 | +[targets.other] |
| 79 | +kind = "bin" |
| 80 | +main = "src/main.cpp" |
| 81 | +EOF |
| 82 | +printf 'int main() { return 0; }\n' > other/src/main.cpp |
| 83 | +run "$M" build |
| 84 | +edges |
| 85 | +section "771 the same, selecting the member (-p player)" |
| 86 | +rm -rf target; run "$M" build -p player |
| 87 | +edges |
| 88 | + |
| 89 | +# ---------------------------------------------------------------- #770 F6 |
| 90 | +section "770 F6 /GL in cxxflags + default windows_auto_export on a DLL (msvc@system)" |
| 91 | +mkdir -p "$W/gl/src"; cd "$W/gl" |
| 92 | +cat > mcpp.toml <<'EOF' |
| 93 | +[package] |
| 94 | +name = "glprobe" |
| 95 | +version = "0.1.0" |
| 96 | +
|
| 97 | +[toolchain] |
| 98 | +windows = "msvc@system" |
| 99 | +
|
| 100 | +[build] |
| 101 | +cxxflags = ["/GL"] |
| 102 | +ldflags = ["/LTCG"] |
| 103 | +
|
| 104 | +[targets.glprobe] |
| 105 | +kind = "shared" |
| 106 | +EOF |
| 107 | +printf 'int gl_fn(int x) { return x + 1; }\n' > src/gl.cpp |
| 108 | +run "$M" build |
| 109 | + |
| 110 | +section "770 F6b /GL + windows_auto_export = false + __declspec(dllexport)" |
| 111 | +mkdir -p "$W/gl2/src"; cd "$W/gl2" |
| 112 | +cat > mcpp.toml <<'EOF' |
| 113 | +[package] |
| 114 | +name = "glprobe2" |
| 115 | +version = "0.1.0" |
| 116 | +
|
| 117 | +[toolchain] |
| 118 | +windows = "msvc@system" |
| 119 | +
|
| 120 | +[build] |
| 121 | +cxxflags = ["/GL"] |
| 122 | +ldflags = ["/LTCG"] |
| 123 | +
|
| 124 | +[targets.glprobe2] |
| 125 | +kind = "shared" |
| 126 | +windows_auto_export = false |
| 127 | +EOF |
| 128 | +printf '__declspec(dllexport) int gl_fn(int x) { return x + 1; }\n' > src/gl.cpp |
| 129 | +run "$M" build |
| 130 | +dll=$(find target -name 'glprobe2.dll' | head -1); [ -n "$dll" ] && MSYS2_ARG_CONV_EXCL='*' run dumpbin -nologo -exports "$dll" |
| 131 | + |
| 132 | +section "770 lto = true on cl.exe today: what the build line says" |
| 133 | +mkdir -p "$W/lto/src"; cd "$W/lto" |
| 134 | +cat > mcpp.toml <<'EOF' |
| 135 | +[package] |
| 136 | +name = "ltoprobe" |
| 137 | +version = "0.1.0" |
| 138 | +
|
| 139 | +[toolchain] |
| 140 | +windows = "msvc@system" |
| 141 | +
|
| 142 | +[profile.release] |
| 143 | +lto = true |
| 144 | +
|
| 145 | +[targets.ltoprobe] |
| 146 | +kind = "bin" |
| 147 | +main = "src/main.cpp" |
| 148 | +EOF |
| 149 | +printf 'int main() { return 0; }\n' > src/main.cpp |
| 150 | +run "$M" build --release |
| 151 | +n=$(find target -name build.ninja | head -1); grep -n "GL\|LTCG\|flto" "$n" | head -5; echo "(grep done)" |
| 152 | + |
| 153 | +# ---------------------------------------------------------------- #769 / D2 |
| 154 | +section "D2 import std only: is std.compat compiled anyway?" |
| 155 | +mkdir -p "$W/stdonly/src"; cd "$W/stdonly" |
| 156 | +cat > mcpp.toml <<'EOF' |
| 157 | +[package] |
| 158 | +name = "std-only" |
| 159 | +version = "0.1.0" |
| 160 | +standard = "c++23" |
| 161 | +
|
| 162 | +[toolchain] |
| 163 | +windows = "llvm@22.1.8" |
| 164 | +
|
| 165 | +[target.x86_64-windows-msvc] |
| 166 | +sysroot = "msvc@system" |
| 167 | +
|
| 168 | +[targets.std-only] |
| 169 | +kind = "bin" |
| 170 | +main = "src/main.cpp" |
| 171 | +EOF |
| 172 | +printf 'import std;\nint main() { std::vector<int> v{1}; return v.size() == 1 ? 0 : 1; }\n' > src/main.cpp |
| 173 | +run "$M" build |
| 174 | +find "${MCPP_HOME:-$HOME/.mcpp}" -path '*std.compat*' \( -name '*.pcm' -o -name '*.o' -o -name '*.obj' \) 2>/dev/null | head -5 |
| 175 | +echo "(compat artefacts listed above, if any)" |
| 176 | + |
| 177 | +section "769 llvm + MSVC STL: import std.compat" |
| 178 | +mkdir -p "$W/compat/src"; cd "$W/compat" |
| 179 | +cat > mcpp.toml <<'EOF' |
| 180 | +[package] |
| 181 | +name = "std-compat-canary" |
| 182 | +version = "0.1.0" |
| 183 | +standard = "c++23" |
| 184 | +
|
| 185 | +[toolchain] |
| 186 | +windows = "llvm@22.1.8" |
| 187 | +
|
| 188 | +[target.x86_64-windows-msvc] |
| 189 | +sysroot = "msvc@system" |
| 190 | +
|
| 191 | +[targets.std-compat-canary] |
| 192 | +kind = "bin" |
| 193 | +main = "src/main.cpp" |
| 194 | +EOF |
| 195 | +cat > src/main.cpp <<'EOF' |
| 196 | +import std.compat; |
| 197 | +int main() { |
| 198 | + auto* memory = ::malloc(32); |
| 199 | + if (!memory) return 1; |
| 200 | + ::free(memory); |
| 201 | + std::vector<int> values{1, 2, 3}; |
| 202 | + ::printf("compat=%zu\n", values.size()); |
| 203 | + return values.size() == 3 ? 0 : 1; |
| 204 | +} |
| 205 | +EOF |
| 206 | +run "$M" build |
| 207 | +run "$M" run |
0 commit comments