Logo Search packages:      
Sourcecode: icecc version File versions  Download package

pid_t call_cpp ( CompileJob &  job,
int  fdwrite,
int  fdread 
)

If the input filename is a plain source file rather than a preprocessed source file, then preprocess it to a temporary file and return the name in cpp_fname.

The preprocessor may still be running when we return; you have to wait for cpp_fid to exit before the output is complete. This allows us to overlap opening the TCP socket, which probably doesn't use many cycles, with running the preprocessor.

Definition at line 64 of file cpp.cpp.

{
    pid_t pid = fork();
    if (pid == -1) {
        log_perror("failed to fork:");
        return -1; /* probably */
    } else if (pid != 0) {
      /* Parent.  Close the write fd.  */
      if (fdwrite > -1)
          close (fdwrite);
        return pid;
    } else {
      /* Child.  Close the read fd, in case we have one.  */
      if (fdread > -1)
          close (fdread);
        int ret = dcc_ignore_sigpipe(0);
        if (ret)    /* set handler back to default */
            exit(ret);

      char **argv;
      if ( dcc_is_preprocessed( job.inputFile() ) ) {
            /* already preprocessed, great.
               write the file to the fdwrite (using cat) */
            argv = new char*[2+1];
            argv[0] = strdup( "/bin/cat" );
            argv[1] = strdup( job.inputFile().c_str() );
            argv[2] = 0;
      } else {
          list<string> flags = job.localFlags();
          appendList( flags, job.restFlags() );
          int argc = flags.size();
          argc++; // the program
          argc += 2; // -E file.i
          argv = new char*[argc + 1];
          argv[0] = strdup( find_compiler( get_compiler_name(job) ).c_str() );
          int i = 1;
          for ( list<string>::const_iterator it = flags.begin();
              it != flags.end(); ++it) {
            argv[i++] = strdup( it->c_str() );
          }
          argv[i++] = strdup( "-E" );
          argv[i++] = strdup( job.inputFile().c_str() );
          argv[i++] = 0;
      }

#if 0
        printf( "forking " );
        for ( int index = 0; argv[index]; index++ )
            printf( "%s ", argv[index] );
        printf( "\n" );
#endif

      if (fdwrite != STDOUT_FILENO) {
            /* Ignore failure */
            close(STDOUT_FILENO);
            dup2(fdwrite, STDOUT_FILENO);
          close(fdwrite);
      }

        dcc_increment_safeguard();

        execvp(argv[0], argv);
        /* !! NEVER RETURN FROM HERE !! */
        return 0;
    }
}


Generated by  Doxygen 1.6.0   Back to index