Skip to content
Snippets Groups Projects
Commit 141fe37a authored by Mark Olesen's avatar Mark Olesen
Browse files

ENH: compile codeStream into local directory only

parent ea2fcaa0
No related branches found
No related tags found
No related merge requests found
...@@ -114,31 +114,46 @@ bool Foam::functionEntries::codeStream::execute ...@@ -114,31 +114,46 @@ bool Foam::functionEntries::codeStream::execute
sha = os.digest(); sha = os.digest();
} }
// write code into _SHA1 subdirectory
fileName dir;
if (isA<IOdictionary>(parentDict))
{
const IOdictionary& d = static_cast<const IOdictionary&>(parentDict);
dir = d.db().time().constantPath()/"codeStream"/"_" + sha.str();
}
else
{
dir = fileName("codeStream")/"_" + sha.str();
}
fileName name = "codeStream_" + sha.str(); // the code name = prefix + sha1
fileName libPath const fileName codeName("codeStream_" + sha.str());
// local directory for compile/link
const fileName baseDir
(
stringOps::expandEnv("$FOAM_CASE/codeStream")
);
// code is written into _SHA1 subdir
const fileName codeDir
( (
Foam::getEnv("FOAM_USER_LIBBIN")/"lib" + name + ".so" baseDir
/ "_" + sha.str()
); );
// library is written into platforms/$WM_OPTIONS/lib subdir
const fileName libPath
(
baseDir
/ stringOps::expandEnv("platforms/$WM_OPTIONS/lib")
/ "lib" + codeName + ".so"
);
void* lib = dlLibraryTable::findLibrary(libPath); void* lib = dlLibraryTable::findLibrary(libPath);
// try to load if not already loaded
if (!lib && dlLibraryTable::open(libPath, false))
{
lib = dlLibraryTable::findLibrary(libPath);
}
// did not load - need to compile it
if (!lib) if (!lib)
{ {
if (Pstream::master()) if (Pstream::master())
{ {
if (!codeStreamTools::upToDate(dir, sha)) if (!codeStreamTools::upToDate(codeDir, sha))
{ {
Info<< "Creating new library in " << libPath << endl; Info<< "Creating new library in " << libPath << endl;
...@@ -175,15 +190,16 @@ bool Foam::functionEntries::codeStream::execute ...@@ -175,15 +190,16 @@ bool Foam::functionEntries::codeStream::execute
filesContents[0].first() = "Make/files"; filesContents[0].first() = "Make/files";
filesContents[0].second() = filesContents[0].second() =
codeTemplateC + "\n\n" codeTemplateC + "\n\n"
"LIB = $(FOAM_USER_LIBBIN)/lib" + name; "LIB = $(PWD)/../platforms/$(WM_OPTIONS)/lib/lib"
+ codeName;
// Write Make/options // Write Make/options
filesContents[1].first() = "Make/options"; filesContents[1].first() = "Make/options";
filesContents[1].second() = filesContents[1].second() =
"EXE_INC = -g \\\n" + codeOptions + "\n\nLIB_LIBS ="; "EXE_INC = -g \\\n" + codeOptions + "\n\nLIB_LIBS =";
codeStreamTools writer(name, copyFiles, filesContents); codeStreamTools writer(codeName, copyFiles, filesContents);
if (!writer.copyFilesContents(dir)) if (!writer.copyFilesContents(codeDir))
{ {
FatalIOErrorIn FatalIOErrorIn
( (
...@@ -196,7 +212,7 @@ bool Foam::functionEntries::codeStream::execute ...@@ -196,7 +212,7 @@ bool Foam::functionEntries::codeStream::execute
} }
} }
Foam::string wmakeCmd("wmake libso " + dir); const Foam::string wmakeCmd("wmake libso " + codeDir);
Info<< "Invoking " << wmakeCmd << endl; Info<< "Invoking " << wmakeCmd << endl;
if (Foam::system(wmakeCmd)) if (Foam::system(wmakeCmd))
{ {
...@@ -209,7 +225,10 @@ bool Foam::functionEntries::codeStream::execute ...@@ -209,7 +225,10 @@ bool Foam::functionEntries::codeStream::execute
} }
} }
if (!dlLibraryTable::open(libPath)) bool dummy = true;
reduce(dummy, orOp<bool>());
if (!dlLibraryTable::open(libPath, false))
{ {
FatalIOErrorIn FatalIOErrorIn
( (
...@@ -231,7 +250,7 @@ bool Foam::functionEntries::codeStream::execute ...@@ -231,7 +250,7 @@ bool Foam::functionEntries::codeStream::execute
void (*function)(const dictionary&, Ostream&); void (*function)(const dictionary&, Ostream&);
function = reinterpret_cast<void(*)(const dictionary&, Ostream&)> function = reinterpret_cast<void(*)(const dictionary&, Ostream&)>
( (
dlSym(lib, name) dlSym(lib, codeName)
); );
if (!function) if (!function)
...@@ -240,7 +259,7 @@ bool Foam::functionEntries::codeStream::execute ...@@ -240,7 +259,7 @@ bool Foam::functionEntries::codeStream::execute
( (
"functionEntries::codeStream::execute(..)", "functionEntries::codeStream::execute(..)",
parentDict parentDict
) << "Failed looking up symbol " << name ) << "Failed looking up symbol " << codeName
<< " in library " << lib << exit(FatalIOError); << " in library " << lib << exit(FatalIOError);
} }
......
...@@ -76,6 +76,14 @@ Description ...@@ -76,6 +76,14 @@ Description
- probably some other limitations (uses string::expand which expands - probably some other limitations (uses string::expand which expands
\c \$ and \c ~ sequences) \c \$ and \c ~ sequences)
Note
The code to be compiled is stored under the local \f codeStream directory
with a subdirectory name corresponding to the SHA1 of the contents.
The corresponding library code is located under the local
\f codeStream/platforms/$WM_OPTIONS/lib directory in a library
\f libcodeStream_SHA1.so
SourceFiles SourceFiles
codeStream.C codeStream.C
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment