// GetAssemblyResourceFiles //------------------------------------------------------------------------------ void LinkerNode::GetAssemblyResourceFiles( Args & fullArgs, const AString & pre, const AString & post ) const { const Dependency * start = m_StaticDependencies.Begin() + m_AssemblyResourcesStartIndex; const Dependency * end = start + m_AssemblyResourcesNum; for ( const Dependency * i = start; i != end; ++i ) { Node * n( i->GetNode() ); if ( n->GetType() == Node::OBJECT_LIST_NODE ) { ObjectListNode * oln = n->CastTo< ObjectListNode >(); oln->GetInputFiles( fullArgs, pre, post, false ); continue; } if ( n->GetType() == Node::LIBRARY_NODE ) { LibraryNode * ln = n->CastTo< LibraryNode >(); ln->GetInputFiles( fullArgs, pre, post, false ); continue; } fullArgs += pre; fullArgs += n->GetName(); fullArgs += post; fullArgs.AddDelimiter(); } }
// GetAssemblyResourceFiles //------------------------------------------------------------------------------ void LinkerNode::GetAssemblyResourceFiles( Args & fullArgs, const AString & pre, const AString & post ) const { const Dependency * const end = m_AssemblyResources.End(); for ( Dependencies::Iter i = m_AssemblyResources.Begin(); i != end; i++ ) { Node * n( i->GetNode() ); if ( n->GetType() == Node::OBJECT_LIST_NODE ) { ObjectListNode * oln = n->CastTo< ObjectListNode >(); oln->GetInputFiles( fullArgs, pre, post ); continue; } if ( n->GetType() == Node::LIBRARY_NODE ) { LibraryNode * ln = n->CastTo< LibraryNode >(); ln->GetInputFiles( fullArgs, pre, post ); continue; } fullArgs += pre; fullArgs += n->GetName(); fullArgs += post; fullArgs.AddDelimiter(); } }
// GetInputFiles //------------------------------------------------------------------------------ void LinkerNode::GetInputFiles( Node * n, Args & fullArgs, const AString & pre, const AString & post ) const { if ( n->GetType() == Node::LIBRARY_NODE ) { const bool linkObjectsInsteadOfLibs = m_LinkerLinkObjects; if ( linkObjectsInsteadOfLibs ) { LibraryNode * ln = n->CastTo< LibraryNode >(); ln->GetInputFiles( fullArgs, pre, post, linkObjectsInsteadOfLibs ); } else { // not building a DLL, so link the lib directly fullArgs += pre; fullArgs += n->GetName(); fullArgs += post; } } else if ( n->GetType() == Node::OBJECT_LIST_NODE ) { const bool linkObjectsInsteadOfLibs = m_LinkerLinkObjects; ObjectListNode * ol = n->CastTo< ObjectListNode >(); ol->GetInputFiles( fullArgs, pre, post, linkObjectsInsteadOfLibs ); } else if ( n->GetType() == Node::DLL_NODE ) { // for a DLL, link to the import library DLLNode * dllNode = n->CastTo< DLLNode >(); AStackString<> importLibName; dllNode->GetImportLibName( importLibName ); fullArgs += pre; fullArgs += importLibName; fullArgs += post; } else if ( n->GetType() == Node::COPY_FILE_NODE ) { CopyFileNode * copyNode = n->CastTo< CopyFileNode >(); Node * srcNode = copyNode->GetSourceNode(); GetInputFiles( srcNode, fullArgs, pre, post ); } else { // link anything else directly fullArgs += pre; fullArgs += n->GetName(); fullArgs += post; } fullArgs.AddDelimiter(); }
// GetInputFiles //------------------------------------------------------------------------------ void ObjectListNode::GetInputFiles( Args & fullArgs, const AString & pre, const AString & post ) const { for ( Dependencies::Iter i = m_DynamicDependencies.Begin(); i != m_DynamicDependencies.End(); i++ ) { const Node * n = i->GetNode(); // handle pch files - get path to object if ( n->GetType() == Node::OBJECT_NODE ) { // handle pch files - get path to matching object const ObjectNode * on = n->CastTo< ObjectNode >(); if ( on->IsCreatingPCH() ) { if ( on->IsMSVC() ) { fullArgs += pre; fullArgs += on->GetName(); fullArgs += on->GetObjExtension(); fullArgs += post; fullArgs.AddDelimiter(); continue; } else { // Clang/GCC/SNC don't have an object to link for a pch continue; } } } // extract objects from additional lists if ( n->GetType() == Node::OBJECT_LIST_NODE ) { ASSERT( GetType() == Node::LIBRARY_NODE ); // should only be possible for a LibraryNode // insert all the objects in the object list ObjectListNode * oln = n->CastTo< ObjectListNode >(); oln->GetInputFiles( fullArgs, pre, post ); continue; } // normal object fullArgs += pre; fullArgs += n->GetName(); fullArgs += post; fullArgs.AddDelimiter(); } }