You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
175 lines
5.2 KiB
175 lines
5.2 KiB
/***************************************************************************
|
|
* Copyright (C) 2005 by David Saxton *
|
|
* david@bluehaze.org *
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
***************************************************************************/
|
|
|
|
#include "gplink.h"
|
|
#include "languagemanager.h"
|
|
#include "logview.h"
|
|
|
|
#include <tdelocale.h>
|
|
#include <tdemessagebox.h>
|
|
#include <kprocess.h>
|
|
|
|
Gplink::Gplink( ProcessChain *processChain, KTechlab * parent )
|
|
: ExternalLanguage( processChain, parent, "Gpasm" )
|
|
{
|
|
m_successfulMessage = i18n("*** Linking successful ***");
|
|
m_failedMessage = i18n("*** Linking failed ***");
|
|
}
|
|
|
|
|
|
Gplink::~Gplink()
|
|
{
|
|
}
|
|
|
|
|
|
void Gplink::processInput( ProcessOptions options )
|
|
{
|
|
resetLanguageProcess();
|
|
m_processOptions = options;
|
|
|
|
*m_languageProcess << ("gplink");
|
|
|
|
if ( !options.m_hexFormat.isEmpty() )
|
|
{
|
|
*m_languageProcess << ("--hex-format");
|
|
*m_languageProcess << (options.m_hexFormat);
|
|
}
|
|
|
|
if ( options.m_bOutputMapFile )
|
|
*m_languageProcess << ("--map");
|
|
|
|
if ( !options.m_libraryDir.isEmpty() )
|
|
{
|
|
*m_languageProcess << ("--include");
|
|
*m_languageProcess << ( options.m_libraryDir );
|
|
}
|
|
|
|
if ( !options.m_linkerScript.isEmpty() )
|
|
{
|
|
*m_languageProcess << ("--script");
|
|
*m_languageProcess << ( options.m_linkerScript );
|
|
}
|
|
|
|
if ( !options.m_linkOther.isEmpty() )
|
|
*m_languageProcess << (options.m_linkOther);
|
|
|
|
// Output hex file
|
|
*m_languageProcess << ("--output");
|
|
*m_languageProcess << ( options.intermediaryOutput() );
|
|
|
|
// Input object file
|
|
const TQStringList inputFiles = options.inputFiles();
|
|
TQStringList::const_iterator end = inputFiles.end();
|
|
for ( TQStringList::const_iterator it = inputFiles.begin(); it != end; ++it )
|
|
*m_languageProcess << ( *it );
|
|
|
|
// Other libraries
|
|
end = options.m_linkLibraries.end();
|
|
for ( TQStringList::const_iterator it = options.m_linkLibraries.begin(); it != end; ++it )
|
|
*m_languageProcess << ( *it );
|
|
|
|
if ( !start() )
|
|
{
|
|
KMessageBox::sorry( LanguageManager::self()->logView(), i18n("Linking failed. Please check you have gputils installed.") );
|
|
processInitFailed();
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
bool Gplink::isError( const TQString &message ) const
|
|
{
|
|
return message.contains( "Error", false );
|
|
}
|
|
|
|
|
|
bool Gplink::isWarning( const TQString &message ) const
|
|
{
|
|
return message.contains( "Warning", false );
|
|
}
|
|
|
|
|
|
MessageInfo Gplink::extractMessageInfo( const TQString &text )
|
|
{
|
|
#if 0
|
|
if ( text.length()<5 || !text.startsWith("/") )
|
|
return MessageInfo();
|
|
|
|
const int index = text.find( ".asm", 0, false )+4;
|
|
if ( index == -1+4 )
|
|
return MessageInfo();
|
|
const TQString fileName = text.left(index);
|
|
|
|
// Extra line number
|
|
const TQString message = text.right(text.length()-index);
|
|
const int linePos = message.find( TQRegExp(":[\\d]+") );
|
|
int line = -1;
|
|
if ( linePos != -1 )
|
|
{
|
|
const int linePosEnd = message.find( ':', linePos+1 );
|
|
if ( linePosEnd != -1 )
|
|
{
|
|
const TQString number = message.mid( linePos+1, linePosEnd-linePos-1 ).stripWhiteSpace();
|
|
bool ok;
|
|
line = number.toInt(&ok)-1;
|
|
if (!ok) line = -1;
|
|
}
|
|
}
|
|
return MessageInfo( fileName, line );
|
|
#endif
|
|
return MessageInfo();
|
|
}
|
|
|
|
|
|
|
|
ProcessOptions::ProcessPath::Path Gplink::outputPath( ProcessOptions::ProcessPath::Path inputPath ) const
|
|
{
|
|
switch (inputPath)
|
|
{
|
|
case ProcessOptions::ProcessPath::Object_PIC:
|
|
return ProcessOptions::ProcessPath::Program_PIC;
|
|
|
|
case ProcessOptions::ProcessPath::Object_Program:
|
|
return ProcessOptions::ProcessPath::None;
|
|
|
|
case ProcessOptions::ProcessPath::AssemblyAbsolute_PIC:
|
|
case ProcessOptions::ProcessPath::AssemblyAbsolute_Program:
|
|
case ProcessOptions::ProcessPath::AssemblyRelocatable_Library:
|
|
case ProcessOptions::ProcessPath::AssemblyRelocatable_Object:
|
|
case ProcessOptions::ProcessPath::AssemblyRelocatable_PIC:
|
|
case ProcessOptions::ProcessPath::AssemblyRelocatable_Program:
|
|
case ProcessOptions::ProcessPath::C_AssemblyRelocatable:
|
|
case ProcessOptions::ProcessPath::C_Library:
|
|
case ProcessOptions::ProcessPath::C_Object:
|
|
case ProcessOptions::ProcessPath::C_PIC:
|
|
case ProcessOptions::ProcessPath::C_Program:
|
|
case ProcessOptions::ProcessPath::FlowCode_AssemblyAbsolute:
|
|
case ProcessOptions::ProcessPath::FlowCode_Microbe:
|
|
case ProcessOptions::ProcessPath::FlowCode_PIC:
|
|
case ProcessOptions::ProcessPath::FlowCode_Program:
|
|
case ProcessOptions::ProcessPath::Microbe_AssemblyAbsolute:
|
|
case ProcessOptions::ProcessPath::Microbe_PIC:
|
|
case ProcessOptions::ProcessPath::Microbe_Program:
|
|
case ProcessOptions::ProcessPath::Object_Disassembly:
|
|
case ProcessOptions::ProcessPath::Object_Library:
|
|
case ProcessOptions::ProcessPath::PIC_AssemblyAbsolute:
|
|
case ProcessOptions::ProcessPath::Program_Disassembly:
|
|
case ProcessOptions::ProcessPath::Program_PIC:
|
|
case ProcessOptions::ProcessPath::Invalid:
|
|
case ProcessOptions::ProcessPath::None:
|
|
return ProcessOptions::ProcessPath::Invalid;
|
|
}
|
|
|
|
return ProcessOptions::ProcessPath::Invalid;
|
|
}
|
|
|
|
|
|
|