diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/CMakeLists.txt | 17 | ||||
-rw-r--r-- | Source/cmBorlandMakefileGenerator.cxx | 14 | ||||
-rw-r--r-- | Source/cmBorlandMakefileGenerator.h | 2 | ||||
-rw-r--r-- | Source/cmDSWWriter.cxx | 13 | ||||
-rw-r--r-- | Source/cmMSDotNETGenerator.cxx | 28 | ||||
-rw-r--r-- | Source/cmMSDotNETGenerator.h | 2 | ||||
-rw-r--r-- | Source/cmMSProjectGenerator.cxx | 2 | ||||
-rw-r--r-- | Source/cmMSProjectGenerator.h | 2 | ||||
-rw-r--r-- | Source/cmMakefile.cxx | 27 | ||||
-rw-r--r-- | Source/cmMakefile.h | 7 | ||||
-rw-r--r-- | Source/cmMakefileGenerator.cxx | 23 | ||||
-rw-r--r-- | Source/cmMakefileGenerator.h | 10 | ||||
-rw-r--r-- | Source/cmNMakeMakefileGenerator.cxx | 14 | ||||
-rw-r--r-- | Source/cmNMakeMakefileGenerator.h | 2 | ||||
-rw-r--r-- | Source/cmProjectCommand.cxx | 13 | ||||
-rw-r--r-- | Source/cmProjectCommand.h | 7 | ||||
-rw-r--r-- | Source/cmSetCommand.cxx | 2 | ||||
-rw-r--r-- | Source/cmSetSourceFilesPropertiesCommand.h | 2 | ||||
-rw-r--r-- | Source/cmTarget.cxx | 12 | ||||
-rw-r--r-- | Source/cmTarget.h | 2 | ||||
-rw-r--r-- | Source/cmUnixMakefileGenerator.cxx | 90 | ||||
-rw-r--r-- | Source/cmUnixMakefileGenerator.h | 2 | ||||
-rw-r--r-- | Source/cmake.cxx | 4 |
23 files changed, 201 insertions, 96 deletions
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index bab332e..71ced9a 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -1,4 +1,4 @@ -SOURCE_FILES(SRCS +SET(SRCS cmake.cxx cmakewizard.cxx cmMakeDepend.cxx @@ -37,13 +37,15 @@ cmListFileCache.h CONFIGURE_FILE( ${CMake_SOURCE_DIR}/Source/cmConfigure.cmake.h.in ${CMake_BINARY_DIR}/Source/cmConfigure.h ) + # add the include path to find the .h INCLUDE_DIRECTORIES(${CMake_BINARY_DIR}/Source) + # let cmake know it is supposed to use it ADD_DEFINITIONS(-DCMAKE_BUILD_WITH_CMAKE) IF (WIN32) - SOURCE_FILES(SRCS + SET(SRCS ${SRCS} cmDSWWriter.cxx cmDSPWriter.cxx cmMSProjectGenerator.cxx @@ -73,17 +75,17 @@ IF (UNIX) ENDIF (CURSES_LIBRARY) ENDIF (UNIX) -SOURCE_FILES(SRCS cmUnixMakefileGenerator.cxx cmUnixMakefileGenerator.h) +SET(SRCS ${SRCS} cmUnixMakefileGenerator.cxx cmUnixMakefileGenerator.h) # create a library used by the command line and the GUI -ADD_LIBRARY(CMakeLib SRCS) +ADD_LIBRARY(CMakeLib ${SRCS}) # always link in the library LINK_LIBRARIES(CMakeLib) # the library is found here LINK_DIRECTORIES(${CMake_BINARY_DIR}/Source) -ADD_EXECUTABLE(cmake cmakemain) +ADD_EXECUTABLE(cmake cmakemain.cxx) ADD_EXECUTABLE(DumpDocumentation cmDumpDocumentation) ADD_EXECUTABLE(ctest ctest.cxx cmSystemTools.cxx cmRegularExpression.cxx) @@ -106,6 +108,11 @@ IF(BUILD_TESTING) ${CMake_BINARY_DIR}/Tests/Simple simple) + ADD_TEST(conly ${CMake_BINARY_DIR}/Source/cmaketest + ${CMake_SOURCE_DIR}/Tests/COnly + ${CMake_BINARY_DIR}/Tests/COnly + conly) + ADD_TEST(complex ${CMake_BINARY_DIR}/Source/cmaketest ${CMake_SOURCE_DIR}/Tests/Complex ${CMake_BINARY_DIR}/Tests/Complex diff --git a/Source/cmBorlandMakefileGenerator.cxx b/Source/cmBorlandMakefileGenerator.cxx index 17197a0..fcee37e 100644 --- a/Source/cmBorlandMakefileGenerator.cxx +++ b/Source/cmBorlandMakefileGenerator.cxx @@ -36,7 +36,7 @@ cmBorlandMakefileGenerator::~cmBorlandMakefileGenerator() } -void cmBorlandMakefileGenerator::ComputeSystemInfo() +void cmBorlandMakefileGenerator::EnableLanguage(const char*) { // now load the settings if(!m_Makefile->GetDefinition("CMAKE_ROOT")) @@ -53,11 +53,15 @@ void cmBorlandMakefileGenerator::ComputeSystemInfo() message += outdir; cmSystemTools::Error(message.c_str()); } + if(!this->GetLanguageEnabled("CXX")) + { + std::string fpath = + m_Makefile->GetDefinition("CMAKE_ROOT"); + fpath += "/Templates/CMakeBorlandWindowsSystemConfig.cmake"; + m_Makefile->ReadListFile(NULL,fpath.c_str()); + this->SetLanguageEnabled("CXX"); + } - std::string fpath = - m_Makefile->GetDefinition("CMAKE_ROOT"); - fpath += "/Templates/CMakeBorlandWindowsSystemConfig.cmake"; - m_Makefile->ReadListFile(NULL,fpath.c_str()); } diff --git a/Source/cmBorlandMakefileGenerator.h b/Source/cmBorlandMakefileGenerator.h index 738b4a2..f577a1f 100644 --- a/Source/cmBorlandMakefileGenerator.h +++ b/Source/cmBorlandMakefileGenerator.h @@ -41,7 +41,7 @@ public: { return new cmBorlandMakefileGenerator;} ///! figure out about the current system information - virtual void ComputeSystemInfo(); + virtual void EnableLanguage(const char*); protected: virtual void OutputMakeVariables(std::ostream&); diff --git a/Source/cmDSWWriter.cxx b/Source/cmDSWWriter.cxx index 9c719ff..c6dbfef 100644 --- a/Source/cmDSWWriter.cxx +++ b/Source/cmDSWWriter.cxx @@ -121,20 +121,9 @@ void cmDSWWriter::WriteDSWFile(std::ostream& fout) k != allListFiles.end(); ++k) { cmMakefile* mf = *k; - cmMSProjectGenerator* pg = 0; - // if not this makefile, then create a new generator - if(m_Makefile != mf) - { - // Create an MS generator with DSW off, so it only creates dsp files - pg = new cmMSProjectGenerator; - } - else - { - pg = (cmMSProjectGenerator*)m_Makefile->GetMakefileGenerator(); - } + cmMSProjectGenerator* pg = (cmMSProjectGenerator*)mf->GetMakefileGenerator(); // make sure the generator is building dsp files pg->BuildDSWOff(); - mf->SetMakefileGenerator(pg); mf->GenerateMakefile(); // Get the source directory from the makefile std::string dir = mf->GetStartDirectory(); diff --git a/Source/cmMSDotNETGenerator.cxx b/Source/cmMSDotNETGenerator.cxx index 69fd73a..29bfb7a 100644 --- a/Source/cmMSDotNETGenerator.cxx +++ b/Source/cmMSDotNETGenerator.cxx @@ -88,7 +88,7 @@ void cmMSDotNETGenerator::SetLocal(bool local) m_BuildSLN = !local; } -void cmMSDotNETGenerator::ComputeSystemInfo() +void cmMSDotNETGenerator::EnableLanguage(const char*) { // now load the settings if(!m_Makefile->GetDefinition("CMAKE_ROOT")) @@ -97,10 +97,14 @@ void cmMSDotNETGenerator::ComputeSystemInfo() "CMAKE_ROOT has not been defined, bad GUI or driver program"); return; } - std::string fpath = - m_Makefile->GetDefinition("CMAKE_ROOT"); - fpath += "/Templates/CMakeDotNetSystemConfig.cmake"; - m_Makefile->ReadListFile(NULL,fpath.c_str()); + if(!this->GetLanguageEnabled("CXX")) + { + std::string fpath = + m_Makefile->GetDefinition("CMAKE_ROOT"); + fpath += "/Templates/CMakeDotNetSystemConfig.cmake"; + m_Makefile->ReadListFile(NULL,fpath.c_str()); + this->SetLanguageEnabled("CXX"); + } } @@ -187,20 +191,10 @@ void cmMSDotNETGenerator::WriteSLNFile(std::ostream& fout) k != allListFiles.end(); ++k) { cmMakefile* mf = *k; - cmMSDotNETGenerator* pg = 0; - // if not this makefile, then create a new generator - if(m_Makefile != mf) - { - // Create an MS generator with SLN off, so it only creates dsp files - pg = new cmMSDotNETGenerator; - } - else - { - pg = static_cast<cmMSDotNETGenerator*>(m_Makefile->GetMakefileGenerator()); - } + cmMSDotNETGenerator* pg = + static_cast<cmMSDotNETGenerator*>(mf->GetMakefileGenerator()); // make sure the generator is building dsp files pg->BuildSLNOff(); - mf->SetMakefileGenerator(pg); mf->GenerateMakefile(); // Get the source directory from the makefile std::string dir = mf->GetStartDirectory(); diff --git a/Source/cmMSDotNETGenerator.h b/Source/cmMSDotNETGenerator.h index 5144a34..7fc8c2d 100644 --- a/Source/cmMSDotNETGenerator.h +++ b/Source/cmMSDotNETGenerator.h @@ -64,7 +64,7 @@ public: * Try to determine system infomation such as shared library * extension, pthreads, byte order etc. */ - virtual void ComputeSystemInfo(); + virtual void EnableLanguage(const char*); protected: /** diff --git a/Source/cmMSProjectGenerator.cxx b/Source/cmMSProjectGenerator.cxx index b7b4f62..c6a48c4 100644 --- a/Source/cmMSProjectGenerator.cxx +++ b/Source/cmMSProjectGenerator.cxx @@ -55,7 +55,7 @@ void cmMSProjectGenerator::SetLocal(bool local) m_BuildDSW = !local; } -void cmMSProjectGenerator::ComputeSystemInfo() +void cmMSProjectGenerator::EnableLanguage(const char*) { // now load the settings if(!m_Makefile->GetDefinition("CMAKE_ROOT")) diff --git a/Source/cmMSProjectGenerator.h b/Source/cmMSProjectGenerator.h index 8b31cd3..d8d81a0 100644 --- a/Source/cmMSProjectGenerator.h +++ b/Source/cmMSProjectGenerator.h @@ -73,7 +73,7 @@ public: * Try to determine system infomation such as shared library * extension, pthreads, byte order etc. */ - virtual void ComputeSystemInfo(); + virtual void EnableLanguage(const char*); private: cmDSWWriter* m_DSWWriter; diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index b713395..5cca930 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -431,23 +431,18 @@ void cmMakefile::AddSource(cmSourceFile& cmfile, const char *srclist) m_Sources[srclist].push_back(this->AddSource(cmfile)); } -struct FindSrcByName : std::binary_function<cmSourceFile*, cmSourceFile*, bool> -{ - public: - bool operator () (const cmSourceFile *f, const cmSourceFile *test) const - { - return (f->GetSourceName() == test->GetSourceName()); - } -}; -void cmMakefile::RemoveSource(cmSourceFile& cmfile,const char *srclist) +void cmMakefile::RemoveSource(cmSourceFile& cmfile, const char *srclist) { std::vector<cmSourceFile*> &maplist = m_Sources[srclist]; - std::vector<cmSourceFile*>::iterator f = - std::find_if(maplist.begin(), maplist.end(), std::bind2nd(FindSrcByName(),&cmfile)); - if (f!=maplist.end()) + for( std::vector<cmSourceFile*>::iterator f = maplist.begin(); + f != maplist.end(); ++f) { + if((*f)->GetSourceName() == cmfile.GetSourceName()) + { maplist.erase(f); + return; + } } } @@ -1079,8 +1074,7 @@ void cmMakefile::RemoveVariablesInString(std::string& source, // This is done by reading the sub directory CMakeLists.txt files, // then calling this function with the new cmMakefile object void -cmMakefile::FindSubDirectoryCMakeListsFiles(std::vector<cmMakefile*>& - makefiles) +cmMakefile::FindSubDirectoryCMakeListsFiles(std::vector<cmMakefile*>& makefiles) { // loop over all the sub directories of this makefile const std::vector<std::string>& subdirs = this->GetSubDirectories(); @@ -1102,6 +1096,7 @@ cmMakefile::FindSubDirectoryCMakeListsFiles(std::vector<cmMakefile*>& else { cmMakefile* mf = new cmMakefile; + mf->SetMakefileGenerator(m_MakefileGenerator->CreateObject()); makefiles.push_back(mf); // initialize new makefile mf->SetHomeOutputDirectory(this->GetHomeOutputDirectory()); @@ -1322,3 +1317,7 @@ cmSourceFile* cmMakefile::AddSource(cmSourceFile const&sf) } +void cmMakefile::EnableLanguage(const char* lang) +{ + m_MakefileGenerator->EnableLanguage(lang); +} diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index e758b96..dede6ac 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -501,7 +501,9 @@ public: /** Recursivly read and create a cmMakefile object for * all CMakeLists.txt files in the GetSubDirectories list. * Once the file is found, it ReadListFile is called on - * the cmMakefile created for it. + * the cmMakefile created for it. CreateObject is called on + * the prototype to create a cmMakefileGenerator for each cmMakefile that + * is created. */ void FindSubDirectoryCMakeListsFiles(std::vector<cmMakefile*>& makefiles); @@ -523,6 +525,9 @@ public: /** Check if a command exists. */ bool CommandExists(const char* name) const; + ///! Enable support for the named language, if null then all languages are enabled. + void EnableLanguage(const char* ); + protected: std::string m_Prefix; std::vector<std::string> m_AuxSourceDirectories; // diff --git a/Source/cmMakefileGenerator.cxx b/Source/cmMakefileGenerator.cxx index 43ef3e0..ef0c819 100644 --- a/Source/cmMakefileGenerator.cxx +++ b/Source/cmMakefileGenerator.cxx @@ -19,6 +19,7 @@ // static list of registered generators std::map<cmStdString, cmMakefileGenerator*> cmMakefileGenerator::s_RegisteredGenerators; +std::map<cmStdString, bool> cmMakefileGenerator::s_LanguageEnabled; void cmMakefileGenerator::SetMakefile(cmMakefile* mf) @@ -77,3 +78,25 @@ cmMakefileGenerator::CreateGenerator(const char* name) } return 0; } + + + +void cmMakefileGenerator::SetLanguageEnabled(const char* l) +{ + s_LanguageEnabled[l] = true; +} + + + +bool cmMakefileGenerator::GetLanguageEnabled(const char* l) +{ + return (s_LanguageEnabled.count(l) > 0); +} + + + +void cmMakefileGenerator::ClearEnabledLanguages() +{ + s_LanguageEnabled.clear(); +} + diff --git a/Source/cmMakefileGenerator.h b/Source/cmMakefileGenerator.h index afef32a..4ef8078 100644 --- a/Source/cmMakefileGenerator.h +++ b/Source/cmMakefileGenerator.h @@ -69,11 +69,19 @@ public: * Try to determine system infomation such as shared library * extension, pthreads, byte order etc. */ - virtual void ComputeSystemInfo() = 0; + virtual void EnableLanguage(const char*) = 0; virtual ~cmMakefileGenerator(){}; + + /** + * Set/Get and Clear the enabled languages. + */ + static void SetLanguageEnabled(const char*); + static bool GetLanguageEnabled(const char*); + static void ClearEnabledLanguages(); protected: static std::map<cmStdString, cmMakefileGenerator*> s_RegisteredGenerators; + static std::map<cmStdString, bool> s_LanguageEnabled; cmMakefile* m_Makefile; }; diff --git a/Source/cmNMakeMakefileGenerator.cxx b/Source/cmNMakeMakefileGenerator.cxx index fb52361..f88b430 100644 --- a/Source/cmNMakeMakefileGenerator.cxx +++ b/Source/cmNMakeMakefileGenerator.cxx @@ -97,7 +97,7 @@ std::string cmNMakeMakefileGenerator::ShortPathCommand(const char* command) } -void cmNMakeMakefileGenerator::ComputeSystemInfo() +void cmNMakeMakefileGenerator::EnableLanguage(const char*) { // now load the settings if(!m_Makefile->GetDefinition("CMAKE_ROOT")) @@ -106,10 +106,14 @@ void cmNMakeMakefileGenerator::ComputeSystemInfo() "CMAKE_ROOT has not been defined, bad GUI or driver program"); return; } - std::string fpath = - m_Makefile->GetDefinition("CMAKE_ROOT"); - fpath += "/Templates/CMakeNMakeWindowsSystemConfig.cmake"; - m_Makefile->ReadListFile(NULL,fpath.c_str()); + if(!this->GetLanguageEnabled("CXX")) + { + std::string fpath = + m_Makefile->GetDefinition("CMAKE_ROOT"); + fpath += "/Templates/CMakeNMakeWindowsSystemConfig.cmake"; + m_Makefile->ReadListFile(NULL,fpath.c_str()); + this->SetLanguageEnabled("CXX"); + } } diff --git a/Source/cmNMakeMakefileGenerator.h b/Source/cmNMakeMakefileGenerator.h index 044d9bb..06f3c1c 100644 --- a/Source/cmNMakeMakefileGenerator.h +++ b/Source/cmNMakeMakefileGenerator.h @@ -41,7 +41,7 @@ public: { return new cmNMakeMakefileGenerator;} ///! figure out about the current system information - virtual void ComputeSystemInfo(); + virtual void EnableLanguage(const char*); protected: std::string ShortPath(const char* path); std::string ShortPathCommand(const char* command); diff --git a/Source/cmProjectCommand.cxx b/Source/cmProjectCommand.cxx index 197bccc..adfbed1 100644 --- a/Source/cmProjectCommand.cxx +++ b/Source/cmProjectCommand.cxx @@ -19,7 +19,7 @@ // cmProjectCommand bool cmProjectCommand::InitialPass(std::vector<std::string> const& args) { - if(args.size() != 1 ) + if(args.size() < 1 ) { this->SetError("PROJECT called with incorrect number of arguments"); return false; @@ -48,6 +48,17 @@ bool cmProjectCommand::InitialPass(std::vector<std::string> const& args) m_Makefile->AddDefinition("PROJECT_NAME", args[0].c_str()); + if(args.size() > 1) + { + for(size_t i =1; i < args.size(); ++i) + { + m_Makefile->EnableLanguage(args[i].c_str()); + } + } + else + { + m_Makefile->EnableLanguage(0); + } return true; } diff --git a/Source/cmProjectCommand.h b/Source/cmProjectCommand.h index 6fdb2e2..7dc7c1e 100644 --- a/Source/cmProjectCommand.h +++ b/Source/cmProjectCommand.h @@ -73,7 +73,12 @@ public: virtual const char* GetFullDocumentation() { return - "PROJECT(projectname) Sets the name of the Microsoft workspace .dsw file. Does nothing on UNIX currently\n"; + "PROJECT(projectname [C++ C Java])\n" + "Sets the name of the project. " + "This creates the variables projectname_BINARY_DIR and projectname_SOURCE_DIR. " + "Optionally you can specify which languages your project supports. " + "By default all languages are supported. If you do not have a C++ compiler, but want" + " to build a c program with cmake, then use this option."; } cmTypeMacro(cmProjectCommand, cmCommand); diff --git a/Source/cmSetCommand.cxx b/Source/cmSetCommand.cxx index 3708e28..3856444 100644 --- a/Source/cmSetCommand.cxx +++ b/Source/cmSetCommand.cxx @@ -49,7 +49,7 @@ bool cmSetCommand::InitialPass(std::vector<std::string> const& args) if(args[1] != "CACHE" && args[2] != "CACHE") { value = args[1]; - for(unsigned int i =2; i < args.size(); ++i) + for(size_t i =2; i < args.size(); ++i) { value += ";"; value += args[i]; diff --git a/Source/cmSetSourceFilesPropertiesCommand.h b/Source/cmSetSourceFilesPropertiesCommand.h index cad2b4e..15d4ed6 100644 --- a/Source/cmSetSourceFilesPropertiesCommand.h +++ b/Source/cmSetSourceFilesPropertiesCommand.h @@ -53,7 +53,7 @@ public: virtual const char* GetFullDocumentation() { return - "SET_SOURCE_FILES_PROPERTIES(flags file1 file2 [ABSTRACT|WRAP_EXCLUDE|GENERATED|COMPILE_FLAGS] [flags]) " + "SET_SOURCE_FILES_PROPERTIES(file1 file2 .. filen [ABSTRACT|WRAP_EXCLUDE|GENERATED|COMPILE_FLAGS] [flags]) " "Set properties on a file. The syntax for the command is to list all the files you want " "to change, and then provide the values you want to set next."; } diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 603e04f..cd0a96a 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -75,3 +75,15 @@ void cmTarget::MergeLibraries(const LinkLibraries &ll) } +bool cmTarget::HasCxx() const +{ + for(std::vector<cmSourceFile*>::const_iterator i = m_SourceFiles.begin(); + i != m_SourceFiles.end(); ++i) + { + if((*i)->GetSourceExtension() != "c") + { + return true; + } + } + return false; +} diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 7f3c8b7..255e1a5 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -71,6 +71,8 @@ public: {return m_SourceFiles;} std::vector<cmSourceFile*> &GetSourceFiles() {return m_SourceFiles;} + ///! does this target have a cxx file in it + bool HasCxx() const; /** * Get the list of the source files used by this target */ diff --git a/Source/cmUnixMakefileGenerator.cxx b/Source/cmUnixMakefileGenerator.cxx index 9cb2bce..f427bdf 100644 --- a/Source/cmUnixMakefileGenerator.cxx +++ b/Source/cmUnixMakefileGenerator.cxx @@ -604,8 +604,17 @@ void cmUnixMakefileGenerator::OutputSharedLibraryRule(std::ostream& fout, std::string command = "$(RM) lib"; command += name; command += "$(SHLIB_SUFFIX)"; - std::string command2 = "$(CMAKE_CXX_COMPILER) $(CMAKE_SHLIB_LINK_FLAGS) " - "$(CMAKE_SHLIB_BUILD_FLAGS) $(CMAKE_CXX_FLAGS) -o \\\n"; + std::string command2; + if(t.HasCxx()) + { + command2 = "$(CMAKE_CXX_COMPILER) $(CMAKE_SHLIB_LINK_FLAGS) " + "$(CMAKE_SHLIB_BUILD_FLAGS) $(CMAKE_CXX_FLAGS) -o \\\n"; + } + else + { + command2 = "$(CMAKE_C_COMPILER) $(CMAKE_SHLIB_LINK_FLAGS) " + "$(CMAKE_SHLIB_BUILD_FLAGS) $(CMAKE_C_FLAGS) -o \\\n"; + } command2 += "\t "; std::string libName = m_LibraryOutputPath + "lib" + std::string(name) + "$(SHLIB_SUFFIX)"; libName = this->ConvertToOutputPath(libName.c_str()); @@ -639,8 +648,17 @@ void cmUnixMakefileGenerator::OutputModuleLibraryRule(std::ostream& fout, depend += this->CreateMakeVariable(name, "_SRC_OBJS") + ") $(" + this->CreateMakeVariable(name, "_DEPEND_LIBS") + ")"; std::string command = "$(RM) lib" + std::string(name) + "$(MODULE_SUFFIX)"; - std::string command2 = "$(CMAKE_CXX_COMPILER) $(CMAKE_MODULE_LINK_FLAGS) " - "$(CMAKE_MODULE_BUILD_FLAGS) $(CMAKE_CXX_FLAGS) -o \\\n"; + std::string command2; + if(t.HasCxx()) + { + command2 = "$(CMAKE_CXX_COMPILER) $(CMAKE_SHLIB_LINK_FLAGS) " + "$(CMAKE_SHLIB_BUILD_FLAGS) $(CMAKE_CXX_FLAGS) -o \\\n"; + } + else + { + command2 = "$(CMAKE_C_COMPILER) $(CMAKE_SHLIB_LINK_FLAGS) " + "$(CMAKE_SHLIB_BUILD_FLAGS) $(CMAKE_C_FLAGS) -o \\\n"; + } command2 += "\t "; std::string libName = m_LibraryOutputPath + "lib" + std::string(name) + "$(MODULE_SUFFIX)"; libName = this->ConvertToOutputPath(libName.c_str()); @@ -705,8 +723,17 @@ void cmUnixMakefileGenerator::OutputExecutableRule(std::ostream& fout, std::string depend = "$("; depend += this->CreateMakeVariable(name, "_SRC_OBJS") + ") $(" + this->CreateMakeVariable(name, "_DEPEND_LIBS") + ")"; - std::string command = - "$(CMAKE_CXX_COMPILER) $(CMAKE_SHLIB_LINK_FLAGS) $(CMAKE_CXX_FLAGS) "; + std::string command; + if(t.HasCxx()) + { + command = + "$(CMAKE_CXX_COMPILER) $(CMAKE_SHLIB_LINK_FLAGS) $(CMAKE_CXX_FLAGS) "; + } + else + { + command = + "$(CMAKE_C_COMPILER) $(CMAKE_SHLIB_LINK_FLAGS) $(CMAKE_C_FLAGS) "; + } command += "$(" + this->CreateMakeVariable(name, "_SRC_OBJS") + ") "; std::strstream linklibs; this->OutputLinkLibraries(linklibs, 0, t); @@ -1451,10 +1478,9 @@ void cmUnixMakefileGenerator::RecursiveGenerateCacheOnly() mf->AddDefinition("RUN_CONFIGURE", true); } cmUnixMakefileGenerator* gen = - static_cast<cmUnixMakefileGenerator*>(this->CreateObject()); + static_cast<cmUnixMakefileGenerator*>(mf->GetMakefileGenerator()); gen->SetCacheOnlyOn(); gen->SetRecurseOff(); - mf->SetMakefileGenerator(gen); mf->GenerateMakefile(); } // CLEAN up the makefiles created @@ -1470,7 +1496,6 @@ void cmUnixMakefileGenerator::OutputMakeVariables(std::ostream& fout) "# the standard shell for make\n" "SHELL = /bin/sh\n" "\n" - "CMAKE_LIB_EXT = @CMAKE_LIB_EXT@\n" "CMAKE_RANLIB = @CMAKE_RANLIB@\n" "CMAKE_AR = @CMAKE_AR@\n" "CMAKE_AR_ARGS = @CMAKE_AR_ARGS@\n" @@ -2034,7 +2059,7 @@ void cmUnixMakefileGenerator::SetLocal (bool local) } } -void cmUnixMakefileGenerator::ComputeSystemInfo() +void cmUnixMakefileGenerator::EnableLanguage(const char* lang) { if (m_CacheOnly) { @@ -2057,21 +2082,38 @@ void cmUnixMakefileGenerator::ComputeSystemInfo() envCC[4999] = 0; putenv(envCC); } - // currently we run configure shell script here to determine the info std::string output; - std::string cmd = "cd "; - cmd += this->ConvertToOutputPath(m_Makefile->GetHomeOutputDirectory()); - cmd += "; "; - const char* root - = m_Makefile->GetDefinition("CMAKE_ROOT"); - cmd += root; - cmd += "/Templates/configure"; - cmSystemTools::RunCommand(cmd.c_str(), output); + std::string root + = this->ConvertToOutputPath(m_Makefile->GetDefinition("CMAKE_ROOT")); + // if no lang specified use CXX + if(!lang ) + { + lang = "CXX"; + } + // if CXX or C, then enable C + if((!this->GetLanguageEnabled(lang) && lang[0] == 'C')) + { + std::string cmd = root; + cmd += "/Templates/cconfigure"; + cmSystemTools::RunCommand(cmd.c_str(), output, + this->ConvertToOutputPath(m_Makefile->GetHomeOutputDirectory()).c_str()); + std::string fpath = m_Makefile->GetHomeOutputDirectory(); + fpath += "/CCMakeSystemConfig.cmake"; + m_Makefile->ReadListFile(NULL,fpath.c_str()); + this->SetLanguageEnabled("C"); + } + // if CXX + if(!this->GetLanguageEnabled(lang) || strcmp(lang, "CXX") == 0) + { + std::string cmd = root; + cmd += "/Templates/cxxconfigure"; + cmSystemTools::RunCommand(cmd.c_str(), output, + this->ConvertToOutputPath(m_Makefile->GetHomeOutputDirectory()).c_str()); + std::string fpath = m_Makefile->GetHomeOutputDirectory(); + fpath += "/CXXCMakeSystemConfig.cmake"; + m_Makefile->ReadListFile(NULL,fpath.c_str()); + this->SetLanguageEnabled("CXX"); + } m_Makefile->AddDefinition("RUN_CONFIGURE", true); } - - // now load the settings - std::string fpath = m_Makefile->GetHomeOutputDirectory(); - fpath += "/CMakeSystemConfig.cmake"; - m_Makefile->ReadListFile(NULL,fpath.c_str()); } diff --git a/Source/cmUnixMakefileGenerator.h b/Source/cmUnixMakefileGenerator.h index 68d3cda..4a7016f 100644 --- a/Source/cmUnixMakefileGenerator.h +++ b/Source/cmUnixMakefileGenerator.h @@ -80,7 +80,7 @@ public: * Try to determine system infomation such as shared library * extension, pthreads, byte order etc. */ - virtual void ComputeSystemInfo(); + virtual void EnableLanguage(const char*); protected: virtual void RecursiveGenerateCacheOnly(); diff --git a/Source/cmake.cxx b/Source/cmake.cxx index 586244d..d5faaa5 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -399,8 +399,8 @@ int cmake::Generate(const std::vector<std::string>& args, bool buildMakefiles) // setup CMAKE_ROOT and CMAKE_COMMAND this->AddCMakePaths(args); - // compute system info - gen->ComputeSystemInfo(); + // reset any system configuration information + cmMakefileGenerator::ClearEnabledLanguages(); std::string lf = mf.GetStartDirectory(); lf += "/CMakeLists.txt"; |