/*============================================================================
  CMake - Cross Platform Makefile Generator
  Copyright 2000-2009 Kitware, Inc., Insight Software Consortium

  Distributed under the OSI-approved BSD License (the "License");
  see accompanying file Copyright.txt for details.

  This software is distributed WITHOUT ANY WARRANTY; without even the
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the License for more information.
============================================================================*/
/* This header file defines the API that loadable commands can use. In many
   of these commands C++ instances of cmMakefile of cmSourceFile are passed
   in as arguments or returned. In these cases they are passed as a void *
   argument. In the function prototypes mf is used to represent a makefile
   and sf is used to represent a source file. The functions are grouped
   loosely into four groups 1) Utility 2) cmMakefile 3) cmSourceFile 4)
   cmSystemTools. Within each grouping functions are listed alphabetically */
/*=========================================================================*/
#ifndef cmCPluginAPI_h
#define cmCPluginAPI_h

#define CMAKE_VERSION_MAJOR 2
#define CMAKE_VERSION_MINOR 5

#ifdef  __cplusplus
extern "C" {
#endif

#ifdef __WATCOMC__
#define CCONV __cdecl
#else
#define CCONV
#endif
/*=========================================================================
this is the structure of function entry points that a plugin may call. This
structure must be kept in sync with the static decaled at the bottom of
cmCPLuginAPI.cxx
=========================================================================*/
typedef struct
{
  /*=========================================================================
  Here we define the set of functions that a plugin may call. The first goup
  of functions are utility functions that are specific to the plugin API
  =========================================================================*/
  /* set/Get the ClientData in the cmLoadedCommandInfo structure, this is how
     information is passed from the InitialPass to FInalPass for commands
     that need a FinalPass and need information from the InitialPass */
  void *(CCONV *GetClientData) (void *info);
  /* return the summed size in characters of all the arguments */
  int   (CCONV *GetTotalArgumentSize) (int argc, char **argv);
  /* free all the memory associated with an argc, argv pair */
  void  (CCONV *FreeArguments) (int argc, char **argv);
  /* set/Get the ClientData in the cmLoadedCommandInfo structure, this is how
     information is passed from the InitialPass to FInalPass for commands
     that need a FinalPass and need information from the InitialPass */
  void  (CCONV *SetClientData) (void *info, void *cd);
  /* when an error occurs, call this function to set the error string */
  void  (CCONV *SetError) (void *info, const char *err);

  /*=========================================================================
  The following functions all directly map to methods in the cmMakefile
  class. See cmMakefile.h for descriptions of what each method does. All of
  these methods take the void * makefile pointer as their first argument.
  =========================================================================*/
  void  (CCONV *AddCacheDefinition) (void *mf, const char* name,
                               const char* value,
                               const char* doc, int cachetype);
  void  (CCONV *AddCustomCommand) (void *mf, const char* source,
                             const char* command,
                             int numArgs, const char **args,
                             int numDepends, const char **depends,
                             int numOutputs, const char **outputs,
                             const char *target);
  void  (CCONV *AddDefineFlag) (void *mf, const char* definition);
  void  (CCONV *AddDefinition) (void *mf, const char* name,
                                const char* value);
  void  (CCONV *AddExecutable) (void *mf, const char *exename,
                         int numSrcs, const char **srcs, int win32);
  void  (CCONV *AddLibrary) (void *mf, const char *libname,
                       int shared, int numSrcs, const char **srcs);
  void  (CCONV *AddLinkDirectoryForTarget) (void *mf, const char *tgt,
                                      const char* d);
  void  (CCONV *AddLinkLibraryForTarget) (void *mf, const char *tgt,
                                    const char *libname, int libtype);
  void  (CCONV *AddUtilityCommand) (void *mf, const char* utilityName,
                              const char *command, const char *arguments,
                              int all, int numDepends, const char **depends,
                              int numOutputs, const char **outputs);
  int   (CCONV *CommandExists) (void *mf, const char* name);
  int  (CCONV *ExecuteCommand) (void *mf, const char *name,
                          int numArgs, const char **args);
  void  (CCONV *ExpandSourceListArguments) (void *mf,int argc,
                                      const char **argv,
                                      int *resArgc, char ***resArgv,
                                      unsigned int startArgumentIndex);
  char *(CCONV *ExpandVariablesInString) (void *mf, const char *source,
                                    int escapeQuotes, int atOnly);
  unsigned int (CCONV *GetCacheMajorVersion) (void *mf);
  unsigned int (CCONV *GetCacheMinorVersion) (void *mf);
  const char*  (CCONV *GetCurrentDirectory) (void *mf);
  const char*  (CCONV *GetCurrentOutputDirectory) (void *mf);
  const char*  (CCONV *GetDefinition) (void *mf, const char *def);
  const char*  (CCONV *GetHomeDirectory) (void *mf);
  const char*  (CCONV *GetHomeOutputDirectory) (void *mf);
  unsigned int (CCONV *GetMajorVersion) (void *mf);
  unsigned int (CCONV *GetMinorVersion) (void *mf);
  const char*  (CCONV *GetProjectName) (void *mf);
  const char*  (CCONV *GetStartDirectory) (void *mf);
  const char*  (CCONV *GetStartOutputDirectory) (void *mf);
  int          (CCONV *IsOn) (void *mf, const char* name);


  /*=========================================================================
  The following functions are designed to operate or manipulate
  cmSourceFiles. Please see cmSourceFile.h for additional information on many
  of these methods. Some of these methods are in cmMakefile.h.
  =========================================================================*/
  void *(CCONV *AddSource) (void *mf, void *sf);
  void *(CCONV *CreateSourceFile) ();
  void  (CCONV *DestroySourceFile) (void *sf);
  void *(CCONV *GetSource) (void *mf, const char* sourceName);
  void  (CCONV *SourceFileAddDepend) (void *sf, const char *depend);
  const char *(CCONV *SourceFileGetProperty) (void *sf, const char *prop);
  int   (CCONV *SourceFileGetPropertyAsBool) (void *sf, const char *prop);
  const char *(CCONV *SourceFileGetSourceName) (void *sf);
  const char *(CCONV *SourceFileGetFullPath) (void *sf);
  void  (CCONV *SourceFileSetName) (void *sf, const char* name,
                             const char* dir,
                             int numSourceExtensions,
                             const char **sourceExtensions,
                             int numHeaderExtensions,
                             const char **headerExtensions);
  void  (CCONV *SourceFileSetName2) (void *sf, const char* name,
                               const char* dir,
                               const char *ext, int headerFileOnly);
  void  (CCONV *SourceFileSetProperty) (void *sf, const char *prop,
                                  const char *value);


  /*=========================================================================
  The following methods are from cmSystemTools.h see that file for specific
  documentation on each method.
  =========================================================================*/
  char  *(CCONV *Capitalized)(const char *);
  void   (CCONV *CopyFileIfDifferent)(const char *f1, const char *f2);
  char  *(CCONV *GetFilenameWithoutExtension)(const char *);
  char  *(CCONV *GetFilenamePath)(const char *);
  void   (CCONV *RemoveFile)(const char *f1);
  void   (CCONV *Free)(void *);

  /*=========================================================================
    The following are new functions added after 1.6
  =========================================================================*/
  void  (CCONV *AddCustomCommandToOutput) (void *mf, const char* output,
                                     const char* command,
                                     int numArgs, const char **args,
                                     const char* main_dependency,
                                     int numDepends, const char **depends);
  void  (CCONV *AddCustomCommandToTarget) (void *mf, const char* target,
                                     const char* command,
                                     int numArgs, const char **args,
                                     int commandType);

  /* display status information */
  void  (CCONV *DisplaySatus) (void *info, const char *message);

  /* new functions added after 2.4 */
  void *(CCONV *CreateNewSourceFile) (void *mf);
  void (CCONV *DefineSourceFileProperty) (void *mf, const char *name,
                                          const char *briefDocs,
                                          const char *longDocs,
                                          int chained);

  /* this is the end of the C function stub API structure */
} cmCAPI;


/*=========================================================================
CM_PLUGIN_EXPORT should be used by plugins
=========================================================================*/
#ifdef _WIN32
#define CM_PLUGIN_EXPORT  __declspec( dllexport )
#else
#define CM_PLUGIN_EXPORT
#endif

/*=========================================================================
define the different types of cache entries, see cmCacheManager.h for more
information
=========================================================================*/
#define CM_CACHE_BOOL 0
#define CM_CACHE_PATH 1
#define CM_CACHE_FILEPATH 2
#define CM_CACHE_STRING 3
#define CM_CACHE_INTERNAL 4
#define CM_CACHE_STATIC 5

/*=========================================================================
define the different types of compiles a library may be
=========================================================================*/
#define CM_LIBRARY_GENERAL 0
#define CM_LIBRARY_DEBUG 1
#define CM_LIBRARY_OPTIMIZED 2

/*=========================================================================
define the different types of custom commands for a target
=========================================================================*/
#define CM_PRE_BUILD  0
#define CM_PRE_LINK   1
#define CM_POST_BUILD 2

/*=========================================================================
Finally we define the key data structures and function prototypes
=========================================================================*/
  typedef const char* (CCONV *CM_DOC_FUNCTION)();
  typedef int (CCONV *CM_INITIAL_PASS_FUNCTION)(void *info, void *mf,
                                          int argc, char *[]);
  typedef void (CCONV *CM_FINAL_PASS_FUNCTION)(void *info, void *mf);
  typedef void (CCONV *CM_DESTRUCTOR_FUNCTION)(void *info);

  typedef struct {
    unsigned long reserved1; /* Reserved for future use.  DO NOT USE.  */
    unsigned long reserved2; /* Reserved for future use.  DO NOT USE.  */
    cmCAPI *CAPI;
    int m_Inherited; /* this ivar is no longer used in CMake 2.2 or later */
    CM_INITIAL_PASS_FUNCTION InitialPass;
    CM_FINAL_PASS_FUNCTION FinalPass;
    CM_DESTRUCTOR_FUNCTION Destructor;
    CM_DOC_FUNCTION GetTerseDocumentation;
    CM_DOC_FUNCTION GetFullDocumentation;
    const char *Name;
    char *Error;
    void *ClientData;
  } cmLoadedCommandInfo;

  typedef void (CCONV *CM_INIT_FUNCTION)(cmLoadedCommandInfo *);

#ifdef  __cplusplus
}
#endif

#endif
