From 75196b99fbd3397ccb7960b6e7ad7c40efef2315 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Mon, 11 Apr 2022 11:01:34 -0400 Subject: [llvm-lib] Add /WX, warn by default on empty inputs, add opt-out lib.exe by default exits successfully without writing an output file when no inputs are passed. llvm-lib has the same behavior, for compatibility. This behavior interacts poorly with build systems: If a static library target had no inputs, llvm-lib would not produce an output file, causing ninja (or make, or a similar system) to successfully run that step, but then re-run it on the next build. After this patch, llvm-lib emits a warning in this case, that with /WX can be turned into an error. That way, ninja (or make, or...) will mark the initial build as failed. People who don't like the warning can use /ignore:emptyoutput to suppress it. The warning also points out the existing flag /llvmlibempty which forces creation of an empty .lib file (this is an extension to lib.exe). Differential Revision: https://reviews.llvm.org/D123517 --- llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) (limited to 'llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp') diff --git a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp index 8f69282..7ecde3c 100644 --- a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp +++ b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp @@ -229,10 +229,11 @@ static void appendFile(std::vector &Members, (Magic == file_magic::coff_object) ? getCOFFFileMachine(MB) : getBitcodeFileMachine(MB); if (!MaybeFileMachine) { - handleAllErrors(MaybeFileMachine.takeError(), [&](const ErrorInfoBase &EIB) { - llvm::errs() << MB.getBufferIdentifier() << ": " << EIB.message() - << "\n"; - }); + handleAllErrors(MaybeFileMachine.takeError(), + [&](const ErrorInfoBase &EIB) { + llvm::errs() << MB.getBufferIdentifier() << ": " + << EIB.message() << "\n"; + }); exit(1); } COFF::MachineTypes FileMachine = *MaybeFileMachine; @@ -291,10 +292,25 @@ int llvm::libDriverMain(ArrayRef ArgsArr) { return 0; } + // Parse /ignore: + llvm::StringSet<> IgnoredWarnings; + for (auto *Arg : Args.filtered(OPT_ignore)) + IgnoredWarnings.insert(Arg->getValue()); + // If no input files and not told otherwise, silently do nothing to match // lib.exe - if (!Args.hasArgNoClaim(OPT_INPUT) && !Args.hasArg(OPT_llvmlibempty)) + if (!Args.hasArgNoClaim(OPT_INPUT) && !Args.hasArg(OPT_llvmlibempty)) { + if (!IgnoredWarnings.contains("emptyoutput")) { + llvm::errs() << "warning: no input files, not writing output file\n"; + llvm::errs() << " pass /llvmlibempty to write empty .lib file,\n"; + llvm::errs() << " pass /ignore:emptyoutput to suppress warning\n"; + if (Args.hasFlag(OPT_WX, OPT_WX_no, false)) { + llvm::errs() << "treating warning as error due to /WX\n"; + return 1; + } + } return 0; + } if (Args.hasArg(OPT_lst)) { doList(Args); -- cgit v1.1