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

  Program:   CMake - Cross-Platform Makefile Generator
  Module:    $RCSfile$
  Language:  C++
  Date:      $Date$
  Version:   $Revision$

  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html 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.

=========================================================================*/
/* 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 4

#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);

  /* 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
