/* $RCSfile: dmake.c,v $ -- $Revision: 1.13 $ -- last change: $Author: kz $ $Date: 2008-03-05 18:28:04 $ -- -- SYNOPSIS -- The main program. -- -- DESCRIPTION -- -- dmake [-#dbug_string] [ options ] -- [ macro definitions ] [ target ... ] -- -- This file contains the main command line parser for the -- make utility. The valid flags recognized are as follows: -- -- -f file - use file as the makefile -- -C file - duplicate console output to file (MSDOS only) -- -K file - .KEEP_STATE file -- -#dbug_string - dump out debugging info, see below -- -v[cdfimrtw] - verbose, print what we are doing, as we do it -- -m[trae] - measure timing information -- -- options: (can be catenated, ie -irn == -i -r -n) -- -- -A - enable AUGMAKE special target mapping -- -B - enable non-use of TABS to start recipe lines -- -c - use non-standard comment scanning -- -d - do not use directory cache -- -i - ignore errors -- -n - trace and print, do not execute commands -- -t - touch, update dates without executing commands -- -T - do not apply transitive closure on inference rules -- -r - don't use internal rules -- -s - do your work silently -- -S - force Sequential make, overrides -P -- -q - check if target is up to date. Does not -- do anything. Returns 0 if up to date, -1 -- otherwise. -- -p - print out a version of the makefile -- -P# - set value of MAXPROCESS -- -E - define environment strings as macros -- -e - as -E but done after parsing makefile -- -u - force unconditional update of target -- -k - make all independent targets even if errors -- -V - print out this make version number -- -M - Microsoft make compatibility, (* disabled *) -- -h - print out usage info -- -x - export macro defs to environment -- -X - ignore #! lines found in makefile -- -- NOTE: - #ddbug_string is only availabe for versions of dmake that -- have been compiled with -DDBUG switch on. Not the case for -- distributed versions. Any such versions must be linked -- together with a version of Fred Fish's debug code. -- -- NOTE: - in order to compile the code the include file stddef.h -- must be shipped with the bundled code. -- -- AUTHOR -- Dennis Vadura, dvadura@dmake.wticorp.com -- -- WWW -- http://dmake.wticorp.com/ -- -- COPYRIGHT -- Copyright (c) 1996,1997 by WTI Corp. All rights reserved. -- -- This program is NOT free software; you can redistribute it and/or -- modify it under the terms of the Software License Agreement Provided -- in the file /readme/license.txt. -- -- LOG -- Use cvs log to obtain detailed change logs. */ /* Set this flag to one, and the global variables in vextern.h will not * be defined as 'extern', instead they will be defined as global vars * when this module is compiled. */ #define _DEFINE_GLOBALS_ 1 #include "extern.h" /* this includes config.h */ #include "sysintf.h" #ifndef MSDOS #define USAGE \ "Usage:\n%s [-P#] [-{f|K} file] [-{w|W} target ...] [macro[!][[*][+][:]]=value ...]\n" #define USAGE2 \ "%s [-v[cdfimrtw]] [-m[trae]] [-ABcdeEghiknpqrsStTuVxX] [target ...]\n" #else #define USAGE \ "Usage:\n%s [-P#] [-{f|C|K} file] [-{w|W} target ...] [macro[!][[*][+][:]]=value ...]\n" #define USAGE2 \ "%s [-v[cdfimrtw]] [-m[trae]] [-ABcdeEghiknpqrsStTuVxX] [target ...]\n" #endif /* We don't use va_end at all, so define it out so that it doesn't produce * lots of "Value not used" warnings. */ #ifdef va_end #undef va_end #endif #define va_end(expand_to_null) /* Make certain that ARG macro is correctly defined. */ #ifdef ARG #undef ARG #endif #define ARG(a,b) a b static char *sccid = "Copyright (c) 1990,...,1997 by WTI Corp."; static char _warn = TRUE; /* warnings on by default */ static void _do_VPATH(); static void _do_ReadEnvironment(); #if !defined(__GNUC__) && !defined(__IBMC__) static void _do_f_flag ANSI((char, char *, char **)); #else static void _do_f_flag ANSI((int, char *, char **)); #endif PUBLIC int main(argc, argv) int argc; char **argv; { #ifdef MSDOS char* std_fil_name = NIL(char); #endif char* fil_name = NIL(char); char* state_name = NIL(char); char* whatif = NIL(char); char* cmdmacs; char* targets; STRINGPTR cltarget = NIL(STRING); /* list of targets from command line. */ STRINGPTR cltarget_first = NIL(STRING); /* Pointer to first element. */ FILE* mkfil; int ex_val; int m_export; /* Uncomment the following line to pass commands to the DBUG engine * before the command line switches (-#..) are evaluated. */ /* DB_PUSH("d,path"); */ DB_ENTER("main"); /* Initialize Global variables to their default values */ Prolog(argc, argv); /* Set internal macros to their initial values, some are changed * later again by Make_rules() that parses the values from ruletab.c. */ Create_macro_vars(); Catch_signals(Quit); /* This macro is only defined for some OSs, see sysintf.c for details * * and NULL if undefined. */ Def_macro("ABSMAKECMD", AbsPname, M_PRECIOUS|M_NOEXPORT|M_EXPANDED ); Def_macro( "MAKECMD", Pname, M_PRECIOUS|M_NOEXPORT|M_EXPANDED ); Pname = Basename(Pname); DB_PROCESS(Pname); (void) setvbuf(stdout, NULL, _IOLBF, BUFSIZ); /* stdout line buffered */ Continue = FALSE; Comment = FALSE; Get_env = FALSE; Force = FALSE; Target = FALSE; If_expand = FALSE; Listing = FALSE; Readenv = FALSE; Rules = TRUE; Trace = FALSE; Touch = FALSE; Check = FALSE; Microsoft = FALSE; Makemkf = FALSE; UseWinpath= FALSE; No_exec = FALSE; m_export = FALSE; cmdmacs = NIL(char); targets = NIL(char); Is_exec_shell = FALSE; Shell_exec_target = NIL(CELL); stdout_redir = NIL(FILE); /* Get fd for for @@-recipe silencing. */ if( (zerofd = open(NULLDEV, O_WRONLY)) == -1 ) Fatal( "Error opening %s !", NULLDEV ); Verbose = V_NOFLAG; Measure = M_NOFLAG; Transitive = TRUE; Nest_level = 0; Line_number = 0; Suppress_temp_file = FALSE; Skip_to_eof = FALSE; while( --argc > 0 ) { register char *p; char *q; if( *(p = *++argv) == '-' ) { if( p[1] == '\0' ) Fatal("Missing option letter"); /* copy options to Buffer for $(MFLAGS), strip 'f' and 'C'*/ q = strchr(Buffer, '\0'); while (*p != '\0') { char c = (*q++ = *p++); if( c == 'f' || c == 'C' ) q--; } if( *(q-1) == '-' ) q--; else *q++ = ' '; *q = '\0'; for( p = *argv+1; *p; p++) switch (*p) { case 'f': _do_f_flag( 'f', *++argv, &fil_name ); argc--; break; #if defined(MSDOS) && !defined(OS2) case 'C': _do_f_flag( 'C', *++argv, &std_fil_name ); argc--; Hook_std_writes( std_fil_name ); break; #endif case 'K': _do_f_flag( 'K', *++argv, &state_name ); argc--; Def_macro(".KEEP_STATE", state_name, M_EXPANDED|M_PRECIOUS); break; case 'W': case 'w': { CELLPTR wif; _do_f_flag( 'w', *++argv, &whatif ); argc--; wif = Def_cell(whatif); wif->ce_attr |= A_WHATIF; whatif = NIL(char); if ( *p == 'W') break; } /*FALLTHRU*/ case 'n': Trace = TRUE; break; case 'k': Continue = TRUE; break; case 'c': Comment = TRUE; break; case 'p': Listing = TRUE; break; case 'r': Rules = FALSE; break; case 't': Touch = TRUE; break; case 'q': Check = TRUE; break; case 'u': Force = TRUE; break; case 'x': m_export = TRUE; break; case 'X': No_exec = TRUE; break; case 'T': Transitive = FALSE; break; case 'e': Get_env = 'e'; break; case 'E': Get_env = 'E'; break; case 'V': Version(); Quit(0); break; case 'A': Def_macro("AUGMAKE", "y", M_EXPANDED); break; case 'B': Def_macro(".NOTABS", "y", M_EXPANDED); break; case 'i': Def_macro(".IGNORE", "y", M_EXPANDED); break; case 's': Def_macro(".SILENT", "y", M_EXPANDED); break; case 'S': Def_macro(".SEQUENTIAL", "y", M_EXPANDED); break; case 'g': Def_macro(".IGNOREGROUP","y", M_EXPANDED); break; case 'd': Def_macro(".DIRCACHE",NIL(char),M_EXPANDED); break; case 'v': if( p[-1] != '-' ) Usage(TRUE); while( p[1] ) switch( *++p ) { case 'c': Verbose |= V_DIR_CACHE; break; case 'd': Verbose |= V_DIR_SET; break; case 'f': Verbose |= V_FILE_IO; break; case 'i': Verbose |= V_INFER; break; case 'm': Verbose |= V_MAKE; break; case 'r': Verbose |= V_FORCEECHO; break; case 't': Verbose |= V_LEAVE_TMP; break; case 'w': Verbose |= V_WARNALL; break; default: Usage(TRUE); break; } if( !Verbose ) Verbose = V_ALL; if( Verbose & V_FORCEECHO ) { HASHPTR hp; /* This cleans the .SILENT setting */ hp = Def_macro(".SILENT", "", M_EXPANDED); /* This overrides the bitmask for further occurrences of * .SILENT to "no bits allowed", see bit variables in the * set_macro_value() definition in dag.c. * The bitmask is already set by Create_macro_vars() in * imacs.c and is overridden for the V_FORCEECHO case. */ hp->MV_MASK = A_DEFAULT; } break; case 'm': if( p[-1] != '-' ) Usage(TRUE); while( p[1] ) switch( *++p ) { case 't': Measure |= M_TARGET; break; case 'r': Measure |= M_RECIPE; break; case 'a': Measure |= M_ABSPATH; break; case 'e': Measure |= M_SHELLESC; break; default: Usage(TRUE); break; } if( !Measure ) Measure = M_TARGET; break; case 'P': if( p[1] ) { /* Only set MAXPROCESS if -S flag is *not* used. */ if( !(Glob_attr & A_SEQ) ) { Def_macro( "MAXPROCESS", p+1, M_MULTI|M_EXPANDED ); } p += strlen(p)-1; } else Fatal( "Missing number for -P flag" ); break; #ifdef DBUG case '#': DB_PUSH(p+1); p += strlen(p)-1; break; #endif case 'h': Usage(FALSE); break; case 0: break; /* lone - */ default: Usage(TRUE); break; } } else if( (q = strchr(p, '=')) != NIL(char) ) { cmdmacs = DmStrAdd( cmdmacs, DmStrDup2(p), TRUE ); /* Macros defined on the command line are marked precious. * FIXME: The exception for += appears to be bogus. */ Parse_macro( p, (q[-1]!='+')?M_PRECIOUS:M_DEFAULT ); } else { /* Remember the targets from the command line. */ register STRINGPTR nsp; targets = DmStrAdd( targets, DmStrDup(p), TRUE ); TALLOC(nsp, 1, STRING); nsp->st_string = DmStrDup( p ); nsp->st_next = NIL(STRING); if(cltarget != NIL(STRING) ) cltarget->st_next = nsp; else cltarget_first = nsp; cltarget = nsp; } } Def_macro( "MAKEMACROS", cmdmacs, M_PRECIOUS|M_NOEXPORT ); Def_macro( "MAKETARGETS", targets, M_PRECIOUS|M_NOEXPORT ); if( cmdmacs != NIL(char) ) FREE(cmdmacs); if( targets != NIL(char) ) FREE(targets); Def_macro( "MFLAGS", Buffer, M_PRECIOUS|M_NOEXPORT ); Def_macro( "%", "$@", M_PRECIOUS|M_NOEXPORT ); if( *Buffer ) Def_macro( "MAKEFLAGS", Buffer+1, M_PRECIOUS|M_NOEXPORT ); _warn = FALSE; /* disable warnings for builtin rules */ Target = TRUE; /* make sure we don't mark any of the default rules as * potential targets. */ Make_rules(); /* Parse the strings stored in Rule_tab. */ _warn = TRUE; /* If -r was not given find and parse startup-makefile. */ if( Rules ) { char *fname = NIL(char); /* Search_file() also checks the environment variable. */ if( (mkfil=Search_file("MAKESTARTUP", &fname)) != NIL(FILE) ) { Parse(mkfil); Def_macro( "MAKESTARTUP", fname, M_EXPANDED|M_MULTI|M_FORCE ); } else Fatal( "Configuration file `%s' not found", fname ); if ( fname != NIL(char)) { FREE( fname ); fname = NIL(char); } } /* Define the targets set on the command line now. */ Target = FALSE; /* Will be set to TRUE when the default targets are set. */ for( cltarget = cltarget_first; cltarget != NIL(STRING); ) { CELLPTR cp; STRINGPTR nta = cltarget->st_next; Add_prerequisite(Targets, cp = Def_cell(cltarget->st_string), FALSE, FALSE); cp->ce_flag |= F_TARGET; cp->ce_attr |= A_FRINGE; Target = TRUE; FREE(cltarget->st_string); FREE(cltarget); cltarget = nta; } if( Get_env == 'E' ) _do_ReadEnvironment(); /* Search for and parse user makefile. */ if( fil_name != NIL(char) ) mkfil = Openfile( fil_name, FALSE, TRUE ); else { /* Search .MAKEFILES dependent list looking for a makefile. */ register CELLPTR cp; cp = Def_cell( ".MAKEFILES" ); mkfil = TryFiles(cp->CE_PRQ); } if( mkfil != NIL(FILE) ) { char *f = Filename(); char *p; if( strcmp(f, "stdin") == 0 ) f = "-"; Def_macro( "MAKEFILE", p = DmStrAdd( "-f", f, FALSE ), M_PRECIOUS|M_NOEXPORT ); FREE(p); Parse( mkfil ); } else if( !Rules ) Fatal( "No `makefile' present" ); if( Nest_level ) Fatal( "Missing .END for .IF" ); if( Get_env == 'e' ) _do_ReadEnvironment(); _do_VPATH(); /* kludge it up with .SOURCE */ if( Listing ) Dump(); /* print out the structures */ if( Trace ) Glob_attr &= ~A_SILENT; /* make sure we see the trace */ if( !Target ) Fatal( "No target" ); else { Test_circle( Root, TRUE ); Check_circle_dfa(); } if( m_export ) { int i; for( i=0; iht_flag & M_NOEXPORT) && hp->ht_value != NIL(char) ) if( Write_env_string(hp->ht_name, hp->ht_value) != 0 ) Warning( "Could not export %s", hp->ht_name ); hp = hp->ht_next; } } } if( Buffer != NIL(char) ) {FREE( Buffer ); Buffer = NIL(char);} if( Trace ) Def_macro(".SEQUENTIAL", "y", M_EXPANDED); ex_val = Make_targets(); Clear_signals(); /* Close fd for for @@-recipe silencing. */ if( close(zerofd) ) Fatal( "Error closing %s !", NULLDEV ); Epilog(ex_val); /* Does not return -- EVER */ return 0; } static void _do_f_flag( flag, name, fname ) char flag; char *name; char **fname; { if( *fname == NIL(char) ) { if( name != NIL(char) ) { *fname = name; } else Fatal("No file name for -%c", flag); } else Fatal("Only one `-%c file' allowed", flag); } static void _do_ReadEnvironment() { t_attr saveattr = Glob_attr; Glob_attr |= A_SILENT; ReadEnvironment(); Glob_attr = saveattr; } static void _do_VPATH() { HASHPTR hp; char *_rl[2]; extern char **Rule_tab; hp = GET_MACRO("VPATH"); if( hp == NIL(HASH) ) return; _rl[0] = ".SOURCE :^ $(VPATH:s/:/ /)"; _rl[1] = NIL(char); Rule_tab = _rl; Parse( NIL(FILE) ); } /* The file table and pointer to the next FREE slot for use by both Openfile and Closefile. Each open stacks the new file onto the open file stack, and a corresponding close will close the passed file, and return the next file on the stack. The maximum number of nested include files is limited by the value of MAX_INC_DEPTH */ static struct { FILE *file; /* file pointer */ char *name; /* name of file */ int numb; /* line number */ } ftab[ MAX_INC_DEPTH ]; static int next_file_slot = 0; /* Set the proper macro value to reflect the depth of the .INCLUDE directives * and the name of the file we are reading. */ static void _set_inc_depth() { char buf[10]; sprintf( buf, "%d", next_file_slot ); Def_macro( "INCDEPTH", buf, M_MULTI|M_NOEXPORT ); Def_macro( "INCFILENAME", next_file_slot ? ftab[next_file_slot-1].name : "", M_MULTI|M_NOEXPORT|M_EXPANDED ); } PUBLIC FILE * Openfile(name, mode, err)/* =========================== This routine opens a file for input or output depending on mode. If the file name is `-' then it returns standard input. The file is pushed onto the open file stack. */ char *name; int mode; int err; { FILE *fil; DB_ENTER("Openfile"); if( name == NIL(char) || !*name ) { if( !err ) DB_RETURN(NIL(FILE)); else Fatal( "Openfile: NIL filename" ); } if( next_file_slot == MAX_INC_DEPTH ) Fatal( "Too many open files. Max nesting level is %d.", MAX_INC_DEPTH); DB_PRINT( "io", ("Opening file [%s], in slot %d", name, next_file_slot) ); if( strcmp("-", name) == 0 ) { name = "stdin"; fil = stdin; } else fil = fopen( name, mode ? "w":"r" ); if( Verbose & V_FILE_IO ) printf( "%s: Openning [%s] for %s", Pname, name, mode?"write":"read" ); if( fil == NIL(FILE) ) { if( Verbose & V_FILE_IO ) printf( " (fail)\n" ); if( err ) Fatal( mode ? "Cannot open file %s for write" : "File %s not found", name ); } else { if( Verbose & V_FILE_IO ) printf( " (success)\n" ); ftab[next_file_slot].file = fil; ftab[next_file_slot].numb = Line_number; ftab[next_file_slot++].name = DmStrDup(name); Line_number = 0; _set_inc_depth(); } DB_RETURN(fil); } PUBLIC FILE * Closefile()/* ============= This routine is used to close the last file opened. This forces make to open files in a last open first close fashion. It returns the file pointer to the next file on the stack, and NULL if the stack is empty.*/ { DB_ENTER("Closefile"); if( !next_file_slot ) DB_RETURN( NIL(FILE) ); if( ftab[--next_file_slot].file != stdin ) { DB_PRINT( "io", ("Closing file in slot %d", next_file_slot) ); if( Verbose & V_FILE_IO ) printf( "%s: Closing [%s]\n", Pname, ftab[next_file_slot].name ); fclose( ftab[next_file_slot].file ); FREE( ftab[next_file_slot].name ); } _set_inc_depth(); if( next_file_slot > 0 ) { Line_number = ftab[next_file_slot].numb; DB_RETURN( ftab[next_file_slot-1].file ); } else Line_number = 0; DB_RETURN( NIL(FILE) ); } PUBLIC FILE * Search_file( macname, rname ) char *macname; char **rname; { HASHPTR hp; FILE *fil = NIL(FILE); char *fname = NIL(char); char *ename = NIL(char); /* order of precedence is: * * MACNAME from command line (precious is marked) * ... via MACNAME:=filename definition. * MACNAME from environment * MACNAME from builtin rules (not precious) */ if( (hp = GET_MACRO(macname)) != NIL(HASH) ) { /* Only expand if needed. */ if( hp->ht_flag & M_EXPANDED ) { ename = fname = DmStrDup(hp->ht_value); } else { ename = fname = Expand(hp->ht_value); } if( hp->ht_flag & M_PRECIOUS ) fil = Openfile(fname, FALSE, FALSE); } if( fil == NIL(FILE) ) { fname=Expand(Read_env_string(macname)); if( (fil = Openfile(fname, FALSE, FALSE)) != NIL(FILE) ) FREE(ename); } if( fil == NIL(FILE) && hp != NIL(HASH) ) { if ( fname != NIL(char) ) { FREE(fname); fname = NIL(char); } fil = Openfile(fname=ename, FALSE, FALSE); } if( rname ) *rname = fname; return(fil); } PUBLIC char * Filename()/* ============ Return name of file on top of stack */ { return( next_file_slot==0 ? NIL(char) : ftab[next_file_slot-1].name ); } PUBLIC int Nestlevel()/* ============= Return the file nesting level */ { return( next_file_slot ); } PUBLIC FILE * TryFiles(lp)/* ============== Try to open a makefile, try to make it if needed and return a filepointer to the first successful found or generated file. The function returns NIL(FILE) if nothing was found. */ LINKPTR lp; { FILE *mkfil = NIL(FILE); if( lp != NIL(LINK) ) { int s_n, s_t, s_q; s_n = Trace; s_t = Touch; s_q = Check; Trace = Touch = Check = FALSE; /* We are making a makefile. Wait for it. */ Makemkf = Wait_for_completion = TRUE; mkfil = NIL(FILE); for(; lp != NIL(LINK) && mkfil == NIL(FILE); lp=lp->cl_next) { if( lp->cl_prq->ce_attr & A_FRINGE ) continue; mkfil = Openfile( lp->cl_prq->CE_NAME, FALSE, FALSE ); /* Note that no error handling for failed Make() calls is possible * as expected errors (no rule to make the makefile) or unexpected * errors both return -1. */ if( mkfil == NIL(FILE) && Make(lp->cl_prq, NIL(CELL)) != -1 ) { mkfil = Openfile( lp->cl_prq->CE_NAME, FALSE, FALSE ); /* Remove flags that indicate that the target was already made. * This is also needed to avoid conflicts with the circular * dependency check in rulparse(), see issues 62118 and 81296 * for details. */ Unmake(lp->cl_prq); } } Trace = s_n; Touch = s_t; Check = s_q; Makemkf = Wait_for_completion = FALSE; } return(mkfil); } /* ** print error message from variable arg list */ static int errflg = TRUE; static int warnflg = FALSE; static void errargs(fmt, args) char *fmt; va_list args; { int warn = _warn && warnflg && !(Glob_attr & A_SILENT); if( errflg || warn ) { char *f = Filename(); fprintf( stderr, "%s: ", Pname ); if( f != NIL(char) ) fprintf(stderr, "%s: line %d: ", f, Line_number); if( errflg ) fprintf(stderr, "Error: -- "); else if( warn ) fprintf(stderr, "Warning: -- "); vfprintf( stderr, fmt, args ); putc( '\n', stderr ); if( errflg && !Continue ) Quit(0); } } /* ** Print error message and abort */ PUBLIC void Fatal(ARG(char *,fmt), ARG(va_alist_type,va_alist)) DARG(char *,fmt) DARG(va_alist_type,va_alist) { va_list args; va_start(args, fmt); Continue = FALSE; errargs(fmt, args); va_end(args); } /* ** error message and exit (unless -k) */ PUBLIC void Error(ARG(char *,fmt), ARG(va_alist_type,va_alist)) DARG(char *,fmt) DARG(va_alist_type,va_alist) { va_list args; va_start(args, fmt); errargs(fmt, args); va_end(args); } /* ** non-fatal message */ PUBLIC void Warning(ARG(char *,fmt), ARG(va_alist_type,va_alist)) DARG(char *,fmt) DARG(va_alist_type,va_alist) { va_list args; va_start(args, fmt); warnflg = TRUE; errflg = FALSE; errargs(fmt, args); errflg = TRUE; warnflg = FALSE; va_end(args); } PUBLIC void No_ram() { Fatal( "No more memory" ); } PUBLIC void Usage( eflag ) int eflag; { register char *p; char *fill; fill = DmStrDup(Pname); for(p=fill; *p; p++) *p=' '; if( eflag ) { fprintf(stderr, USAGE, Pname); fprintf(stderr, USAGE2, fill); } else { printf(USAGE, Pname); printf(USAGE2, fill); puts(" -P# - set max number of child processes for parallel make"); puts(" -f file - use file as the makefile"); #ifdef MSDOS puts(" -C [+]file - duplicate console output to file, ('+' => append)"); #endif puts(" -K file - use file as the .KEEP_STATE file"); puts(" -w target - show what you would do if 'target' were out of date"); puts(" -W target - rebuild pretending that 'target' is out of date"); puts(" -v[cdfimrtw] - verbose, indicate what we are doing, (-v => -vcdfimrtw)"); puts(" c => dump directory cache info only" ); puts(" d => dump change of directory info only" ); puts(" f => dump file open/close info only" ); puts(" i => dump inference information only" ); puts(" m => dump make of target information only" ); puts(" r => Force output of recipe lines and warnings," ); puts(" overrides -s" ); puts(" t => keep temporary files when done" ); puts(" w => issue non-essential warnings\n" ); puts(" -m[trae] - Measure timing information, (-m => -mt)"); puts(" t => display the start and end time of each target" ); puts(" r => display the start and end time of each recipe" ); puts(" a => display the target as an absolute path" ); puts(" e => display the timing of shell escape macros\n" ); puts("Options: (can be catenated, ie -irn == -i -r -n)"); puts(" -A - enable AUGMAKE special target mapping"); puts(" -B - enable the use of spaces instead of tabs to start recipes"); puts(" -c - use non standard comment scanning"); puts(" -d - do not use directory cache"); puts(" -E - define environment strings as macros"); puts(" -e - same as -E but done after parsing makefile"); puts(" -g - disable the special meaning of [ ... ] for group recipes"); puts(" -h - print out usage info"); puts(" -i - ignore errors"); puts(" -k - make independent targets, even if errors"); puts(" -n - trace and print, do not execute commands"); puts(" -p - print out a version of the makefile"); puts(" -q - check if target is up to date. Does not do"); puts(" anything. Returns 0 if up to date, 1 otherwise"); puts(" -r - don't use internal rules"); puts(" -s - do your work silently"); puts(" -S - disable parallel (force sequential) make, overrides -P"); puts(" -t - touch, update time stamps without executing commands"); puts(" -T - do not apply transitive closure on inference rules"); puts(" -u - force unconditional update of target"); puts(" -V - print out version number"); puts(" -x - export macro values to environment"); puts(" -X - ignore #! lines at start of makefile"); } FREE(fill); Quit(0); } PUBLIC void Version() { extern char **Rule_tab; char **p; printf("%s - Version %s (%s)\n", Pname, VERSION, BUILDINFO); printf("%s\n\n", sccid); puts("Default Configuration:"); for (p=Rule_tab; *p != NIL(char); p++) printf("\t%s\n", *p); printf("\n"); #if defined(HAVE_SPAWN_H) || defined(__CYGWIN__) /* Only systems that have spawn ar concerned whether spawn or fork/exec * are used. */ #if ENABLE_SPAWN printf("Subprocesses are executed using: spawn.\n\n"); #else printf("Subprocesses are executed using: fork/exec.\n\n"); #endif #endif printf("Please read the NEWS file for the latest release notes.\n"); } 'libreoffice-4-0-3'>libreoffice-4-0-3 LibreOffice 核心代码仓库文档基金会
summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2021-01-18do not preload all images in the pptx importerLuboš Luňák
Now with my GraphicFilter::MakeGraphicsAvailableThreaded() patches for Impress images will be loaded in parallel as they are needed, which should usually be more efficient than loading all of them immediately. This basically reverts commits: b1319842a49cdf6512bbd9e81081e2a9edbd6089 04e27df3c162f1df02f061b94434a38d1eaa3a46 9eb8e2737d3a4d52ce1b0cc44091a3b7ecf59e3b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107945 Tested-by: Luboš Luňák <l.lunak@collabora.com> Reviewed-by: Luboš Luňák <l.lunak@collabora.com> (cherry picked from commit afa3dff9c7b963f1d312ef8c2efcbc8ab7271e62) Change-Id: I46bb0d6d93fb69f03f464308f6fce1603aafdfd8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109393 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com> Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
2020-09-25fix Graphic duplication in import and add GraphicMapperTomaž Vajngerl
When importing writerfilter, we change to oox when importing images. This transition doesn't store any previous contexts and all instances are reset. The problem occurs when we have identical images because the transition erases all caches we have to determine if an image has already been imported or not, which causes that we import the same image multiple times which create unnecessary copies. This introduces the XGraphicMapper, which can be used to store the XGraphic for a key and can be transferred between writerfilter to oox. With this we can remember which images were already imported and don't create unnecessary internal copies which decreases memory. This also includes a test which checks that the import and export doesn't produce unnecessary copies of identical images. The test checks that for OOXML, ODF and MS Binary formats. Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103283 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <quikee@gmail.com> (cherry picked from commit d0efd878dc41e3913a2d91ff4b5c335c1d71a85c) Change-Id: I33dc19218c565937fab77e132b3a996c51358b6e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103407 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com> Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
2019-07-15tdf#126310 Disable lazy loading of WMF imagesGabor Kelemen
Change-Id: I70d271e29bedc640cbfeab187ddb9ffce3e779e6 Reviewed-on: https://gerrit.libreoffice.org/75599 Tested-by: Jenkins Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
2019-03-26loplugin:unnnecessaryvirtualNoel Grandin
Change-Id: I2aa9a8f14b6db2098931a14c6eed522a9d2653ed Reviewed-on: https://gerrit.libreoffice.org/69682 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2019-03-18tdf#81437 XLSX import: fix missing chart borderBalazs Varga
of MSO 2007/2010 documents with "automatic" chart area formatting, setting also the default 0.75 pt border width and light gray border color. Note: MSO 2007/2010 and MSO 2013/2016 have different "automatic" border colors. This fix uses the last, light gray version instead of the dark one. Change-Id: I579f3745d5fcb2a36e1b4d519320631d20e60fd4 Reviewed-on: https://gerrit.libreoffice.org/69341 Tested-by: Jenkins Reviewed-by: László Németh <nemeth@numbertext.org>
2018-11-29tdf#42949 Fix IWYU warnings in include/vcl/[i-m]*Gabor Kelemen
Found with bin/find-unneeded-includes Only removal proposals are dealt with here. Change-Id: If1b2e04872eb0dd6725802c1709a9085f4cd8c91 Reviewed-on: https://gerrit.libreoffice.org/64141 Tested-by: Jenkins Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
2018-10-09Extend loplugin:redundantinline to catch inline functions w/o external linkageStephan Bergmann
...where "inline" (in its meaning of "this function can be defined in multiple translation units") thus doesn't make much sense. (As discussed in compilerplugins/clang/redundantinline.cxx, exempt such "static inline" functions in include files for now.) All the rewriting has been done automatically by the plugin, except for one instance in sw/source/ui/frmdlg/column.cxx that used to involve an #if), plus some subsequent solenv/clang-format/reformat-formatted-files. Change-Id: Ib8b996b651aeafc03bbdc8890faa05ed50517224 Reviewed-on: https://gerrit.libreoffice.org/61573 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
2018-07-30Add missing sal/log.hxx headersGabor Kelemen
rtl/string.hxx and rtl/ustring.hxx both unnecessarily #include <sal/log.hxx> (and don't make use of it themselves), but many other files happen to depend on it. This is a continuation of commit 6ff2d84ade299cb3d14d4110e4cf1a4b8070c030 to be able to remove those unneeded includes. This commit adds missing headers to every file found by: grep -FwL sal/log.hxx $(git grep -Elw 'SAL_INFO|SAL_INFO_IF|SAL_WARN|SAL_WARN_IF|SAL_DETAIL_LOG_STREAM|SAL_WHERE|SAL_STREAM|SAL_DEBUG') to directories from l10ntools to reportdesign Change-Id: Ia2dc93dd848c2dc0b6a8cb6e19849c614ec55198 Reviewed-on: https://gerrit.libreoffice.org/58205 Tested-by: Jenkins Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
2018-06-26tdf#118133 DOCX import: disable lazy-loading of tiff imagesMiklos Vajna
The same code that works for jpeg/png doesn't work for tiff, go back to synchronous loading there for now. Change-Id: I9b16f40811f6d485c986bd06daa7d4d8c8a76178 Reviewed-on: https://gerrit.libreoffice.org/56415 Tested-by: Jenkins Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
2018-04-20DOC import: lazy-read imagesMiklos Vajna
At least JPEG files are now only loaded when the user scrolls to the relevant page. Also fix the root cause of the EMF lazy-read problem and remove the previous workarounds. Change-Id: I9699927282b99bcb71a0d271a20bbfd56a361ee8 Reviewed-on: https://gerrit.libreoffice.org/53219 Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk> Tested-by: Jenkins <ci@libreoffice.org>
2018-04-20DOCX import: lazy-read images without external headersMiklos Vajna
So that similar to ODT, images are not loaded on file open, only when the user scrolls there. Notes: 1) GraphicDescriptor::ImpDetectJPG() would try to calculate the logic size before the pixel size is available, so the logic size would be 0x0. Also, ImpGraphic::ImplSetPrepared() would always work with a pixel map mode. Any of these two would result in a failure of testDMLShapeFillBitmapCrop in CppunitTest_sw_ooxmlexport6. 2) Lazy-loading seems to (at the moment) not recognize EMF files, so don't lazy-load in case an external header is provided. This probably has to be revisited, since the ODF import doesn't go via GraphicProvider::queryGraphic(). Change-Id: I44754e659effebca8339715df114dbaadb9b5e9f Reviewed-on: https://gerrit.libreoffice.org/53215 Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk> Tested-by: Jenkins <ci@libreoffice.org>
2018-03-10oox: remove unused methods that rely on GraphicObject URLTomaž Vajngerl
Change-Id: Ie68ccfa8d802bb284da8bb4af69882f4b66a3dac Reviewed-on: https://gerrit.libreoffice.org/51010 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
2018-03-08loplugin:unusedmethodsNoel Grandin
Change-Id: Id6b4edd265cb6bef31c72e2a0a440211d51c7c33 Reviewed-on: https://gerrit.libreoffice.org/50900 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2018-03-05use more Color in ooxNoel Grandin
Change-Id: I8fdc6742de5af9101e246411e7208650bae2c4c7 Reviewed-on: https://gerrit.libreoffice.org/50617 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2017-12-06Remove unused #include <vcl/metaact.hxx> from vcl/outdev.hxxStephan Bergmann
...and fix the fallout Change-Id: Ie514bd95d5a9f990a887566619031e9844c40b92 Reviewed-on: https://gerrit.libreoffice.org/45195 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
2017-10-23loplugin:includeform: ooxStephan Bergmann
Change-Id: I9f1cc9940f5b31370394f789ebfaddfd6d30ca61
2017-07-15emfplus: completed isolation/migration of Emf/WmfArmin Le Grand
Decided to keep the migrated/isolated Emf/Wmf reader which are now hidden behind a Uno Api. Had to re-implement WMF_EXTERNALHEADER (now WmfExternal, own file/header) to not break anything. It *seems* to just scale something and could be done after import, but I could not be sure. Also needed a callback hook to allow getting the Metafile out of a MetafilePrimitive in a lower module (vcl relative to drawinglayer) which is needed as long as primitives are not completely on Uno Api. Deleted all Emf/Wmf reader stuff from vcl. Change-Id: Ic5540defa8ec770728280df4df3f12e1f48cfc3a
2017-06-12cleanup unused css/frame/* includesJochen Nitschke
Change-Id: I173a29fd1ee889127369d2bc2fce8e010b89ca65 Reviewed-on: https://gerrit.libreoffice.org/38633 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2017-06-02tdf#70415 PPTX import: fix assert fail in importEmbeddedGraphics()Miklos Vajna
The intention for the parallel import is that the number of input and output arguments is always the same. On error just empty references are returned. That means we should not check for empty references here, otherwise the input and output length won't equal. Change-Id: Ief86162e7f827bc413c4dde4a4c9f606a83ea803 Reviewed-on: https://gerrit.libreoffice.org/38316 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
2017-05-23svtools: add GraphicProvider::queryGraphics()Miklos Vajna
This allows moving the for() loop from oox to svtools when importing multiple images. That means in case later we parallelize that loop, then the performance benefit won't be restricted to oox, but also will be available for all clients of the graphic provider. Change-Id: Icd7bd447e7ae623b0a8548e020d8f6ab38da47bb Reviewed-on: https://gerrit.libreoffice.org/37945 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
2017-05-23oox: add GraphicHelper::importGraphics()Miklos Vajna
Similar to GraphicHelper::importGraphic(), but can import multiple streams with one function call. Change-Id: I5fd398bb6649259e86967f8db5cc1e212f50bc8e Reviewed-on: https://gerrit.libreoffice.org/37942 Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk> Tested-by: Jenkins <ci@libreoffice.org>
2017-05-23oox: add GraphicHelper::importEmbeddedGraphics()Miklos Vajna
Similar to GraphicHelper::importEmbeddedGraphic(), but it takes a list of image paths to import. Change-Id: I11b670a0b2c693540054c78be2cee3835477b7e6 Reviewed-on: https://gerrit.libreoffice.org/37938 Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk> Tested-by: Jenkins <ci@libreoffice.org>
2016-10-05convert MapUnit to scoped enumNoel Grandin
I left a prefix on the names "Map" so that I would not have to re-arrange each name too much, since I can't start identifiers with digits like "100thMM" And remove RSC_EXTRAMAPUNIT, which doesn't seem to be doing anything anymore. Change-Id: I5187824aa87e30caf5357b51b5384b5ab919d224 Reviewed-on: https://gerrit.libreoffice.org/29096 Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> Tested-by: Noel Grandin <noel.grandin@collabora.co.uk>
2015-10-23com::sun::star->css in lotuswordpro,mysqlc,ooxNoel Grandin
Change-Id: Id99ff87c4eb3f1b36702261ce63d5d2793ea35d7
2015-02-18better way to set default for chart area fill style, related tdf#89451Markus Mohrhard
Change-Id: Iee7fea0f55cf54d43a349b6cc0ffa25995069e40
2015-02-02oox: 89 DPI is not such a great defaultMiklos Vajna
Using the DPI from Application::GetDefaultDevice() is a much better idea, especially that now oox::GraphicHelper::GraphicHelper() and oox::drawingml::DrawingML::WriteSrcRect() are in sync. Should fix the testCropPixel() failure in CppunitTest_sw_ooxmlexport that appears on HiDPI systems. Also, fix all the rounding problems that now became visible when the DPI is the same for both import and export. Change-Id: Iceb34a8a5a1eaa8ce0824491521ad6b4d2f6949c Reviewed-on: https://gerrit.libreoffice.org/14280 Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk> Tested-by: Miklos Vajna <vmiklos@collabora.co.uk>
2014-11-17sal: clean up public headers with include-what-you-useMichael Stahl
Sadly cannot forward declare "struct {...} TimeValue;". rtl/(u)?string.hxx still include sal/log.hxx but removing osl/diagnose.h was painful enough for now... Change-Id: Id41e17f3870c4f24c53ce7b11f2c40a3d14d1f05
2014-08-04bnc#886540: Default chart background for pptx docs should be transparent.Kohei Yoshida
Charts in docx and xlsx OTOH use solid white as the default fill style. Change-Id: Ic4351fe65cabc12d60214b67c7026a317841f2c7
2014-06-25remove whitespacesMarkus Mohrhard
Change-Id: Ie14ba3dcb97f20479a04538748ef2c1c9e6c5dac
2014-06-17improve the inlinesimplememberfunctions clang pluginNoel Grandin
Change-Id: I6d5a952901648e01904ef5c37f953c517304d31e
2014-04-24fdo#77089 pass shape dimensions to graphicfilter for WMFTomaž Vajngerl
Change-Id: I673a76ef85038b1f304ea85faeed5b4a462cb144
2014-02-26Remove visual noise from ooxAlexander Wilms
Change-Id: Ie25838f20f00dc32d9d22959308c118cef688e94 Reviewed-on: https://gerrit.libreoffice.org/8288 Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
2013-01-04Make LO buildable again after the GraphicFilter move.Jan Holesovsky
Change-Id: I3455a7294b136400f32163626d5a7a7f2bfa898c
2013-01-04oox: kill no longer needed CREATE_OUSTRINGMiklos Vajna
2012-12-21fdo#46808, Convert frame::Desktop to new style service.Noel Grandin
I had to drop XEventBroadcaster from the merged interface because it introduced method name conflicts (addEventListener). Shouldn't be an issue since it was scheduled to be dropped anyhow, and the service implementation still implements it, so existing clients will be fine. I dropped the interface XPropertySet from the combined IDL because nobody seems to be using it, and it's primary purpose appears to be to set weird flags. I dropped the optional interfaces XStatusIndicatorFactory XDispatchInformationProvider from the combined IDL because the service does not implement them, and nobody seems to be using them. I suspect they were mistakenly copied from XFrame. I also did not convert the Title, UserDefinedAttributes and LayoutManager properties to attributes, again because no-one is using them. Change-Id: I678a00006ed2cca2d6c37c4e39465811442c33af
2012-12-20Removal unnecessary using declarationsJosé Guilherme Vanz
This commit just removes some unnecessary using declarations Change-Id: Ia1c7cc925b2db5b1172fae91dc703883d6539eaa Signed-off-by: José Guilherme Vanz <guilherme.sft@gmail.com> Reviewed-on: https://gerrit.libreoffice.org/1430 Reviewed-by: Norbert Thiebaud <nthiebaud@gmail.com> Tested-by: Norbert Thiebaud <nthiebaud@gmail.com>
2012-12-13PCH for Library_ooxLuboš Luňák