Skip to content

Commit

Permalink
Initial ObjectLibrary libraries.
Browse files Browse the repository at this point in the history
  • Loading branch information
egorpugin committed May 23, 2024
1 parent 9eea80c commit bc02134
Show file tree
Hide file tree
Showing 6 changed files with 101 additions and 16 deletions.
2 changes: 2 additions & 0 deletions src/sw/driver/sw.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,13 +76,15 @@ using sw::LibraryTarget;
using sw::StaticLibraryTarget;
using sw::SharedLibraryTarget;
using sw::ExecutableTarget;
using sw::ObjectLibraryTarget;

// new aliases
using Project = ProjectTarget; // deprecate?
using Library = LibraryTarget;
using StaticLibrary = StaticLibraryTarget;
using SharedLibrary = SharedLibraryTarget;
using Executable = ExecutableTarget;
using ObjectLibrary = ObjectLibraryTarget;

// other langs
using sw::CSharpTarget;
Expand Down
2 changes: 2 additions & 0 deletions src/sw/driver/target/base.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ struct ExecutableTarget;
struct LibraryTarget;
struct StaticLibraryTarget;
struct SharedLibraryTarget;
struct ObjectLibraryTarget;

struct Test;

Expand Down Expand Up @@ -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 <typename ... Args>
Expand Down
1 change: 1 addition & 0 deletions src/sw/driver/target/enums.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ enum class TargetType : int
NativeHeaderOnlyLibrary,
NativeStaticLibrary,
NativeSharedLibrary,
NativeObjectLibrary,
NativeExecutable,

// remove below?
Expand Down
93 changes: 77 additions & 16 deletions src/sw/driver/target/native.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -965,7 +969,7 @@ void NativeCompiledTarget::setupCommand(builder::Command &c) const
continue;
if (auto nt = d->getTarget().as<NativeCompiledTarget *>())
{
if (!*nt->HeaderOnly && nt->getSelectedTool() == nt->Linker.get())
if (!*nt->HeaderOnly && nt->getSelectedTool() && nt->getSelectedTool() == nt->Linker.get())
{
f(nt->getOutputFile());
}
Expand Down Expand Up @@ -1332,6 +1336,8 @@ LinkLibrariesType NativeCompiledTarget::gatherLinkLibraries() const

NativeLinker *NativeCompiledTarget::getSelectedTool() const
{
if (getType() == TargetType::NativeObjectLibrary)
return {};
if (SelectedTool)
return SelectedTool;
if (Linker)
Expand Down Expand Up @@ -1504,7 +1510,7 @@ void NativeCompiledTarget::addPrecompiledHeader()

std::shared_ptr<builder::Command> NativeCompiledTarget::getCommand() const
{
if (HeaderOnly && *HeaderOnly)
if (HeaderOnly && *HeaderOnly || getType() == TargetType::NativeObjectLibrary)
return nullptr;
return getSelectedTool()->getCommand(*this);
}
Expand Down Expand Up @@ -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());
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand All @@ -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());
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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<RcToolSourceFile>(*this).empty()
&& getSelectedTool() == Linker.get()
Expand Down Expand Up @@ -4402,6 +4434,10 @@ void NativeCompiledTarget::prepare_pass8()
{
// linker 2

if (getType() == TargetType::NativeObjectLibrary) {
return;
}

// linker setup
auto obj = gatherObjectFilesWithoutLibraries();

Expand Down Expand Up @@ -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;
}
}
}

Expand Down Expand Up @@ -5032,6 +5079,7 @@ CompilerType NativeCompiledTarget::getCompilerType() const
return ct;
}

// this function is not used
TargetType NativeCompiledTarget::getRealType() const
{
if (isHeaderOnly())
Expand All @@ -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;
}

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -5183,4 +5238,10 @@ bool SharedLibraryTarget::init()
return r;
}

bool ObjectLibraryTarget::init() {
auto r = NativeCompiledTarget::init();
initLibrary(LibraryType::Object);
return r;
}

}
18 changes: 18 additions & 0 deletions src/sw/driver/target/native.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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
/**
Expand Down
1 change: 1 addition & 0 deletions src/sw/driver/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ enum class LibraryType

Static,
Shared,
Object,

Default = Shared,
};
Expand Down

0 comments on commit bc02134

Please sign in to comment.