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