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