filemode.c   [plain text]


/******************************************************************************
*
*   Copyright (C) 2000-2004, International Business Machines
*   Corporation and others.  All Rights Reserved.
*
*******************************************************************************
*   file name:  filemode.c
*   encoding:   ANSI X3.4 (1968)
*   tab size:   8 (not used)
*   indentation:4
*
*   created on: 2000sep28
*   created by: Steven \u24C7 Loomis
*
*   The mode which uses raw files (i.e. does nothing until installation).
*/

#include <stdio.h>
#include <stdlib.h>
#include "unicode/utypes.h"
#include "unicode/putil.h"
#include "cmemory.h"
#include "cstring.h"
#include "filestrm.h"
#include "toolutil.h"
#include "unewdata.h"
#include "uoptions.h"
#include "pkgtypes.h"
#include "makefile.h"

/* The file we will make will look like this:

(where /out is the full path to the output dir)

SOURCES=/out/filea /out/fileb ./somewhere/filec ../somewhereelse/filed

TARGETS=/out/filea /out/fileb /out/filec /out/filed

all: $(TARGETS)

/out/filec /out/filed: ../somewhere/filec ../somewhereelse/filed
      $(INSTALL_DATA) $? $(OUTDIR)

install: all
      $(INSTALL_DATA) $(TARGETS) $(instdir)


==Note:==
  The only items in the first '$(INSTALL_DATA)' are files NOT already in the out dir!


*/



void pkg_mode_files(UPKGOptions *o, FileStream *makefile, UErrorCode *status)
{
  char tmp[1024], tmp2[1024], srcPath[1024];
  char stanza[3072];

  CharList *tail = NULL, *infiles = NULL;

  CharList *copyFilesLeft = NULL;  /* left hand side of the copy rule*/
  CharList *copyFilesRight = NULL; /* rhs "" "" */
  CharList *copyFilesInstall = NULL;

  CharList *copyFilesLeftTail = NULL;
  CharList *copyFilesRightTail = NULL;
  CharList *copyFilesInstallTail = NULL;

  CharList *copyDirs = NULL; /* list of dirs to create for copying */
  CharList *installDirs = NULL; /* list of dirs to create for installation */

/*  CharList *copyCommands = NULL;*/

  const char *baseName;

  T_FileStream_writeLine(makefile, "\n.PHONY: $(NAME) all install clean\n\nall: $(NAME)\n\n");

  if(o->embed) {
    infiles = o->filePaths;
  } else {
    infiles = o->files; /* raw files - no paths other than tree paths */
  }

  /* Dont' copy files already in tmp */
  for(;infiles;infiles = infiles->next)
  { 
    uprv_strcpy(tmp, o->targetDir);
    uprv_strcat(tmp, U_FILE_SEP_STRING);
    if(o->embed) {
      baseName = findBasename(infiles->str);
      uprv_strcpy(srcPath, baseName);
    } else {
      baseName = infiles->str;
      uprv_strcat(tmp, o->shortName);
      uprv_strcat(tmp, U_FILE_SEP_STRING);
      uprv_strcpy(srcPath, "$(SRCDIR)/");
      uprv_strcat(srcPath, infiles->str);
    }
    uprv_strcat(tmp, baseName);

    copyDirs = pkg_appendUniqueDirToList(copyDirs, NULL, tmp);

    o->outFiles = pkg_appendToList(o->outFiles, &tail, uprv_strdup(tmp));

    if(strcmp(tmp, infiles->str) == 0)
    {
      /* fprintf(stderr, "### NOT copying: %s\n", tmp); */
      /*  no copy needed.. */
    } else {
      sprintf(stanza, "%s: %s\n\t$(INSTALL_DATA) $< $@\n", tmp, srcPath);
      T_FileStream_writeLine(makefile, stanza);
    }

    uprv_strcpy(tmp2, "$(INSTALLTO)" U_FILE_SEP_STRING);
    if(!o->embed) {
      uprv_strcat(tmp2, o->shortName);
      uprv_strcat(tmp2, U_FILE_SEP_STRING);
    }
    uprv_strcat(tmp2, baseName);

    installDirs = pkg_appendUniqueDirToList(installDirs, NULL, tmp2);

    if(strcmp(tmp2, infiles->str) == 0) {
      /* fprintf(stderr, "### NOT copying: %s\n", tmp2);   */
      /*  no copy needed.. */
    } else {
      sprintf(stanza, "%s: %s\n\t$(INSTALL_DATA) $< $@\n", tmp2, tmp);
      T_FileStream_writeLine(makefile, stanza);
      
      /* left hand side: target path, target name */
      copyFilesLeft = pkg_appendToList(copyFilesLeft, &copyFilesLeftTail, uprv_strdup(tmp));
      
      /* fprintf(stderr, "##### COPY %s from %s\n", tmp, infiles->str); */
      /* rhs:  source path */
      copyFilesRight = pkg_appendToList(copyFilesRight, &copyFilesRightTail, uprv_strdup(infiles->str));
      
      /* install:  installed path */
      copyFilesInstall = pkg_appendToList(copyFilesInstall, &copyFilesInstallTail, uprv_strdup(tmp2));
    }
  }
  
  if(o->nooutput || o->verbose) {
    CharList *i;
    fprintf(stdout, "# Output files: ");
    for(i = o->outFiles; i; i=i->next) {
      printf("%s ", i->str);
    }
    printf("\n");
  }

  if(o->nooutput) {
    *status = U_ZERO_ERROR;
    return;
  }

  /* these are also the files to delete */
  T_FileStream_writeLine(makefile, "COPIEDDEST= ");
  pkg_writeCharListWrap(makefile, copyFilesLeft, " ", " \\\n", 0);
  T_FileStream_writeLine(makefile, "\n\n");


  T_FileStream_writeLine(makefile, "INSTALLEDDEST= ");
  pkg_writeCharListWrap(makefile, copyFilesInstall, " ", " \\\n", 0);
  T_FileStream_writeLine(makefile, "\n\n");

  T_FileStream_writeLine(makefile, "COPYDIRS= ");
  pkg_writeCharListWrap(makefile, copyDirs, " ", " \\\n", 0);
  T_FileStream_writeLine(makefile, "\n\n");


  T_FileStream_writeLine(makefile, "INSTALLDIRS= ");
  pkg_writeCharListWrap(makefile, installDirs, " ", " \\\n", 0);
  T_FileStream_writeLine(makefile, "\n\n");

  if(copyFilesRight != NULL)
  {
    T_FileStream_writeLine(makefile, "$(NAME): copy-dirs $(COPIEDDEST)\n\n");

    T_FileStream_writeLine(makefile, "clean:\n\t-$(RMV) $(COPIEDDEST) $(MAKEFILE)");
    T_FileStream_writeLine(makefile, "\n\n");

  }
  else
  {
    T_FileStream_writeLine(makefile, "clean:\n\n");
  }
  T_FileStream_writeLine(makefile, "install: install-dirs $(INSTALLEDDEST)\n\n");
  T_FileStream_writeLine(makefile, "install-dirs:\n\t$(MKINSTALLDIRS) $(INSTALLDIRS)\n\n");
  T_FileStream_writeLine(makefile, "copy-dirs:\n\t$(MKINSTALLDIRS) $(COPYDIRS)\n\n");
}