1 /*============================================================================
2 CMake - Cross Platform Makefile Generator
3 Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
5 Distributed under the OSI-approved BSD License (the "License");
6 see accompanying file Copyright.txt for details.
8 This software is distributed WITHOUT ANY WARRANTY; without even the
9 implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10 See the License for more information.
11 ============================================================================*/
12 #ifndef cmGlobalXCodeGenerator_h
13 #define cmGlobalXCodeGenerator_h
15 #include "cmGlobalGenerator.h"
16 #include "cmXCodeObject.h"
17 #include "cmCustomCommand.h"
23 /** \class cmGlobalXCodeGenerator
24 * \brief Write a Unix makefiles.
26 * cmGlobalXCodeGenerator manages UNIX build process for a tree
28 class cmGlobalXCodeGenerator : public cmGlobalGenerator
31 cmGlobalXCodeGenerator(std::string const& version);
32 static cmGlobalGenerator* New();
34 ///! Get the name for the generator.
35 virtual const char* GetName() const {
36 return cmGlobalXCodeGenerator::GetActualName();}
37 static const char* GetActualName() {return "Xcode";}
39 /** Get the documentation entry for this generator. */
40 virtual void GetDocumentation(cmDocumentationEntry& entry) const;
42 ///! Create a local generator appropriate to this Global Generator
43 virtual cmLocalGenerator *CreateLocalGenerator();
46 * Try to determine system infomation such as shared library
47 * extension, pthreads, byte order etc.
49 virtual void EnableLanguage(std::vector<std::string>const& languages,
50 cmMakefile *, bool optional);
52 * Try running cmake and building a file. This is used for dynalically
53 * loaded commands, not as part of the usual build process.
55 virtual std::string GenerateBuildCommand(const char* makeProgram,
56 const char *projectName,
57 const char* additionalOptions,
58 const char *targetName,
64 * Generate the all required files for building this project/tree. This
65 * basically creates a series of LocalGenerators for each directory and
66 * requests that they Generate.
68 virtual void Generate();
70 /** Append the subdirectory for the given configuration. */
71 virtual void AppendDirectoryForConfig(const char* prefix,
76 ///! What is the configurations directory variable called?
77 virtual const char* GetCMakeCFGIntDir() const;
79 void SetCurrentLocalGenerator(cmLocalGenerator*);
81 /** Return true if the generated build tree may contain multiple builds.
82 i.e. "Can I build Debug and Release in the same tree?" */
83 virtual bool IsMultiConfig();
86 cmXCodeObject* CreateOrGetPBXGroup(cmTarget& cmtarget,
88 cmXCodeObject* CreatePBXGroup(cmXCodeObject *parent,
90 void CreateGroups(cmLocalGenerator* root,
91 std::vector<cmLocalGenerator*>&
93 std::string XCodeEscapePath(const char* p);
94 std::string RelativeToSource(const char* p);
95 std::string RelativeToBinary(const char* p);
96 std::string ConvertToRelativeForXCode(const char* p);
97 std::string ConvertToRelativeForMake(const char* p);
98 void CreateCustomCommands(cmXCodeObject* buildPhases,
99 cmXCodeObject* sourceBuildPhase,
100 cmXCodeObject* headerBuildPhase,
101 cmXCodeObject* resourceBuildPhase,
102 std::vector<cmXCodeObject*> contentBuildPhases,
103 cmXCodeObject* frameworkBuildPhase,
106 std::string ComputeInfoPListLocation(cmTarget& target);
108 void AddCommandsToBuildPhase(cmXCodeObject* buildphase,
110 std::vector<cmCustomCommand>
112 const char* commandFileName);
114 void CreateCustomRulesMakefile(const char* makefileBasename,
116 std::vector<cmCustomCommand> const & commands,
117 const char* configName,
118 const std::map<cmStdString, cmStdString>&
122 cmXCodeObject* FindXCodeTarget(cmTarget*);
123 std::string GetOrCreateId(const char* name, const char* id);
125 // create cmXCodeObject from these functions so that memory can be managed
126 // correctly. All objects created are stored in this->XCodeObjects.
127 cmXCodeObject* CreateObject(cmXCodeObject::PBXType ptype);
128 cmXCodeObject* CreateObject(cmXCodeObject::Type type);
129 cmXCodeObject* CreateString(const char* s);
130 cmXCodeObject* CreateObjectReference(cmXCodeObject*);
131 cmXCodeObject* CreateXCodeTarget(cmTarget& target,
132 cmXCodeObject* buildPhases);
133 void ForceLinkerLanguages();
134 void ForceLinkerLanguage(cmTarget& cmtarget);
135 const char* GetTargetFileType(cmTarget& cmtarget);
136 const char* GetTargetProductType(cmTarget& cmtarget);
137 std::string AddConfigurations(cmXCodeObject* target, cmTarget& cmtarget);
138 void AppendOrAddBuildSetting(cmXCodeObject* settings, const char* attr,
140 void AppendBuildSettingAttribute(cmXCodeObject* target, const char* attr,
141 const char* value, const char* configName);
142 cmXCodeObject* CreateUtilityTarget(cmTarget& target);
143 void AddDependAndLinkInformation(cmXCodeObject* target);
144 void CreateBuildSettings(cmTarget& target,
145 cmXCodeObject* buildSettings,
146 const char* buildType);
147 std::string ExtractFlag(const char* flag, std::string& flags);
148 // delete all objects in the this->XCodeObjects vector.
149 void ClearXCodeObjects();
150 void CreateXCodeObjects(cmLocalGenerator* root,
151 std::vector<cmLocalGenerator*>& generators);
152 void OutputXCodeProject(cmLocalGenerator* root,
153 std::vector<cmLocalGenerator*>& generators);
154 void WriteXCodePBXProj(std::ostream& fout, cmLocalGenerator* root,
155 std::vector<cmLocalGenerator*>& generators);
156 cmXCodeObject* CreateXCodeFileReferenceFromPath(const std::string &fullpath,
158 const std::string &lang);
159 cmXCodeObject* CreateXCodeSourceFileFromPath(const std::string &fullpath,
161 const std::string &lang);
162 cmXCodeObject* CreateXCodeFileReference(cmSourceFile* sf,
164 cmXCodeObject* CreateXCodeSourceFile(cmLocalGenerator* gen,
167 void CreateXCodeTargets(cmLocalGenerator* gen,
168 std::vector<cmXCodeObject*>&);
169 bool IsHeaderFile(cmSourceFile*);
170 void AddDependTarget(cmXCodeObject* target,
171 cmXCodeObject* dependTarget);
172 void CreateXCodeDependHackTarget(std::vector<cmXCodeObject*>& targets);
173 bool SpecialTargetEmitted(std::string const& tname);
174 void SetGenerationRoot(cmLocalGenerator* root);
175 void AddExtraTargets(cmLocalGenerator* root,
176 std::vector<cmLocalGenerator*>& gens);
177 cmXCodeObject* CreateBuildPhase(const char* name,
180 const std::vector<cmCustomCommand>&);
181 void CreateReRunCMakeFile(cmLocalGenerator* root,
182 std::vector<cmLocalGenerator*> const& gens);
184 std::string LookupFlags(const char* varNamePrefix,
185 const char* varNameLang,
186 const char* varNameSuffix,
187 const char* default_flags);
189 class BuildObjectListOrString;
190 friend class BuildObjectListOrString;
192 void AppendDefines(BuildObjectListOrString& defs, const char* defines_list,
194 void AppendDefines(BuildObjectListOrString& defs,
195 std::vector<std::string> const& defines,
197 void AppendFlag(std::string& flags, std::string const& flag);
200 virtual const char* GetInstallTargetName() const { return "install"; }
201 virtual const char* GetPackageTargetName() const { return "package"; }
203 unsigned int XcodeVersion;
204 std::string VersionString;
205 std::set<cmStdString> XCodeObjectIDs;
206 std::vector<cmXCodeObject*> XCodeObjects;
207 cmXCodeObject* RootObject;
209 void ComputeTargetObjects(cmGeneratorTarget* gt) const;
211 std::string GetObjectsNormalDirectory(
212 const std::string &projName,
213 const std::string &configName,
214 const cmTarget *t) const;
216 void addObject(cmXCodeObject *obj);
217 std::string PostBuildMakeTarget(std::string const& tName,
218 std::string const& configName);
219 cmXCodeObject* MainGroupChildren;
220 cmXCodeObject* SourcesGroupChildren;
221 cmXCodeObject* ResourcesGroupChildren;
222 cmMakefile* CurrentMakefile;
223 cmLocalGenerator* CurrentLocalGenerator;
224 std::vector<std::string> CurrentConfigurationTypes;
225 std::string CurrentReRunCMakeMakefile;
226 std::string CurrentXCodeHackMakefile;
227 std::string CurrentProject;
228 std::set<cmStdString> TargetDoneSet;
229 std::vector<std::string> CurrentOutputDirectoryComponents;
230 std::vector<std::string> ProjectSourceDirectoryComponents;
231 std::vector<std::string> ProjectOutputDirectoryComponents;
232 std::map<cmStdString, cmXCodeObject* > GroupMap;
233 std::map<cmStdString, cmXCodeObject* > GroupNameMap;
234 std::map<cmStdString, cmXCodeObject* > TargetGroup;
235 std::map<cmStdString, cmXCodeObject* > FileRefs;
236 std::vector<std::string> Architectures;