summaryrefslogtreecommitdiffstats
path: root/Source/cmTryCompileCommand.h
blob: 25fbea59f04f58a228d97ffce0c143ba78ae06ba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*=========================================================================

  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.

=========================================================================*/
#ifndef cmTryCompileCommand_h
#define cmTryCompileCommand_h

#include "cmCommand.h"

/** \class cmTryCompileCommand
 * \brief Specifies where to install some files
 *
 * cmTryCompileCommand is used to test if soucre code can be compiled
 */
class cmTryCompileCommand : public cmCommand
{
public:
  /**
   * This is a virtual constructor for the command.
   */
  virtual cmCommand* Clone() 
    {
    return new cmTryCompileCommand;
    }

  /**
   * This is called when the command is first encountered in
   * the CMakeLists.txt file.
   */
  virtual bool InitialPass(std::vector<std::string> const& args);

  /**
   * The name of the command as specified in CMakeList.txt.
   */
  virtual const char* GetName() { return "TRY_COMPILE";}

  /**
   * Succinct documentation.
   */
  virtual const char* GetTerseDocumentation() 
    {
    return "Try compiling some code.";
    }

  /**
   * This is the core code for try compile. It is here so that other
   * commands, such as TryRun can access the same logic without
   * duplication. 
   */
  static int CoreTryCompileCode(cmMakefile *mf, 
                                std::vector<std::string> const& argv, 
                                bool clean, 
                                const char* cmakeCommand, 
                                std::string& outputFile);

  /** 
   * This deletes all the files created by TRY_COMPILE or TRY_RUN
   * code. This way we do not have to rely on the timing and
   * dependencies of makefiles.
   */
  static void CleanupFiles(const char* binDir);

  /** 
   * This tries to find the (executable) file created by TRY_COMPILE or 
   * TRY_RUN. If nothing is found an empty string will be returned.
   */
  static const char* GetOutputFile(cmMakefile* mf, const char* binaryDirectory, 
                             const char* targetName, const char* cmakeCommand, 
                             std::string& errorMessage);

  /**
   * More documentation.  */
  virtual const char* GetFullDocumentation()
    {
    return
      "  TRY_COMPILE(RESULT_VAR bindir srcdir\n"
      "              projectName <targetname> <CMAKE_FLAGS <Flags>>\n"
      "              <OUTPUT_VARIABLE var>)\n"
      "Try compiling a program.  In this form, srcdir should contain a complete "
      "CMake project with a CMakeLists.txt file and all sources. The bindir and "
      "srcdir will not be deleted after this command is run. "
      "If <target name> is specified then build just that target "
      "otherwise the all or ALL_BUILD target is built.\n"
      "  TRY_COMPILE(RESULT_VAR bindir srcfile\n"
      "              <CMAKE_FLAGS <Flags>>\n"
      "              <COMPILE_DEFINITIONS <flags> ...>\n"
      "              <OUTPUT_VARIABLE var>)\n"
      "Try compiling a srcfile.  In this case, the user need only supply a "
      "source file.  CMake will create the appropriate CMakeLists.txt file "
      "to build the source. "
      "In this version all files in bindir/CMakeFiles/CMakeTmp, "
      "will be cleaned automatically, for debugging a --debug-trycompile can "
      "be passed to cmake to avoid the clean. Some extra flags that "
      " can be included are,  "
      "INCLUDE_DIRECTORIES, LINK_DIRECTORIES, and LINK_LIBRARIES.  "
      "COMPILE_DEFINITIONS are -Ddefinition that will be passed to the "
      "compile line.  "

      "TRY_COMPILE creates a CMakeList.txt "
      "file on the fly that looks like this:\n"
      "  ADD_DEFINITIONS( <expanded COMPILE_DEFINITIONS from calling "
      "cmake>)\n"
      "  INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES})\n"
      "  LINK_DIRECTORIES(${LINK_DIRECTORIES})\n"
      "  ADD_EXECUTABLE(cmTryCompileExec sources)\n"
      "  TARGET_LINK_LIBRARIES(cmTryCompileExec ${LINK_LIBRARIES})\n"
      "In both versions of the command, "
      "if OUTPUT_VARIABLE is specified, then the "
      "output from the build process is stored in the given variable. "
      "Return the success or failure in "
      "RESULT_VAR. CMAKE_FLAGS can be used to pass -DVAR:TYPE=VALUE flags "
      "to the cmake that is run during the build. "
      "";
    }
  
  cmTypeMacro(cmTryCompileCommand, cmCommand);

};


#endif