@@ -123,42 +123,41 @@ esac
123123RC_TOOL=$( sed -n ' s/^rc *= *//p' " $BUILD_DIR /build.ninja" | head -1)
124124[ -n " $RC_TOOL " ] || fail " no 'rc =' binding in build.ninja" " $BUILD_DIR /build.ninja"
125125
126+ # Two routes, TRIED in order rather than dispatched on the tool's name: GNU
127+ # binutils' windres round-trips, `llvm-windres` does not (it only wraps llvm-rc,
128+ # one way) — and both answer to `*windres*`, so the name tells you nothing. Only
129+ # when NEITHER route exists is this a hard failure; silently skipping the
130+ # assertion is how #365 shipped in the first place.
131+ #
126132# $1 = file to inspect, $2 = log suffix, $3 = "ordinal" | "string"
127133version_name_is () {
128134 case " $3 " in
129- ordinal) _want=' ^[[:space:]]*1[[:space:]]+VERSIONINFO' ;;
130- string) _want=' "VS_VERSION_INFO"[[:space:]]+VERSIONINFO' ;;
135+ ordinal) _want=' ^[[:space:]]*1[[:space:]]+VERSIONINFO' ; _n= ' Name: (ID 1) ' ; ;
136+ string) _want=' "VS_VERSION_INFO"[[:space:]]+VERSIONINFO' ; _n= ' Name: VS_VERSION_INFO ' ; ;
131137 esac
132- case " $RC_TOOL " in
133- * windres* )
134- " $RC_TOOL " -J coff -O rc -i " $1 " -o " rt.$2 .rc" 2> " rt.$2 .err" \
135- || fail " windres could not read back $1 " " rt.$2 .err"
136- grep -qiE ' VERSIONINFO' " rt.$2 .rc" \
137- || fail " $1 carries no version resource at all" " rt.$2 .rc"
138+
139+ # Route 1 — windres back to rc SOURCE. Readable, and no PE parser needed.
140+ if [ -n " $RC_TOOL " ] \
141+ && " $RC_TOOL " -J coff -O rc -i " $1 " -o " rt.$2 .rc" 2> " rt.$2 .err" \
142+ && grep -qiE ' VERSIONINFO' " rt.$2 .rc" ; then
138143 grep -qE " $_want " " rt.$2 .rc" \
139144 || fail " expected the version resource to be named by $3 in $1 " " rt.$2 .rc"
140- ;;
141- * )
142- # rc.exe / llvm-rc cannot read back, so use llvm-readobj — which ships
143- # with the LLVM payload that IS the default Windows toolchain, i.e. the
144- # only configuration that reaches this branch. Same discriminator, in
145- # the resource directory: `Name: (ID 1)` vs `Name: VS_VERSION_INFO`.
146- READOBJ=$( ls " $MCPP_HOME " /registry/data/xpkgs/xim-x-llvm/* /bin/llvm-readobj \
147- " $MCPP_HOME " /registry/data/xpkgs/xim-x-llvm/* /bin/llvm-readobj.exe \
148- 2> /dev/null | head -1)
149- [ -n " $READOBJ " ] || fail " no way to read back $1 (no windres, no llvm-readobj) — silently skipping this assertion is how #365 shipped" b1.log
150- " $READOBJ " --coff-resources " $1 " > " readobj.$2 .log" 2>&1 \
151- || fail " llvm-readobj could not read $1 " " readobj.$2 .log"
152- grep -q ' Type: VERSIONINFO' " readobj.$2 .log" \
153- || fail " $1 carries no version resource at all" " readobj.$2 .log"
154- case " $3 " in ordinal) _n=' Name: (ID 1)' ;; string) _n=' Name: VS_VERSION_INFO' ;; esac
155- # The window is the VERSIONINFO type table only — an icon is also
156- # `(ID 1)`, so matching anywhere in the file would pass for the wrong
157- # reason.
158- grep -A5 ' Type: VERSIONINFO' " readobj.$2 .log" | grep -qF " $_n " \
159- || fail " expected the version resource to be named by $3 in $1 " " readobj.$2 .log"
160- ;;
161- esac
145+ return 0
146+ fi
147+
148+ # Route 2 — the resource DIRECTORY, via llvm-readobj.
149+ READOBJ=$( ls " $MCPP_HOME " /registry/data/xpkgs/xim-x-llvm/* /bin/llvm-readobj \
150+ " $MCPP_HOME " /registry/data/xpkgs/xim-x-llvm/* /bin/llvm-readobj.exe \
151+ 2> /dev/null | head -1)
152+ [ -n " $READOBJ " ] || fail " no way to read back $1 : '$RC_TOOL ' cannot round-trip and no llvm-readobj was found under $MCPP_HOME " " rt.$2 .err"
153+ " $READOBJ " --coff-resources " $1 " > " readobj.$2 .log" 2>&1 \
154+ || fail " llvm-readobj could not read $1 " " readobj.$2 .log"
155+ grep -q ' Type: VERSIONINFO' " readobj.$2 .log" \
156+ || fail " $1 carries no version resource at all" " readobj.$2 .log"
157+ # The window is the VERSIONINFO type table only — an icon is also `(ID 1)`,
158+ # so matching anywhere in the file would pass for the wrong reason.
159+ grep -A5 ' Type: VERSIONINFO' " readobj.$2 .log" | grep -qF " $_n " \
160+ || fail " expected the version resource to be named by $3 in $1 " " readobj.$2 .log"
162161}
163162version_name_is " $RES_ART " art ordinal
164163
0 commit comments