From bd199b894ec9c5c50b1ed2b5502d55617ac9717c Mon Sep 17 00:00:00 2001 From: Wayne Stambaugh Date: Tue, 3 Feb 2015 15:42:33 -0500 Subject: [PATCH] Set default footprint library table and 3D model library environment variables. --- CMakeModules/config.h.cmake | 9 ++++ common/pgm_base.cpp | 86 ++++++++++++++++++++++++++++++++++--- include/pgm_base.h | 31 ++++++++++--- 3 files changed, 116 insertions(+), 10 deletions(-) diff --git a/CMakeModules/config.h.cmake b/CMakeModules/config.h.cmake index d5aaf1843e..27c1117a16 100644 --- a/CMakeModules/config.h.cmake +++ b/CMakeModules/config.h.cmake @@ -61,6 +61,15 @@ /// The install prefix defined in CMAKE_INSTALL_PREFIX. #define DEFAULT_INSTALL_PATH "@CMAKE_INSTALL_PREFIX@" +/// The install prefix used for KiCad's libraries. +/// These paths are only intended to be reasonable default values that work if +/// the user installs KiCad in the default path for a given platform. +#if defined( APPLE ) +#define KICAD_DATA_PATH "/Library/Application Support/kicad" +#else +#define KICAD_DATA_PATH "@CMAKE_INSTALL_PREFIX@/@KICAD_DATA@" +#endif + /// When defined, build the GITHUB_PLUGIN for pcbnew. #cmakedefine BUILD_GITHUB_PLUGIN diff --git a/common/pgm_base.cpp b/common/pgm_base.cpp index a708ecdd56..1f8b01ff2f 100644 --- a/common/pgm_base.cpp +++ b/common/pgm_base.cpp @@ -51,14 +51,16 @@ #include -#define KICAD_COMMON wxT( "kicad_common" ) +#define KICAD_COMMON wxT( "kicad_common" ) // some key strings used to store parameters in KICAD_COMMON -const wxChar PGM_BASE::workingDirKey[] = wxT( "WorkingDir" ); // public +const wxChar PGM_BASE::workingDirKey[] = wxT( "WorkingDir" ); // public -static const wxChar languageCfgKey[] = wxT( "LanguageID" ); -static const wxChar kicadFpLibPath[] = wxT( "KicadFootprintLibraryPath" ); +static const wxChar languageCfgKey[] = wxT( "LanguageID" ); +static const wxChar kicadFpLibPath[] = wxT( "KicadFootprintLibraryPath" ); +static const wxChar pathEnvVariables[] = wxT( "EnvironmentVariables" ); +static const wxChar traceEnvVars[] = wxT( "KIENVVARS" ); /** @@ -353,7 +355,8 @@ bool PGM_BASE::initPgm() wxInitAllImageHandlers(); - m_pgm_checker = new wxSingleInstanceChecker( pgm_name.GetName().Lower() + wxT( "-" ) + wxGetUserId(), GetKicadLockFilePath() ); + m_pgm_checker = new wxSingleInstanceChecker( pgm_name.GetName().Lower() + wxT( "-" ) + + wxGetUserId(), GetKicadLockFilePath() ); if( m_pgm_checker->IsAnotherRunning() ) { @@ -361,6 +364,7 @@ bool PGM_BASE::initPgm() _( "%s is already running, Continue?" ), GetChars( pgm_name.GetName() ) ); + if( !IsOK( NULL, quiz ) ) return false; } @@ -399,6 +403,17 @@ bool PGM_BASE::initPgm() SetLanguagePath(); + // Useful local environment variable settings. + m_local_env_vars[ wxString( wxT( "KIGITHUB" ) ) ] = + wxString( wxT( "https://github.com/KiCad" ) ); + + wxFileName tmpFileName; + tmpFileName.AssignDir( wxString( wxT( KICAD_DATA_PATH ) ) ); + tmpFileName.AppendDir( wxT( "modules" ) ); + m_local_env_vars[ wxString( wxT( "KISYSMOD" ) ) ] = tmpFileName.GetPath(); + tmpFileName.AppendDir( wxT( "packages3d" ) ); + m_local_env_vars[ wxString( wxT( "KISYS3DMOD" ) ) ] = tmpFileName.GetPath(); + // OS specific instantiation of wxConfigBase derivative: m_common_settings = GetNewConfig( KICAD_COMMON ); @@ -425,6 +440,7 @@ bool PGM_BASE::setExecutablePath() // bundle directory, e.g., /Applications/kicad.app/ wxFileName fn( m_bin_dir ); + if( fn.GetName() == wxT( "kicad" ) ) { // kicad launcher, so just remove the Contents/MacOS part @@ -440,6 +456,7 @@ bool PGM_BASE::setExecutablePath() fn.RemoveLastDir(); fn.RemoveLastDir(); } + m_bin_dir = fn.GetPath() + wxT( "/" ); #else // Use unix notation for paths. I am not sure this is a good idea, @@ -479,6 +496,33 @@ void PGM_BASE::loadCommonSettings() } m_editor_name = m_common_settings->Read( wxT( "Editor" ) ); + + wxString entry, oldPath; + wxArrayString entries; + long index = 0L; + + oldPath = m_common_settings->GetPath(); + m_common_settings->SetPath( pathEnvVariables ); + + while( m_common_settings->GetNextEntry( entry, index ) ) + { + wxLogTrace( traceEnvVars, + wxT( "Enumerating over entry %s, %ld." ), GetChars( entry ), index ); + entries.Add( entry ); + } + + for( unsigned i = 0; i < entries.GetCount(); i++ ) + { + wxString val = m_common_settings->Read( entries[i], wxEmptyString ); + m_local_env_vars[ entries[i] ] = val; + } + + for( std::map::iterator it = m_local_env_vars.begin(); + it != m_local_env_vars.end(); + ++it ) + SetLocalEnvVariable( it->first, it->second ); + + m_common_settings->SetPath( oldPath ); } @@ -491,6 +535,20 @@ void PGM_BASE::saveCommonSettings() wxString cur_dir = wxGetCwd(); m_common_settings->Write( workingDirKey, cur_dir ); + + // Save the local environment variables. + m_common_settings->SetPath( pathEnvVariables ); + + for( std::map::iterator it = m_local_env_vars.begin(); + it != m_local_env_vars.end(); + ++it ) + { + wxLogTrace( traceEnvVars, wxT( "Saving environment varaiable config entry %s as %s" ), + GetChars( it->first ), GetChars( it->second ) ); + m_common_settings->Write( it->first, it->second ); + } + + m_common_settings->SetPath( wxT( ".." ) ); } } @@ -665,3 +723,21 @@ void PGM_BASE::AddMenuLanguageList( wxMenu* MasterMenu ) } } + +bool PGM_BASE::SetLocalEnvVariable( const wxString& aName, const wxString& aValue ) +{ + wxString env; + + // Check to see if the environment variable is already set. + if( wxGetEnv( aName, &env ) ) + { + wxLogTrace( traceEnvVars, wxT( "Environment variable %s already set to %s." ), + GetChars( aName ), GetChars( env ) ); + return env == aValue; + } + + wxLogTrace( traceEnvVars, wxT( "Setting local environment variable %s to %s." ), + GetChars( aName ), GetChars( aValue ) ); + + return wxSetEnv( aName, aValue ); +} diff --git a/include/pgm_base.h b/include/pgm_base.h index 8b151996de..be340e7406 100644 --- a/include/pgm_base.h +++ b/include/pgm_base.h @@ -1,9 +1,9 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com - * Copyright (C) 2008-2011 Wayne Stambaugh - * Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors. + * Copyright (C) 2004-2015 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com + * Copyright (C) 2008-2015 Wayne Stambaugh + * Copyright (C) 1992-2015 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -31,6 +31,7 @@ #ifndef PGM_BASE_H_ #define PGM_BASE_H_ +#include #include #include #include @@ -109,7 +110,7 @@ public: /** * Function UseSystemPdfBrowser * returns true if the PDF browser is the default (system) PDF browser - * and false if the PDF browser is the prefered (selected) browser, else + * and false if the PDF browser is the preferred (selected) browser, else * returns false if there is no selected browser */ VTBL_ENTRY bool UseSystemPdfBrowser() const @@ -119,7 +120,7 @@ public: /** * Function ForceSystemPdfBrowser - * forces the use of system PDF browser, even if a preferend PDF browser is set. + * forces the use of system PDF browser, even if a preferred PDF browser is set. */ VTBL_ENTRY void ForceSystemPdfBrowser( bool aFlg ) { m_use_system_pdf_browser = aFlg; } @@ -168,6 +169,22 @@ public: */ VTBL_ENTRY void WritePdfBrowserInfos(); + /** + * Function SetLocalEnvVariable + * + * Sets the environment variable \a aName to \a aValue. + * + * This function first checks to see if the environment variable \a aName is already + * defined. If it is not defined, then the environment variable \a aName is set to + * a value. Otherwise, the environment variable is left unchanged. This allows the user + * to override environment variables for testing purposes. + * + * @param aName is a wxString containing the environment variable name. + * @param aValue is a wxString containing the environment variable value. + * @return true if the environment variable \a Name was set to \a aValue. + */ + VTBL_ENTRY bool SetLocalEnvVariable( const wxString& aName, const wxString& aValue ); + /** * Function App * returns a bare naked wxApp, which may come from wxPython, SINGLE_TOP, or kicad.exe. @@ -247,6 +264,10 @@ protected: wxString m_editor_name; wxSize m_help_size; + /// Local environment variable expansion settings such as KIGITHUB, KISYSMOD, and KISYS3DMOD. + /// library table. + std::map m_local_env_vars; + wxApp* m_wx_app; // The PGM_* classes can have difficulties at termination if they