| # Run "cmake -E __create_def" on the checked-in object files and compare the | |
| # generated .def files with the expected ones. The object files are compiled | |
| # for Windows but are read on every host, so this checks that the COFF symbol | |
| # table backend used on Windows hosts and the nm backend used on other | |
| # hosts export the same symbols. | |
| # | |
| # The object files were generated from CreateDef/fixture.cxx with | |
| # | |
| # clang-cl --target=<arch>-pc-windows-msvc /c /GR- /EHs- /Os /Zl -nostdinc \ | |
| # CreateDef/fixture.cxx /Fo:CreateDef/fixture-<arch>.obj | |
| # | |
| # once per architecture. | |
| set(failed "") | |
| foreach(arch IN ITEMS x86_64 i386 arm64ec) | |
| set(objlist "${bin}/${arch}-objects.txt") | |
| set(def "${bin}/${arch}.def") | |
| file(WRITE "${objlist}" "${src}/CreateDef/fixture-${arch}.obj\n") | |
| file(REMOVE "${def}") | |
| execute_process( | |
| COMMAND ${cmake} -E __create_def "${def}" "${objlist}" ${nm} | |
| RESULT_VARIABLE result | |
| OUTPUT_VARIABLE output | |
| ERROR_VARIABLE output | |
| ) | |
| if(NOT result EQUAL 0) | |
| string(APPEND failed | |
| "__create_def failed for ${arch}: ${result}\n${output}") | |
| continue() | |
| endif() | |
| file(READ "${def}" actual) | |
| file(READ "${src}/CreateDef/fixture-${arch}.def" expect) | |
| # Compare ignoring trailing whitespace, which __create_def emits. | |
| string(REGEX REPLACE "[ \t\r]+\n" "\n" actual "${actual}") | |
| string(REGEX REPLACE "[ \t\r]+\n" "\n" expect "${expect}") | |
| if(NOT actual STREQUAL expect) | |
| string(APPEND failed | |
| "Wrong exports for ${arch}.\n" | |
| "Expected:\n${expect}\n" | |
| "Actual:\n${actual}\n") | |
| endif() | |
| endforeach() | |
| if(failed) | |
| message(FATAL_ERROR "${failed}") | |
| endif() |