From 5ecfd3d4d332e616605a75a273921b01437cb08f Mon Sep 17 00:00:00 2001 From: Bill Hoffman Date: Mon, 17 Apr 2006 14:01:22 -0400 Subject: [PATCH] ENH: fix java and add OBJECT_DIR support --- Modules/CMakeJavaInformation.cmake | 4 ++-- Source/cmLocalGenerator.cxx | 14 +++++++++++++- Source/cmLocalGenerator.h | 2 ++ Source/cmMakefileLibraryTargetGenerator.cxx | 4 ++++ Source/cmMakefileTargetGenerator.cxx | 6 ++++++ 5 files changed, 27 insertions(+), 3 deletions(-) diff --git a/Modules/CMakeJavaInformation.cmake b/Modules/CMakeJavaInformation.cmake index d7692bc98..c73b7e84d 100644 --- a/Modules/CMakeJavaInformation.cmake +++ b/Modules/CMakeJavaInformation.cmake @@ -15,14 +15,14 @@ ENDIF(CMAKE_USER_MAKE_RULES_OVERRIDE_CXX) # this is a place holder if java needed flags for javac they would go here. IF(NOT CMAKE_Java_CREATE_STATIC_LIBRARY) SET(CMAKE_Java_CREATE_STATIC_LIBRARY - " -cf *.class") + " -cf -C .") # should be this but compling a java file can create more than one .class file # so for now get all of them ENDIF(NOT CMAKE_Java_CREATE_STATIC_LIBRARY) # compile a Java file into an object file IF(NOT CMAKE_Java_COMPILE_OBJECT) SET(CMAKE_Java_COMPILE_OBJECT - " -d ") + " -d ") ENDIF(NOT CMAKE_Java_COMPILE_OBJECT) # set java include flag option and the separator for multiple include paths diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 36fed5642..36a5ecce5 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -457,6 +457,7 @@ void cmLocalGenerator::AddCustomCommandToCreateObject(const char* ofname, cmSourceFile& source, cmTarget& ) { + std::string objectDir = cmSystemTools::GetFilenamePath(std::string(ofname)); std::string objectFile = this->Convert(ofname,START_OUTPUT,SHELL); std::string sourceFile = this->Convert(source.GetFullPath().c_str(),START_OUTPUT,SHELL,true); @@ -481,6 +482,7 @@ void cmLocalGenerator::AddCustomCommandToCreateObject(const char* ofname, vars.Language = lang; vars.Source = sourceFile.c_str(); vars.Object = objectFile.c_str(); + vars.ObjectDir = objectDir.c_str(); vars.Flags = flags.c_str(); for(std::vector::iterator i = commands.begin(); i != commands.end(); ++i) @@ -568,6 +570,10 @@ void cmLocalGenerator::AddBuildTargetRule(const char* llang, cmTarget& target) cmLocalGenerator::RuleVariables vars; vars.Language = llang; vars.Objects = objs.c_str(); + std::string objdir = "CMakeFiles/"; + objdir += targetName; + objdir += ".dir"; + vars.ObjectDir = objdir.c_str(); vars.Target = targetName.c_str(); vars.LinkLibraries = linkLibs.c_str(); vars.Flags = flags.c_str(); @@ -583,7 +589,6 @@ void cmLocalGenerator::AddBuildTargetRule(const char* llang, cmTarget& target) { // Expand the full command line string. this->ExpandRuleVariables(*i, vars); - // Parse the string to get the custom command line. cmCustomCommandLine commandLine; std::vector cmd = cmSystemTools::ParseArguments(i->c_str()); @@ -710,6 +715,13 @@ cmLocalGenerator::ExpandRuleVariable(std::string const& variable, return replaceValues.Object; } } + if(replaceValues.ObjectDir) + { + if(variable == "OBJECT_DIR") + { + return replaceValues.ObjectDir; + } + } if(replaceValues.Objects) { if(variable == "OBJECTS") diff --git a/Source/cmLocalGenerator.h b/Source/cmLocalGenerator.h index 41c2c4459..4db28f59d 100644 --- a/Source/cmLocalGenerator.h +++ b/Source/cmLocalGenerator.h @@ -185,6 +185,7 @@ public: this->LinkLibraries= 0; this->Source= 0; this->Object= 0; + this->ObjectDir= 0; this->Flags= 0; this->ObjectsQuoted= 0; this->TargetSOName= 0; @@ -197,6 +198,7 @@ public: const char* LinkLibraries; const char* Source; const char* Object; + const char* ObjectDir; const char* Flags; const char* ObjectsQuoted; const char* TargetSOName; diff --git a/Source/cmMakefileLibraryTargetGenerator.cxx b/Source/cmMakefileLibraryTargetGenerator.cxx index bf5d55cb2..9140d3110 100644 --- a/Source/cmMakefileLibraryTargetGenerator.cxx +++ b/Source/cmMakefileLibraryTargetGenerator.cxx @@ -404,6 +404,10 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules cmLocalGenerator::RuleVariables vars; vars.Language = linkLanguage; vars.Objects = buildObjs.c_str(); + std::string objdir = "CMakeFiles/"; + objdir += this->Target->GetName(); + objdir += ".dir"; + vars.ObjectDir = objdir.c_str(); vars.Target = targetOutPathReal.c_str(); std::string linkString = linklibs.str(); vars.LinkLibraries = linkString.c_str(); diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx index 249db05c1..aca3d2993 100644 --- a/Source/cmMakefileTargetGenerator.cxx +++ b/Source/cmMakefileTargetGenerator.cxx @@ -389,6 +389,12 @@ cmMakefileTargetGenerator vars.Language = lang; vars.Source = sourceFile.c_str(); vars.Object = relativeObj.c_str(); + std::string objdir = this->LocalGenerator->GetHomeRelativeOutputPath(); + objdir = this->Convert(objdir.c_str(), + cmLocalGenerator::START_OUTPUT, + cmLocalGenerator::SHELL); + std::string objectDir = cmSystemTools::GetFilenamePath(obj); + vars.ObjectDir = objectDir.c_str(); vars.Flags = flags.c_str(); // Expand placeholders in the commands.