From 6a961306c982c838114a0a83d2846051ffc80a36 Mon Sep 17 00:00:00 2001 From: Simone Date: Sun, 3 May 2026 01:19:13 +0200 Subject: [PATCH] build(linux): introduce overlay makefile infrastructure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces the per-version in-tree build files with a shared overlay that keeps all project-owned build infrastructure outside the vendor source trees, making it safe to use vendor directories as pristine git submodules. Changes: - Add tools/linux/overlay/makefile.gcc: parameterised makefile that drives MinGW cross-compilation; VENDOR_7ZIP, DEF_FILE and NSIS_DIR are all overridable from the command line so no files are written into the vendor tree at build time. - Add tools/linux/overlay/include/: case-sensitivity shim headers (Windows.h, CommCtrl.h, MAPI.h, NTSecAPI.h, Psapi.h, ShlObj.h) that redirect to the lowercase MinGW system headers; also adds z7_idecl_noexcept_strip.h which resolves the noexcept-specifier mismatch in 7-zip 25.01 NSIS UI code. - Move Nsis7z.def from versions/26.00/…/Bundles/Nsis7z/ to overlay/ (git rename; content unchanged). - Delete versions/26.00/…/Bundles/Nsis7z/makefile.gcc (superseded by the overlay). - Rewrite tools/linux/build_plugin_linux.py to drive the overlay makefile, support multiple 7-zip versions (25.01, 26.00, 26.01, zstd) with a VERSION_LAYOUT table, and add NSIS_DIR auto-detection for bundle-based builds. - Add _linux_build/ to .gitignore. --- .gitignore | 1 + tools/linux/build_plugin_linux.py | 120 ++++++++++++++---- .../Nsis7z => tools/linux/overlay}/Nsis7z.def | 0 tools/linux/overlay/include/CommCtrl.h | 3 + tools/linux/overlay/include/MAPI.h | 3 + tools/linux/overlay/include/NTSecAPI.h | 3 + tools/linux/overlay/include/Psapi.h | 3 + tools/linux/overlay/include/ShlObj.h | 3 + tools/linux/overlay/include/Windows.h | 3 + .../overlay/include/z7_idecl_noexcept_strip.h | 33 +++++ tools/linux/overlay/makefile.gcc | 115 +++++++++++++++++ .../CPP/7zip/Bundles/Nsis7z/makefile.gcc | 97 -------------- 12 files changed, 262 insertions(+), 122 deletions(-) rename {versions/26.00/CPP/7zip/Bundles/Nsis7z => tools/linux/overlay}/Nsis7z.def (100%) create mode 100644 tools/linux/overlay/include/CommCtrl.h create mode 100644 tools/linux/overlay/include/MAPI.h create mode 100644 tools/linux/overlay/include/NTSecAPI.h create mode 100644 tools/linux/overlay/include/Psapi.h create mode 100644 tools/linux/overlay/include/ShlObj.h create mode 100644 tools/linux/overlay/include/Windows.h create mode 100644 tools/linux/overlay/include/z7_idecl_noexcept_strip.h create mode 100644 tools/linux/overlay/makefile.gcc delete mode 100644 versions/26.00/CPP/7zip/Bundles/Nsis7z/makefile.gcc diff --git a/.gitignore b/.gitignore index abf2a6b..24f240d 100644 --- a/.gitignore +++ b/.gitignore @@ -64,3 +64,4 @@ tools/check_*.py # Plugin-specific versions/*/CPP/7zip/*/Release/ versions/*/CPP/7zip/*/x64/ +_linux_build/ diff --git a/tools/linux/build_plugin_linux.py b/tools/linux/build_plugin_linux.py index 22ffe46..034f269 100644 --- a/tools/linux/build_plugin_linux.py +++ b/tools/linux/build_plugin_linux.py @@ -2,7 +2,11 @@ """Linux build path for nsis7z plugin. Builds Windows DLL artifacts from Linux using MinGW-w64 cross compilers. -Current support: 7-Zip 26.00. +Supported versions: 7-Zip 25.01, 26.00 and zstd. + +All project-owned build-infrastructure files (makefile.gcc, Nsis7z.def) live +under tools/linux/overlay/ and are never written into the vendor source trees. +Build artifacts go to _linux_build/// (gitignored). """ from __future__ import annotations @@ -15,7 +19,56 @@ from pathlib import Path ROOT = Path(__file__).resolve().parents[2] -SUPPORTED = {"26.00"} +OVERLAY = ROOT / "tools" / "linux" / "overlay" +BUILD_DIR = ROOT / "_linux_build" + +SUPPORTED = {"25.01", "26.00", "26.01", "zstd"} + +# For 25.01/26.00 the vendor bundle dir already contains our wrapper .cpp +# files alongside the upstream 7-zip sources. make is run with -C pointing +# there so relative paths (../../UI/…) resolve correctly, but the makefile +# itself comes from OVERLAY and the output objects go to BUILD_DIR. +# +# For zstd the 7-zip C++ sources live in the 7-zip-zstd submodule while our +# NSIS wrapper sits in versions/zstd/. make is run with -C pointing to the +# wrapper dir and VENDOR_7ZIP overridden to the submodule tree so that +# include/source rules resolve correctly without touching the submodule. +VERSION_LAYOUT = { + "25.01": { + "vendor_7zip": ROOT / "versions" / "25.01" / "CPP" / "7zip", + "bundle_dir": ROOT / "versions" / "25.01" / "CPP" / "7zip" / "Bundles" / "Nsis7z", + }, + "26.00": { + "vendor_7zip": ROOT / "versions" / "26.00" / "CPP" / "7zip", + "bundle_dir": ROOT / "versions" / "26.00" / "CPP" / "7zip" / "Bundles" / "Nsis7z", + }, + "26.01": { + "vendor_7zip": ROOT / "versions" / "26.01" / "CPP" / "7zip", + "bundle_dir": ROOT / "versions" / "26.01-bundle" / "CPP" / "7zip" / "Bundles" / "Nsis7z", + }, + # zstd: make runs in our wrapper dir; vendor_7zip points to submodule tree. + "zstd": { + "vendor_7zip": ROOT / "versions" / "7-zip-zstd" / "CPP" / "7zip", + "bundle_dir": ROOT / "versions" / "zstd" / "CPP" / "7zip" / "Bundles" / "Nsis7z", + }, +} + +# Per-version C++-only extra flags for GCC/MinGW cross-compilation. +# These compensate for vendor code written exclusively for MSVC. +# Passed via LOCAL_CXXFLAGS_EXTRA → appended to CXXFLAGS only (not CFLAGS). +# +# If flag-based suppression is insufficient (e.g. the code must be modified), +# place a patched copy at tools/linux/overlay/src// +# and add a rule override in makefile.gcc using the OVERLAY_SRC variable. +VERSION_EXTRA_CXXFLAGS: dict[str, str] = { + # 7-zip 25.01 NSIS UI code was never compiled with GCC: + # - STDMETHODIMP implementations lack `noexcept`/`throw()` while the COM + # interface macros (Z7_COM7F_IMP) declare the virtuals with `throw()` + # (= noexcept in C++17). Fixed per-TU via -include z7_idecl_noexcept_strip.h + # in the specific makefile rule for NsisExtractCallbackConsole.o. + # - Several unused parameters and sign-compare on UInt64 vs. literal -1. + "25.01": "-Wno-sign-compare -Wno-unused-parameter", +} CONFIGS = { "x86-ansi": { @@ -63,17 +116,18 @@ def _build_one( clean: bool, cleanup_artifacts: bool, ) -> int: + layout = VERSION_LAYOUT[zip_version] + vendor_7zip = layout["vendor_7zip"] + bundle_dir = layout["bundle_dir"] + cfg = CONFIGS[cfg_name] triplet = cfg["triplet"] - bundle_dir = ROOT / "versions" / zip_version / "CPP" / "7zip" / "Bundles" / "Nsis7z" - cpp_root = ROOT / "versions" / zip_version / "CPP" - makefile = bundle_dir / "makefile.gcc" - if not makefile.exists(): - print(f"ERROR: Linux makefile not found: {makefile}", file=sys.stderr) - return 1 + # Output objects go to an absolute path under _linux_build/ so nothing + # temporary is ever written into the vendor source trees. + out_dir = BUILD_DIR / zip_version / cfg_name + out_dir.mkdir(parents=True, exist_ok=True) - out_obj = f"_o_{cfg_name.replace('-', '_')}" local_flags = "-DNDEBUG" if cfg["unicode"]: local_flags += " -DUNICODE -D_UNICODE" @@ -82,11 +136,30 @@ def _build_one( # build so that LPTSTR resolves to char* consistently in all TUs. local_flags += " -DZ7_NO_UNICODE" + # Version-specific workarounds for vendor code that was MSVC-only. + # Flags that are C++-only (e.g. -fpermissive) must go into LOCAL_CXXFLAGS_EXTRA + # which the makefile appends only to CXXFLAGS, not to CFLAGS. + extra_cxx = VERSION_EXTRA_CXXFLAGS.get(zip_version, "") + + # CXX_INCLUDE_FLAGS: + # 1. overlay/include – case-sensitivity shims (Windows.h → windows.h, …) + # searched first so they shadow the actual MinGW system headers. + # 2. CPP root – so vendor #include paths resolve from any working dir. + cpp_root = vendor_7zip.parent # …/CPP + overlay_inc = OVERLAY / "include" + + # For bundle-based builds (zstd, 26.01) the UI/NSIS wrapper files live in + # our bundle dir, not in the vendor tree. Override NSIS_DIR accordingly. + bundle_nsis = bundle_dir.parent.parent / "UI" / "NSIS" + base_cmd = [ "make", - "-f", - "makefile.gcc", - f"O={out_obj}", + "-C", str(bundle_dir), + "-f", str(OVERLAY / "makefile.gcc"), + f"O={out_dir}", + f"DEF_FILE={OVERLAY / 'Nsis7z.def'}", + f"VENDOR_7ZIP={vendor_7zip}", + *([ f"NSIS_DIR={bundle_nsis}" ] if bundle_nsis.is_dir() else []), "SystemDrive=1", "IS_MINGW=1", "MSYSTEM=LINUX", @@ -95,7 +168,12 @@ def _build_one( f"CXX={triplet}-g++", f"RC={triplet}-windres", f"LOCAL_FLAGS_EXTRA={local_flags} -Wno-unknown-pragmas", - f"CXX_INCLUDE_FLAGS=-I{cpp_root}", + f"LOCAL_CXXFLAGS_EXTRA={extra_cxx}", + # Linux ld is case-sensitive; vendor makefile uses mixed-case lib names + # (lUser32, lOle32, …) that don't exist on disk. Override LIB2 with + # fully-expanded lowercase equivalents. + "LIB2=-loleaut32 -luuid -ladvapi32 -luser32 -lole32 -lgdi32 -lcomctl32 -lcomdlg32 -lshell32 -lhtmlhelp", + f"CXX_INCLUDE_FLAGS=-I{overlay_inc} -I{cpp_root}", ] build_mode = "clean build" if clean else "incremental build" @@ -113,7 +191,7 @@ def _build_one( if proc.returncode != 0: return proc.returncode - built = bundle_dir / out_obj / "nsis7z.dll" + built = out_dir / "nsis7z.dll" if not built.exists(): print(f"ERROR: expected artifact not found: {built}", file=sys.stderr) return 1 @@ -123,12 +201,12 @@ def _build_one( shutil.copy2(built, dest) if cleanup_artifacts: - shutil.rmtree(bundle_dir / out_obj, ignore_errors=True) + shutil.rmtree(out_dir, ignore_errors=True) if verbose: print(f"[linux] Copied -> {dest}") if cleanup_artifacts: - print(f"[linux] Cleaned build artifacts -> {bundle_dir / out_obj}") + print(f"[linux] Cleaned build artifacts -> {out_dir}") return 0 @@ -137,7 +215,7 @@ def main() -> int: parser.add_argument( "--7zip-version", dest="zip_version", - choices=["19.00", "25.01", "26.00", "zstd"], + choices=sorted(SUPPORTED), default="26.00", help="7-Zip version to build", ) @@ -180,14 +258,6 @@ def main() -> int: parser.add_argument("--verbose", action="store_true", help="Verbose output") args = parser.parse_args() - if args.zip_version not in SUPPORTED: - print( - "ERROR: Linux local build is currently supported only for 26.00. " - f"Requested: {args.zip_version}", - file=sys.stderr, - ) - return 2 - _require_tool("make") for cfg in CONFIGS.values(): _require_tool(f"{cfg['triplet']}-gcc") diff --git a/versions/26.00/CPP/7zip/Bundles/Nsis7z/Nsis7z.def b/tools/linux/overlay/Nsis7z.def similarity index 100% rename from versions/26.00/CPP/7zip/Bundles/Nsis7z/Nsis7z.def rename to tools/linux/overlay/Nsis7z.def diff --git a/tools/linux/overlay/include/CommCtrl.h b/tools/linux/overlay/include/CommCtrl.h new file mode 100644 index 0000000..27ae447 --- /dev/null +++ b/tools/linux/overlay/include/CommCtrl.h @@ -0,0 +1,3 @@ +/* Linux/MinGW cross-build shim: CommCtrl.h → commctrl.h */ +#pragma GCC system_header +#include diff --git a/tools/linux/overlay/include/MAPI.h b/tools/linux/overlay/include/MAPI.h new file mode 100644 index 0000000..77c8dec --- /dev/null +++ b/tools/linux/overlay/include/MAPI.h @@ -0,0 +1,3 @@ +/* Linux/MinGW cross-build shim: MAPI.h → mapi.h */ +#pragma GCC system_header +#include diff --git a/tools/linux/overlay/include/NTSecAPI.h b/tools/linux/overlay/include/NTSecAPI.h new file mode 100644 index 0000000..65219b6 --- /dev/null +++ b/tools/linux/overlay/include/NTSecAPI.h @@ -0,0 +1,3 @@ +/* Linux/MinGW cross-build shim: NTSecAPI.h → ntsecapi.h */ +#pragma GCC system_header +#include diff --git a/tools/linux/overlay/include/Psapi.h b/tools/linux/overlay/include/Psapi.h new file mode 100644 index 0000000..edb1cd5 --- /dev/null +++ b/tools/linux/overlay/include/Psapi.h @@ -0,0 +1,3 @@ +/* Linux/MinGW cross-build shim: Psapi.h → psapi.h */ +#pragma GCC system_header +#include diff --git a/tools/linux/overlay/include/ShlObj.h b/tools/linux/overlay/include/ShlObj.h new file mode 100644 index 0000000..b1e0f49 --- /dev/null +++ b/tools/linux/overlay/include/ShlObj.h @@ -0,0 +1,3 @@ +/* Linux/MinGW cross-build shim: ShlObj.h → shlobj.h */ +#pragma GCC system_header +#include diff --git a/tools/linux/overlay/include/Windows.h b/tools/linux/overlay/include/Windows.h new file mode 100644 index 0000000..0ce95e0 --- /dev/null +++ b/tools/linux/overlay/include/Windows.h @@ -0,0 +1,3 @@ +/* Linux/MinGW cross-build shim: Windows.h → windows.h */ +#pragma GCC system_header +#include diff --git a/tools/linux/overlay/include/z7_idecl_noexcept_strip.h b/tools/linux/overlay/include/z7_idecl_noexcept_strip.h new file mode 100644 index 0000000..e759738 --- /dev/null +++ b/tools/linux/overlay/include/z7_idecl_noexcept_strip.h @@ -0,0 +1,33 @@ +#pragma GCC system_header +/* + * Linux/MinGW cross-build shim for 7-zip 25.01 UI/NSIS sources. + * + * In 25.01, IDecl.h defines Z7_COM7F_E as throw(). Under GCC/C++17, + * throw() is treated as noexcept, causing a hard "different exception + * specifier" error when STDMETHODIMP out-of-class definitions (which carry + * no exception spec) are compiled against class declarations that used the + * noexcept-bearing Z7_COM7F_IMF macro. + * + * Strategy (no vendor files modified): + * 1. Include IDecl.h now so its include guard (ZIP7_INC_IDECL_H) is set. + * Subsequent indirect includes of IDecl.h from the source file will be + * no-ops. + * 2. Immediately undefine Z7_COM7F_E and redefine it as empty. + * Because the preprocessor expands macros lazily (at use site, not at + * definition site), all Z7_COM7F_IMF / Z7_COM7F_EO usages that follow + * will pick up the empty definition, producing declarations with no + * exception specifier — matching the STDMETHODIMP definitions. + */ +#include "7zip/IDecl.h" /* searched via -I$(CPP_ROOT); resolves to versions//CPP/7zip/IDecl.h */ + +#undef Z7_COM7F_E +#define Z7_COM7F_E /* empty – no exception specifier */ + +/* Cascade: Z7_COM7F_EO and Z7_COM7F_EOF reference Z7_COM7F_E by name, + * so they pick it up automatically. Redefine them explicitly to avoid + * "macro redefined" warnings if they were already expanded anywhere. */ +#undef Z7_COM7F_EO +#define Z7_COM7F_EO Z7_COM7F_E Z7_override + +#undef Z7_COM7F_EOF +#define Z7_COM7F_EOF Z7_COM7F_EO Z7_final diff --git a/tools/linux/overlay/makefile.gcc b/tools/linux/overlay/makefile.gcc new file mode 100644 index 0000000..f713ebe --- /dev/null +++ b/tools/linux/overlay/makefile.gcc @@ -0,0 +1,115 @@ +PROG = nsis7z + +# Path to the vendor CPP/7zip tree. Override from the command line for +# out-of-tree builds (e.g. zstd variant whose sources live in a separate +# submodule directory): +# make -f .../overlay/makefile.gcc VENDOR_7ZIP=/abs/path/7-zip-zstd/CPP/7zip +VENDOR_7ZIP ?= ../.. + +# Path to the UI/NSIS source directory. For versions where NSIS files live +# in the vendor tree this defaults to $(VENDOR_7ZIP)/UI/NSIS. Override for +# bundle-based builds (zstd, 26.01) where UI/NSIS lives in our wrapper dir. +NSIS_DIR ?= $(VENDOR_7ZIP)/UI/NSIS + +# DEF file path – may be overridden to an absolute path so that this +# makefile can be used with -f without writing anything into the vendor tree. +DEF_FILE ?= Nsis7z.def + +include $(VENDOR_7ZIP)/Bundles/Format7zF/Arc_gcc.mak + +ifdef IS_MINGW +LOCAL_FLAGS_SYS = -DZ7_DEVICE_FILE +SYS_OBJS = \ + $O/DLL.o \ + $O/DllSecur.o \ + $O/resource.o \ + +else +SYS_OBJS = \ + $O/MyWindows.o \ + +endif + +LOCAL_FLAGS += \ + $(LOCAL_FLAGS_SYS) \ + $(LOCAL_FLAGS_EXTRA) \ + +# C++-only extra flags (e.g. -fpermissive for MSVC-only code). +# Appended to CXXFLAGS_EXTRA which is used exclusively by the C++ compiler. +CXXFLAGS_EXTRA += $(LOCAL_CXXFLAGS_EXTRA) + +NSIS_UI_OBJS = \ + $O/NsisMain.o \ + $O/NsisMainAr.o \ + $O/NsisBreak.o \ + $O/NsisExtractCallbackConsole.o \ + $O/NsisUserInputUtils2.o \ + $O/ConsoleOpenCallbackConsole.o \ + $O/ConsolePercentPrinter.o \ + $O/ConsoleClose.o \ + $O/ConsoleUserInputUtils.o \ + $O/Extract.o \ + $O/HashCalc.o \ + $O/OpenArchive.o \ + $O/ArchiveExtractCallback.o \ + $O/ArchiveOpenCallback.o \ + $O/DefaultName.o \ + $O/EnumDirItems.o \ + $O/ExtractingFilePath.o \ + $O/LoadCodecs.o \ + $O/SetProperties.o \ + $O/FileStreams.o \ + $O/FileSystem.o \ + $O/ErrorMsg.o \ + $O/FileLink.o \ + $O/FilePathAutoRename.o \ + $O/SortUtils.o \ + $O/PropIDUtils.o \ + +CURRENT_OBJS = \ + $O/StdInStream.o \ + $O/StdOutStream.o \ + $O/StdAfx2.o \ + $O/pluginapi.o \ + $O/nsis7z.o \ + +OBJS = \ + $(ARC_OBJS) \ + $(SYS_OBJS) \ + $(NSIS_UI_OBJS) \ + $(CURRENT_OBJS) \ + +include $(VENDOR_7ZIP)/7zip_gcc.mak + +$O/NsisMain.o: $(NSIS_DIR)/Main.cpp + $(CXX) $(CXXFLAGS) $< + +$O/NsisMainAr.o: $(NSIS_DIR)/MainAr.cpp + $(CXX) $(CXXFLAGS) $< + +$O/NsisBreak.o: $(NSIS_DIR)/NSISBreak.cpp + $(CXX) $(CXXFLAGS) $< + +$O/NsisExtractCallbackConsole.o: $(NSIS_DIR)/ExtractCallbackConsole.cpp + $(CXX) $(CXXFLAGS) -include z7_idecl_noexcept_strip.h $< + +$O/NsisUserInputUtils2.o: $(NSIS_DIR)/UserInputUtils2.cpp + $(CXX) $(CXXFLAGS) $< + +$O/ConsoleOpenCallbackConsole.o: $(VENDOR_7ZIP)/UI/Console/OpenCallbackConsole.cpp + $(CXX) $(CXXFLAGS) $< + +$O/ConsolePercentPrinter.o: $(VENDOR_7ZIP)/UI/Console/PercentPrinter.cpp + $(CXX) $(CXXFLAGS) $< + +$O/ConsoleUserInputUtils.o: $(VENDOR_7ZIP)/UI/Console/UserInputUtils.cpp + $(CXX) $(CXXFLAGS) $< + +$O/StdAfx2.o: StdAfx2.cpp + $(CXX) $(CXXFLAGS) $< + +$O/pluginapi.o: pluginapi.cpp + $(CXX) $(CXXFLAGS) $< + +$O/nsis7z.o: nsis7z.cpp + $(CXX) $(CXXFLAGS) $< diff --git a/versions/26.00/CPP/7zip/Bundles/Nsis7z/makefile.gcc b/versions/26.00/CPP/7zip/Bundles/Nsis7z/makefile.gcc deleted file mode 100644 index d397c04..0000000 --- a/versions/26.00/CPP/7zip/Bundles/Nsis7z/makefile.gcc +++ /dev/null @@ -1,97 +0,0 @@ -PROG = nsis7z -DEF_FILE = Nsis7z.def - -include ../Format7zF/Arc_gcc.mak - -ifdef IS_MINGW -LOCAL_FLAGS_SYS = -DZ7_DEVICE_FILE -SYS_OBJS = \ - $O/DLL.o \ - $O/DllSecur.o \ - $O/resource.o \ - -else -SYS_OBJS = \ - $O/MyWindows.o \ - -endif - -LOCAL_FLAGS += \ - $(LOCAL_FLAGS_SYS) \ - $(LOCAL_FLAGS_EXTRA) \ - -NSIS_UI_OBJS = \ - $O/NsisMain.o \ - $O/NsisMainAr.o \ - $O/NsisBreak.o \ - $O/NsisExtractCallbackConsole.o \ - $O/NsisUserInputUtils2.o \ - $O/ConsoleOpenCallbackConsole.o \ - $O/ConsolePercentPrinter.o \ - $O/ConsoleClose.o \ - $O/ConsoleUserInputUtils.o \ - $O/Extract.o \ - $O/HashCalc.o \ - $O/OpenArchive.o \ - $O/ArchiveExtractCallback.o \ - $O/ArchiveOpenCallback.o \ - $O/DefaultName.o \ - $O/EnumDirItems.o \ - $O/ExtractingFilePath.o \ - $O/LoadCodecs.o \ - $O/SetProperties.o \ - $O/FileStreams.o \ - $O/FileSystem.o \ - $O/ErrorMsg.o \ - $O/FileLink.o \ - $O/FilePathAutoRename.o \ - $O/SortUtils.o \ - $O/PropIDUtils.o \ - -CURRENT_OBJS = \ - $O/StdInStream.o \ - $O/StdOutStream.o \ - $O/StdAfx2.o \ - $O/pluginapi.o \ - $O/nsis7z.o \ - -OBJS = \ - $(ARC_OBJS) \ - $(SYS_OBJS) \ - $(NSIS_UI_OBJS) \ - $(CURRENT_OBJS) \ - -include ../../7zip_gcc.mak - -$O/NsisMain.o: ../../UI/NSIS/Main.cpp - $(CXX) $(CXXFLAGS) $< - -$O/NsisMainAr.o: ../../UI/NSIS/MainAr.cpp - $(CXX) $(CXXFLAGS) $< - -$O/NsisBreak.o: ../../UI/NSIS/NSISBreak.cpp - $(CXX) $(CXXFLAGS) $< - -$O/NsisExtractCallbackConsole.o: ../../UI/NSIS/ExtractCallbackConsole.cpp - $(CXX) $(CXXFLAGS) $< - -$O/NsisUserInputUtils2.o: ../../UI/NSIS/UserInputUtils2.cpp - $(CXX) $(CXXFLAGS) $< - -$O/ConsoleOpenCallbackConsole.o: ../../UI/Console/OpenCallbackConsole.cpp - $(CXX) $(CXXFLAGS) $< - -$O/ConsolePercentPrinter.o: ../../UI/Console/PercentPrinter.cpp - $(CXX) $(CXXFLAGS) $< - -$O/ConsoleUserInputUtils.o: ../../UI/Console/UserInputUtils.cpp - $(CXX) $(CXXFLAGS) $< - -$O/StdAfx2.o: StdAfx2.cpp - $(CXX) $(CXXFLAGS) $< - -$O/pluginapi.o: pluginapi.cpp - $(CXX) $(CXXFLAGS) $< - -$O/nsis7z.o: nsis7z.cpp - $(CXX) $(CXXFLAGS) $<