summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fluid/ide_maketools.cxx1632
-rw-r--r--ide/Xcode3/FLTK.xcodeproj/project.pbxproj2
2 files changed, 1633 insertions, 1 deletions
diff --git a/fluid/ide_maketools.cxx b/fluid/ide_maketools.cxx
new file mode 100644
index 000000000..e71e51859
--- /dev/null
+++ b/fluid/ide_maketools.cxx
@@ -0,0 +1,1632 @@
+//
+// "$Id: ide_maketools.cxx 7169 2010-02-27 22:38:25Z matt $"
+//
+// IDE and Build FIle generation for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 1998-2009 by Bill Spitzak and others.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Library General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Library General Public License for more details.
+//
+// You should have received a copy of the GNU Library General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+// USA.
+//
+// Please report all bugs and problems on the following page:
+//
+// http://www.fltk.org/str.php
+//
+
+/*
+
+ MAKETOOLS IDE FILES
+
+ FLTK builds easily from the command line using the sequence:
+
+ > autoconfig
+ > ./configure
+ > make
+ > test/Demo
+ > sudo make install
+
+ This module creates all "Makefile" files that are required to create the
+ project. Other files, for example "config.h.in" or "makeinclude.in", are
+ not created. We expect them to exist already. This may change in later
+ releases and for stand-alone application support.
+
+ The Makefiles are pretty straight forward. Just read the source code below.
+ There are some exceptions, particularly for handling OpenGL that are hard coded
+ into the sources below.
+
+*/
+
+#include "ide_support.h"
+
+#include <FL/filename.H>
+#include <FL/fl_ask.H>
+#include "../src/flstring.h"
+
+#include "Fl_Type.h"
+
+/*
+ * This class creates all Makefile/autoconf files.
+ */
+class Maketools_IDE {
+ char *rootDir;
+ char projectName[80];
+ Fl_Preferences tgtAppsDB;
+ int nTgtApps;
+ Fl_Preferences tgtLibsDB;
+ int nTgtLibs;
+ Fl_Preferences tgtTestsDB;
+ int nTgtTests;
+ Fl_Preferences filesDB;
+ int nFiles;
+ Fl_Preferences ideDB;
+public:
+ Maketools_IDE(Fl_Preferences &db, const char *rootDirA)
+ : rootDir(strdup(rootDirA)),
+ tgtAppsDB(db, "targets/apps"),
+ tgtLibsDB(db, "targets/libs"),
+ tgtTestsDB(db, "targets/tests"),
+ filesDB(db, "files"),
+ ideDB(db, "ide/Maketools")
+ {
+ db.get("projectName", projectName, "Unnamed", 80);
+ nTgtApps = tgtAppsDB.groups();
+ nTgtLibs = tgtLibsDB.groups();
+ nTgtTests = tgtTestsDB.groups();
+ nFiles = filesDB.groups();
+ }
+ ~Maketools_IDE() {
+ if (rootDir) free(rootDir);
+ }
+
+#if 0
+ /*
+ * Write all files required during the actual build.
+ * These are actually forwarding links from the build setup into the
+ * files section.
+ */
+ int writeBuildFiles(FILE *out, Fl_Preferences &targetDB) {
+ // FIXME: also write .app, .plist, and maybe headers
+ // --- write all references to sources from the given target
+ Fl_Preferences sourcesDB(targetDB, "sources");
+ int i, n = sourcesDB.groups();
+ for (i=0; i<n; i++) {
+ Fl_Preferences sourceDB(sourcesDB, i);
+ GET_UUID(refUUID, sourceDB);
+ MAKE_XCID(xcBuildFileID, sourceDB);
+ Fl_File_Prefs fileDB(filesDB, refUUID);
+ MAKE_XCID(xcFileID, fileDB);
+ const char *fullName = fileDB.fullName();
+ fprintf(out, "\t\t%s /* %s in Sources */ = {isa = PBXBuildFile; fileRef = %s /* %s */; };\n", xcBuildFileID, fullName, xcFileID, fullName);
+ }
+ // --- write all references to Fluid UI files from the given target
+ Fl_Preferences flsDB(targetDB, "fl");
+ n = flsDB.groups();
+ for (i=0; i<n; i++) {
+ Fl_Preferences flDB(flsDB, i);
+ GET_UUID(refUUID, flDB);
+ MAKE_XCID(xcBuildFileID, flDB);
+ Fl_File_Prefs fileDB(filesDB, refUUID);
+ MAKE_XCID(xcFileID, fileDB);
+ const char *fullName = fileDB.fullName();
+ fprintf(out, "\t\t%s /* %s in Sources */ = {isa = PBXBuildFile; fileRef = %s /* %s */; };\n", xcBuildFileID, fullName, xcFileID, fullName);
+ }
+ Fl_Preferences libsDB(targetDB, "libs"); n = libsDB.groups();
+ for (i=0; i<n; i++) {
+ Fl_Preferences libDB(libsDB, i);
+ GET_UUID(refUUID, libDB);
+ MAKE_XCID(xcBuildFrameworkID, libDB);
+ MAKE_XCID(xcCopyFrameworkID, libDB);
+ Fl_Preferences tgtLibDB(tgtLibsDB, refUUID);
+ MAKE_XCID(xcProductID, tgtLibDB);
+ char name[80]; tgtLibDB.get("name", name, "DBERROR", 80);;
+ fprintf(out, "\t\t%s /* %s.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = %s /* %s.framework */; };\n", xcBuildFrameworkID, name, xcProductID, name);
+ fprintf(out, "\t\t%s /* %s.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = %s /* %s.framework */; };\n", xcCopyFrameworkID, name, xcProductID, name);
+ }
+ Fl_Preferences extsDB(targetDB, "externals"); n = extsDB.groups();
+ for (i=0; i<n; i++) {
+ Fl_Preferences extDB(extsDB, i);
+ if (with_xcode(extDB.id())) {
+ GET_UUID(refUUID, extDB);
+ Fl_File_Prefs fileDB(filesDB, refUUID);
+ MAKE_XCID(xcFileID, fileDB);
+ const char *fullName = fileDB.fullName();
+ if (strcmp(fileDB.fileExt(), ".icns")==0) {
+ MAKE_XCID(xcCopyResourceID, extDB);
+ fprintf(out, "\t\t%s /* %s in Resources */ = {isa = PBXBuildFile; fileRef = %s /* %s */; };\n", xcCopyResourceID, fullName, xcFileID, fullName);
+ } else {
+ MAKE_XCID(xcBuildFrameworkID, extDB);
+ fprintf(out, "\t\t%s /* %s in Frameworks */ = {isa = PBXBuildFile; fileRef = %s /* %s */; };\n", xcBuildFrameworkID, fullName, xcFileID, fullName);
+ }
+ }
+ }
+ return 0;
+ }
+
+ /*
+ * Writes the section that links build components to a file.
+ */
+ int writeBuildFileSection(FILE *out) {
+ fprintf(out, "/* Begin PBXBuildFile section */\n");
+ int i;
+ for (i=0; i<nTgtApps; i++) {
+ Fl_Preferences targetDB(tgtAppsDB, i);
+ writeBuildFiles(out, targetDB);
+ }
+ for (i=0; i<nTgtLibs; i++) {
+ Fl_Preferences targetDB(tgtLibsDB, i);
+ writeBuildFiles(out, targetDB);
+ }
+ for (i=0; i<nTgtTests; i++) {
+ Fl_Preferences targetDB(tgtTestsDB, i);
+ writeBuildFiles(out, targetDB);
+ }
+ fprintf(out, "/* End PBXBuildFile section */\n\n");
+ return 0;
+ }
+
+ /*
+ * Write the build rule for .fl files.
+ */
+ int writeBuildRule(FILE *out, Fl_Preferences &targetDB) {
+ MAKE_XCID(xcBuildRuleFlID, targetDB);
+ fprintf(out, "\t\t%s /* PBXBuildRule */ = {\n", xcBuildRuleFlID);
+ fprintf(out, "\t\t\tisa = PBXBuildRule;\n");
+ fprintf(out, "\t\t\tcompilerSpec = com.apple.compilers.proxy.script;\n");
+ fprintf(out, "\t\t\tfilePatterns = \"*.fl\";\n");
+ fprintf(out, "\t\t\tfileType = pattern.proxy;\n");
+ fprintf(out, "\t\t\tisEditable = 1;\n");
+ fprintf(out, "\t\t\toutputFiles = (\n");
+ fprintf(out, "\t\t\t\t\"${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx\",\n");
+ fprintf(out, "\t\t\t\t\"${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h\",\n");
+ fprintf(out, "\t\t\t);\n");
+ fprintf(out, "\t\t\tscript = \"export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}\";\n");
+ fprintf(out, "\t\t};\n");
+ return 0;
+ }
+
+ /*
+ * Additional build rules. Here we teach Xcode how to handle .fl files.
+ */
+ int writeBuildRuleSection(FILE *out) {
+ int i;
+ fprintf(out, "/* Begin PBXBuildRule section */\n");
+ for (i=0; i<nTgtApps; i++) {
+ Fl_Preferences targetDB(tgtAppsDB, i);
+ writeBuildRule(out, targetDB);
+ }
+ for (i=0; i<nTgtLibs; i++) {
+ Fl_Preferences targetDB(tgtLibsDB, i);
+ writeBuildRule(out, targetDB);
+ }
+ for (i=0; i<nTgtTests; i++) {
+ Fl_Preferences targetDB(tgtTestsDB, i);
+ writeBuildRule(out, targetDB);
+ }
+ fprintf(out, "/* End PBXBuildRule section */\n\n");
+ return 0;
+ }
+
+ /*
+ * Write all target proxies for a single target.
+ */
+ int writeContainerItemProxy(FILE *out, Fl_Preferences &targetDB) {
+ Fl_Preferences depsDB(targetDB, "deps");
+ int i, n = depsDB.groups();
+ for (i=0; i<n; i++) {
+ Fl_Preferences depDB(depsDB, i);
+ GET_UUID(refUUID, depDB);
+ // MAKE_XCID(xcDependencyID, depDB);
+ MAKE_XCID(xcProxyID, depDB);
+ Fl_Preferences *depTgtDBp = 0;
+ if (tgtAppsDB.groupExists(refUUID))
+ depTgtDBp = new Fl_Preferences(tgtAppsDB, refUUID);
+ else if (tgtLibsDB.groupExists(refUUID))
+ depTgtDBp = new Fl_Preferences(tgtLibsDB, refUUID);
+ else if (tgtTestsDB.groupExists(refUUID))
+ depTgtDBp = new Fl_Preferences(tgtTestsDB, refUUID);
+ if (depTgtDBp) {
+ Fl_Preferences &depTgtDB = *depTgtDBp;
+ MAKE_XCID(xcTargetID, depTgtDB);
+ char name[80]; depTgtDB.get("name", name, "DBERROR", 80);
+ fprintf(out, "\t\t%s /* PBXContainerItemProxy */ = {\n", xcProxyID);
+ fprintf(out, "\t\t\tisa = PBXContainerItemProxy;\n");
+ fprintf(out, "\t\t\tcontainerPortal = %s /* Project object */;\n", xcRootNodeID);
+ fprintf(out, "\t\t\tproxyType = 1;\n");
+ fprintf(out, "\t\t\tremoteGlobalIDString = %s;\n", xcTargetID);
+ fprintf(out, "\t\t\tremoteInfo = %s;\n", name);
+ fprintf(out, "\t\t};\n");
+ delete depTgtDBp;
+ }
+ }
+ return 0;
+ }
+
+ /*
+ * Write a proxy for all target dependencies of all targets.
+ * (I am not entirely sure why these proxies exist, but Apple will know)
+ */
+ int writeContainerItemProxySection(FILE *out) {
+ fprintf(out, "/* Begin PBXContainerItemProxy section */\n");
+ int i;
+ for (i=0; i<nTgtApps; i++) {
+ Fl_Preferences targetDB(tgtAppsDB, i);
+ writeContainerItemProxy(out, targetDB);
+ }
+ for (i=0; i<nTgtLibs; i++) {
+ Fl_Preferences targetDB(tgtLibsDB, i);
+ writeContainerItemProxy(out, targetDB);
+ }
+ for (i=0; i<nTgtTests; i++) {
+ Fl_Preferences targetDB(tgtTestsDB, i);
+ writeContainerItemProxy(out, targetDB);
+ }
+ fprintf(out, "/* End PBXContainerItemProxy section */\n\n");
+ return 0;
+ }
+
+ /*
+ * List the files that will be copied into the final application.
+ */
+ int writeCopyFilesBuildPhase(FILE *out, Fl_Preferences &targetDB) {
+ MAKE_XCID(xcBuildCopyFilesID, targetDB);
+ fprintf(out, "\t\t%s /* CopyFiles */ = {\n", xcBuildCopyFilesID);
+ fprintf(out, "\t\t\tisa = PBXCopyFilesBuildPhase;\n");
+ fprintf(out, "\t\t\tbuildActionMask = 2147483647;\n");
+ fprintf(out, "\t\t\tdstPath = \"\";\n");
+ fprintf(out, "\t\t\tdstSubfolderSpec = 10;\n");
+ fprintf(out, "\t\t\tfiles = (\n");
+ // ---
+ Fl_Preferences libsDB(targetDB, "libs");
+ int i, n = libsDB.groups();
+ for (i=0; i<n; i++) {
+ Fl_Preferences libDB(libsDB, i);
+ GET_UUID(refUUID, libDB);
+ MAKE_XCID(xcCopyFrameworkID, libDB);
+ Fl_Preferences tgtLibDB(tgtLibsDB, refUUID);
+ char name[80]; tgtLibDB.get("name", name, "DBERROR", 80);;
+ fprintf(out, "\t\t\t\t%s /* %s.framework in CopyFiles */,\n", xcCopyFrameworkID, name);
+ }
+ // ---
+ fprintf(out, "\t\t\t);\n");
+ fprintf(out, "\t\t\trunOnlyForDeploymentPostprocessing = 0;\n");
+ fprintf(out, "\t\t};\n");
+ return 0;
+ };
+
+ /*
+ * List the files that will be copied into the final application.
+ */
+ int writeCopyFilesBuildPhaseSection(FILE *out) {
+ fprintf(out, "/* Begin PBXCopyFilesBuildPhase section */\n");
+ int i;
+ for (i=0; i<nTgtApps; i++) {
+ Fl_Preferences targetDB(tgtAppsDB, i);
+ writeCopyFilesBuildPhase(out, targetDB);
+ }
+ // TgtLibsDB has no CopyFile build phase
+ for (i=0; i<nTgtTests; i++) {
+ Fl_Preferences targetDB(tgtTestsDB, i);
+ writeCopyFilesBuildPhase(out, targetDB);
+ }
+ fprintf(out, "/* End PBXCopyFilesBuildPhase section */\n\n");
+ return 0;
+ }
+
+ /*
+ * A list of all files that are somehow referenced in this project
+ */
+ int writeFileReferenceSection(FILE *out) {
+ int i;
+ fprintf(out, "/* Begin PBXFileReference section */\n");
+ // --- list of all Application target results
+ for (i=0; i<nTgtApps; i++) {
+ Fl_Preferences targetDB(tgtAppsDB, i);
+ // write a reference to the target.app file
+ char name[80]; targetDB.get("name", name, "DBERROR", 80);
+ MAKE_XCID(xcProductID, targetDB);
+ fprintf(out, "\t\t%s /* %s.app */ = {isa = PBXFileReference; "
+ "explicitFileType = wrapper.application; includeInIndex = 0; "
+ "path = %s.app; sourceTree = BUILT_PRODUCTS_DIR; };\n",
+ xcProductID, name, name);
+ // FIXME: write .plist reference
+ }
+ for (i=0; i<nTgtLibs; i++) {
+ Fl_Preferences targetDB(tgtLibsDB, i);
+ // write a reference to the target.app file
+ char name[80]; targetDB.get("name", name, "DBERROR", 80);
+ MAKE_XCID(xcProductID, targetDB);
+ fprintf(out, "\t\t%s /* %s.framework */ = {isa = PBXFileReference; "
+ "explicitFileType = wrapper.framework; includeInIndex = 0; "
+ "path = %s.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n",
+ xcProductID, name, name);
+ // FIXME: write .plist reference
+ }
+ for (i=0; i<nTgtTests; i++) {
+ Fl_Preferences targetDB(tgtTestsDB, i);
+ // write a reference to the target.app file
+ char name[80]; targetDB.get("name", name, "DBERROR", 80);
+ MAKE_XCID(xcProductID, targetDB);
+ fprintf(out, "\t\t%s /* %s.app */ = {isa = PBXFileReference; "
+ "explicitFileType = wrapper.application; includeInIndex = 0; "
+ "path = %s.app; sourceTree = BUILT_PRODUCTS_DIR; };\n",
+ xcProductID, name, name);
+ // FIXME: write .plist reference
+ }
+ // write all source file
+ for (i=0; i<nFiles; i++) {
+ Fl_File_Prefs fileDB(filesDB, i);
+ MAKE_XCID(xcFileID, fileDB);
+ const char *fullName = fileDB.fullName();
+ char pathAndName[1024]; fileDB.get("pathAndName", pathAndName, "DBERROR", 1024);
+ const char *filetype = "test";
+ const char *ext = fileDB.fileExt();
+ if (!ext) {
+ } else if (strcmp(pathAndName, "src/Fl.cxx")==0
+ ||strcmp(pathAndName, "src/Fl_Native_File_Chooser.cxx")==0) { // FIXME: bad hack!
+ filetype = "sourcecode.cpp.objcpp";
+ } else if (strcmp(ext, ".cxx")==0) {
+ filetype = "sourcecode.cpp.cpp";
+ } else if (strcmp(ext, ".c")==0) {
+ filetype = "sourcecode.c.c";
+ } else if (strcmp(ext, ".mm")==0) {
+ filetype = "sourcecode.cpp.objcpp";
+ } else if (strcmp(ext, ".dylib")==0) {
+ fprintf(out,
+ "\t\t%s /* %s */ = {isa = PBXFileReference; "
+ "lastKnownFileType = \"compiled.mach-o.dylib\"; "
+ "name = %s; path = %s; "
+ "sourceTree = \"<absolute>\"; };\n",
+ xcFileID, fullName, fullName, pathAndName );
+ filetype = 0L;
+ } else if (strcmp(ext, ".framework")==0) {
+ fprintf(out,
+ "\t\t%s /* %s */ = {isa = PBXFileReference; "
+ "lastKnownFileType = \"wrapper.framework\"; "
+ "name = %s; path = %s; "
+ "sourceTree = \"<absolute>\"; };\n",
+ xcFileID, fullName, fullName, pathAndName );
+ filetype = 0L;
+ } else if (strcmp(ext, ".icns")==0) {
+ fprintf(out,
+ "\t\t%s /* %s */ = {isa = PBXFileReference; "
+ "lastKnownFileType = \"image.icns\"; "
+ "name = %s; path = %s; "
+ "sourceTree = \"<group>\"; };\n",
+ xcFileID, fullName, fullName, pathAndName );
+ filetype = 0L;
+ } else if (strcmp(ext, ".plist")==0) {
+ filetype = "text.plist.xml";
+ }
+ if (filetype)
+ fprintf(out,
+ "\t\t%s /* %s */ = {isa = PBXFileReference; fileEncoding = 4; "
+ "lastKnownFileType = %s; name = %s; "
+ "path = ../../%s; sourceTree = SOURCE_ROOT; };\n",
+ xcFileID, fullName, filetype, fullName, pathAndName);
+ }
+ fprintf(out, "/* End PBXFileReference section */\n\n");
+ return 0;
+ }
+
+ /*
+ * List all framework build phases
+ */
+ int writeFrameworksBuildPhase(FILE *out, Fl_Preferences &targetDB) {
+ MAKE_XCID(xcBuildFrameworksID, targetDB);
+ fprintf(out, "\t\t%s /* Frameworks */ = {\n", xcBuildFrameworksID);
+ fprintf(out, "\t\t\tisa = PBXFrameworksBuildPhase;\n");
+ fprintf(out, "\t\t\tbuildActionMask = 2147483647;\n");
+ fprintf(out, "\t\t\tfiles = (\n");
+ Fl_Preferences libsDB(targetDB, "libs");
+ int i, n = libsDB.groups();
+ for (i=0; i<n; i++) {
+ Fl_Preferences libDB(libsDB, i);
+ GET_UUID(refUUID, libDB);
+ MAKE_XCID(xcBuildFrameworkID, libDB);
+ Fl_Preferences tgtLibDB(tgtLibsDB, refUUID);
+ char name[80]; tgtLibDB.get("name", name, "DBERROR", 80);
+ fprintf(out, "\t\t\t\t%s /* %s.framework in Frameworks */,\n", xcBuildFrameworkID, name);
+ }
+ Fl_Preferences extsDB(targetDB, "externals");
+ n = extsDB.groups();
+ for (i=0; i<n; i++) {
+ Fl_Preferences extDB(extsDB, i);
+ if (with_xcode(extDB.id())) {
+ GET_UUID(refUUID, extDB);
+ MAKE_XCID(xcBuildFrameworkID, extDB);
+ Fl_File_Prefs fileDB(filesDB, refUUID);
+ const char *fullName = fileDB.fullName();
+ if (strcmp(fileDB.fileExt(), ".icns")!=0) {
+ fprintf(out, "\t\t\t\t%s /* %s in Frameworks */,\n", xcBuildFrameworkID, fullName);
+ }
+ }
+ }
+ fprintf(out, "\t\t\t);\n");
+ fprintf(out, "\t\t\trunOnlyForDeploymentPostprocessing = 0;\n");
+ fprintf(out, "\t\t};\n");
+ return 0;
+ };
+
+ /*
+ * Write all build phases.
+ */
+ int writeFrameworksBuildPhaseSection(FILE *out) {
+ fprintf(out, "/* Begin PBXFrameworksBuildPhase section */\n");
+ int i;
+ for (i=0; i<nTgtApps; i++) {
+ Fl_Preferences targetDB(tgtAppsDB, i);
+ writeFrameworksBuildPhase(out, targetDB);
+ }
+ for (i=0; i<nTgtLibs; i++) {
+ Fl_Preferences targetDB(tgtLibsDB, i);
+ writeFrameworksBuildPhase(out, targetDB);
+ }
+ for (i=0; i<nTgtTests; i++) {
+ Fl_Preferences targetDB(tgtTestsDB, i);
+ writeFrameworksBuildPhase(out, targetDB);
+ }
+ fprintf(out, "/* End PBXFrameworksBuildPhase section */\n\n");
+ return 0;
+ }
+
+ /*
+ *
+ */
+ int writeTargetFiles(FILE *out, Fl_Preferences &targetDB) {
+ char name[80];
+ MAKE_XCID(xcTargetGroupID, targetDB);
+ targetDB.get("name", name, "DBERROR", 80);
+ fprintf(out, "\t\t%s /* %s */ = {\n", xcTargetGroupID, name);
+ fprintf(out, "\t\t\tisa = PBXGroup;\n");
+ fprintf(out, "\t\t\tchildren = (\n");
+
+ MAKE_XCID(xcProductID, targetDB);
+ Fl_Preferences sourcesDB(targetDB, "sources");
+ int j, n = sourcesDB.groups();
+ for (j=0; j<n; j++) {
+ Fl_Preferences sourceDB(sourcesDB, j);
+ GET_UUID(refUUID, sourceDB);
+ Fl_File_Prefs fileDB(filesDB, refUUID);
+ MAKE_XCID(xcFileID, fileDB);
+ const char *fullName = fileDB.fullName();
+ fprintf(out, "\t\t\t\t%s /* %s */,\n", xcFileID, fullName);
+ }
+ Fl_Preferences flsDB(targetDB, "fl");
+ n = flsDB.groups();
+ for (j=0; j<n; j++) {
+ Fl_Preferences flDB(flsDB, j);
+ GET_UUID(refUUID, flDB);
+ Fl_File_Prefs fileDB(filesDB, refUUID);
+ MAKE_XCID(xcFileID, fileDB);
+ const char *fullName = fileDB.fullName();
+ fprintf(out, "\t\t\t\t%s /* %s */,\n", xcFileID, fullName);
+ }
+ Fl_Preferences extsDB(targetDB, "externals");
+ n = extsDB.groups();
+ for (j=0; j<n; j++) {
+ Fl_Preferences extDB(extsDB, j);
+ if (with_xcode(extDB.id())) {
+ GET_UUID(refUUID, extDB);
+ Fl_File_Prefs fileDB(filesDB, refUUID);
+ MAKE_XCID(xcFileID, fileDB);
+ const char *fullName = fileDB.fullName();
+ fprintf(out, "\t\t\t\t%s /* %s */,\n", xcFileID, fullName);
+ }
+ }
+
+ fprintf(out, "\t\t\t);\n");
+ fprintf(out, "\t\t\tname = %s;\n", name);
+ fprintf(out, "\t\t\tsourceTree = \"<group>\";\n");
+ fprintf(out, "\t\t};\n");
+ return 0;
+ }
+
+ /*
+ * Groups define the folder hierarchy in the "Groups & Files" panel
+ */
+ int writeGroupSection(FILE *out) {
+ int i;
+ char name[80];
+ fprintf(out, "/* Begin PBXGroup section */\n");
+ // --- FIXME: missing "icons" group
+ // --- main group
+ fprintf(out, "\t\t%s = {\n", xcMainGroupID);
+ fprintf(out, "\t\t\tisa = PBXGroup;\n");
+ fprintf(out, "\t\t\tchildren = (\n");
+ fprintf(out, "\t\t\t\t%s /* Applications */,\n", xcAppsGroupID);
+ fprintf(out, "\t\t\t\t%s /* Frameworks */,\n", xcLibsGroupID);
+ fprintf(out, "\t\t\t\t%s /* Tests */,\n", xcTestsGroupID);
+ fprintf(out, "\t\t\t\t%s /* Products */,\n", xcProductsGroupID); // link to "Products" group
+ fprintf(out, "\t\t\t);\n");
+ fprintf(out, "\t\t\tsourceTree = \"<group>\";\n");
+ fprintf(out, "\t\t};\n");
+ // --- "Products" group
+ fprintf(out, "\t\t%s /* Products */ = {\n", xcProductsGroupID);
+ fprintf(out, "\t\t\tisa = PBXGroup;\n");
+ fprintf(out, "\t\t\tchildren = (\n");
+ for (i=0; i<nTgtApps; i++) {
+ Fl_Preferences targetDB(tgtAppsDB, i);
+ char name[80]; targetDB.get("name", name, "DBERROR", 80);
+ MAKE_XCID(xcProductID, targetDB);
+ fprintf(out, "\t\t\t\t%s /* %s.app */,\n", xcProductID, name);
+ }
+ for (i=0; i<nTgtLibs; i++) {
+ Fl_Preferences targetDB(tgtLibsDB, i);
+ char name[80]; targetDB.get("name", name, "DBERROR", 80);
+ MAKE_XCID(xcProductID, targetDB);
+ fprintf(out, "\t\t\t\t%s /* %s.framework */,\n", xcProductID, name);
+ }
+ for (i=0; i<nTgtTests; i++) {
+ Fl_Preferences targetDB(tgtTestsDB, i);
+ char name[80]; targetDB.get("name", name, "DBERROR", 80);
+ MAKE_XCID(xcProductID, targetDB);
+ fprintf(out, "\t\t\t\t%s /* %s.app */,\n", xcProductID, name);
+ }
+ fprintf(out, "\t\t\t);\n");
+ fprintf(out, "\t\t\tname = Products;\n");
+ fprintf(out, "\t\t\tsourceTree = \"<group>\";\n");
+ fprintf(out, "\t\t};\n");
+ // --- FIXME: missing "plists" group
+
+ // --- "Applications" group
+ fprintf(out, "\t\t%s /* Applications */ = {\n", xcAppsGroupID);
+ fprintf(out, "\t\t\tisa = PBXGroup;\n");
+ fprintf(out, "\t\t\tchildren = (\n");
+ for (i=0; i<nTgtApps; i++) {
+ Fl_Preferences targetDB(tgtAppsDB, i);
+ MAKE_XCID(xcTargetGroupID, targetDB);
+ targetDB.get("name", name, "DBERROR", 80);
+ fprintf(out, "\t\t\t\t%s /* %s */,\n", xcTargetGroupID, name);
+ }
+ fprintf(out, "\t\t\t);\n");
+ fprintf(out, "\t\t\tname = Applications;\n");
+ fprintf(out, "\t\t\tsourceTree = \"<group>\";\n");
+ fprintf(out, "\t\t};\n");
+ for (i=0; i<nTgtApps; i++) {
+ Fl_Preferences targetDB(tgtAppsDB, i);
+ writeTargetFiles(out, targetDB);
+ }
+ // --- "Frameworks" group
+ fprintf(out, "\t\t%s /* Frameworks */ = {\n", xcLibsGroupID);
+ fprintf(out, "\t\t\tisa = PBXGroup;\n");
+ fprintf(out, "\t\t\tchildren = (\n");
+ for (i=0; i<nTgtLibs; i++) {
+ Fl_Preferences targetDB(tgtLibsDB, i);
+ MAKE_XCID(xcTargetGroupID, targetDB);
+ targetDB.get("name", name, "DBERROR", 80);
+ fprintf(out, "\t\t\t\t%s /* %s */,\n", xcTargetGroupID, name);
+ }
+ fprintf(out, "\t\t\t);\n");
+ fprintf(out, "\t\t\tname = Frameworks;\n");
+ fprintf(out, "\t\t\tsourceTree = \"<group>\";\n");
+ fprintf(out, "\t\t};\n");
+ for (i=0; i<nTgtLibs; i++) {
+ Fl_Preferences targetDB(tgtLibsDB, i);
+ writeTargetFiles(out, targetDB);
+ }
+ // --- "Tests" group
+ fprintf(out, "\t\t%s /* Tests */ = {\n", xcTestsGroupID);
+ fprintf(out, "\t\t\tisa = PBXGroup;\n");
+ fprintf(out, "\t\t\tchildren = (\n");
+ for (i=0; i<nTgtTests; i++) {
+ Fl_Preferences targetDB(tgtTestsDB, i);
+ MAKE_XCID(xcTargetGroupID, targetDB);
+ targetDB.get("name", name, "DBERROR", 80);
+ fprintf(out, "\t\t\t\t%s /* %s */,\n", xcTargetGroupID, name);
+ }
+ fprintf(out, "\t\t\t);\n");
+ fprintf(out, "\t\t\tname = Tests;\n");
+ fprintf(out, "\t\t\tsourceTree = \"<group>\";\n");
+ fprintf(out, "\t\t};\n");
+ for (i=0; i<nTgtTests; i++) {
+ Fl_Preferences targetDB(tgtTestsDB, i);
+ writeTargetFiles(out, targetDB);
+ }
+ // --- done
+
+ fprintf(out, "/* End PBXGroup section */\n\n");
+ return 0;
+ }
+
+ /*
+ *
+ */
+ int writeHeadersBuildPhase(FILE *out, Fl_Preferences &targetDB) {
+ MAKE_XCID(xcBuildHeadersID, targetDB);
+ fprintf(out, "\t\t%s /* Headers */ = {\n", xcBuildHeadersID);
+ fprintf(out, "\t\t\tisa = PBXHeadersBuildPhase;\n");
+ fprintf(out, "\t\t\tbuildActionMask = 2147483647;\n");
+ fprintf(out, "\t\t\tfiles = (\n");
+#if 0
+ // FIXME: list all required headers
+ Fl_Preferences libsDB(targetDB, "libs");
+ int i, n = libsDB.groups();
+ for (i=0; i<n; i++) {
+ Fl_Preferences libDB(libsDB, i);
+ GET_UUID(refUUID, libDB);
+ MAKE_XCID(xcCopyFrameworkID, libDB);
+ Fl_Preferences tgtLibDB(tgtLibsDB, refUUID);
+ char name[80]; tgtLibDB.get("name", name, "DBERROR", 80);;
+ fprintf(out, "\t\t\t\t%s /* %s.framework in CopyFiles */,\n", xcCopyFrameworkID, name);
+ }
+#endif
+ fprintf(out, "\t\t\t);\n");
+ fprintf(out, "\t\t\trunOnlyForDeploymentPostprocessing = 0;\n");
+ fprintf(out, "\t\t};\n");
+ return 0;
+ };
+
+ /*
+ *
+ */
+ int writeHeadersBuildPhaseSection(FILE *out) {
+ int i;
+ fprintf(out, "/* Begin PBXHeadersBuildPhase section */\n");
+ for (i=0; i<nTgtLibs; i++) {
+ Fl_Preferences targetDB(tgtLibsDB, i);
+ writeHeadersBuildPhase(out, targetDB);
+ }
+ fprintf(out, "/* End PBXHeadersBuildPhase section */\n\n");
+ return 0;
+ }
+
+ /*
+ * Write build information for this target
+ */
+ int writeNativeTarget(FILE *out, Fl_Preferences &targetDB, int fmwk=0) {
+ char name[80]; targetDB.get("name", name, "DBERROR", 80);
+ MAKE_XCID(xcTargetID, targetDB);
+ MAKE_XCID(xcBuildConfigurationListID, targetDB);
+ char xcBuildHeadersID[25], xcBuildCopyFilesID[25];
+ if (fmwk) getXCID(targetDB, "xcBuildHeadersID", xcBuildHeadersID);
+ MAKE_XCID(xcBuildResourcesID, targetDB);
+ MAKE_XCID(xcBuildSourcesID, targetDB);
+ MAKE_XCID(xcBuildFrameworksID, targetDB);
+ if (!fmwk) getXCID(targetDB, "xcBuildCopyFilesID", xcBuildCopyFilesID);
+ MAKE_XCID(xcProductID, targetDB);
+ MAKE_XCID(xcBuildRuleFlID, targetDB);
+ fprintf(out, "\t\t%s /* %s */ = {\n", xcTargetID, name);
+ fprintf(out, "\t\t\tisa = PBXNativeTarget;\n");
+ fprintf(out, "\t\t\tbuildConfigurationList = %s /* Build configuration list for PBXNativeTarget \"%s\" */;\n", xcBuildConfigurationListID, name);
+ fprintf(out, "\t\t\tbuildPhases = (\n");
+ if (fmwk) fprintf(out, "\t\t\t\t%s /* Headers */,\n", xcBuildHeadersID);
+ fprintf(out, "\t\t\t\t%s /* Resources */,\n", xcBuildResourcesID);
+ fprintf(out, "\t\t\t\t%s /* Sources */,\n", xcBuildSourcesID);
+ fprintf(out, "\t\t\t\t%s /* Frameworks */,\n", xcBuildFrameworksID);
+ if (!fmwk) fprintf(out, "\t\t\t\t%s /* CopyFiles */,\n", xcBuildCopyFilesID);
+ fprintf(out, "\t\t\t);\n");
+ fprintf(out, "\t\t\tbuildRules = (\n");
+ fprintf(out, "\t\t\t\t%s /* PBXBuildRule */,\n", xcBuildRuleFlID);
+ fprintf(out, "\t\t\t);\n");
+ fprintf(out, "\t\t\tdependencies = (\n"); {
+ Fl_Preferences depsDB(targetDB, "deps");
+ int i, n = depsDB.groups();
+ for (i=0; i<n; i++) {
+ Fl_Preferences depDB(depsDB, i);
+ MAKE_XCID(xcDependencyID, depDB);
+ fprintf(out, "\t\t\t\t%s /* PBXTargetDependency */,\n", xcDependencyID);
+ }
+ }
+ fprintf(out, "\t\t\t);\n");
+ fprintf(out, "\t\t\tname = %s;\n", name);
+ fprintf(out, "\t\t\tproductName = %s;\n", name);
+ if (fmwk) {
+ fprintf(out, "\t\t\tproductReference = %s /* %s.framework */;\n", xcProductID, name);
+ fprintf(out, "\t\t\tproductType = \"com.apple.product-type.framework\";\n");
+ } else {
+ fprintf(out, "\t\t\tproductReference = %s /* %s.app */;\n", xcProductID, name);
+ fprintf(out, "\t\t\tproductType = \"com.apple.product-type.application\";\n");
+ }
+ fprintf(out, "\t\t};\n");
+ return 0;
+ }
+
+ /*
+ * Write the build information for all targets
+ */
+ int writeNativeTargetSection(FILE *out) {
+ fprintf(out, "/* Begin PBXNativeTarget section */\n");
+ int i;
+ for (i=0; i<nTgtApps; i++) {
+ Fl_Preferences targetDB(tgtAppsDB, i);
+ writeNativeTarget(out, targetDB, 0);
+ }
+ for (i=0; i<nTgtLibs; i++) {
+ Fl_Preferences targetDB(tgtLibsDB, i);
+ writeNativeTarget(out, targetDB, 1);
+ }
+ for (i=0; i<nTgtTests; i++) {
+ Fl_Preferences targetDB(tgtTestsDB, i);
+ writeNativeTarget(out, targetDB, 0);
+ }
+ fprintf(out, "/* End PBXNativeTarget section */\n\n");
+ return 0;
+ }
+
+ /*
+ * This section describes the file layout in "Grous & Files"
+ */
+ int writeProjectSection(FILE *out) {
+ int i;
+ fprintf(out, "/* Begin PBXProject section */\n");
+ fprintf(out, "\t\t%s /* Project object */ = {\n", xcRootNodeID);
+ fprintf(out, "\t\t\tisa = PBXProject;\n");
+ fprintf(out, "\t\t\tbuildConfigurationList = %s /* Build configuration list for PBXProject \"%s\" */;\n", xcBuildConfigurationListID, projectName);
+ fprintf(out, "\t\t\tcompatibilityVersion = \"Xcode 3.0\";\n");
+ fprintf(out, "\t\t\thasScannedForEncodings = 0;\n");
+ fprintf(out, "\t\t\tmainGroup = %s;\n", xcMainGroupID);
+ fprintf(out, "\t\t\tproductRefGroup = %s /* Products */;\n", xcProductsGroupID);
+ fprintf(out, "\t\t\tprojectDirPath = \"\";\n");
+ fprintf(out, "\t\t\tprojectRoot = \"\";\n");
+ fprintf(out, "\t\t\ttargets = (\n");
+ for (i=0; i<nTgtApps; i++) {
+ Fl_Preferences targetDB(tgtAppsDB, i);
+ char name[80]; targetDB.get("name", name, "DBERROR", 80);
+ MAKE_XCID(xcTargetID, targetDB);
+ fprintf(out, "\t\t\t\t%s /* %s */,\n", xcTargetID, name);
+ }
+ for (i=0; i<nTgtLibs; i++) {
+ Fl_Preferences targetDB(tgtLibsDB, i);
+ char name[80]; targetDB.get("name", name, "DBERROR", 80);
+ MAKE_XCID(xcTargetID, targetDB);
+ fprintf(out, "\t\t\t\t%s /* %s */,\n", xcTargetID, name);
+ }
+ for (i=0; i<nTgtTests; i++) {
+ Fl_Preferences targetDB(tgtTestsDB, i);
+ char name[80]; targetDB.get("name", name, "DBERROR", 80);
+ MAKE_XCID(xcTargetID, targetDB);
+ fprintf(out, "\t\t\t\t%s /* %s */,\n", xcTargetID, name);
+ }
+ fprintf(out, "\t\t\t);\n");
+ fprintf(out, "\t\t};\n");
+ fprintf(out, "/* End PBXProject section */\n\n");
+ return 0;
+ }
+
+ /*
+ * Write the resource build pahse for a target.
+ * Currently we do not include any resources, but we will eventually allow
+ * icons for applications.
+ */
+ int writeResourcesBuildPhase(FILE *out, Fl_Preferences &targetDB) {
+ MAKE_XCID(xcBuildResourcesID, targetDB);
+ fprintf(out, "\t\t%s /* Resources */ = {\n", xcBuildResourcesID);
+ fprintf(out, "\t\t\tisa = PBXResourcesBuildPhase;\n");
+ fprintf(out, "\t\t\tbuildActionMask = 2147483647;\n");
+ fprintf(out, "\t\t\tfiles = (\n");
+ Fl_Preferences extsDB(targetDB, "externals");
+ int i, n = extsDB.groups();
+ for (i=0; i<n; i++) {
+ Fl_Preferences extDB(extsDB, i);
+ if (with_xcode(extDB.id())) {
+ GET_UUID(refUUID, extDB);
+ Fl_File_Prefs fileDB(filesDB, refUUID);
+ if (strcmp(fileDB.fileExt(), ".icns")==0) {
+ MAKE_XCID(xcCopyResourceID, extDB);
+ fprintf(out, "\t\t\t\t%s /* %s in Resources */,\n", xcCopyResourceID, fileDB.fullName());
+ }
+ }
+ }
+ fprintf(out, "\t\t\t);\n");
+ fprintf(out, "\t\t\trunOnlyForDeploymentPostprocessing = 0;\n");
+ fprintf(out, "\t\t};\n");
+ return 0;
+ }
+
+ /*
+ * Write all resource build phases for all targets.
+ */
+ int writeResourcesBuildPhaseSection(FILE *out) {
+ int i;
+ fprintf(out, "/* Begin PBXResourcesBuildPhase section */\n");
+ for (i=0; i<nTgtApps; i++) {
+ Fl_Preferences targetDB(tgtAppsDB, i);
+ writeResourcesBuildPhase(out, targetDB);
+ }
+ for (i=0; i<nTgtLibs; i++) {
+ Fl_Preferences targetDB(tgtLibsDB, i);
+ writeResourcesBuildPhase(out, targetDB);
+ }
+ for (i=0; i<nTgtTests; i++) {
+ Fl_Preferences targetDB(tgtTestsDB, i);
+ writeResourcesBuildPhase(out, targetDB);
+ }
+ fprintf(out, "/* End PBXResourcesBuildPhase section */\n\n");
+ return 0;
+ }
+
+ /*
+ *
+ */
+ int writeSourcesBuildPhase(FILE *out, Fl_Preferences &targetDB) {
+ MAKE_XCID(xcBuildSourcesID, targetDB);
+ fprintf(out, "\t\t%s /* Sources */ = {\n", xcBuildSourcesID);
+ fprintf(out, "\t\t\tisa = PBXSourcesBuildPhase;\n");
+ fprintf(out, "\t\t\tbuildActionMask = 2147483647;\n");
+ fprintf(out, "\t\t\tfiles = (\n");
+ // write the array of source code files
+ Fl_Preferences sourcesDB(targetDB, "sources");
+ int i, n = sourcesDB.groups();
+ for (i=0; i<n; i++) {
+ Fl_Preferences sourceDB(sourcesDB, i);
+ GET_UUID(refUUID, sourceDB);
+ MAKE_XCID(xcBuildFileID, sourceDB);
+ Fl_File_Prefs fileDB(filesDB, refUUID);
+ fprintf(out, "\t\t\t\t%s /* %s in Sources */,\n", xcBuildFileID, fileDB.fullName());
+ }
+ Fl_Preferences flsDB(targetDB, "fl");
+ n = flsDB.groups();
+ for (i=0; i<n; i++) {
+ Fl_Preferences flDB(flsDB, i);
+ GET_UUID(refUUID, flDB);
+ MAKE_XCID(xcBuildFileID, flDB);
+ Fl_File_Prefs fileDB(filesDB, refUUID);
+ fprintf(out, "\t\t\t\t%s /* %s in Sources */,\n", xcBuildFileID, fileDB.fullName());
+ }
+ fprintf(out, "\t\t\t);\n");
+ fprintf(out, "\t\t\trunOnlyForDeploymentPostprocessing = 0;\n");
+ fprintf(out, "\t\t};\n");
+ return 0;
+ };
+
+ /*
+ *
+ */
+ int writeSourcesBuildPhaseSection(FILE *out) {
+ fprintf(out, "/* Begin PBXSourcesBuildPhase section */\n");
+ int i;
+ for (i=0; i<nTgtApps; i++) {
+ Fl_Preferences targetDB(tgtAppsDB, i);
+ writeSourcesBuildPhase(out, targetDB);
+ }
+ for (i=0; i<nTgtLibs; i++) {
+ Fl_Preferences targetDB(tgtLibsDB, i);
+ writeSourcesBuildPhase(out, targetDB);
+ }
+ for (i=0; i<nTgtTests; i++) {
+ Fl_Preferences targetDB(tgtTestsDB, i);
+ writeSourcesBuildPhase(out, targetDB);
+ }
+ fprintf(out, "/* End PBXSourcesBuildPhase section */\n\n");
+ return 0;
+ }
+
+ /*
+ * Write all target dependencies of a single target.
+ */
+ int writeTargetDependency(FILE *out, Fl_Preferences &targetDB) {
+ Fl_Preferences depsDB(targetDB, "deps");
+ int i, n = depsDB.groups();
+ for (i=0; i<n; i++) {
+ Fl_Preferences depDB(depsDB, i);
+ GET_UUID(refUUID, depDB);
+ MAKE_XCID(xcDependencyID, depDB);
+ MAKE_XCID(xcProxyID, depDB);
+ Fl_Preferences *depTgtDBp = 0;
+ if (tgtAppsDB.groupExists(refUUID))
+ depTgtDBp = new Fl_Preferences(tgtAppsDB, refUUID);
+ else if (tgtLibsDB.groupExists(refUUID))
+ depTgtDBp = new Fl_Preferences(tgtLibsDB, refUUID);
+ else if (tgtTestsDB.groupExists(refUUID))
+ depTgtDBp = new Fl_Preferences(tgtTestsDB, refUUID);
+ if (depTgtDBp) {
+ Fl_Preferences &depTgtDB = *depTgtDBp;
+ MAKE_XCID(xcTargetID, depTgtDB);
+ char name[80]; depTgtDB.get("name", name, "DBERROR", 80);
+ fprintf(out, "\t\t%s /* PBXTargetDependency */ = {\n", xcDependencyID);
+ fprintf(out, "\t\t\tisa = PBXTargetDependency;\n");
+ fprintf(out, "\t\t\ttarget = %s /* %s */;\n", xcTargetID, name);
+ fprintf(out, "\t\t\ttargetProxy = %s /* PBXContainerItemProxy */;\n", xcProxyID);
+ fprintf(out, "\t\t};\n");
+ delete depTgtDBp;
+ }
+ }
+ return 0;
+ }
+
+ /*
+ * Collect all the target dependencies from all targets and write them into
+ * this section.
+ */
+ int writeTargetDependencySection(FILE *out) {
+ int i;
+ fprintf(out, "/* Begin PBXTargetDependency section */\n");
+ for (i=0; i<nTgtApps; i++) {
+ Fl_Preferences targetDB(tgtAppsDB, i);
+ writeTargetDependency(out, targetDB);
+ }
+ for (i=0; i<nTgtLibs; i++) {
+ Fl_Preferences targetDB(tgtLibsDB, i);
+ writeTargetDependency(out, targetDB);
+ }
+ for (i=0; i<nTgtTests; i++) {
+ Fl_Preferences targetDB(tgtTestsDB, i);
+ writeTargetDependency(out, targetDB);
+ }
+ fprintf(out, "/* End PBXTargetDependency section */\n\n");
+ return 0;
+ }
+
+ /*
+ *
+ */
+ int writeProjectBuildConfiguration(FILE *out) {
+ // --- project build configuration (Debug)
+ fprintf(out, "\t\t%s /* Debug */ = {\n", xcBuildConfigurationDebugID);
+ fprintf(out, "\t\t\tisa = XCBuildConfiguration;\n");
+ fprintf(out, "\t\t\tbuildSettings = {\n");
+#ifdef XCODE_DEFAULT
+ fprintf(out, "\t\t\t\tARCHS = \"$(ARCHS_STANDARD_32_64_BIT)\";\n");
+ fprintf(out, "\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n");
+ fprintf(out, "\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n");
+ fprintf(out, "\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n");
+ fprintf(out, "\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n");
+ fprintf(out, "\t\t\t\tONLY_ACTIVE_ARCH = YES;\n");
+ fprintf(out, "\t\t\t\tPREBINDING = NO;\n");
+ fprintf(out, "\t\t\t\tSDKROOT = macosx10.5;\n");
+#else
+ fprintf(out, "\t\t\t\tCOPY_PHASE_STRIP = NO;\n");
+ fprintf(out, "\t\t\t\tGCC_ENABLE_TRIGRAPHS = YES;\n");
+ fprintf(out, "\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n");
+ fprintf(out, "\t\t\t\tGCC_PFE_FILE_C_DIALECTS = \"c c++\";\n");
+ fprintf(out, "\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n");
+ fprintf(out, "\t\t\t\tGCC_PREFIX_HEADER = \"\";\n");
+ fprintf(out, "\t\t\t\tGCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;\n");
+ fprintf(out, "\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.2;\n");
+ fprintf(out, "\t\t\t\tSDKROOT = \"$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk\";\n");
+ fprintf(out, "\t\t\t\tUSER_HEADER_SEARCH_PATHS = ../../jpeg;\n");
+ fprintf(out, "\t\t\t\tWARNING_CFLAGS = \"\";\n");
+#endif
+ fprintf(out, "\t\t\t};\n");
+ fprintf(out, "\t\t\tname = Debug;\n");
+ fprintf(out, "\t\t};\n");
+ // --- project build configuration (Debug)
+ fprintf(out, "\t\t%s /* Release */ = {\n", xcBuildConfigurationReleaseID);
+ fprintf(out, "\t\t\tisa = XCBuildConfiguration;\n");
+ fprintf(out, "\t\t\tbuildSettings = {\n");
+#ifdef XCODE_DEFAULT
+ fprintf(out, "\t\t\t\tARCHS = \"$(ARCHS_STANDARD_32_64_BIT)\";\n");
+ fprintf(out, "\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n");
+ fprintf(out, "\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n");
+ fprintf(out, "\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n");
+ fprintf(out, "\t\t\t\tPREBINDING = NO;\n");
+ fprintf(out, "\t\t\t\tSDKROOT = macosx10.5;\n");
+#else
+ fprintf(out, "\t\t\t\tARCHS = \"$(ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1)\";\n");
+ fprintf(out, "\t\t\t\tARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1 = \"ppc i386 x86_64\";\n");
+ fprintf(out, "\t\t\t\tCOPY_PHASE_STRIP = YES;\n");
+ fprintf(out, "\t\t\t\tGCC_GENERATE_DEBUGGING_SYMBOLS = NO;\n");
+ fprintf(out, "\t\t\t\tGCC_PFE_FILE_C_DIALECTS = \"c c++\";\n");
+ fprintf(out, "\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n");
+ fprintf(out, "\t\t\t\tGCC_PREFIX_HEADER = \"\";\n");
+ fprintf(out, "\t\t\t\tGCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;\n");
+ fprintf(out, "\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.3;\n");
+ fprintf(out, "\t\t\t\tSDKROOT = \"$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk\";\n");
+ fprintf(out, "\t\t\t\tUSER_HEADER_SEARCH_PATHS = ../../jpeg;\n");
+ fprintf(out, "\t\t\t\tVALID_ARCHS = \"i386 ppc x86_64\";\n");
+ fprintf(out, "\t\t\t\tWARNING_CFLAGS = \"\";\n");
+#endif
+ fprintf(out, "\t\t\t};\n");
+ fprintf(out, "\t\t\tname = Release;\n");
+ fprintf(out, "\t\t};\n");
+ return 0;
+ }
+
+ /*
+ *
+ */
+ int writeApplicationBuildConfiguration(FILE *out, Fl_Preferences &targetDB) {
+ char name[80]; targetDB.get("name", name, "DBERROR", 80);
+ MAKE_XCID(xcBuildConfigurationDebugID, targetDB);
+ fprintf(out, "\t\t%s /* Debug */ = {\n", xcBuildConfigurationDebugID);
+ fprintf(out, "\t\t\tisa = XCBuildConfiguration;\n");
+ fprintf(out, "\t\t\tbuildSettings = {\n");
+#ifdef XCODE_DEFAULT
+ fprintf(out, "\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n");
+ fprintf(out, "\t\t\t\tCOPY_PHASE_STRIP = NO;\n");
+ fprintf(out, "\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n");
+ fprintf(out, "\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = YES;\n");
+ fprintf(out, "\t\t\t\tGCC_MODEL_TUNING = G5;\n");
+ fprintf(out, "\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n");
+ fprintf(out, "\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n");
+ fprintf(out, "\t\t\t\tGCC_PREFIX_HEADER = fltk.pch;\n");
+ fprintf(out, "\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"USING_XCODE=1\";\n");
+ fprintf(out, "\t\t\t\tHEADER_SEARCH_PATHS = (\n");
+ fprintf(out, "\t\t\t\t\t../../ide/XCode3/,\n");
+ fprintf(out, "\t\t\t\t\t../../,\n");
+ fprintf(out, "\t\t\t\t\t../../png,\n");
+ fprintf(out, "\t\t\t\t\t../../jpeg,\n");
+ fprintf(out, "\t\t\t\t);\n");
+ fprintf(out, "\t\t\t\tINFOPLIST_FILE = \"plists/%s-Info.plist\";\n", name);
+ fprintf(out, "\t\t\t\tINSTALL_PATH = \"$(HOME)/Applications\";\n");
+ fprintf(out, "\t\t\t\tOTHER_LDFLAGS = (\n");
+ fprintf(out, "\t\t\t\t\t\"-framework\",\n");
+ fprintf(out, "\t\t\t\t\tCocoa,\n");
+ fprintf(out, "\t\t\t\t\t\"-framework\",\n");
+ fprintf(out, "\t\t\t\t\tCarbon,\n");
+ fprintf(out, "\t\t\t\t);\n");
+ fprintf(out, "\t\t\t\tPRODUCT_NAME = %s;\n", name);
+ fprintf(out, "\t\t\t\tWARNING_CFLAGS = (\"-Wno-format-security\",\"-Wall\");\n");
+#else
+ fprintf(out, "\t\t\t\tCOPY_PHASE_STRIP = NO;\n");
+ fprintf(out, "\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n");
+ fprintf(out, "\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = YES;\n");
+ fprintf(out, "\t\t\t\tGCC_MODEL_TUNING = G5;\n");
+ fprintf(out, "\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n");
+ fprintf(out, "\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n");
+ fprintf(out, "\t\t\t\tGCC_PREFIX_HEADER = \"\";\n");
+ fprintf(out, "\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"USING_XCODE=1\";\n");
+ fprintf(out, "\t\t\t\tHEADER_SEARCH_PATHS = (\n");
+ fprintf(out, "\t\t\t\t\t../../ide/XCode3/,\n");
+ fprintf(out, "\t\t\t\t\t../../,\n");
+ fprintf(out, "\t\t\t\t\t../../png,\n");
+ fprintf(out, "\t\t\t\t\t../../jpeg,\n");
+ fprintf(out, "\t\t\t\t);\n");
+ fprintf(out, "\t\t\t\tINFOPLIST_FILE = \"plists/%s-Info.plist\";\n", name);
+ fprintf(out, "\t\t\t\tINSTALL_PATH = /Applications;\n");
+ fprintf(out, "\t\t\t\tOTHER_LDFLAGS = (\n");
+ fprintf(out, "\t\t\t\t\t\"-framework\",\n");
+ fprintf(out, "\t\t\t\t\tCocoa,\n");
+ fprintf(out, "\t\t\t\t\t\"-framework\",\n");
+ fprintf(out, "\t\t\t\t\tCarbon,\n");
+ fprintf(out, "\t\t\t\t);\n");
+ fprintf(out, "\t\t\t\tPREBINDING = NO;\n");
+ fprintf(out, "\t\t\t\tPRODUCT_NAME = %s;\n", name);
+ fprintf(out, "\t\t\t\tUSER_HEADER_SEARCH_PATHS = \"\";\n");
+ fprintf(out, "\t\t\t\tWARNING_CFLAGS = (\"-Wno-format-security\",\"-Wall\");\n");
+ fprintf(out, "\t\t\t\tWRAPPER_EXTENSION = app;\n");
+ fprintf(out, "\t\t\t\tZERO_LINK = YES;\n");
+#endif
+ fprintf(out, "\t\t\t};\n");
+ fprintf(out, "\t\t\tname = Debug;\n");
+ fprintf(out, "\t\t};\n");
+ MAKE_XCID(xcBuildConfigurationReleaseID, targetDB);
+ fprintf(out, "\t\t%s /* Release */ = {\n", xcBuildConfigurationReleaseID);
+ fprintf(out, "\t\t\tisa = XCBuildConfiguration;\n");
+ fprintf(out, "\t\t\tbuildSettings = {\n");
+#ifdef XCODE_DEFAULT
+ fprintf(out, "\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n");
+ fprintf(out, "\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n");
+ fprintf(out, "\t\t\t\tGCC_MODEL_TUNING = G5;\n");
+ fprintf(out, "\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n");
+ fprintf(out, "\t\t\t\tGCC_PREFIX_HEADER = fltk.pch;\n");
+ fprintf(out, "\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"USING_XCODE=1\";\n");
+ fprintf(out, "\t\t\t\tHEADER_SEARCH_PATHS = (\n");
+ fprintf(out, "\t\t\t\t\t../../ide/XCode3/,\n");
+ fprintf(out, "\t\t\t\t\t../../,\n");
+ fprintf(out, "\t\t\t\t\t../../png,\n");
+ fprintf(out, "\t\t\t\t\t../../jpeg,\n");
+ fprintf(out, "\t\t\t\t);\n");
+ fprintf(out, "\t\t\t\tINFOPLIST_FILE = \"plists/%s-Info.plist\";\n", name);
+ fprintf(out, "\t\t\t\tINSTALL_PATH = \"$(HOME)/Applications\";\n");
+ fprintf(out, "\t\t\t\tOTHER_LDFLAGS = (\n");
+ fprintf(out, "\t\t\t\t\t\"-framework\",\n");
+ fprintf(out, "\t\t\t\t\tCocoa,\n");
+ fprintf(out, "\t\t\t\t\t\"-framework\",\n");
+ fprintf(out, "\t\t\t\t\tCarbon,\n");
+ fprintf(out, "\t\t\t\t);\n");
+ fprintf(out, "\t\t\t\tPRODUCT_NAME = %s;\n", name);
+ fprintf(out, "\t\t\t\tWARNING_CFLAGS = (\"-Wno-format-security\",\"-Wall\");\n");
+#else
+ fprintf(out, "\t\t\t\tCOPY_PHASE_STRIP = YES;\n");
+ fprintf(out, "\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n");
+ fprintf(out, "\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = NO;\n");
+ fprintf(out, "\t\t\t\tGCC_MODEL_TUNING = G5;\n");
+ fprintf(out, "\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n");
+ fprintf(out, "\t\t\t\tGCC_PREFIX_HEADER = \"\";\n");
+ fprintf(out, "\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"USING_XCODE=1\";\n");
+ fprintf(out, "\t\t\t\tHEADER_SEARCH_PATHS = (\n");
+ fprintf(out, "\t\t\t\t\t../../ide/XCode3/,\n");
+ fprintf(out, "\t\t\t\t\t../../,\n");
+ fprintf(out, "\t\t\t\t\t../../png,\n");
+ fprintf(out, "\t\t\t\t\t../../jpeg,\n");
+ fprintf(out, "\t\t\t\t);\n");
+ fprintf(out, "\t\t\t\tINFOPLIST_FILE = \"plists/%s-Info.plist\";\n", name);
+ fprintf(out, "\t\t\t\tINSTALL_PATH = /Applications;\n");
+ fprintf(out, "\t\t\t\tOTHER_LDFLAGS = (\n");
+ fprintf(out, "\t\t\t\t\t\"-framework\",\n");
+ fprintf(out, "\t\t\t\t\tCocoa,\n");
+ fprintf(out, "\t\t\t\t\t\"-framework\",\n");
+ fprintf(out, "\t\t\t\t\tCarbon,\n");
+ fprintf(out, "\t\t\t\t);\n");
+ fprintf(out, "\t\t\t\tPREBINDING = NO;\n");
+ fprintf(out, "\t\t\t\tPRODUCT_NAME = %s;\n", name);
+ fprintf(out, "\t\t\t\tUSER_HEADER_SEARCH_PATHS = \"\";\n");
+ fprintf(out, "\t\t\t\tWARNING_CFLAGS = (\"-Wno-format-security\",\"-Wall\");\n");
+ fprintf(out, "\t\t\t\tWRAPPER_EXTENSION = app;\n");
+ fprintf(out, "\t\t\t\tZERO_LINK = NO;\n");
+#endif
+ fprintf(out, "\t\t\t};\n");
+ fprintf(out, "\t\t\tname = Release;\n");
+ fprintf(out, "\t\t};\n");
+ return 0;
+ }
+
+ /*
+ *
+ */
+ int writeFrameworkBuildConfiguration(FILE *out, Fl_Preferences &targetDB) {
+ char name[80]; targetDB.get("name", name, "DBERROR", 80);
+ MAKE_XCID(xcBuildConfigurationDebugID, targetDB);
+ fprintf(out, "\t\t%s /* Debug */ = {\n", xcBuildConfigurationDebugID);
+ fprintf(out, "\t\t\tisa = XCBuildConfiguration;\n");
+ fprintf(out, "\t\t\tbuildSettings = {\n");
+#ifdef XCODE_DEFAULT
+ fprintf(out, "\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n");
+ fprintf(out, "\t\t\t\tCOPY_PHASE_STRIP = NO;\n");
+ fprintf(out, "\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n");
+ fprintf(out, "\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n");
+ fprintf(out, "\t\t\t\tFRAMEWORK_VERSION = A;\n");
+ fprintf(out, "\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n");
+ fprintf(out, "\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = YES;\n");
+ fprintf(out, "\t\t\t\tGCC_MODEL_TUNING = G5;\n");
+ fprintf(out, "\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n");
+ fprintf(out, "\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n");
+ fprintf(out, "\t\t\t\tGCC_PREFIX_HEADER = fltk.pch;\n");
+ fprintf(out, "\t\t\t\tHEADER_SEARCH_PATHS = (\n");
+ fprintf(out, "\t\t\t\t\t../../ide/XCode3/,\n");
+ fprintf(out, "\t\t\t\t\t../../,\n");
+ fprintf(out, "\t\t\t\t\t../../png,\n");
+ fprintf(out, "\t\t\t\t\t../../jpeg,\n");
+ fprintf(out, "\t\t\t\t);\n");
+ fprintf(out, "\t\t\t\tINFOPLIST_FILE = \"plists/%s-Info.plist\";\n", name);
+ fprintf(out, "\t\t\t\tINSTALL_PATH = \"@executable_path/../Frameworks\";\n");
+ fprintf(out, "\t\t\t\tOTHER_LDFLAGS = (\n");
+ fprintf(out, "\t\t\t\t\t\"-framework\",\n");
+ fprintf(out, "\t\t\t\t\tCocoa,\n");
+ fprintf(out, "\t\t\t\t\t\"-framework\",\n");
+ fprintf(out, "\t\t\t\t\tCarbon,\n");
+ fprintf(out, "\t\t\t\t);\n");
+ fprintf(out, "\t\t\t\tPREBINDING = NO;\n");
+ fprintf(out, "\t\t\t\tPRODUCT_NAME = %s;\n", name);
+ fprintf(out, "\t\t\t\tWARNING_CFLAGS = (\"-Wno-format-security\",\"-Wall\");\n");
+#else
+ fprintf(out, "\t\t\t\tALWAYS_SEARCH_USER_PATHS = YES;\n");
+ fprintf(out, "\t\t\t\tCOPY_PHASE_STRIP = NO;\n");
+ fprintf(out, "\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n");
+ fprintf(out, "\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n");
+ fprintf(out, "\t\t\t\tEXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES = \"*.nib *.lproj *.framework *.gch (*) CVS .svn *.xcodeproj *.xcode *.pbproj *.pbxproj\";\n");
+ fprintf(out, "\t\t\t\tFRAMEWORK_VERSION = A;\n");
+ fprintf(out, "\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n");
+ fprintf(out, "\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = YES;\n");
+ fprintf(out, "\t\t\t\tGCC_MODEL_TUNING = G5;\n");
+ fprintf(out, "\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n");
+ fprintf(out, "\t\t\t\tGCC_PFE_FILE_C_DIALECTS = \"c c++ objective-c++\";\n");
+ fprintf(out, "\t\t\t\tHEADER_SEARCH_PATHS = (\n");
+ fprintf(out, "\t\t\t\t\t../../ide/XCode3/,\n");
+ fprintf(out, "\t\t\t\t\t../../,\n");
+ fprintf(out, "\t\t\t\t\t../../png,\n");
+ fprintf(out, "\t\t\t\t\t../../jpeg,\n");
+ fprintf(out, "\t\t\t\t);\n");
+ fprintf(out, "\t\t\t\tINFOPLIST_FILE = \"plists/%s-Info.plist\";\n", name);
+ fprintf(out, "\t\t\t\tINSTALL_PATH = \"@executable_path/../Frameworks\";\n");
+ fprintf(out, "\t\t\t\tOTHER_LDFLAGS = (\n");
+ fprintf(out, "\t\t\t\t\t\"-framework\",\n");
+ fprintf(out, "\t\t\t\t\tCocoa,\n");
+ fprintf(out, "\t\t\t\t\t\"-framework\",\n");
+ fprintf(out, "\t\t\t\t\tCarbon,\n");
+ fprintf(out, "\t\t\t\t);\n");
+ fprintf(out, "\t\t\t\tPREBINDING = NO;\n");
+ fprintf(out, "\t\t\t\tPRODUCT_NAME = %s;\n", name);
+ fprintf(out, "\t\t\t\tUSER_HEADER_SEARCH_PATHS = \"\";\n");
+ fprintf(out, "\t\t\t\tWARNING_CFLAGS = (\"-Wno-format-security\",\"-Wall\");\n");
+ fprintf(out, "\t\t\t\tZERO_LINK = YES;\n");
+#endif
+ fprintf(out, "\t\t\t};\n");
+ fprintf(out, "\t\t\tname = Debug;\n");
+ fprintf(out, "\t\t};\n");
+ MAKE_XCID(xcBuildConfigurationReleaseID, targetDB);
+ fprintf(out, "\t\t%s /* Release */ = {\n", xcBuildConfigurationReleaseID);
+ fprintf(out, "\t\t\tisa = XCBuildConfiguration;\n");
+ fprintf(out, "\t\t\tbuildSettings = {\n");
+#ifdef XCODE_DEFAULT
+ fprintf(out, "\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n");
+ fprintf(out, "\t\t\t\tCOPY_PHASE_STRIP = YES;\n");
+ fprintf(out, "\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n");
+ fprintf(out, "\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n");
+ fprintf(out, "\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n");
+ fprintf(out, "\t\t\t\tFRAMEWORK_VERSION = A;\n");
+ fprintf(out, "\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = NO;\n");
+ fprintf(out, "\t\t\t\tGCC_MODEL_TUNING = G5;\n");
+ fprintf(out, "\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n");
+ fprintf(out, "\t\t\t\tGCC_PREFIX_HEADER = fltk.pch;\n");
+ fprintf(out, "\t\t\t\tHEADER_SEARCH_PATHS = (\n");
+ fprintf(out, "\t\t\t\t\t../../ide/XCode3/,\n");
+ fprintf(out, "\t\t\t\t\t../../,\n");
+ fprintf(out, "\t\t\t\t\t../../png,\n");
+ fprintf(out, "\t\t\t\t\t../../jpeg,\n");
+ fprintf(out, "\t\t\t\t);\n");
+ fprintf(out, "\t\t\t\tINFOPLIST_FILE = \"plists/%s-Info.plist\";\n", name);
+ fprintf(out, "\t\t\t\tINSTALL_PATH = \"@executable_path/../Frameworks\";\n");
+ fprintf(out, "\t\t\t\tOTHER_LDFLAGS = (\n");
+ fprintf(out, "\t\t\t\t\t\"-framework\",\n");
+ fprintf(out, "\t\t\t\t\tCocoa,\n");
+ fprintf(out, "\t\t\t\t\t\"-framework\",\n");
+ fprintf(out, "\t\t\t\t\tCarbon,\n");
+ fprintf(out, "\t\t\t\t);\n");
+ fprintf(out, "\t\t\t\tPREBINDING = NO;\n");
+ fprintf(out, "\t\t\t\tPRODUCT_NAME = %s;\n", name);
+ fprintf(out, "\t\t\t\tWARNING_CFLAGS = (\"-Wno-format-security\",\"-Wall\");\n");
+ fprintf(out, "\t\t\t\tZERO_LINK = NO;\n");
+#else
+ fprintf(out, "\t\t\t\tALWAYS_SEARCH_USER_PATHS = YES;\n");
+ fprintf(out, "\t\t\t\tCOPY_PHASE_STRIP = YES;\n");
+ fprintf(out, "\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n");
+ fprintf(out, "\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n");
+ fprintf(out, "\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n");
+ fprintf(out, "\t\t\t\tEXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES = \"*.nib *.lproj *.framework *.gch (*) CVS .svn *.xcodeproj *.xcode *.pbproj *.pbxproj\";\n");
+ fprintf(out, "\t\t\t\tFRAMEWORK_VERSION = A;\n");
+ fprintf(out, "\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = NO;\n");
+ fprintf(out, "\t\t\t\tGCC_MODEL_TUNING = G5;\n");
+ fprintf(out, "\t\t\t\tGCC_PFE_FILE_C_DIALECTS = \"c c++ objective-c++\";\n");
+ fprintf(out, "\t\t\t\tHEADER_SEARCH_PATHS = (\n");
+ fprintf(out, "\t\t\t\t\t../../ide/XCode3/,\n");
+ fprintf(out, "\t\t\t\t\t../../,\n");
+ fprintf(out, "\t\t\t\t\t../../png,\n");
+ fprintf(out, "\t\t\t\t\t../../jpeg,\n");
+ fprintf(out, "\t\t\t\t);\n");
+ fprintf(out, "\t\t\t\tINFOPLIST_FILE = \"plists/%s-Info.plist\";\n", name);
+ fprintf(out, "\t\t\t\tINSTALL_PATH = \"@executable_path/../Frameworks\";\n");
+ fprintf(out, "\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.2;\n");
+ fprintf(out, "\t\t\t\tOTHER_LDFLAGS = (\n");
+ fprintf(out, "\t\t\t\t\"-framework\",\n");
+ fprintf(out, "\t\t\t\tCocoa,\n");
+ fprintf(out, "\t\t\t\t\t\"-framework\",\n");
+ fprintf(out, "\t\t\t\t\tCarbon,\n");
+ fprintf(out, "\t\t\t\t);\n");
+ fprintf(out, "\t\t\t\tPREBINDING = NO;\n");
+ fprintf(out, "\t\t\t\tPRODUCT_NAME = %s;\n", name);
+ fprintf(out, "\t\t\t\tSDKROOT = \"\";\n");
+ fprintf(out, "\t\t\t\tUSER_HEADER_SEARCH_PATHS = \"\";\n");
+ fprintf(out, "\t\t\t\tWARNING_CFLAGS = (\"-Wno-format-security\",\"-Wall\");\n");
+ fprintf(out, "\t\t\t\tZERO_LINK = NO;\n");
+#endif
+ fprintf(out, "\t\t\t};\n");
+ fprintf(out, "\t\t\tname = Release;\n");
+ fprintf(out, "\t\t};\n");
+ return 0;
+ }
+
+ /*
+ * This block contains build configurations for every target and project
+ */
+ int writeBuildConfigurationSection(FILE *out) {
+ writeProjectBuildConfiguration(out);
+ int i;
+ fprintf(out, "/* Begin XCBuildConfiguration section */\n");
+ for (i=0; i<nTgtApps; i++) {
+ Fl_Preferences targetDB(tgtAppsDB, i);
+ writeApplicationBuildConfiguration(out, targetDB);
+ }
+ for (i=0; i<nTgtLibs; i++) {
+ Fl_Preferences targetDB(tgtLibsDB, i);
+ writeFrameworkBuildConfiguration(out, targetDB);
+ }
+ for (i=0; i<nTgtTests; i++) {
+ Fl_Preferences targetDB(tgtTestsDB, i);
+ writeApplicationBuildConfiguration(out, targetDB);
+ }
+ fprintf(out, "/* End XCBuildConfiguration section */\n\n");
+ return 0;
+ }
+
+ /*
+ * Write the build onfiguration list for the entire project.
+ */
+ int writeProjectConfigurationList(FILE *out) {
+ fprintf(out, "\t\t%s /* Build configuration list for PBXProject \"%s\" */ = {\n", xcBuildConfigurationListID, projectName);
+ fprintf(out, "\t\t\tisa = XCConfigurationList;\n");
+ fprintf(out, "\t\t\tbuildConfigurations = (\n");
+ fprintf(out, "\t\t\t\t%s /* Debug */,\n", xcBuildConfigurationDebugID);
+ fprintf(out, "\t\t\t\t%s /* Release */,\n", xcBuildConfigurationReleaseID);
+ fprintf(out, "\t\t\t);\n");
+ fprintf(out, "\t\t\tdefaultConfigurationIsVisible = 0;\n");
+ fprintf(out, "\t\t\tdefaultConfigurationName = Debug;\n");
+ fprintf(out, "\t\t};\n");
+ return 0;
+ }
+
+ /*
+ * Write the build onfiguration list for the entire project.
+ */
+ int writeTargetConfigurationList(FILE *out, Fl_Preferences &targetDB) {
+ char name[80]; targetDB.get("name", name, "DBERROR", 80);
+ MAKE_XCID(xcBuildConfigurationListID, targetDB);
+ MAKE_XCID(xcBuildConfigurationDebugID, targetDB);
+ MAKE_XCID(xcBuildConfigurationReleaseID, targetDB);
+ fprintf(out, "\t\t%s /* Build configuration list for PBXProject \"%s\" */ = {\n", xcBuildConfigurationListID, name);
+ fprintf(out, "\t\t\tisa = XCConfigurationList;\n");
+ fprintf(out, "\t\t\tbuildConfigurations = (\n");
+ fprintf(out, "\t\t\t\t%s /* Debug */,\n", xcBuildConfigurationDebugID);
+ fprintf(out, "\t\t\t\t%s /* Release */,\n", xcBuildConfigurationReleaseID);
+ fprintf(out, "\t\t\t);\n");
+ fprintf(out, "\t\t\tdefaultConfigurationIsVisible = 0;\n");
+ fprintf(out, "\t\t\tdefaultConfigurationName = Debug;\n");
+ fprintf(out, "\t\t};\n");
+ return 0;
+ }
+
+ /*
+ * This block contains arrays to the available build configurations
+ */
+ int writeConfigurationListSection(FILE *out) {
+ int i;
+ fprintf(out, "/* Begin XCConfigurationList section */\n");
+ // --- project configuration list
+ writeProjectConfigurationList(out);
+ // --- configuration list for all targets
+ for (i=0; i<nTgtApps; i++) {
+ Fl_Preferences targetDB(tgtAppsDB, i);
+ writeTargetConfigurationList(out, targetDB);
+ }
+ for (i=0; i<nTgtLibs; i++) {
+ Fl_Preferences targetDB(tgtLibsDB, i);
+ writeTargetConfigurationList(out, targetDB);
+ }
+ for (i=0; i<nTgtTests; i++) {
+ Fl_Preferences targetDB(tgtTestsDB, i);
+ writeTargetConfigurationList(out, targetDB);
+ }
+ fprintf(out, "/* End XCConfigurationList section */\n\n");
+ return 0;
+ }
+
+ /*
+ * Write the project definition file
+ */
+ int writeProjectFile(const char *filepath) {
+ char filename[2048];
+ fl_snprintf(filename, 2047, "%s/project.pbxproj", filepath);
+ FILE *out = fopen(filename, "wb");
+ if (!out) {
+ fl_alert("Can't open file:\n%s", filename);
+ return -1;
+ }
+ fprintf(out,
+ "// !$*UTF8*$!\n" "{\n" "\tarchiveVersion = 1;\n" "\tclasses = {\n"
+ "\t};\n" "\tobjectVersion = 44;\n" "\tobjects = {\n\n");
+ writeBuildFileSection(out);
+ writeBuildRuleSection(out);
+ writeContainerItemProxySection(out);
+ writeCopyFilesBuildPhaseSection(out);
+ writeFileReferenceSection(out);
+ writeFrameworksBuildPhaseSection(out);
+ writeGroupSection(out);
+ writeHeadersBuildPhaseSection(out);
+ writeNativeTargetSection(out);
+ writeProjectSection(out);
+ writeResourcesBuildPhaseSection(out);
+ writeSourcesBuildPhaseSection(out);
+ writeTargetDependencySection(out);
+ writeBuildConfigurationSection(out);
+ writeConfigurationListSection(out);
+ fprintf(out,
+ "\t};\n"
+ "\trootObject = %s /* Project object */;\n"
+ "}\n", xcRootNodeID);
+
+ fclose(out);
+ return 0;
+ }
+
+ int writeConfigH(const char *filename) {
+ FILE *f = fopen(filename, "wb");
+ fputs("/*\n * \"$Id: ide_xcode.cxx 7169 2010-02-27 22:38:25Z matt $\"\n"
+ " *\n * Configuration file for the Fast Light Tool Kit (FLTK).\n *\n"
+ " * Copyright 1998-2010 by Bill Spitzak and others.\n */\n\n", f);
+ fputs("#define FLTK_DATADIR \"/usr/local/share/fltk\"\n"
+ "#define FLTK_DOCDIR \"/usr/local/share/doc/fltk\"\n"
+ "#define BORDER_WIDTH 2\n#define HAVE_GL 1\n#define HAVE_GL_GLU_H 1\n"
+ "#define USE_COLORMAP 1\n#define HAVE_XINERAMA 0\n#define USE_XFT 0\n"
+ "#define HAVE_XDBE 0\n#define USE_XDBE HAVE_XDBE\n", f);
+ fputs("#define USE_QUARTZ 1\n#define __APPLE_QUARTZ__ 1\n"
+ "#define __APPLE_COCOA__ 1\n#define HAVE_OVERLAY 0\n"
+ "#define HAVE_GL_OVERLAY HAVE_OVERLAY\n#define WORDS_BIGENDIAN 0\n"
+ "#define U16 unsigned short\n#define U32 unsigned\n"
+ "#define HAVE_DIRENT_H 1\n#define HAVE_SCANDIR 1\n"
+ "#define HAVE_VSNPRINTF 1\n", f);
+ fputs("#define HAVE_SNPRINTF 1\n#define HAVE_STRINGS_H 1\n"
+ "#define HAVE_STRCASECMP 1\n#define HAVE_STRLCAT 1\n"
+ "#define HAVE_STRLCPY 1\n#define HAVE_LOCALE_H 1\n"
+ "#define HAVE_LOCALECONV 1\n#define HAVE_SYS_SELECT_H 1\n"
+ "#define USE_POLL 0\n#define HAVE_LIBPNG 1\n#define HAVE_LIBZ 1\n"
+ "#define HAVE_LIBJPEG 1\n#define HAVE_PNG_H 1\n", f);
+ fputs("#define HAVE_PTHREAD 1\n#define HAVE_PTHREAD_H 1\n"
+ "#define HAVE_LONG_LONG 1\n#define FLTK_LLFMT \"%lld\"\n"
+ "#define FLTK_LLCAST (long long)\n#define HAVE_STRTOLL 1\n"
+ "#define HAVE_DLFCN_H 1\n#define HAVE_DLSYM 1\n\n", f);
+ fputs("/*\n"
+ " * End of \"$Id: ide_xcode.cxx 7169 2010-02-27 22:38:25Z matt $\".\n"
+ " */", f);
+ fclose(f);
+ return 0;
+ }
+
+ int writePCH(const char *filename) {
+ FILE *f = fopen(filename, "wb");
+ fputs("//\n// Prefix header for all source files\n//\n\n"
+ "#ifdef __OBJC__\n#import <Cocoa/Cocoa.h>\n#endif\n\n", f);
+ fclose(f);
+ return 0;
+ }
+
+ int createIcons(const char *filepath) {
+ // FIXME: LATER: create a minimum set of icon files?
+ return 0;
+ }
+
+ /*
+ * create a single plists/[name]-Info.plist
+ */
+ int writePList(const char *filepath, Fl_Preferences &target_db, int fmwk=0) {
+ char name[80]; target_db.get("name", name, "DBERROR", 79);
+ char filename[2048];
+ fl_snprintf(filename, 2047, "%s/%s-Info.plist", filepath, name);
+ FILE *f = fopen(filename, "wb");
+ fprintf(f, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
+ fprintf(f, "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n");
+ fprintf(f, "<plist version=\"1.0\">\n");
+ fprintf(f, "<dict>\n");
+ fprintf(f, "\t<key>CFBundleDevelopmentRegion</key>\n");
+ fprintf(f, "\t<string>English</string>\n");
+ if (strcmp(name, "Fluid")==0) { // TODO: this option is not yet in the database
+ fprintf(f, "\t<key>CFBundleDocumentTypes</key>\n");
+ fprintf(f, "\t<array>\n");
+ fprintf(f, "\t\t<dict>\n");
+ fprintf(f, "\t\t\t<key>CFBundleTypeExtensions</key>\n");
+ fprintf(f, "\t\t\t<array>\n");
+ fprintf(f, "\t\t\t\t<string>fl</string>\n");
+ fprintf(f, "\t\t\t</array>\n");
+ fprintf(f, "\t\t\t<key>CFBundleTypeIconFile</key>\n");
+ fprintf(f, "\t\t\t<string>fluid_doc</string>\n");
+ fprintf(f, "\t\t\t<key>CFBundleTypeName</key>\n");
+ fprintf(f, "\t\t\t<string>Fluid Documents</string>\n");
+ fprintf(f, "\t\t\t<key>CFBundleTypeOSTypes</key>\n");
+ fprintf(f, "\t\t\t<array>\n");
+ fprintf(f, "\t\t\t\t<string>flid</string>\n");
+ fprintf(f, "\t\t\t</array>\n");
+ fprintf(f, "\t\t\t<key>CFBundleTypeRole</key>\n");
+ fprintf(f, "\t\t\t<string>Editor</string>\n");
+ fprintf(f, "\t\t\t<key>LSTypeIsPackage</key>\n");
+ fprintf(f, "\t\t\t<false/>\n");
+ fprintf(f, "\t\t\t<key>NSPersistentStoreTypeKey</key>\n");
+ fprintf(f, "\t\t\t<string>Binary</string>\n");
+ fprintf(f, "\t\t</dict>\n");
+ fprintf(f, "\t</array>\n");
+ }
+ fprintf(f, "\t<key>CFBundleExecutable</key>\n");
+ fprintf(f, "\t<string>${EXECUTABLE_NAME}</string>\n");
+ // find the first suitable icon file if there is one
+ Fl_Preferences extsDB(target_db, "externals");
+ int i, n = extsDB.groups();
+ for (i=0; i<n; i++) {
+ Fl_Preferences extDB(extsDB, i);
+ if (with_xcode(extDB.id())) {
+ GET_UUID(refUUID, extDB);
+ Fl_File_Prefs fileDB(filesDB, refUUID);
+ if (strcmp(fileDB.fileExt(), ".icns")==0) {
+ fprintf(f, "\t<key>CFBundleIconFile</key>\n\t<string>%s</string>", fileDB.fileName());
+ break;
+ }
+ }
+ }
+ fprintf(f, "\t<key>CFBundleIdentifier</key>\n");
+ fprintf(f, "\t<string>org.fltk.%s</string>\n", name);
+ fprintf(f, "\t<key>CFBundleInfoDictionaryVersion</key>\n");
+ fprintf(f, "\t<string>6.0</string>\n");
+ fprintf(f, "\t<key>CFBundlePackageType</key>\n");
+ if (fmwk)
+ fprintf(f, "\t<string>FMWK</string>\n");
+ else
+ fprintf(f, "\t<string>APPL</string>\n");
+ fprintf(f, "\t<key>CFBundleSignature</key>\n");
+ fprintf(f, "\t<string>FLTK</string>\n");
+ fprintf(f, "\t<key>CFBundleVersion</key>\n");
+ fprintf(f, "\t<string>1.0</string>\n");
+ fprintf(f, "</dict>\n");
+ fprintf(f, "\t</plist>\n");
+ fclose(f);
+ return 0;
+ }
+
+ /*
+ * Create the plist files for all apps and tests
+ */
+ int writePLists(const char *filepath) {
+ int i;
+ for (i=0; i<nTgtApps; i++) {
+ Fl_Preferences targetDB(tgtAppsDB, i);
+ writePList(filepath, targetDB, 0);
+ }
+ for (i=0; i<nTgtLibs; i++) {
+ Fl_Preferences targetDB(tgtLibsDB, i);
+ writePList(filepath, targetDB, 1);
+ }
+ for (i=0; i<nTgtTests; i++) {
+ Fl_Preferences targetDB(tgtTestsDB, i);
+ writePList(filepath, targetDB, 0);
+ }
+ return 0;
+ }
+#endif
+
+ /*
+ * Write the entire system of files.
+ */
+ int write() {
+ char filepath[2048];
+ // --- create directory structures
+ sprintf(filepath, "%s/fluid", rootDir); fl_mkdir(filepath, 0777);
+ sprintf(filepath, "%s/src", rootDir); fl_mkdir(filepath, 0777);
+ sprintf(filepath, "%s/test", rootDir); fl_mkdir(filepath, 0777);
+ return 0;
+ }
+};
+
+//
+// This creates all files needed to compile FLTK using Makefiles and autoconf.
+// create directory structure ./$(Applications), ./test, and ./src
+// create ./Makefile
+// create ./$(Applications)/Makefile
+// create ./src/Makefile (source code for all libraries)
+// create ./test/Makefile (source code for all test applications)
+//
+void generate_fltk_maketools_support(const char *filename, const char *targetpath)
+{
+ Fl_Preferences *db =
+ new Fl_Preferences(filename, "fltk.org", 0);
+ Maketools_IDE ide(*db, targetpath);
+ ide.write();
+ delete db;
+ return;
+}
+
+
+extern int exit_early;
+
+class Fl_IDE_Maketools_Plugin : public Fl_Commandline_Plugin
+{
+public:
+ Fl_IDE_Maketools_Plugin() : Fl_Commandline_Plugin(name()) { }
+ const char *name() { return "ideMaketools.fluid.fltk.org"; }
+ const char *help() { return
+ " --dbmake <dbname> <targetpath> : create all IDE files for a Makefile/autoconf based project\n"
+ " WARNING: --dbmake is not yet implemented completely.\n"; }
+ int arg(int argc, char **argv, int &i) {
+ if (argc>=i+1 && strcmp(argv[i], "--dbxcode3")==0) {
+ if (argc>=i+3 && argv[i+1][0]!='-' && argv[i+2][0]!='-') {
+ fprintf(stderr, "Creating Makefiles from %s in %s\n", argv[i+1], argv[i+2]);
+ exit_early = 1;
+ fprintf(stderr, "WARNING: --dbmake is not yet implemented completely.\n");
+ generate_fltk_maketools_support(argv[i+1], argv[i+2]);
+ i = i+3;
+ return 3;
+ } else {
+ fprintf(stderr, "Missing argument: --dbmake <dbname> <targetpath>\n");
+ return 1;
+ }
+ }
+ return 0;
+ }
+ int test(const char *a1, const char *a2, const char *a3) {
+ generate_fltk_maketools_support(a1, a2);
+ return 0;
+ }
+};
+Fl_IDE_Maketools_Plugin IDE_Maketools_Plugin;
+
+//
+// End of "$Id: ide_maketools.cxx 7169 2010-02-27 22:38:25Z matt $".
+//
diff --git a/ide/Xcode3/FLTK.xcodeproj/project.pbxproj b/ide/Xcode3/FLTK.xcodeproj/project.pbxproj
index 8f5786468..4f81d4a41 100644
--- a/ide/Xcode3/FLTK.xcodeproj/project.pbxproj
+++ b/ide/Xcode3/FLTK.xcodeproj/project.pbxproj
@@ -5296,6 +5296,7 @@
40C91D1AB7051A0D4BF38884 /* file.cxx */,
80B8A51F1B0E64482CB2723F /* fluid.cxx */,
1C0E3777F229938969F8E0E7 /* function_panel.cxx */,
+ B65FCD2B8489E2BBAA3F695A /* ide_maketools.cxx */,
77759BD79A674B0703F21C3E /* ide_support.cxx */,
BE8AEC5B94A33E971A141F65 /* ide_support_ui.cxx */,
B50524F41B3A568F8AD761C9 /* ide_visualc.cxx */,
@@ -5303,7 +5304,6 @@
82D70F7B9460C9797FF03089 /* template_panel.cxx */,
3F148981EF92A30C3D6D698E /* undo.cxx */,
B0CFC7002EFFC3DD3E191940 /* widget_panel.cxx */,
- B65FCD2B8489E2BBAA3F695A /* ide_maketools.cxx */,
BDC84124E6CDF9D25B9505B6 /* fluid.icns */,
);
name = Fluid;