]> git.sur5r.net Git - cc65/commitdiff
Added --print-target-path option.
authorOliver Schmidt <ol.sc@web.de>
Fri, 3 Jun 2016 09:08:53 +0000 (11:08 +0200)
committerOliver Schmidt <ol.sc@web.de>
Fri, 3 Jun 2016 09:08:53 +0000 (11:08 +0200)
If cc65 is installed and used as designed there's no need whatsoever for CC65_HOME (both on *IX and Windows) from the perspective of the cc65 binaries. If the user however has to access files from the 'target' directory thenhe ends up with some assumption on the cc65 installation path nevertheless :-(

In order to avoid this I added the --print-target-path option. It "exports" the logic used by the cc65 binaries to locate their files to the user thus allowing him to leverage the same logic to locate the target files in his build scripts / Makefiles.

doc/cl65.sgml
src/Makefile
src/cl65/main.c
src/common/searchpath.c
src/common/searchpath.h

index 6e044b8d52c0c3d66aa19f830b0fb8b31b6f1066..6f29fa29dcc521bfa65579ff8c00b653156b4a0e 100644 (file)
@@ -103,6 +103,7 @@ Long options:
   --o65-model model             Override the o65 model
   --obj file                    Link this object file
   --obj-path path               Specify an object file search path
+  --print-target-path           Print the target file path
   --register-space b            Set space available for register variables
   --register-vars               Enable register variables
   --rodata-name seg             Set the name of the RODATA segment
@@ -154,6 +155,14 @@ There are a few remaining options that control the behaviour of cl65:
   shouldn't use -o when more than one output file is created.
 
 
+  <tag><tt>--print-target-path</tt></tag>
+
+  This option prints the absolute path of the target file directory and exits
+  then. It is supposed to be used with shell backquotes or the GNU make shell
+  function This way you can write build scripts or Makefiles accessing target
+  files without any assumption about the cc65 installation path.
+
+
   <tag><tt>-t sys, --target sys</tt></tag>
 
   The default for this option is different from the compiler and linker in the
@@ -162,6 +171,7 @@ There are a few remaining options that control the behaviour of cl65:
   the C64 as a target system by default. This was chosen since most people
   seem to use cc65 to develop for the C64.
 
+
   <tag><tt>-Wa options, --asm-args options</tt></tag>
 
   Pass options directly to the assembler. This may be used to pass options
@@ -172,6 +182,7 @@ There are a few remaining options that control the behaviour of cl65:
   if cl65 supports an option by itself, do not pass this option to the
   assembler by means of the <tt/-Wa/ switch.
 
+
   <tag><tt>-Wc options, --cc-args options</tt></tag>
 
   Pass options directly to the compiler. This may be used to pass options
@@ -182,6 +193,7 @@ There are a few remaining options that control the behaviour of cl65:
   if cl65 supports an option by itself, do not pass this option to the
   compiler by means of the <tt/-Wc/ switch.
 
+
   <tag><tt>-Wl options, --ld-args options</tt></tag>
 
   Pass options directly to the linker. This may be used to pass options that
@@ -192,7 +204,7 @@ There are a few remaining options that control the behaviour of cl65:
   supports an option by itself, do not pass this option to the linker by means
   of the <tt/-Wl/ switch.
 
-</descrip>                        
+</descrip>
 
 
 
@@ -304,4 +316,3 @@ freely, subject to the following restrictions:
 
 
 </article>
-
index f10c189b3da94203d294eb9090e253f6c74ae29d..edb6f5aa8a25db449d57ee3350bbed451cd25603 100644 (file)
@@ -24,6 +24,7 @@ datadir := $(if $(prefix),$(prefix)/share/cc65,$(abspath ..))
 
 CA65_INC = $(datadir)/asminc
 CC65_INC = $(datadir)/include
+CL65_TGT = $(datadir)/target
 LD65_LIB = $(datadir)/lib
 LD65_OBJ = $(datadir)/lib
 LD65_CFG = $(datadir)/cfg
@@ -63,8 +64,9 @@ endif
 
 CFLAGS += -MMD -MP -O -I common \
           -Wall -Wextra -Wno-char-subscripts $(USER_CFLAGS) \
-          -DGIT_SHA=$(GIT_SHA) -DCA65_INC=$(CA65_INC) -DCC65_INC=$(CC65_INC) \
+          -DCA65_INC=$(CA65_INC) -DCC65_INC=$(CC65_INC) -DCL65_TGT=$(CL65_TGT) \
           -DLD65_LIB=$(LD65_LIB) -DLD65_OBJ=$(LD65_OBJ) -DLD65_CFG=$(LD65_CFG)
+          -DGIT_SHA=$(GIT_SHA)
 
 LDLIBS += -lm
 
index 4268a569bcff7cdc984cf8424b9d6855017978b9..654bd97b2cc66bdfa4418124525c7f07c4ee1e88 100644 (file)
@@ -73,6 +73,7 @@
 #include "filetype.h"
 #include "fname.h"
 #include "mmodel.h"
+#include "searchpath.h"
 #include "strbuf.h"
 #include "target.h"
 #include "version.h"
@@ -759,6 +760,7 @@ static void Usage (void)
             "  --o65-model model\t\tOverride the o65 model\n"
             "  --obj file\t\t\tLink this object file\n"
             "  --obj-path path\t\tSpecify an object file search path\n"
+            "  --print-target-path\t\tPrint the target file path\n"
             "  --register-space b\t\tSet space available for register variables\n"
             "  --register-vars\t\tEnable register variables\n"
             "  --rodata-name seg\t\tSet the name of the RODATA segment\n"
@@ -1126,6 +1128,23 @@ static void OptObjPath (const char* Opt attribute ((unused)), const char* Arg)
 
 
 
+static void OptPrintTargetPath (const char* Opt attribute ((unused)),
+                                const char* Arg attribute ((unused)))
+/* Print the target file path */
+{
+    SearchPaths* TargetPath = NewSearchPath ();
+    AddSubSearchPathFromEnv (TargetPath, "CC65_HOME", "target");
+#if defined(CL65_TGT) && !defined(_WIN32)
+    AddSearchPath (TargetPath, STRINGIZE (CL65_TGT));
+#endif
+    AddSubSearchPathFromWinBin (TargetPath, "target");
+
+    printf ("%s\n", GetSearchPath (TargetPath, 0));
+    exit (EXIT_SUCCESS);
+}
+
+
+
 static void OptRegisterSpace (const char* Opt attribute ((unused)), const char* Arg)
 /* Handle the --register-space option */
 {
@@ -1240,56 +1259,57 @@ int main (int argc, char* argv [])
 {
     /* Program long options */
     static const LongOpt OptTab[] = {
-        { "--add-source",       0,      OptAddSource            },
-        { "--asm-args",         1,      OptAsmArgs              },
-        { "--asm-define",       1,      OptAsmDefine            },
-        { "--asm-include-dir",  1,      OptAsmIncludeDir        },
-        { "--bin-include-dir",  1,      OptBinIncludeDir        },
-        { "--bss-label",        1,      OptBssLabel             },
-        { "--bss-name",         1,      OptBssName              },
-        { "--cc-args",          1,      OptCCArgs               },
-        { "--cfg-path",         1,      OptCfgPath              },
-        { "--check-stack",      0,      OptCheckStack           },
-        { "--code-label",       1,      OptCodeLabel            },
-        { "--code-name",        1,      OptCodeName             },
-        { "--codesize",         1,      OptCodeSize             },
-        { "--config",           1,      OptConfig               },
-        { "--cpu",              1,      OptCPU                  },
-        { "--create-dep",       1,      OptCreateDep            },
-        { "--create-full-dep",  1,      OptCreateFullDep        },
-        { "--data-label",       1,      OptDataLabel            },
-        { "--data-name",        1,      OptDataName             },
-        { "--debug",            0,      OptDebug                },
-        { "--debug-info",       0,      OptDebugInfo            },
-        { "--feature",          1,      OptFeature              },
-        { "--force-import",     1,      OptForceImport          },
-        { "--help",             0,      OptHelp                 },
-        { "--include-dir",      1,      OptIncludeDir           },
-        { "--ld-args",          1,      OptLdArgs               },
-        { "--lib",              1,      OptLib                  },
-        { "--lib-path",         1,      OptLibPath              },
-        { "--list-targets",     0,      OptListTargets          },
-        { "--listing",          1,      OptListing              },
-        { "--list-bytes",       1,      OptListBytes            },
-        { "--mapfile",          1,      OptMapFile              },
-        { "--memory-model",     1,      OptMemoryModel          },
-        { "--module",           0,      OptModule               },
-        { "--module-id",        1,      OptModuleId             },
-        { "--o65-model",        1,      OptO65Model             },
-        { "--obj",              1,      OptObj                  },
-        { "--obj-path",         1,      OptObjPath              },
-        { "--register-space",   1,      OptRegisterSpace        },
-        { "--register-vars",    0,      OptRegisterVars         },
-        { "--rodata-name",      1,      OptRodataName           },
-        { "--signed-chars",     0,      OptSignedChars          },
-        { "--standard",         1,      OptStandard             },
-        { "--start-addr",       1,      OptStartAddr            },
-        { "--static-locals",    0,      OptStaticLocals         },
-        { "--target",           1,      OptTarget               },
-        { "--verbose",          0,      OptVerbose              },
-        { "--version",          0,      OptVersion              },
-        { "--zeropage-label",   1,      OptZeropageLabel        },
-        { "--zeropage-name",    1,      OptZeropageName         },
+        { "--add-source",        0, OptAddSource      },
+        { "--asm-args",          1, OptAsmArgs        },
+        { "--asm-define",        1, OptAsmDefine      },
+        { "--asm-include-dir",   1, OptAsmIncludeDir  },
+        { "--bin-include-dir",   1, OptBinIncludeDir  },
+        { "--bss-label",         1, OptBssLabel       },
+        { "--bss-name",          1, OptBssName        },
+        { "--cc-args",           1, OptCCArgs         },
+        { "--cfg-path",          1, OptCfgPath        },
+        { "--check-stack",       0, OptCheckStack     },
+        { "--code-label",        1, OptCodeLabel      },
+        { "--code-name",         1, OptCodeName       },
+        { "--codesize",          1, OptCodeSize       },
+        { "--config",            1, OptConfig         },
+        { "--cpu",               1, OptCPU            },
+        { "--create-dep",        1, OptCreateDep      },
+        { "--create-full-dep",   1, OptCreateFullDep  },
+        { "--data-label",        1, OptDataLabel      },
+        { "--data-name",         1, OptDataName       },
+        { "--debug",             0, OptDebug          },
+        { "--debug-info",        0, OptDebugInfo      },
+        { "--feature",           1, OptFeature        },
+        { "--force-import",      1, OptForceImport    },
+        { "--help",              0, OptHelp           },
+        { "--include-dir",       1, OptIncludeDir     },
+        { "--ld-args",           1, OptLdArgs         },
+        { "--lib",               1, OptLib            },
+        { "--lib-path",          1, OptLibPath        },
+        { "--list-targets",      0, OptListTargets    },
+        { "--listing",           1, OptListing        },
+        { "--list-bytes",        1, OptListBytes      },
+        { "--mapfile",           1, OptMapFile        },
+        { "--memory-model",      1, OptMemoryModel    },
+        { "--module",            0, OptModule         },
+        { "--module-id",         1, OptModuleId       },
+        { "--o65-model",         1, OptO65Model       },
+        { "--obj",               1, OptObj            },
+        { "--obj-path",          1, OptObjPath        },
+        { "--print-target-path", 0, OptPrintTargetPath},
+        { "--register-space",    1, OptRegisterSpace  },
+        { "--register-vars",     0, OptRegisterVars   },
+        { "--rodata-name",       1, OptRodataName     },
+        { "--signed-chars",      0, OptSignedChars    },
+        { "--standard",          1, OptStandard       },
+        { "--start-addr",        1, OptStartAddr      },
+        { "--static-locals",     0, OptStaticLocals   },
+        { "--target",            1, OptTarget         },
+        { "--verbose",           0, OptVerbose        },
+        { "--version",           0, OptVersion        },
+        { "--zeropage-label",    1, OptZeropageLabel  },
+        { "--zeropage-name",     1, OptZeropageName   },
     };
 
     char* CmdPath;
index 78443f34cba977c40fcf7ce8bc9a95f2899ab03b..ca7017e6fd4a404e296ba5b4a4a4ff91c221e4bd 100644 (file)
@@ -238,6 +238,18 @@ void PopSearchPath (SearchPaths* P)
 
 
 
+char* GetSearchPath (SearchPaths* P, unsigned Index)
+/* Return the search path at the given index, if the index is valid, return an
+** empty string otherwise.
+*/
+{
+    if (Index < CollCount (P))
+        return CollAtUnchecked (P, Index);
+    return "";
+}
+
+
+
 char* SearchFile (const SearchPaths* P, const char* File)
 /* Search for a file in a list of directories. Return a pointer to a malloced
 ** area that contains the complete path, if found, return 0 otherwise.
index 6f5bafa7a8c9d289ea6063403a1a7deb8d005602..974886a67c373d24910b3d0d2a1738262bca5328 100644 (file)
@@ -94,6 +94,11 @@ int PushSearchPath (SearchPaths* P, const char* NewPath);
 void PopSearchPath (SearchPaths* P);
 /* Remove a search path from the head of an existing search path list */
 
+char* GetSearchPath (SearchPaths* P, unsigned Index);
+/* Return the search path at the given index, if the index is valid, return an
+** empty string otherwise.
+*/
+
 char* SearchFile (const SearchPaths* P, const char* File);
 /* Search for a file in a list of directories. Return a pointer to a malloced
 ** area that contains the complete path, if found, return 0 otherwise.