#!/usr/bin/env perl use strict; use warnings; use FindBin; use Cwd 'getcwd'; use File::Path 'rmtree'; my ($cc,$cflags,$asm,$ld,$ldflags,$libgcc,$cmake,$kernel_cflags,$kernel_ld_flags,$kernel_ld_command, $initcode_cflags, $initcode_ld_command); my $curdir = getcwd; if (@ARGV) { if ($ARGV[0] =~ /--delete/) { my @current_dir_file = glob "*"; map { print "$_\n";} @current_dir_file; print "delete all files? > [y/n]\n"; my $ans = ; if ($ans =~ /y/) { print "delete ...\n"; map { rmtree $_ } @current_dir_file; } } } $cmake = 'cmake'; my @cmake_arg = (); my $xv6_src_dir = $FindBin::Bin; $xv6_src_dir =~ s|(.*)/gearsTools(.*)|$1|; if ($^O =~ /darwin/){ $cc = "$ENV{CBC_LANG_COMPILER}-7.0"; $asm = "$ENV{CBC_LANG_COMPILER}-7.0"; $cflags = qq|-Wall -g --target=armv6-linux-gnueabihf -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -DCBCXV6=1 -g -O0 -nodefaultlibs -Wno-macro-redefined -Wno-gnu-designator -Wno-sometimes-uninitialized -Wno-tautological-compare -Wno-nullability-completeness -Wno-expansion-to-defined |; $cflags .= ' -B' . $ENV{HOME} .'/workspace/cr/arm_library/usr/lib/gcc/arm-linux-gnueabihf/6.3.0'; $cflags .= ' --gcc-toolchain=arm-linux-gnueabihf-raspbian'; #$ld = '/Users/anatofuz/workspace/compiler/llvm/llvm-project/build/bin/lld'; #$ld = '/Users/anatofuz/workspace/compiler/llvm/llvm-project/build/bin/ld.lld'; $ld = '/usr/local/linaro/arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-ld'; #$libgcc = '/Users/anatofuz/workspace/cr/arm_library/usr/lib/gcc/arm-linux-gnueabihf/6.3.0/libgcc.a'; $libgcc = '/usr/local/lib/gcc/arm-none-eabi/7.3.1/libgcc.a'; #chomp($libgcc = `$cc --print-libgcc-file-name`); $ldflags = " -L. -T kernel-cmake.ld"; $kernel_cflags = '--target=armv6-linux-gnueabihf -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -Werror -g -O0 -iquote ../ -c'; # -DX_CMAKE_C_LINK_EXECUTABLE=\"$ld $ldflags -o kernel.elf $libgcc -b binary initcode usr/fs.img\" $kernel_ld_flags = ' -L. -N -e main -Ttext 0 -o -L ../ ' . $libgcc; #$kernel_ld_flags = ' -L. -N -e main -Ttext 0 -o ' ; $kernel_ld_command = "$ld $kernel_ld_flags"; $initcode_cflags = '--target=armv6-linux-gnueabihf -nostdinc -c'; $initcode_ld_command = "$ld -L. -N -e start -Ttext 0 -o "; my $arm_library = '/Users/anatofuz/workspace/cr/arm_library'; push(@cmake_arg, "-DCBC_XV6_SYSROOT=\"$arm_library\"", # "-DCMAKE_OSX_SYSROOT=\"$arm_library\"", #"-DCMAKE_AR=\"/Users/anatofuz/workspace/compiler/llvm/llvm-project/build/bin/llvm-ar\"", #"-DCMAKE_RANLIB=\"/Users/anatofuz/workspace/compiler/llvm/llvm-project/build/bin/llvm-ar\"", "-DCMAKE_AR=\"/usr/local/linaro/arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-ar\"", "-DCMAKE_RANLIB=\"/usr/local/linaro/arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-ranlib\"", # "-DCMAKE_OSX_XV6_INCLUDE_DIR=\"$arm_library/usr/include\"", ); } else { $cc = '/mnt/dalmore-home/one/src/armgcc/cross/bin/arm-none-eabi-gcc'; $asm = $cc; $cflags = qq|-B/mnt/dalmore-home/one/src/armgcc/cross/bin/arm-none-eabi- -DCBCXV6=1 -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -g -O0|; $ld = '/mnt/dalmore-home/one/src/armgcc/cross/bin/arm-none-eabi-ld'; chomp($libgcc = `$cc --print-libgcc-file-name`); $cmake .= 3; $ldflags = " -L. -T kernel-cmake.ld"; $kernel_cflags = '-march=armv6 -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -Werror -g -O0 -iquote ../ -c'; # -DX_CMAKE_C_LINK_EXECUTABLE=\"$ld $ldflags -o kernel.elf $libgcc -b binary initcode usr/fs.img\" $kernel_ld_flags = ' -L. -N -e main -Ttext 0 -o -L ../ /mnt/dalmore-home/one/src/gcc-arm-none-eabi-6-2017-q2-update/bin/../lib/gcc/arm-none-eabi/6.3.1/libgcc.a'; $kernel_ld_command = "$ld $kernel_ld_flags"; $initcode_cflags = '-march=armv6 -nostdinc -c'; $initcode_ld_command = "$ld -L. -N -e start -Ttext 0 -o "; $cflags =~ s/\n//g; } push(@cmake_arg, "-DCBC_COM=$cc", "-DPMAKE_ARGS=\"$cflags\"", "-DCBC_ASM_COMPILER=$cc", "-DX_CMAKE_LINKER=$ld", "-DX_CMAKE_C_LINK_EXECUTABLE=\"$ld $ldflags -o kernel.elf $libgcc -b binary initcode fs.img\"", "-DKERNEL_LINK_EXECUTABLE=\"$kernel_ld_command\"", "-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=TRUE", "-DINITOCDE_CFLAGS=\"$initcode_cflags\"", "-DINITOCDE_LINK_EXECUTABLE=\"$initcode_ld_command\"", "-S $xv6_src_dir", $curdir); unshift(@cmake_arg, $cmake); create_link_script(); print_exec_system(@cmake_arg); system("make"); #system("sh","link.sh"); sub create_link_script { my @link_script; while (my $line = ){ $line =~ s/LD/$ld/; $line =~ s/LIBGCC/$libgcc/; push @link_script,$line; } if ($^O =~ /darwin/){ for (@link_script){ s/CMakeFiles/build/; s|kernel\.dir/||; } } open my $fh, '>', 'link.sh'; print $fh "@link_script"; } sub print_exec_system { my @query = @_; print(join(' ',@query), "\n"); system(join(' ',@query)); } __DATA__ cp initcode ./CMakeFiles/kernel.dir/initcode cp fs.img ./CMakeFiles/kernel.dir/fs.img LD \ -L. \ -T \ kernel-cmake.ld \ -o \ kernel.elf \ \ CMakeFiles/kernel.dir/lib/string.c.o \ CMakeFiles/kernel.dir/arm.c.o \ CMakeFiles/kernel.dir/asm.S.o \ CMakeFiles/kernel.dir/bio.c.o \ CMakeFiles/kernel.dir/buddy.c.o \ CMakeFiles/kernel.dir/c/console.c.o \ CMakeFiles/kernel.dir/exec.c.o \ CMakeFiles/kernel.dir/c/file.c.o \ CMakeFiles/kernel.dir/fs.c.o \ CMakeFiles/kernel.dir/log.c.o \ CMakeFiles/kernel.dir/main.c.o \ CMakeFiles/kernel.dir/memide.c.o \ CMakeFiles/kernel.dir/c/pipe.c.o \ CMakeFiles/kernel.dir/c/proc.c.o \ CMakeFiles/kernel.dir/c/spinlock.c.o \ CMakeFiles/kernel.dir/start.c.o \ CMakeFiles/kernel.dir/swtch.S.o \ CMakeFiles/kernel.dir/c/syscall.c.o \ CMakeFiles/kernel.dir/c/sysfile.c.o \ CMakeFiles/kernel.dir/sysproc.c.o \ CMakeFiles/kernel.dir/trap_asm.S.o \ CMakeFiles/kernel.dir/trap.c.o \ CMakeFiles/kernel.dir/vm.c.o \ CMakeFiles/kernel.dir/device/picirq.c.o \ CMakeFiles/kernel.dir/device/timer.c.o \ CMakeFiles/kernel.dir/device/uart.c.o \ CMakeFiles/kernel.dir/entry.S.o \ CMakeFiles/kernel.dir/c/kernel-context.c.o \ \ \ LIBGCC \ \ -b \ binary \ initcode \ fs.img