From bc0213403ea3d024f7547812da00f5c29a64e978 Mon Sep 17 00:00:00 2001 From: Egor Pugin Date: Thu, 23 May 2024 22:55:43 +0300 Subject: [PATCH] Initial ObjectLibrary libraries. --- src/sw/driver/sw.h | 2 + src/sw/driver/target/base.h | 2 + src/sw/driver/target/enums.h | 1 + src/sw/driver/target/native.cpp | 93 +++++++++++++++++++++++++++------ src/sw/driver/target/native.h | 18 +++++++ src/sw/driver/types.h | 1 + 6 files changed, 101 insertions(+), 16 deletions(-) diff --git a/src/sw/driver/sw.h b/src/sw/driver/sw.h index e21e3a5e0..fdad08ee4 100644 --- a/src/sw/driver/sw.h +++ b/src/sw/driver/sw.h @@ -76,6 +76,7 @@ using sw::LibraryTarget; using sw::StaticLibraryTarget; using sw::SharedLibraryTarget; using sw::ExecutableTarget; +using sw::ObjectLibraryTarget; // new aliases using Project = ProjectTarget; // deprecate? @@ -83,6 +84,7 @@ using Library = LibraryTarget; using StaticLibrary = StaticLibraryTarget; using SharedLibrary = SharedLibraryTarget; using Executable = ExecutableTarget; +using ObjectLibrary = ObjectLibraryTarget; // other langs using sw::CSharpTarget; diff --git a/src/sw/driver/target/base.h b/src/sw/driver/target/base.h index 017d674da..00dfa7729 100644 --- a/src/sw/driver/target/base.h +++ b/src/sw/driver/target/base.h @@ -45,6 +45,7 @@ struct ExecutableTarget; struct LibraryTarget; struct StaticLibraryTarget; struct SharedLibraryTarget; +struct ObjectLibraryTarget; struct Test; @@ -153,6 +154,7 @@ struct SW_DRIVER_CPP_API TargetBase : TargetBaseData ADD_TARGET(Library) ADD_TARGET(StaticLibrary) ADD_TARGET(SharedLibrary) + ADD_TARGET(ObjectLibrary) #undef ADD_TARGET template diff --git a/src/sw/driver/target/enums.h b/src/sw/driver/target/enums.h index c315d4c25..48b02e314 100644 --- a/src/sw/driver/target/enums.h +++ b/src/sw/driver/target/enums.h @@ -50,6 +50,7 @@ enum class TargetType : int NativeHeaderOnlyLibrary, NativeStaticLibrary, NativeSharedLibrary, + NativeObjectLibrary, NativeExecutable, // remove below? diff --git a/src/sw/driver/target/native.cpp b/src/sw/driver/target/native.cpp index 489413270..e98a1e2dc 100644 --- a/src/sw/driver/target/native.cpp +++ b/src/sw/driver/target/native.cpp @@ -929,12 +929,16 @@ bool NativeCompiledTarget::init() // we set output file, but sometimes overridden call must set it later // (libraries etc.) // this one is used for executables - setOutputFile(); + if (getType() != TargetType::NativeObjectLibrary) { + setOutputFile(); + } } RETURN_INIT_MULTIPASS_NEXT_PASS; case 2: { - setOutputFile(); + if (getType() != TargetType::NativeObjectLibrary) { + setOutputFile(); + } } SW_RETURN_MULTIPASS_END(init_pass); } @@ -965,7 +969,7 @@ void NativeCompiledTarget::setupCommand(builder::Command &c) const continue; if (auto nt = d->getTarget().as()) { - if (!*nt->HeaderOnly && nt->getSelectedTool() == nt->Linker.get()) + if (!*nt->HeaderOnly && nt->getSelectedTool() && nt->getSelectedTool() == nt->Linker.get()) { f(nt->getOutputFile()); } @@ -1332,6 +1336,8 @@ LinkLibrariesType NativeCompiledTarget::gatherLinkLibraries() const NativeLinker *NativeCompiledTarget::getSelectedTool() const { + if (getType() == TargetType::NativeObjectLibrary) + return {}; if (SelectedTool) return SelectedTool; if (Linker) @@ -1504,7 +1510,7 @@ void NativeCompiledTarget::addPrecompiledHeader() std::shared_ptr NativeCompiledTarget::getCommand() const { - if (HeaderOnly && *HeaderOnly) + if (HeaderOnly && *HeaderOnly || getType() == TargetType::NativeObjectLibrary) return nullptr; return getSelectedTool()->getCommand(*this); } @@ -2201,14 +2207,16 @@ const TargetSettings &NativeCompiledTarget::getInterfaceSettings(std::unordered_ case TargetType::NativeSharedLibrary: s["type"] = "native_shared_library"; break; + case TargetType::NativeObjectLibrary: + s["type"] = "native_object_library"; + break; default: SW_UNIMPLEMENTED; } - if (*HeaderOnly) + if (*HeaderOnly) { s["header_only"] = "true"; - else - { + } else if (getType() != TargetType::NativeObjectLibrary) { if (getType() != TargetType::NativeExecutable) // skip for exe atm s["import_library"].setPathValue(getContext().getLocalStorage(), getImportLibrary()); s["output_file"].setPathValue(getContext().getLocalStorage(), getOutputFile()); @@ -2399,26 +2407,30 @@ bool NativeCompiledTarget::prepare() prepare_pass4(); RETURN_PREPARE_MULTIPASS_NEXT_PASS; case 5: + // merge + prepare_pass4_1(); + RETURN_PREPARE_MULTIPASS_NEXT_PASS; + case 6: // source files prepare_pass5(); RETURN_PREPARE_MULTIPASS_NEXT_PASS; - case 6: + case 7: // link libraries prepare_pass6(); RETURN_PREPARE_MULTIPASS_NEXT_PASS; - case 7: + case 8: // link libraries prepare_pass6_1(); RETURN_PREPARE_MULTIPASS_NEXT_PASS; - case 8: + case 9: // linker 1 prepare_pass7(); RETURN_PREPARE_MULTIPASS_NEXT_PASS; - case 9: + case 10: // linker 2 prepare_pass8(); RETURN_PREPARE_MULTIPASS_NEXT_PASS; - case 10: + case 11: prepare_pass9(); // TODO: create prepare endgames method that always will be the last one getGeneratedCommands(); // create g.commands @@ -2522,7 +2534,7 @@ void NativeCompiledTarget::prepare_pass1() // do not check for existence, because generated files may go there // and we do not know about it right now if (PublicBinaryDir) - Public.IncludeDirectories.insert(BinaryDir); + Public.IncludeDirectories.insert(BinaryDir); else IncludeDirectories.insert(BinaryDir); fs::create_directories(BinaryDir); @@ -2537,6 +2549,12 @@ void NativeCompiledTarget::prepare_pass1() Librarian.reset(); SelectedTool = nullptr; } + else if (getType() == TargetType::NativeObjectLibrary) + { + Linker.reset(); + Librarian.reset(); + SelectedTool = nullptr; + } else { LinkLibrary l(getImportLibrary()); @@ -3182,6 +3200,20 @@ void NativeCompiledTarget::prepare_pass4() getMergeObject().merge(v); }); + if (getType() != TargetType::NativeObjectLibrary) { + return; + } + + auto obj = gatherObjectFilesWithoutLibraries(); + FilesOrdered files(obj.begin(), obj.end()); + std::sort(files.begin(), files.end()); + for (auto &&f : files) { + Public.LinkOptions.push_back(f.string()); + } +} + +void NativeCompiledTarget::prepare_pass4_1() +{ // merge deps' stuff // normal deps @@ -4005,9 +4037,9 @@ void NativeCompiledTarget::prepare_pass5() // add casual idirs? f->getCompiler().idirs = NativeCompilerOptions::System.IncludeDirectories; } - // generate rc, this one does not need idirs above if (GenerateWindowsResource + && getType() != TargetType::NativeObjectLibrary && !*HeaderOnly && ::sw::gatherSourceFiles(*this).empty() && getSelectedTool() == Linker.get() @@ -4402,6 +4434,10 @@ void NativeCompiledTarget::prepare_pass8() { // linker 2 + if (getType() == TargetType::NativeObjectLibrary) { + return; + } + // linker setup auto obj = gatherObjectFilesWithoutLibraries(); @@ -4660,14 +4696,25 @@ void NativeCompiledTarget::initLibrary(LibraryType Type) if (getBuildSettings().TargetOS.Type == OSType::Windows) Definitions["_WINDLL"]; - if (getBuildSettings().TargetOS.Type == OSType::Mingw) + if (getBuildSettings().TargetOS.Type == OSType::Mingw + // protect from self build of mingw + && !getPackage().getPath().toString().contains("mingw.w64") + ) { *this += "org.sw.demo.mingw.w64.crtdll"_dep; + *this += "org.sw.demo.mingw.w64.ucrtapp"_dep; } } else { SelectedTool = Librarian.get(); + + if (getBuildSettings().TargetOS.Type == OSType::Mingw + // protect from self build of mingw + && !getPackage().getPath().toString().contains("mingw.w64")) + { + *this += "org.sw.demo.mingw.w64.ucrtapp"_dep; + } } } @@ -5032,6 +5079,7 @@ CompilerType NativeCompiledTarget::getCompilerType() const return ct; } +// this function is not used TargetType NativeCompiledTarget::getRealType() const { if (isHeaderOnly()) @@ -5040,6 +5088,8 @@ TargetType NativeCompiledTarget::getRealType() const return TargetType::NativeStaticLibrary; if (getType() == TargetType::NativeExecutable) return TargetType::NativeExecutable; + if (getType() == TargetType::NativeObjectLibrary) + return TargetType::NativeObjectLibrary; return TargetType::NativeSharedLibrary; } @@ -5102,8 +5152,13 @@ bool ExecutableTarget::init() } } - if (getBuildSettings().TargetOS.Type == OSType::Mingw) { + if (getBuildSettings().TargetOS.Type == OSType::Mingw + // protect from self build of mingw + // do not protect exes! + //&& !getPackage().getPath().toString().contains("mingw.w64") + ) { *this += "org.sw.demo.mingw.w64.crtexe"_dep; + *this += "org.sw.demo.mingw.w64.ucrtapp"_dep; } } break; @@ -5183,4 +5238,10 @@ bool SharedLibraryTarget::init() return r; } +bool ObjectLibraryTarget::init() { + auto r = NativeCompiledTarget::init(); + initLibrary(LibraryType::Object); + return r; +} + } diff --git a/src/sw/driver/target/native.h b/src/sw/driver/target/native.h index a85e203ab..5bca46a3e 100644 --- a/src/sw/driver/target/native.h +++ b/src/sw/driver/target/native.h @@ -224,6 +224,7 @@ struct SW_DRIVER_CPP_API NativeCompiledTarget : NativeTarget, void prepare_pass3_2(); void prepare_pass3_3(); void prepare_pass4(); + void prepare_pass4_1(); void prepare_pass5(); void prepare_pass6(); void prepare_pass6_1(); @@ -298,6 +299,23 @@ struct SW_DRIVER_CPP_API SharedLibraryTarget : NativeCompiledTarget } }; +/** + * \brief Object only target. + */ +struct SW_DRIVER_CPP_API ObjectLibraryTarget : NativeCompiledTarget +{ + using NativeCompiledTarget::NativeCompiledTarget; + + bool init() override; + + TargetType getType() const override { return TargetType::NativeObjectLibrary; } + + bool prepare() override + { + return prepareLibrary(LibraryType::Object); + } +}; + // remove? // module target is dll target without import lib generated /** diff --git a/src/sw/driver/types.h b/src/sw/driver/types.h index 47a766904..c2cdde435 100644 --- a/src/sw/driver/types.h +++ b/src/sw/driver/types.h @@ -61,6 +61,7 @@ enum class LibraryType Static, Shared, + Object, Default = Shared, };