Skip to content

Commit

Permalink
Merge pull request #34 from dougbinks/master
Browse files Browse the repository at this point in the history
Added support for source file discovery, and turning off RCC++ via RCCPPOFF macro or at runtime with improved autocompile disabling.
  • Loading branch information
dougbinks committed Oct 19, 2013
2 parents 3b9d3ed + 4f8a7b1 commit ea08383
Show file tree
Hide file tree
Showing 11 changed files with 321 additions and 79 deletions.
6 changes: 2 additions & 4 deletions Aurora/Examples/SimpleTest/Console.cpp
Expand Up @@ -87,13 +87,11 @@ Console::Console(Environment* pEnv, Rocket::Core::Context* pRocketContext)
AU_ASSERT(m_pEnv && m_pRocketContext);

Path basepath = Path(__FILE__).ParentPath();
basepath = m_pEnv->sys->pRuntimeObjectSystem->FindFile( basepath );
m_inputFile = basepath / Path(CONSOLE_INPUT_FILE);
m_contextFile = basepath / Path(CONSOLE_CONTEXT_FILE);

#ifdef _WINDOWS_
// make filename lowercase to avoid case sensitivity issues
FileSystemUtils::ToLowerInPlace( m_contextFile.m_string );
#endif
m_contextFile.ToOSCanonicalCase();

if( CreateConsoleContextFile() )
{
Expand Down
2 changes: 1 addition & 1 deletion Aurora/Examples/SimpleTest/Game.cpp
Expand Up @@ -155,10 +155,10 @@ bool Game::Init()

m_pEnv->sys->pObjectFactorySystem->AddListener(this);

m_pConsole = new Console(m_pEnv, m_pRocketContext);
m_EntityUpdateProtector.pEntitySystem = m_pEnv->sys->pEntitySystem;

m_pEnv->Init();
m_pConsole = new Console(m_pEnv, m_pRocketContext);

return true;
}
Expand Down
17 changes: 4 additions & 13 deletions Aurora/RuntimeCompiler/FileChangeNotifier.cpp
Expand Up @@ -75,10 +75,7 @@ void FileChangeNotifier::Watch( const FileSystemUtils::Path& filename, IFileChan
{
FileSystemUtils::Path fixedFilename = filename.DelimitersToOSDefault(); // Note this doesn't handle ../

#ifdef _WIN32
// make filename lowercase to avoid case sensitivity issues with __FILE__ and ReadDirectoryChangesW output
FileSystemUtils::ToLowerInPlace( fixedFilename.m_string );
#endif
fixedFilename.ToOSCanonicalCase();

m_pFileMonitor->Watch(fixedFilename, this);
m_fileListenerMap[fixedFilename].insert(pListener);
Expand Down Expand Up @@ -117,16 +114,10 @@ void FileChangeNotifier::OnFileChange( const FileSystemUtils::Path& filename )

if (!bIgnoreFileChange)
{
const FileSystemUtils::Path* pFilename = &filename;
FileSystemUtils::Path filePath = filename;
filePath.ToOSCanonicalCase();

#ifdef _WIN32
// make filename lowercase to avoid case sensitivity issues with __FILE__ and ReadDirectoryChangesW output
FileSystemUtils::Path lowerFilename = filename;
FileSystemUtils::ToLowerInPlace( lowerFilename.m_string );
pFilename = &lowerFilename;
#endif

m_changedFileList.push_back(pFilename->m_string);
m_changedFileList.push_back(filePath.m_string);

if (!m_bRecompilePending)
{
Expand Down
13 changes: 13 additions & 0 deletions Aurora/RuntimeCompiler/FileSystemUtils.h
Expand Up @@ -71,6 +71,7 @@ namespace FileSystemUtils
: m_string( rhs_ )
{
}
virtual ~Path() {} // for RCC++

const char* c_str() const;

Expand All @@ -94,6 +95,7 @@ namespace FileSystemUtils

// returns a path cleaned of /../ by removing prior dir
Path GetCleanPath() const;
void ToOSCanonicalCase(); // lower case on Windows, preserve case on Linux

// replaces extension if one exists, or adds it if not
void ReplaceExtension( const std::string& ext );
Expand Down Expand Up @@ -394,6 +396,10 @@ namespace FileSystemUtils
{
return rhs_;
}
if( 0 == rhs_.m_string.length() )
{
return lhs_;
}
std::string strlhs = lhs_.m_string;
while( strlhs.length() && strlhs.find_last_of( FILESYSTEMUTILS_SEPERATORS ) == strlhs.length()-1 )
{
Expand Down Expand Up @@ -452,6 +458,13 @@ namespace FileSystemUtils
return path;
}

inline void Path::ToOSCanonicalCase()
{
#ifdef _WIN32
ToLowerInPlace( m_string );
#endif
}


class PathIterator
{
Expand Down
12 changes: 12 additions & 0 deletions Aurora/RuntimeObjectSystem/IRuntimeObjectSystem.h
Expand Up @@ -56,6 +56,11 @@ struct ITestBuildNotifier
virtual bool TestBuildWaitAndUpdate() = 0;
};

namespace FileSystemUtils
{
class Path;
}

struct IRuntimeObjectSystem
{
// Initialise RuntimeObjectSystem. pLogger and pSystemTable should be deleted by creator.
Expand Down Expand Up @@ -108,6 +113,13 @@ struct IRuntimeObjectSystem
// tests touching each header which has RUNTIME_MODIFIABLE_INCLUDE.
// returns the number of errors - 0 if all passed.
virtual int TestBuildAllRuntimeHeaders( ITestBuildNotifier* callback, bool bTestFileTracking ) = 0;

// FindFile - attempts to find the file in a source directory
virtual FileSystemUtils::Path FindFile( const FileSystemUtils::Path& input ) = 0;

// AddPathToSourceSearch - adds a path to help source search. Can be called multiple times to add paths.
virtual void AddPathToSourceSearch( const char* path ) = 0;

};

#endif // IRUNTIMEOBJECTSYSTEM_INCLUDED
68 changes: 51 additions & 17 deletions Aurora/RuntimeObjectSystem/ObjectInterfacePerModule.h
Expand Up @@ -83,24 +83,30 @@ template<typename T> class TObjectConstructorConcrete: public IObjectConstructor
{
public:
TObjectConstructorConcrete(
#ifndef RCCPPOFF
const char* Filename,
IRuntimeIncludeFileList* pIncludeFileList_,
IRuntimeSourceDependencyList* pSourceDependencyList_,
IRuntimeLinkLibraryList* pLinkLibraryList,
#endif
bool bIsSingleton,
bool bIsAutoConstructSingleton)
: m_bIsSingleton( bIsSingleton )
, m_bIsAutoConstructSingleton( bIsAutoConstructSingleton )
, m_pModuleInterface(0)
#ifndef RCCPPOFF
, m_FileName( Filename )
, m_pIncludeFileList( pIncludeFileList_ )
, m_pSourceDependencyList( pSourceDependencyList_ )
, m_pLinkLibraryList( pLinkLibraryList )
, m_pModuleInterface( 0 )
, m_pIncludeFileList(pIncludeFileList_)
, m_pSourceDependencyList(pSourceDependencyList_)
, m_pLinkLibraryList(pLinkLibraryList)
#endif
{
#ifndef RCCPPOFF
// add path to filename
#ifdef COMPILE_PATH
m_FileName = COMPILE_PATH + m_FileName;
#endif
#endif
PerModuleInterface::GetInstance()->AddConstructor( this );
m_pModuleInterface = PerModuleInterface::GetInstance();
m_Id = InvalidId;
Expand Down Expand Up @@ -149,69 +155,89 @@ template<typename T> class TObjectConstructorConcrete: public IObjectConstructor

virtual const char* GetFileName()
{
#ifndef RCCPPOFF
return m_FileName.c_str();
#else
return 0;
#endif
}

virtual const char* GetCompiledPath()
{
#ifndef RCCPPOFF
#ifdef COMPILE_PATH
return COMPILE_PATH;
#else
return "";
#endif
#else
return 0;
#endif
}

virtual const char* GetIncludeFile( size_t Num_ ) const
{
#ifndef RCCPPOFF
if( m_pIncludeFileList )
{
return m_pIncludeFileList->GetIncludeFile( Num_ );
}
#endif
return 0;
}

virtual size_t GetMaxNumIncludeFiles() const
{
#ifndef RCCPPOFF
if( m_pIncludeFileList )
{
return m_pIncludeFileList->MaxNum;
}
#endif
return 0;
}

virtual const char* GetLinkLibrary( size_t Num_ ) const
{
#ifndef RCCPPOFF
if( m_pLinkLibraryList )
{
return m_pLinkLibraryList->GetLinkLibrary( Num_ );
}
#endif
return 0;
}

virtual size_t GetMaxNumLinkLibraries() const
{
#ifndef RCCPPOFF
if( m_pLinkLibraryList )
{
return m_pLinkLibraryList->MaxNum;
}
#endif
return 0;
}

virtual const char* GetSourceDependency( size_t Num_ ) const
{
#ifndef RCCPPOFF
if( m_pSourceDependencyList )
{
return m_pSourceDependencyList->GetSourceDependency( Num_ );
}
#endif
return 0;
}

virtual size_t GetMaxNumSourceDependencies() const
{
#ifndef RCCPPOFF
if( m_pSourceDependencyList )
{
return m_pSourceDependencyList->MaxNum;
}
#endif
return 0;
}

Expand Down Expand Up @@ -265,16 +291,18 @@ template<typename T> class TObjectConstructorConcrete: public IObjectConstructor
}
}
private:
bool m_bIsSingleton;
bool m_bIsAutoConstructSingleton;
std::string m_FileName;
bool m_bIsSingleton;
bool m_bIsAutoConstructSingleton;
std::vector<T*> m_ConstructedObjects;
std::vector<PerTypeObjectId> m_FreeIds;
ConstructorId m_Id;
PerModuleInterface* m_pModuleInterface;
#ifndef RCCPPOFF
std::string m_FileName;
IRuntimeIncludeFileList* m_pIncludeFileList;
IRuntimeSourceDependencyList* m_pSourceDependencyList;
IRuntimeSourceDependencyList* m_pSourceDependencyList;
IRuntimeLinkLibraryList* m_pLinkLibraryList;
PerModuleInterface* m_pModuleInterface;
#endif
};


Expand Down Expand Up @@ -320,14 +348,20 @@ template<typename T> class TActual: public T
PerTypeObjectId m_Id;
static TObjectConstructorConcrete<TActual> m_Constructor;
};

#define REGISTERBASE( T, bIsSingleton, bIsAutoConstructSingleton ) \
static RuntimeIncludeFiles< __COUNTER__ > g_includeFileList_##T; \
static RuntimeSourceDependency< __COUNTER__ > g_sourceDependencyList_##T; \
static RuntimeLinkLibrary< __COUNTER__ > g_linkLibraryList_##T; \
template<> TObjectConstructorConcrete< TActual< T > > TActual< T >::m_Constructor( __FILE__, &g_includeFileList_##T, &g_sourceDependencyList_##T, &g_linkLibraryList_##T, bIsSingleton, bIsAutoConstructSingleton );\
template<> const char* TActual< T >::GetTypeNameStatic() { return #T; } \
template class TActual< T >;
#ifndef RCCPPOFF
#define REGISTERBASE( T, bIsSingleton, bIsAutoConstructSingleton ) \
static RuntimeIncludeFiles< __COUNTER__ > g_includeFileList_##T; \
static RuntimeSourceDependency< __COUNTER__ > g_sourceDependencyList_##T; \
static RuntimeLinkLibrary< __COUNTER__ > g_linkLibraryList_##T; \
template<> TObjectConstructorConcrete< TActual< T > > TActual< T >::m_Constructor( __FILE__, &g_includeFileList_##T, &g_sourceDependencyList_##T, &g_linkLibraryList_##T, bIsSingleton, bIsAutoConstructSingleton );\
template<> const char* TActual< T >::GetTypeNameStatic() { return #T; } \
template class TActual< T >;
#else
#define REGISTERBASE( T, bIsSingleton, bIsAutoConstructSingleton ) \
template<> TObjectConstructorConcrete< TActual< T > > TActual< T >::m_Constructor( bIsSingleton, bIsAutoConstructSingleton); \
template<> const char* TActual< T >::GetTypeNameStatic() { return #T; } \
template class TActual< T >;
#endif

//NOTE: the file macro will only emit the full path if /FC option is used in visual studio or /ZI (Which forces /FC)
#define REGISTERCLASS( T ) REGISTERBASE( T, false, false )
Expand Down
5 changes: 5 additions & 0 deletions Aurora/RuntimeObjectSystem/RuntimeInclude.h
Expand Up @@ -22,6 +22,8 @@

#include <stddef.h>

#ifndef RCCPPOFF

//NOTE: the file macro will only emit the full path if /FC option is used in visual studio or /ZI (Which forces /FC)
//Following creates a list of files which are runtime modifiable, to be used in headers
//requires use of __COUNTER__ predefined macro, which is in gcc 4.3+, clang/llvm and MSVC
Expand Down Expand Up @@ -103,5 +105,8 @@ template<> struct RuntimeIncludeFiles<0> : public IRuntimeIncludeFileList
#define RUNTIME_MODIFIABLE_INCLUDE namespace { RUNTIME_MODIFIABLE_INCLUDE_BASE( __COUNTER__ ) }

}
#else
#define RUNTIME_MODIFIABLE_INCLUDE
#endif //RCCPPOFF

#endif //RUNTIMEINCLUDE_INCLUDED
6 changes: 6 additions & 0 deletions Aurora/RuntimeObjectSystem/RuntimeLinkLibrary.h
Expand Up @@ -20,6 +20,8 @@
#ifndef RUNTIMELINKLIBRARY_INCLUDED
#define RUNTIMELINKLIBRARY_INCLUDED


#ifndef RCCPPOFF
//NOTE: the file macro will only emit the full path if /FC option is used in visual studio or /ZI (Which forces /FC)
//Following creates a list of files which are runtime modifiable, to be used in headers
//requires use of __COUNTER__ predefined macro, which is in gcc 4.3+, clang/llvm and MSVC
Expand Down Expand Up @@ -101,5 +103,9 @@ template<> struct RuntimeLinkLibrary<0> : public IRuntimeLinkLibraryList
#define RUNTIME_COMPILER_LINKLIBRARY( LIBRARY ) namespace { RUNTIME_COMPILER_LINKLIBRARY_BASE( LIBRARY, __COUNTER__ ) }

}
#else
#define RUNTIME_COMPILER_LINKLIBRARY( LIBRARY )
#endif //RCCPPOFF


#endif //RUNTIMELINKLIBRARY_INCLUDED

0 comments on commit ea08383

Please sign in to comment.