1919#include "../src/carbon_crypto.c"
2020#include "../src/carbon_hashmap.c"
2121
22- #define HDRFILE "carbon.h"
23- #define SRCDIR "src"
24- #define TESTDIR "src_test"
25- #define TESTBIN "./" TESTDIR "/test"
26- #define WORKDIR "carbon-" CARBON_VERSION_RAW "-" CARBON_TARGET_OS "-" CARBON_CPU_ARCH
22+ #define HDR_FILE "carbon.h"
23+ #define HDR_FILE_TPL HDR_FILE ".in"
24+ #define LICENSE_FILE "LICENSE"
25+ #define SRC_DIR "src"
26+ #define TEST_DIR "src_test"
27+ #define TEST_BIN "./" TEST_DIR "/test"
28+ #define EXAMPLES_DIR "examples"
29+ #define BUILD_DIR "carbon-" CARBON_VERSION_RAW "-" CARBON_TARGET_OS "-" CARBON_CPU_ARCH
2730
2831#define C_STD "-std=c11"
2932#define CXX_STD "-std=c++20"
@@ -159,71 +162,74 @@ static void bootstrap(char * const *host_argv, u8 force) {
159162}
160163
161164static void clean (void ) {
162- rm_dash_r (HDRFILE );
163- rm_dash_r (TESTBIN );
164- rm_dash_r (TESTBIN ".exe" );
165- rm_dash_r (TESTDIR "/*.o" );
166- rm_dash_r ("examples/*.exe" );
167- rm_dash_r ("examples/*.bin" );
168- rm_dash_r ("examples/*.bin.old" );
169- rm_dash_r ("examples/*.png" );
170- rm_dash_r ("examples/*.skap*" );
171- rm_dash_r ("examples/*.dSYM" );
172- rm_dash_r (WORKDIR );
173- rm_dash_r (WORKDIR ".tgz" );
165+ rm_dash_r (HDR_FILE );
166+ rm_dash_r (TEST_BIN );
167+ rm_dash_r (TEST_BIN ".exe" );
168+ rm_dash_r (TEST_DIR "/*.o" );
169+ rm_dash_r (EXAMPLES_DIR "/*.exe" );
170+ rm_dash_r (EXAMPLES_DIR "/*.bin" );
171+ rm_dash_r (EXAMPLES_DIR "/*.bin.old" );
172+ rm_dash_r (EXAMPLES_DIR "/*.png" );
173+ rm_dash_r (EXAMPLES_DIR "/*.skap*" );
174+ rm_dash_r (EXAMPLES_DIR "/*.inl" );
175+ rm_dash_r (EXAMPLES_DIR "/*.dSYM" );
176+ rm_dash_r (BUILD_DIR );
177+ rm_dash_r (BUILD_DIR ".tgz" );
174178}
175179
176180static void hdrgen (void ) {
177- carbon_println (" GEN " HDRFILE );
181+ carbon_println (" GEN " HDR_FILE );
178182 CBN_StrBuilder hdr = {0 };
179- CBN_ASSERT (carbon_fs_read_entire_file (& hdr , HDRFILE ".in" ));
183+ CBN_ASSERT (carbon_fs_read_entire_file (& hdr , HDR_FILE_TPL ));
180184 CBN_StrList hdrs = carbon_strlist_create (true);
181185 CBN_StrBuilder inc = {0 };
182- CBN_ASSERT (carbon_fs_read_entire_file (& inc , SRCDIR "/carbon.inc" ));
186+ CBN_ASSERT (carbon_fs_read_entire_file (& inc , SRC_DIR "/carbon.inc" ));
183187 CBN_StrView inc_sv = carbon_strview_from_strbuilder (& inc );
184188 while (inc_sv .size ) {
185189 CBN_StrView line = carbon_strview_chop (& inc_sv , '\n' );
186190 if (!carbon_strview_starts_with (line , carbon_strview_from_cstr ("#include" )) ||
187- carbon_strview_are_equal (line , carbon_strview_from_cstr ("#include \"../" HDRFILE ".in \"" ))) continue ;
191+ carbon_strview_are_equal (line , carbon_strview_from_cstr ("#include \"../" HDR_FILE_TPL " \"" ))) continue ;
188192 char * line_str = carbon_strview_to_cstr (line );
189193 carbon_string_strip_substr (line_str , "#include \"" );
190194 carbon_string_strip_substr (line_str , "\"" );
191- carbon_strlist_push (& hdrs , carbon_string_fmt (SRCDIR "/%s" , line_str ));
195+ carbon_strlist_push (& hdrs , carbon_string_fmt (SRC_DIR "/%s" , line_str ));
192196 }
193197 carbon_strlist_foreach (hdrs ) {
194198 carbon_strbuilder_add_cstr (& hdr , "\n" );
195199 CBN_ASSERT (carbon_fs_read_entire_file (& hdr , carbon_strview_to_cstr (it .sv )));
196200 }
197201 carbon_strbuilder_add_cstr (& hdr , "\n" );
198- CBN_ASSERT (carbon_fs_read_entire_file (& hdr , SRCDIR "/carbon_aliases.h" ));
199- FILE * hdr_fd = fopen (HDRFILE , "w" );
200- fwrite (hdr .items , hdr .size , 1 , hdr_fd );
201- fclose (hdr_fd );
202+ CBN_ASSERT (carbon_fs_read_entire_file (& hdr , SRC_DIR "/carbon_aliases.h" ));
203+ {// TODO: replace this with smth like `carbon_strbuilder_save_to_file(hdr, HDR_FILE);`.
204+ FILE * fd = fopen (HDR_FILE , "w" );
205+ fwrite (hdr .items , hdr .size , 1 , fd );
206+ fclose (fd );
207+ }
202208 carbon_strlist_destroy (& hdrs );
203209 carbon_strbuilder_free (& hdr );
204210}
205211
206212static void build_compile_c_files (void ) {
207213 CBN_StrBuilder cmd = {0 };
208- CBN_PatternMatchedFiles files = carbon_fs_pattern_match (SRCDIR "/carbon_*.c" );
214+ CBN_PatternMatchedFiles files = carbon_fs_pattern_match (SRC_DIR "/carbon_*.c" );
209215 carbon_fs_pattern_match_foreach (files ) {
210216 carbon_println (" CC %s" , it .f );
211217 carbon_strbuilder_add_cstr (& cmd , CARBON_C_COMPILER " -I . " C_STD " " WARNS " -fPIC " OPTIMIZATIONS );
212- carbon_string_strip_substr (it .f , SRCDIR "/" );
213- carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt (" -c " SRCDIR "/%s -o " WORKDIR "/%s.o" , it .f , it .f ));
218+ carbon_string_strip_substr (it .f , SRC_DIR "/" );
219+ carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt (" -c " SRC_DIR "/%s -o " BUILD_DIR "/%s.o" , it .f , it .f ));
214220 call_cmd (carbon_strview_to_cstr (carbon_strview_from_strbuilder (& cmd )));
215221 carbon_strbuilder_free (& cmd );
216222 }
217223}
218224
219225static void build_compile_cxx_files (void ) {
220226 CBN_StrBuilder cmd = {0 };
221- CBN_PatternMatchedFiles files = carbon_fs_pattern_match (SRCDIR "/carbon_*.cc" );
227+ CBN_PatternMatchedFiles files = carbon_fs_pattern_match (SRC_DIR "/carbon_*.cc" );
222228 carbon_fs_pattern_match_foreach (files ) {
223229 carbon_println (" CXX %s" , it .f );
224230 carbon_strbuilder_add_cstr (& cmd , CARBON_CXX_COMPILER " -I . " CXX_STD " " WARNS " -fPIC " OPTIMIZATIONS );
225- carbon_string_strip_substr (it .f , SRCDIR "/" );
226- carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt (" -c " SRCDIR "/%s -o " WORKDIR "/%s.o" , it .f , it .f ));
231+ carbon_string_strip_substr (it .f , SRC_DIR "/" );
232+ carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt (" -c " SRC_DIR "/%s -o " BUILD_DIR "/%s.o" , it .f , it .f ));
227233 call_cmd (carbon_strview_to_cstr (carbon_strview_from_strbuilder (& cmd )));
228234 carbon_strbuilder_free (& cmd );
229235 }
@@ -232,13 +238,13 @@ static void build_compile_cxx_files(void) {
232238static void build_static_lib (void ) {
233239 carbon_println (" AR libcarbon.a" );
234240#ifndef _WIN32
235- call_cmd ("ar -rcs " WORKDIR "/libcarbon.a " WORKDIR "/*.o" );
241+ call_cmd ("ar -rcs " BUILD_DIR "/libcarbon.a " BUILD_DIR "/*.o" );
236242#else
237243 CBN_StrBuilder cmd = {0 };
238- carbon_strbuilder_add_cstr (& cmd , "ar -rcs " WORKDIR "/libcarbon.a " );
239- CBN_PatternMatchedFiles o_files = carbon_fs_pattern_match (WORKDIR "/*.o" );
244+ carbon_strbuilder_add_cstr (& cmd , "ar -rcs " BUILD_DIR "/libcarbon.a " );
245+ CBN_PatternMatchedFiles o_files = carbon_fs_pattern_match (BUILD_DIR "/*.o" );
240246 carbon_fs_pattern_match_foreach (o_files ) {
241- carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt (WORKDIR "/%s " , it .f ));
247+ carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt (BUILD_DIR "/%s " , it .f ));
242248 }
243249 call_cmd (carbon_strview_to_cstr (carbon_strview_from_strbuilder (& cmd )));
244250 carbon_strbuilder_free (& cmd );
@@ -250,72 +256,72 @@ static void build_shared_lib(void) {
250256 carbon_println (" LD " SHARED_LIB_FILE );
251257 carbon_strbuilder_add_cstr (& cmd , CARBON_CXX_COMPILER " " OPTIMIZATIONS );
252258#ifndef _WIN32
253- carbon_strbuilder_add_cstr (& cmd , WORKDIR "/*.o -shared " );
259+ carbon_strbuilder_add_cstr (& cmd , BUILD_DIR "/*.o -shared " );
254260#else
255- CBN_PatternMatchedFiles o_files = carbon_fs_pattern_match (WORKDIR "/*.o" );
261+ CBN_PatternMatchedFiles o_files = carbon_fs_pattern_match (BUILD_DIR "/*.o" );
256262 carbon_fs_pattern_match_foreach (o_files ) {
257- carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt (WORKDIR "/%s " , it .f ));
263+ carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt (BUILD_DIR "/%s " , it .f ));
258264 }
259265 carbon_strbuilder_add_cstr (& cmd , "-shared " );
260266#endif
261267 carbon_strbuilder_add_cstr (& cmd , LIBS );
262- carbon_strbuilder_add_cstr (& cmd , "-o " WORKDIR "/" SHARED_LIB_FILE );
268+ carbon_strbuilder_add_cstr (& cmd , "-o " BUILD_DIR "/" SHARED_LIB_FILE );
263269 call_cmd (carbon_strview_to_cstr (carbon_strview_from_strbuilder (& cmd )));
264270 carbon_strbuilder_free (& cmd );
265271}
266272
267273static void build (void ) {
268274 CBN_INFO ("Building..." );
269- carbon_println (" MKDIR " WORKDIR );
270- if (!carbon_fs_create_directory (WORKDIR )) CARBON_UNREACHABLE ;
275+ carbon_println (" MKDIR " BUILD_DIR );
276+ if (!carbon_fs_create_directory (BUILD_DIR )) CARBON_UNREACHABLE ;
271277 build_compile_c_files ();
272278 build_compile_cxx_files ();
273279 build_static_lib ();
274280 build_shared_lib ();
275281#ifndef _WIN32
276282 // TODO: make this work on Windows (MinGW)...
277- rm_dash_r (WORKDIR "/*.o" );
283+ rm_dash_r (BUILD_DIR "/*.o" );
278284#endif
279285}
280286
281287static void test_compile_c_files (void ) {
282288 CBN_StrBuilder cmd = {0 };
283- CBN_PatternMatchedFiles files = carbon_fs_pattern_match (TESTDIR "/*.c" );
289+ CBN_PatternMatchedFiles files = carbon_fs_pattern_match (TEST_DIR "/*.c" );
284290 carbon_fs_pattern_match_foreach (files ) {
285291 carbon_println (" CC %s" , it .f );
286292 carbon_strbuilder_add_cstr (& cmd , CARBON_C_COMPILER " -I . " C_STD " " WARNS " -fPIE " OPTIMIZATIONS );
287- carbon_string_strip_substr (it .f , TESTDIR "/" );
288- carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt ("-c " TESTDIR "/%s -o " TESTDIR "/%s.o" , it .f , it .f ));
293+ carbon_string_strip_substr (it .f , TEST_DIR "/" );
294+ carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt ("-c " TEST_DIR "/%s -o " TEST_DIR "/%s.o" , it .f , it .f ));
289295 call_cmd (carbon_strview_to_cstr (carbon_strview_from_strbuilder (& cmd )));
290296 carbon_strbuilder_free (& cmd );
291297 }
292298}
293299
294300static void test_compile_cxx_files (void ) {
295301 CBN_StrBuilder cmd = {0 };
296- CBN_PatternMatchedFiles files = carbon_fs_pattern_match (TESTDIR "/*.cc" );
302+ CBN_PatternMatchedFiles files = carbon_fs_pattern_match (TEST_DIR "/*.cc" );
297303 carbon_fs_pattern_match_foreach (files ) {
298304 carbon_println (" CXX %s" , it .f );
299305 carbon_strbuilder_add_cstr (& cmd , CARBON_CXX_COMPILER " -I . " CXX_STD " " WARNS " -fPIE " OPTIMIZATIONS );
300- carbon_string_strip_substr (it .f , TESTDIR "/" );
301- carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt ("-c " TESTDIR "/%s -o " TESTDIR "/%s.o" , it .f , it .f ));
306+ carbon_string_strip_substr (it .f , TEST_DIR "/" );
307+ carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt ("-c " TEST_DIR "/%s -o " TEST_DIR "/%s.o" , it .f , it .f ));
302308 call_cmd (carbon_strview_to_cstr (carbon_strview_from_strbuilder (& cmd )));
303309 carbon_strbuilder_free (& cmd );
304310 }
305311}
306312
307313static void test_link (void ) {
308314 CBN_StrBuilder cmd = {0 };
309- carbon_println (" LD " TESTBIN );
315+ carbon_println (" LD " TEST_BIN );
310316 carbon_strbuilder_add_cstr (& cmd , CARBON_CXX_COMPILER " " OPTIMIZATIONS );
311317#ifdef _WIN32
312- CBN_PatternMatchedFiles o_files = carbon_fs_pattern_match (TESTDIR "/*.o" );
318+ CBN_PatternMatchedFiles o_files = carbon_fs_pattern_match (TEST_DIR "/*.o" );
313319 carbon_fs_pattern_match_foreach (o_files ) {
314- carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt (TESTDIR "/%s " , it .f ));
320+ carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt (TEST_DIR "/%s " , it .f ));
315321 }
316- carbon_strbuilder_add_cstr (& cmd , WORKDIR "/libcarbon.a -static -o " TESTBIN );
322+ carbon_strbuilder_add_cstr (& cmd , BUILD_DIR "/libcarbon.a -static -o " TEST_BIN );
317323#else
318- carbon_strbuilder_add_cstr (& cmd , TESTDIR "/*.o " WORKDIR "/libcarbon.a -o " TESTBIN );
324+ carbon_strbuilder_add_cstr (& cmd , TEST_DIR "/*.o " BUILD_DIR "/libcarbon.a -o " TEST_BIN );
319325#endif
320326 call_cmd (carbon_strview_to_cstr (carbon_strview_from_strbuilder (& cmd )));
321327 carbon_strbuilder_free (& cmd );
@@ -328,27 +334,26 @@ static void test(void) {
328334 test_link ();
329335#ifndef _WIN32
330336 // TODO: make this work on Windows (MinGW)...
331- rm_dash_r (TESTDIR "/*.o" );
337+ rm_dash_r (TEST_DIR "/*.o" );
332338#endif
333- carbon_println ("+ " TESTBIN " -n" );
334- call_cmd (TESTBIN " -n" );
339+ carbon_println ("+ " TEST_BIN " -n" );
340+ call_cmd (TEST_BIN " -n" );
335341}
336342
337343static void examples_c_files (void ) {
338344 CBN_StrBuilder cmd = {0 };
339- CBN_PatternMatchedFiles files = carbon_fs_pattern_match ("examples /*.c" );
345+ CBN_PatternMatchedFiles files = carbon_fs_pattern_match (EXAMPLES_DIR " /*.c" );
340346 carbon_fs_pattern_match_foreach (files ) {
341347 carbon_println (" CCLD %s" , it .f );
342348 carbon_strbuilder_add_cstr (& cmd , CARBON_C_COMPILER " -I . " C_STD " " WARNS " -fPIE " OPTIMIZATIONS );
343- carbon_string_strip_substr (it .f , "examples/" );
344- carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt ("examples/%s " , it .f ));
349+ carbon_strbuilder_add_cstr (& cmd , it .f );
345350 carbon_string_strip_substr (it .f , ".c" );
346- carbon_strbuilder_add_cstr (& cmd , WORKDIR "/libcarbon.a " );
351+ carbon_strbuilder_add_cstr (& cmd , " " BUILD_DIR "/libcarbon.a " );
347352 carbon_strbuilder_add_cstr (& cmd , LIBS );
348353#ifdef _WIN32
349- carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt ("-o examples/ %s" , it .f ));
354+ carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt ("-o %s" , it .f ));
350355#else
351- carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt ("-o examples/ %s.bin" , it .f ));
356+ carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt ("-o %s.bin" , it .f ));
352357#endif
353358 call_cmd (carbon_strview_to_cstr (carbon_strview_from_strbuilder (& cmd )));
354359 carbon_strbuilder_free (& cmd );
@@ -357,19 +362,18 @@ static void examples_c_files(void) {
357362
358363static void examples_cxx_files (void ) {
359364 CBN_StrBuilder cmd = {0 };
360- CBN_PatternMatchedFiles files = carbon_fs_pattern_match ("examples /*.cc" );
365+ CBN_PatternMatchedFiles files = carbon_fs_pattern_match (EXAMPLES_DIR " /*.cc" );
361366 carbon_fs_pattern_match_foreach (files ) {
362367 carbon_println (" CXXLD %s" , it .f );
363368 carbon_strbuilder_add_cstr (& cmd , CARBON_CXX_COMPILER " -I . " CXX_STD " " WARNS " -fPIE " OPTIMIZATIONS );
364- carbon_string_strip_substr (it .f , "examples/" );
365- carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt ("examples/%s " , it .f ));
369+ carbon_strbuilder_add_cstr (& cmd , it .f );
366370 carbon_string_strip_substr (it .f , ".cc" );
367- carbon_strbuilder_add_cstr (& cmd , WORKDIR "/libcarbon.a " );
371+ carbon_strbuilder_add_cstr (& cmd , " " BUILD_DIR "/libcarbon.a " );
368372 carbon_strbuilder_add_cstr (& cmd , LIBS );
369373#ifdef _WIN32
370- carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt ("-o examples/ %s" , it .f ));
374+ carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt ("-o %s" , it .f ));
371375#else
372- carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt ("-o examples/ %s.bin" , it .f ));
376+ carbon_strbuilder_add_cstr (& cmd , carbon_string_fmt ("-o %s.bin" , it .f ));
373377#endif
374378 call_cmd (carbon_strview_to_cstr (carbon_strview_from_strbuilder (& cmd )));
375379 carbon_strbuilder_free (& cmd );
@@ -380,17 +384,21 @@ static void examples(void) {
380384 CBN_INFO ("Building examples..." );
381385 examples_c_files ();
382386 examples_cxx_files ();
383- const char * pong_skap = "examples/pong.skap" ;
384- CBN_INFO ("Creating `%$`..." , $ (pong_skap ));
385- CBN_ASSERT (carbon_skap_create ("examples/pong.d/assets.txt" , pong_skap ));
387+ {// Pong AssetPack
388+ const char * skap = EXAMPLES_DIR "/pong.skap" ;
389+ const char * decl = EXAMPLES_DIR "/pong.d/assets.txt" ;
390+ CBN_INFO ("Creating `%$`..." , $ (skap ));
391+ CBN_ASSERT (carbon_skap_create (decl , skap ));
392+ }
386393}
387394
388395static void package (void ) {
389396 CBN_INFO ("Packaging..." );
390- cp_dash_r ("COPYING " HDRFILE , WORKDIR );
391- carbon_println (" GZIP " WORKDIR ".tgz" );
392- call_cmd ("tar -zcf " WORKDIR ".tgz " WORKDIR );
393- CBN_INFO (WORKDIR ".tgz is ready" );
397+ cp_dash_r (HDR_FILE , BUILD_DIR );
398+ cp_dash_r (LICENSE_FILE , BUILD_DIR );
399+ carbon_println (" GZIP " BUILD_DIR ".tgz" );
400+ call_cmd ("tar -zcf " BUILD_DIR ".tgz " BUILD_DIR );
401+ CBN_INFO (BUILD_DIR ".tgz is ready" );
394402}
395403
396404int main (int argc , char * * argv ) {
0 commit comments