source: trunk/src/kmk/output.h@ 3478

Last change on this file since 3478 was 3432, checked in by bird, 5 years ago

kmk: Quick output hack to repeat the failure output at the end of die() as it may easily get lost in output from other jobs (problem on systems with lots of cores).

  • Property svn:eol-style set to native
File size: 3.4 KB
Line 
1/* Output to stdout / stderr for GNU make
2Copyright (C) 2013-2016 Free Software Foundation, Inc.
3This file is part of GNU Make.
4
5GNU Make is free software; you can redistribute it and/or modify it under the
6terms of the GNU General Public License as published by the Free Software
7Foundation; either version 3 of the License, or (at your option) any later
8version.
9
10GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
11WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12A PARTICULAR PURPOSE. See the GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License along with
15this program. If not, see <http://www.gnu.org/licenses/>. */
16
17#ifndef INCLUDED_MAKE_OUTPUT_H
18#define INCLUDED_MAKE_OUTPUT_H
19#include <stdio.h> /* darwin*/
20
21#ifdef CONFIG_WITH_OUTPUT_IN_MEMORY
22/* Output run. */
23struct output_run
24{
25 unsigned int seqno; /* For interleaving out/err output. */
26 unsigned int len; /* The length of the output. */
27 struct output_run *next; /* Pointer to the next run. */
28};
29
30/* Output segment. */
31struct output_segment
32{
33 struct output_segment *next;
34 size_t size; /* Segment size, everything included. */
35 struct output_run runs[1];
36};
37
38/* Output memory buffer. */
39struct output_membuf
40{
41 struct output_run *head_run;
42 struct output_run *tail_run; /* Always in tail_seg. */
43 struct output_segment *head_seg;
44 struct output_segment *tail_seg;
45 size_t left; /* Number of bytes that can be appended to
46 the tail_run. */
47 size_t total; /* Total segment allocation size. */
48};
49#endif /* CONFIG_WITH_OUTPUT_IN_MEMORY */
50
51struct output
52 {
53#ifdef CONFIG_WITH_OUTPUT_IN_MEMORY
54 struct output_membuf out;
55 struct output_membuf err;
56 unsigned int seqno; /* The current run sequence number. */
57#else
58 int out;
59 int err;
60#endif
61 unsigned int syncout:1; /* True if we want to synchronize output. */
62#ifdef KMK
63 unsigned int dont_truncate:1; /* For die_with_child_output repeat. */
64#endif
65 };
66
67extern struct output *output_context;
68extern unsigned int stdio_traced;
69
70#define OUTPUT_SET(_new) do{ output_context = (_new)->syncout ? (_new) : NULL; }while(0)
71#define OUTPUT_UNSET() do{ output_context = NULL; }while(0)
72
73#define OUTPUT_TRACED() do{ stdio_traced = 1; }while(0)
74#define OUTPUT_IS_TRACED() (!!stdio_traced)
75
76FILE *output_tmpfile (char **, const char *);
77
78/* Initialize and close a child output structure: if NULL do this program's
79 output (this should only be done once). */
80void output_init (struct output *out);
81void output_close (struct output *out);
82
83/* In situations where output may be about to be displayed but we're not
84 sure if we've set it up yet, call this. */
85void output_start (void);
86
87/* Show a message on stdout or stderr. Will start the output if needed. */
88void outputs (int is_err, const char *msg);
89#ifdef CONFIG_WITH_OUTPUT_IN_MEMORY
90ssize_t output_write_bin (struct output *out, int is_err, const char *src, size_t len);
91#endif
92ssize_t output_write_text (struct output *out, int is_err, const char *src, size_t len);
93
94#ifndef NO_OUTPUT_SYNC
95int output_tmpfd (void);
96/* Dump any child output content to stdout, and reset it. */
97void output_dump (struct output *out);
98#endif
99
100#endif /* INLCUDED_MAKE_OUTPUT_H */
101
Note: See TracBrowser for help on using the repository browser.