xref: /freebsd-src/contrib/atf/atf-c/build.c (revision 8f0ea33f2bbf3a6aa80235f0a02fa5f2780c2b17)
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