xref: /minix3/external/bsd/bind/dist/unit/atf-src/atf-c/build.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: build.c,v 1.1.1.3 2014/12/10 03:34:48 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Automated Testing Framework (atf)
5*00b67f09SDavid van Moolenbroek  *
6*00b67f09SDavid van Moolenbroek  * Copyright (c) 2009 The NetBSD Foundation, Inc.
7*00b67f09SDavid van Moolenbroek  * All rights reserved.
8*00b67f09SDavid van Moolenbroek  *
9*00b67f09SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
10*00b67f09SDavid van Moolenbroek  * modification, are permitted provided that the following conditions
11*00b67f09SDavid van Moolenbroek  * are met:
12*00b67f09SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
13*00b67f09SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
14*00b67f09SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
15*00b67f09SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer in the
16*00b67f09SDavid van Moolenbroek  *    documentation and/or other materials provided with the distribution.
17*00b67f09SDavid van Moolenbroek  *
18*00b67f09SDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
19*00b67f09SDavid van Moolenbroek  * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
20*00b67f09SDavid van Moolenbroek  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21*00b67f09SDavid van Moolenbroek  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22*00b67f09SDavid van Moolenbroek  * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
23*00b67f09SDavid van Moolenbroek  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24*00b67f09SDavid van Moolenbroek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
25*00b67f09SDavid van Moolenbroek  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*00b67f09SDavid van Moolenbroek  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
27*00b67f09SDavid van Moolenbroek  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28*00b67f09SDavid van Moolenbroek  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
29*00b67f09SDavid van Moolenbroek  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*00b67f09SDavid van Moolenbroek  */
31*00b67f09SDavid van Moolenbroek 
32*00b67f09SDavid van Moolenbroek #include <stdlib.h>
33*00b67f09SDavid van Moolenbroek #include <string.h>
34*00b67f09SDavid van Moolenbroek 
35*00b67f09SDavid van Moolenbroek #include "atf-c/build.h"
36*00b67f09SDavid van Moolenbroek #include "atf-c/config.h"
37*00b67f09SDavid van Moolenbroek #include "atf-c/error.h"
38*00b67f09SDavid van Moolenbroek 
39*00b67f09SDavid van Moolenbroek #include "detail/sanity.h"
40*00b67f09SDavid van Moolenbroek #include "detail/text.h"
41*00b67f09SDavid van Moolenbroek 
42*00b67f09SDavid van Moolenbroek /* ---------------------------------------------------------------------
43*00b67f09SDavid van Moolenbroek  * Auxiliary functions.
44*00b67f09SDavid van Moolenbroek  * --------------------------------------------------------------------- */
45*00b67f09SDavid van Moolenbroek 
46*00b67f09SDavid van Moolenbroek static
47*00b67f09SDavid van Moolenbroek atf_error_t
append_config_var(const char * var,atf_list_t * argv)48*00b67f09SDavid van Moolenbroek append_config_var(const char *var, atf_list_t *argv)
49*00b67f09SDavid van Moolenbroek {
50*00b67f09SDavid van Moolenbroek     atf_error_t err;
51*00b67f09SDavid van Moolenbroek     atf_list_t words;
52*00b67f09SDavid van Moolenbroek 
53*00b67f09SDavid van Moolenbroek     err = atf_text_split(atf_config_get(var), " ", &words);
54*00b67f09SDavid van Moolenbroek     if (atf_is_error(err))
55*00b67f09SDavid van Moolenbroek         goto out;
56*00b67f09SDavid van Moolenbroek 
57*00b67f09SDavid van Moolenbroek     atf_list_append_list(argv, &words);
58*00b67f09SDavid van Moolenbroek 
59*00b67f09SDavid van Moolenbroek out:
60*00b67f09SDavid van Moolenbroek     return err;
61*00b67f09SDavid van Moolenbroek }
62*00b67f09SDavid van Moolenbroek 
63*00b67f09SDavid van Moolenbroek static
64*00b67f09SDavid van Moolenbroek atf_error_t
append_arg1(const char * arg,atf_list_t * argv)65*00b67f09SDavid van Moolenbroek append_arg1(const char *arg, atf_list_t *argv)
66*00b67f09SDavid van Moolenbroek {
67*00b67f09SDavid van Moolenbroek     return atf_list_append(argv, strdup(arg), true);
68*00b67f09SDavid van Moolenbroek }
69*00b67f09SDavid van Moolenbroek 
70*00b67f09SDavid van Moolenbroek static
71*00b67f09SDavid van Moolenbroek atf_error_t
append_arg2(const char * flag,const char * arg,atf_list_t * argv)72*00b67f09SDavid van Moolenbroek append_arg2(const char *flag, const char *arg, atf_list_t *argv)
73*00b67f09SDavid van Moolenbroek {
74*00b67f09SDavid van Moolenbroek     atf_error_t err;
75*00b67f09SDavid van Moolenbroek 
76*00b67f09SDavid van Moolenbroek     err = append_arg1(flag, argv);
77*00b67f09SDavid van Moolenbroek     if (!atf_is_error(err))
78*00b67f09SDavid van Moolenbroek         err = append_arg1(arg, argv);
79*00b67f09SDavid van Moolenbroek 
80*00b67f09SDavid van Moolenbroek     return err;
81*00b67f09SDavid van Moolenbroek }
82*00b67f09SDavid van Moolenbroek 
83*00b67f09SDavid van Moolenbroek static
84*00b67f09SDavid van Moolenbroek atf_error_t
append_optargs(const char * const optargs[],atf_list_t * argv)85*00b67f09SDavid van Moolenbroek append_optargs(const char *const optargs[], atf_list_t *argv)
86*00b67f09SDavid van Moolenbroek {
87*00b67f09SDavid van Moolenbroek     atf_error_t err;
88*00b67f09SDavid van Moolenbroek 
89*00b67f09SDavid van Moolenbroek     err = atf_no_error();
90*00b67f09SDavid van Moolenbroek     while (*optargs != NULL && !atf_is_error(err)) {
91*00b67f09SDavid van Moolenbroek         err = append_arg1(strdup(*optargs), argv);
92*00b67f09SDavid van Moolenbroek         optargs++;
93*00b67f09SDavid van Moolenbroek     }
94*00b67f09SDavid van Moolenbroek 
95*00b67f09SDavid van Moolenbroek     return err;
96*00b67f09SDavid van Moolenbroek }
97*00b67f09SDavid van Moolenbroek 
98*00b67f09SDavid van Moolenbroek static
99*00b67f09SDavid van Moolenbroek atf_error_t
append_src_out(const char * src,const char * obj,atf_list_t * argv)100*00b67f09SDavid van Moolenbroek append_src_out(const char *src, const char *obj, atf_list_t *argv)
101*00b67f09SDavid van Moolenbroek {
102*00b67f09SDavid van Moolenbroek     atf_error_t err;
103*00b67f09SDavid van Moolenbroek 
104*00b67f09SDavid van Moolenbroek     err = append_arg2("-o", obj, argv);
105*00b67f09SDavid van Moolenbroek     if (atf_is_error(err))
106*00b67f09SDavid van Moolenbroek         goto out;
107*00b67f09SDavid van Moolenbroek 
108*00b67f09SDavid van Moolenbroek     err = append_arg1("-c", argv);
109*00b67f09SDavid van Moolenbroek     if (atf_is_error(err))
110*00b67f09SDavid van Moolenbroek         goto out;
111*00b67f09SDavid van Moolenbroek 
112*00b67f09SDavid van Moolenbroek     err = append_arg1(src, argv);
113*00b67f09SDavid van Moolenbroek 
114*00b67f09SDavid van Moolenbroek out:
115*00b67f09SDavid van Moolenbroek     return err;
116*00b67f09SDavid van Moolenbroek }
117*00b67f09SDavid van Moolenbroek 
118*00b67f09SDavid van Moolenbroek static
119*00b67f09SDavid van Moolenbroek atf_error_t
list_to_array(const atf_list_t * l,char *** ap)120*00b67f09SDavid van Moolenbroek list_to_array(const atf_list_t *l, char ***ap)
121*00b67f09SDavid van Moolenbroek {
122*00b67f09SDavid van Moolenbroek     atf_error_t err;
123*00b67f09SDavid van Moolenbroek     char **a;
124*00b67f09SDavid van Moolenbroek 
125*00b67f09SDavid van Moolenbroek     a = (char **)malloc((atf_list_size(l) + 1) * sizeof(char *));
126*00b67f09SDavid van Moolenbroek     if (a == NULL)
127*00b67f09SDavid van Moolenbroek         err = atf_no_memory_error();
128*00b67f09SDavid van Moolenbroek     else {
129*00b67f09SDavid van Moolenbroek         char **aiter;
130*00b67f09SDavid van Moolenbroek         atf_list_citer_t liter;
131*00b67f09SDavid van Moolenbroek 
132*00b67f09SDavid van Moolenbroek         aiter = a;
133*00b67f09SDavid van Moolenbroek         atf_list_for_each_c(liter, l) {
134*00b67f09SDavid van Moolenbroek             *aiter = strdup((const char *)atf_list_citer_data(liter));
135*00b67f09SDavid van Moolenbroek             aiter++;
136*00b67f09SDavid van Moolenbroek         }
137*00b67f09SDavid van Moolenbroek         *aiter = NULL;
138*00b67f09SDavid van Moolenbroek 
139*00b67f09SDavid van Moolenbroek         err = atf_no_error();
140*00b67f09SDavid van Moolenbroek     }
141*00b67f09SDavid van Moolenbroek     *ap = a; /* Shut up warnings in the caller about uninitialized *ap. */
142*00b67f09SDavid van Moolenbroek 
143*00b67f09SDavid van Moolenbroek     return err;
144*00b67f09SDavid van Moolenbroek }
145*00b67f09SDavid van Moolenbroek 
146*00b67f09SDavid van Moolenbroek /* ---------------------------------------------------------------------
147*00b67f09SDavid van Moolenbroek  * Free functions.
148*00b67f09SDavid van Moolenbroek  * --------------------------------------------------------------------- */
149*00b67f09SDavid van Moolenbroek 
150*00b67f09SDavid van Moolenbroek atf_error_t
atf_build_c_o(const char * sfile,const char * ofile,const char * const optargs[],char *** argv)151*00b67f09SDavid van Moolenbroek atf_build_c_o(const char *sfile,
152*00b67f09SDavid van Moolenbroek               const char *ofile,
153*00b67f09SDavid van Moolenbroek               const char *const optargs[],
154*00b67f09SDavid van Moolenbroek               char ***argv)
155*00b67f09SDavid van Moolenbroek {
156*00b67f09SDavid van Moolenbroek     atf_error_t err;
157*00b67f09SDavid van Moolenbroek     atf_list_t argv_list;
158*00b67f09SDavid van Moolenbroek 
159*00b67f09SDavid van Moolenbroek     err = atf_list_init(&argv_list);
160*00b67f09SDavid van Moolenbroek     if (atf_is_error(err))
161*00b67f09SDavid van Moolenbroek         goto out;
162*00b67f09SDavid van Moolenbroek 
163*00b67f09SDavid van Moolenbroek     err = append_config_var("atf_build_cc", &argv_list);
164*00b67f09SDavid van Moolenbroek     if (atf_is_error(err))
165*00b67f09SDavid van Moolenbroek         goto out_list;
166*00b67f09SDavid van Moolenbroek 
167*00b67f09SDavid van Moolenbroek     err = append_config_var("atf_build_cppflags", &argv_list);
168*00b67f09SDavid van Moolenbroek     if (atf_is_error(err))
169*00b67f09SDavid van Moolenbroek         goto out_list;
170*00b67f09SDavid van Moolenbroek 
171*00b67f09SDavid van Moolenbroek     err = append_config_var("atf_build_cflags", &argv_list);
172*00b67f09SDavid van Moolenbroek     if (atf_is_error(err))
173*00b67f09SDavid van Moolenbroek         goto out_list;
174*00b67f09SDavid van Moolenbroek 
175*00b67f09SDavid van Moolenbroek     if (optargs != NULL) {
176*00b67f09SDavid van Moolenbroek         err = append_optargs(optargs, &argv_list);
177*00b67f09SDavid van Moolenbroek         if (atf_is_error(err))
178*00b67f09SDavid van Moolenbroek             goto out_list;
179*00b67f09SDavid van Moolenbroek     }
180*00b67f09SDavid van Moolenbroek 
181*00b67f09SDavid van Moolenbroek     err = append_src_out(sfile, ofile, &argv_list);
182*00b67f09SDavid van Moolenbroek     if (atf_is_error(err))
183*00b67f09SDavid van Moolenbroek         goto out_list;
184*00b67f09SDavid van Moolenbroek 
185*00b67f09SDavid van Moolenbroek     err = list_to_array(&argv_list, argv);
186*00b67f09SDavid van Moolenbroek     if (atf_is_error(err))
187*00b67f09SDavid van Moolenbroek         goto out_list;
188*00b67f09SDavid van Moolenbroek 
189*00b67f09SDavid van Moolenbroek out_list:
190*00b67f09SDavid van Moolenbroek     atf_list_fini(&argv_list);
191*00b67f09SDavid van Moolenbroek out:
192*00b67f09SDavid van Moolenbroek     return err;
193*00b67f09SDavid van Moolenbroek }
194*00b67f09SDavid van Moolenbroek 
195*00b67f09SDavid van Moolenbroek atf_error_t
atf_build_cpp(const char * sfile,const char * ofile,const char * const optargs[],char *** argv)196*00b67f09SDavid van Moolenbroek atf_build_cpp(const char *sfile,
197*00b67f09SDavid van Moolenbroek               const char *ofile,
198*00b67f09SDavid van Moolenbroek               const char *const optargs[],
199*00b67f09SDavid van Moolenbroek               char ***argv)
200*00b67f09SDavid van Moolenbroek {
201*00b67f09SDavid van Moolenbroek     atf_error_t err;
202*00b67f09SDavid van Moolenbroek     atf_list_t argv_list;
203*00b67f09SDavid van Moolenbroek 
204*00b67f09SDavid van Moolenbroek     err = atf_list_init(&argv_list);
205*00b67f09SDavid van Moolenbroek     if (atf_is_error(err))
206*00b67f09SDavid van Moolenbroek         goto out;
207*00b67f09SDavid van Moolenbroek 
208*00b67f09SDavid van Moolenbroek     err = append_config_var("atf_build_cpp", &argv_list);
209*00b67f09SDavid van Moolenbroek     if (atf_is_error(err))
210*00b67f09SDavid van Moolenbroek         goto out_list;
211*00b67f09SDavid van Moolenbroek 
212*00b67f09SDavid van Moolenbroek     err = append_config_var("atf_build_cppflags", &argv_list);
213*00b67f09SDavid van Moolenbroek     if (atf_is_error(err))
214*00b67f09SDavid van Moolenbroek         goto out_list;
215*00b67f09SDavid van Moolenbroek 
216*00b67f09SDavid van Moolenbroek     if (optargs != NULL) {
217*00b67f09SDavid van Moolenbroek         err = append_optargs(optargs, &argv_list);
218*00b67f09SDavid van Moolenbroek         if (atf_is_error(err))
219*00b67f09SDavid van Moolenbroek             goto out_list;
220*00b67f09SDavid van Moolenbroek     }
221*00b67f09SDavid van Moolenbroek 
222*00b67f09SDavid van Moolenbroek     err = append_arg2("-o", ofile, &argv_list);
223*00b67f09SDavid van Moolenbroek     if (atf_is_error(err))
224*00b67f09SDavid van Moolenbroek         goto out_list;
225*00b67f09SDavid van Moolenbroek 
226*00b67f09SDavid van Moolenbroek     err = append_arg1(sfile, &argv_list);
227*00b67f09SDavid van Moolenbroek     if (atf_is_error(err))
228*00b67f09SDavid van Moolenbroek         goto out_list;
229*00b67f09SDavid van Moolenbroek 
230*00b67f09SDavid van Moolenbroek     err = list_to_array(&argv_list, argv);
231*00b67f09SDavid van Moolenbroek     if (atf_is_error(err))
232*00b67f09SDavid van Moolenbroek         goto out_list;
233*00b67f09SDavid van Moolenbroek 
234*00b67f09SDavid van Moolenbroek out_list:
235*00b67f09SDavid van Moolenbroek     atf_list_fini(&argv_list);
236*00b67f09SDavid van Moolenbroek out:
237*00b67f09SDavid van Moolenbroek     return err;
238*00b67f09SDavid van Moolenbroek }
239*00b67f09SDavid van Moolenbroek 
240*00b67f09SDavid van Moolenbroek atf_error_t
atf_build_cxx_o(const char * sfile,const char * ofile,const char * const optargs[],char *** argv)241*00b67f09SDavid van Moolenbroek atf_build_cxx_o(const char *sfile,
242*00b67f09SDavid van Moolenbroek                 const char *ofile,
243*00b67f09SDavid van Moolenbroek                 const char *const optargs[],
244*00b67f09SDavid van Moolenbroek                 char ***argv)
245*00b67f09SDavid van Moolenbroek {
246*00b67f09SDavid van Moolenbroek     atf_error_t err;
247*00b67f09SDavid van Moolenbroek     atf_list_t argv_list;
248*00b67f09SDavid van Moolenbroek 
249*00b67f09SDavid van Moolenbroek     err = atf_list_init(&argv_list);
250*00b67f09SDavid van Moolenbroek     if (atf_is_error(err))
251*00b67f09SDavid van Moolenbroek         goto out;
252*00b67f09SDavid van Moolenbroek 
253*00b67f09SDavid van Moolenbroek     err = append_config_var("atf_build_cxx", &argv_list);
254*00b67f09SDavid van Moolenbroek     if (atf_is_error(err))
255*00b67f09SDavid van Moolenbroek         goto out_list;
256*00b67f09SDavid van Moolenbroek 
257*00b67f09SDavid van Moolenbroek     err = append_config_var("atf_build_cppflags", &argv_list);
258*00b67f09SDavid van Moolenbroek     if (atf_is_error(err))
259*00b67f09SDavid van Moolenbroek         goto out_list;
260*00b67f09SDavid van Moolenbroek 
261*00b67f09SDavid van Moolenbroek     err = append_config_var("atf_build_cxxflags", &argv_list);
262*00b67f09SDavid van Moolenbroek     if (atf_is_error(err))
263*00b67f09SDavid van Moolenbroek         goto out_list;
264*00b67f09SDavid van Moolenbroek 
265*00b67f09SDavid van Moolenbroek     if (optargs != NULL) {
266*00b67f09SDavid van Moolenbroek         err = append_optargs(optargs, &argv_list);
267*00b67f09SDavid van Moolenbroek         if (atf_is_error(err))
268*00b67f09SDavid van Moolenbroek             goto out_list;
269*00b67f09SDavid van Moolenbroek     }
270*00b67f09SDavid van Moolenbroek 
271*00b67f09SDavid van Moolenbroek     err = append_src_out(sfile, ofile, &argv_list);
272*00b67f09SDavid van Moolenbroek     if (atf_is_error(err))
273*00b67f09SDavid van Moolenbroek         goto out_list;
274*00b67f09SDavid van Moolenbroek 
275*00b67f09SDavid van Moolenbroek     err = list_to_array(&argv_list, argv);
276*00b67f09SDavid van Moolenbroek     if (atf_is_error(err))
277*00b67f09SDavid van Moolenbroek         goto out_list;
278*00b67f09SDavid van Moolenbroek 
279*00b67f09SDavid van Moolenbroek out_list:
280*00b67f09SDavid van Moolenbroek     atf_list_fini(&argv_list);
281*00b67f09SDavid van Moolenbroek out:
282*00b67f09SDavid van Moolenbroek     return err;
283*00b67f09SDavid van Moolenbroek }
284