/*=========================================================================

  Program:   Insight Segmentation & Registration Toolkit
  Module:    $RCSfile$
  Language:  C++
  Date:      $Date$
  Version:   $Revision$

  Copyright (c) 2002 Insight Consortium. All rights reserved.
  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.

     This software is distributed WITHOUT ANY WARRANTY; without even 
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
     PURPOSE.  See the above copyright notices for more information.

=========================================================================*/

#include "cmGlobalUnixMakefileGenerator.h"
#include "cmLocalUnixMakefileGenerator.h"
#include "cmMakefile.h"
#include "cmake.h"

void cmGlobalUnixMakefileGenerator::EnableLanguage(const char* lang, 
                                                   cmMakefile *mf)
{
  if (!m_LanguagesEnabled)
    {
    m_LanguagesEnabled = true;
    
    // only do for global runs 
    if (!m_CMakeInstance->GetLocal())
      {
      // see man putenv for explaination of this stupid code....
      static char envCXX[5000];
      static char envCC[5000];
      if(mf->GetDefinition("CMAKE_CXX_COMPILER"))
        {
#if !defined(_WIN32) && defined(__COMO__)
        std::string env = "${CMAKE_CXX_COMPILER}";
        mf->ExpandVariablesInString(env);
        strncpy(envCXX, env.c_str(), 4999);
        envCXX[4999] = 0;
        setenv("CXX", envCXX, 1);        
#else
        std::string env = "CXX=${CMAKE_CXX_COMPILER}";
        mf->ExpandVariablesInString(env);
        strncpy(envCXX, env.c_str(), 4999);
        envCXX[4999] = 0;
        putenv(envCXX);
#endif
        }
      if(mf->GetDefinition("CMAKE_C_COMPILER"))
        {
#if !defined(_WIN32) && defined(__COMO__)
        std::string env = "${CMAKE_C_COMPILER}";
        mf->ExpandVariablesInString(env);
        strncpy(envCC, env.c_str(), 4999);
        envCC[4999] = 0;
        setenv("CC", envCC, 1);        
#else
        std::string env = "CC=${CMAKE_C_COMPILER}";
        mf->ExpandVariablesInString(env);
        strncpy(envCC, env.c_str(), 4999);
        envCC[4999] = 0;
        putenv(envCC);
#endif
        }
      std::string output;
      std::string root 
        = cmSystemTools::ConvertToOutputPath(mf->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, 
                                  cmSystemTools::ConvertToOutputPath(mf->GetHomeOutputDirectory()).c_str());
        std::string fpath = mf->GetHomeOutputDirectory();
        fpath += "/CCMakeSystemConfig.cmake";
        mf->ReadListFile(0,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, 
                                  cmSystemTools::ConvertToOutputPath(mf->GetHomeOutputDirectory()).c_str());
        std::string fpath = mf->GetHomeOutputDirectory();
        fpath += "/CXXCMakeSystemConfig.cmake";
        mf->ReadListFile(0,fpath.c_str());
        this->SetLanguageEnabled("CXX");
        }
      }
    }

  if (!m_CMakeInstance->GetLocal())
    {
    // if we are from the top, always define this
    mf->AddDefinition("RUN_CONFIGURE", true);
    }
}

///! Create a local generator appropriate to this Global Generator
cmLocalGenerator *cmGlobalUnixMakefileGenerator::CreateLocalGenerator()
{
  cmLocalGenerator *lg = new cmLocalUnixMakefileGenerator;
  lg->SetGlobalGenerator(this);
  return lg;
}

