📄 genmake.pl
字号:
#!/usr/bin/perl#********************************************************#* Some code. Copyright (C) 2003 by Pascal Massimino. *#* All Rights Reserved. (http://skal.planet-d.net) *#* For Educational/Academic use ONLY. See 'LICENSE.TXT'.*#********************************************************######################################################## Makefile generator (=>./makefile.all)## This is a "script-velu-qui-fait-tout" (tm)## Not really finished (especially .dsp and .so stuff)#######################################################$root_dir = "..";$src_dir = "$root_dir/src";$inc_dir = "$root_dir/include";$config_file = "./PROJECT";$makefile = "./makefile.all";$doctxt = "../doc/files.txt";@Ex_Bin;@Ex_Src;@Ex_Dep;@Ex_Flag;@Ex_Type;@Shared_Bin;@Shared_Bin_So;@Shared_Src;@Shared_Flag;@Shared_Link;%Spc_Flags;@Libs_Flags;@Libs_so_link;%Libs_src_dirs;########################################### read config file ###########################################sub parse_example{ my $elm; push(@Ex_Bin, @_[0]); foreach $elm (split(' ', @_[1])) { push(@Ex_Src, $elm); } push( @Ex_Src,";"); foreach $elm (split(' ', @_[2])) { push(@Ex_Dep, $elm); } push( @Ex_Dep,";"); if (@_[3]) { foreach $elm (split(' ', @_[3])) { push( @Ex_Flag, "\$(DEF)$elm" ); } push( @Ex_Flag,";"); } push(@Ex_Type, @_[4]);}sub parse_shared # $name, $src, $flag, $deps{ my @a = split(' ', @_[0]); push(@Shared_Bin, @a[0]); push(@Shared_Bin_So, "@a[0].so"); my $elm; foreach $elm (split(' ', @_[1])) { push(@Shared_Src, $elm); } push( @Shared_Src,";"); foreach $elm (split(' ', @_[2])) { push(@Shared_Flag, "\$(DEF)$elm"); } push( @Shared_Flag,";"); foreach $elm (split(' ', @_[3])) { push(@Shared_Link, "$elm"); } push( @Shared_Link,";");}#########################################sub read_config_file { my $line; open(FILES,"$config_file") || die( "Can't open $config_file file.\n"); while($line=<FILES>) { chomp $line; my @lines = split( '#', $line); $line = $lines[0]; if (!$line) { next; } if (!split(' ', $line)) { next; } if ($line =~ /^\s*example\s+(\w+)\s*:\s*(\w*)\s*:\s*([\w\s]*)\s*:\s*(\w*)/) {# print "example = [$1][$2][$3][$4]\n"; parse_example($1, $2, $3, $4, 0); } elsif ($line =~ /^\s*util\s+(\w+)\s*:\s*([\w\s]*)\s*:\s*([\w\s]*)\s*:\s*(\w*)/) {# print "util = [$1][$2][$3][$4]\n"; parse_example($1, $2, $3, $4, 1); } elsif ($line =~ /^\s*shared\s+(\w+)\s*:\s*([\w\s\/\.]+)\s*:\s*(\w*)\s*:\s*([\w\s]*)/) { parse_shared($1, $2, $3, $4); } elsif ($line =~ /^\s*exclude\s+([\w\.]+)\s*/) { @Line = split( ' ', $1); @Exclude{@Line} = 1; } elsif ($line =~ /^\s*conditional\s+(\w+)\s*/) { @Line = split( ' ', $1); my $obj = @Line[0]; @Conditional_Flag{$obj} = @Line[1]; @Conditional_Value{$obj} = @Line[2]; } elsif ($line =~ /^\s*include\s+(\w+)\s*/) { @Line = split( ' ', $1); push(@include_dir,"$root_dir/@Line[0]"); } elsif ($line =~ /^\s*flag\s+([\w\.]+)\s+(\w*)/) { my $src = $1;# print "special flag '$2' for source '$src'.\n"; my $elm; foreach $elm (split( ' ',$2)) { @Spc_Flags{$src} .= "\$(DEF)$elm "; } } elsif ($line =~ /^\s*lib\s+(\w+)\s*:\s*(\w+)\s*:\s*([\w\s\/,\(\)\$]+)\s*:\s*(\w*)\s*:\s*([\w\s]*)/) {# print "lib = [$1][$2][$3][$4][$5]\n"; my @Line; @Line = split( ' ', $1); my $lib = $Line[0]; push(@libs, $lib); @Line = split( ' ', $2); @libs_label{$lib} = $Line[0]; @Line = split( ', ', $3 ); $line = join( ",", @Line ); my @List = split( ' ', $line ); @Libs_src_dirs{$lib} = $List[0]; while(@Line) { my @idir = split( ' ', @Line[0]); $idir[0] = "$src_dir/$idir[0]"; push(@include_dir, $idir[0]); shift @Line; } if ($4) { @Line = split( ' ', $4); @Libs_Flags{$lib} = $Line[0]; } if ($5) { @Libs_so_link{$lib} = $5; } } else { die( "unrecognized entry directive '$line'\n" ); } } close FILES;}########################################### generation of makefile ###########################################sub write_cpp_entry{ my $path = @_[0]; shift @_; my $src = @_[0]; shift @_; my $cpp = "$path$src.\$(CPP)"; my $obj = "\$(OBJ_OUTPUT_DIR)$src@_[0].\$(O)"; shift @_; print OUT "$obj: $cpp\n"; print OUT "\t\$(CC) \$(CC_FLAGS) $cpp \$(OUT) $obj"; while(@_[0]) { print OUT " @_[0]"; shift @_; } my $name = "$src.cpp"; if (@Spc_Flags{$name}) { print OUT " @Spc_Flags{$name}"; } print OUT "\n\n";}sub write_asm_entry{ my $path = @_[0]; shift @_; my $src = @_[0]; shift @_; my $asm = "$path$src.\$(ASM)"; my $obj = "\$(OBJ_OUTPUT_DIR)$src.\$(O)"; shift @_; print OUT "$obj: $asm\n"; print OUT "\t\$(NASM) \$(NASM_FLAGS) $asm -o $obj\n"; print OUT "\n\n";}#########################################sub write_cpp_so_entry{ my $src = @_[0]; shift @_; my @toto = split('/', $src); my $src2 = @toto[$toto-1]; my $cpp = "\$(LIB_SRC_DIR)$src.\$(CPP)"; my $obj = "\$(LIB_SO_OUTPUT_DIR)$src2@_[0].\$(O)"; shift @_; print OUT "$obj: $cpp\n"; print OUT "\t\$(CC) \$(CC_FLAGS) $cpp \$(OUT) $obj"; while(@_[0]) { print OUT " @_[0]"; shift @_; } my $name = "$src2.cpp"; if (@Spc_Flags{$name}) { print OUT " @Spc_Flags{$name}"; } print OUT "\n\n";}sub write_asm_so_entry{ my $src = @_[0]; shift @_; my @toto = split('/', $src); my $src2 = @toto[$toto-1]; my $asm = "\$(LIB_SRC_DIR)$src.\$(ASM)"; my $obj = "\$(LIB_SO_OUTPUT_DIR)$src2@_[0].\$(O)"; shift @_; print OUT "$obj: $asm\n"; print OUT "\t\$(NASM) \$(NASM_FLAGS) $asm \$(OUT) $obj\n";# while(@_) { print OUT " @_[0]"; shift @_; } print OUT "\n\n";}sub write_so_entry # $so_name, @Src, ";", @Links{ my $shared = @_[0]; shift @_; my @a = split( '/', $shared); $shared = @a[$a-1]; my @objs; my $i = 0; while(@_) { if (@_[0] eq ";") { shift @_; last; } @a = split( '/', @_[0]); my $src = @a[$a-1]; if ($src =~ /(\w+)\.asm$/ ) { push @objs, " \$(LIB_SO_OUTPUT_DIR)$1\_so.\$(O)"; } else { push @objs, " \$(LIB_SO_OUTPUT_DIR)$src\_so.\$(O)"; } $i++; if (($i&3)==3) { push @objs, "\\\n "; } shift @_; } print OUT "$shared.so: @objs\n"; print OUT "\t\$(LDSO) \$(OUT) \$(LIB_SO_OUTPUT_DIR)$shared.\$(SO) \\\n"; print OUT "\t @objs\\\n\t "; while(@_[0]) { my $link = @_[0]; print OUT "\$(LIBINC)$link "; shift @_; } print OUT "\\\n\t \$(LDSO_FLAGS)\n"; print OUT "\n\n";}sub is_excluded{ if (@Exclude{@_[0]}==1) { return 1; } return 0;}sub write_lib_entry # $dir, $lib, $Nb{ my $dir = @_[0]; my $lib = @_[1]; my $Nb = @_[2]; if (not -d "$dir") { die( "Directory $dir does not exist\n" ); } opendir (DIR, $dir) || die ("Cannot opendir $dir\n"); my @cpp_objs_cond; my @asm_objs_cond; while ($file=readdir(DIR)) { if ($file =~ /(\w+)\.cpp$/) { if (@Conditional_Flag{"$1.cpp"}) { push(@cpp_objs_cond, $1); next; } if (@Exclude{"$1.cpp"}==1) { print " excluding file '$1.cpp'\n"; next; } push(@cpp_objs,$1); } elsif ($file =~ /(\w+)\.asm$/) { if (@Conditional{"$1.asm"}) { my $flag = @Conditional_Flag{"$1.asm"}; my $val = @Conditional_Value{"$1.asm"}; push(@asm_objs_cond, $1); next; } if (@Exclude{"$1.asm"}==1) { print " excluding file '$1.asm'\n"; next; } push(@asm_objs,$1); } elsif ($file eq ".") { next; } elsif ($file eq "..") { next; } elsif ($file =~ /.+.h/) { next; } else { print " ignoring file '$file'\n"; } } closedir DIR; my $flag = @Libs_Flags{$lib}; if ($flag) { if ($flag =~ /!(\w+)/) { print OUT "ifndef $1\n\n"; } else { print OUT "ifdef $flag\n\n"; } } ##### regular cpp compilation ##### my $name_OBJ = "$lib\_OBJ$Nb"; print OUT "$name_OBJ = "; my @objs = @cpp_objs; while(@objs) { print OUT "\\\n"; print OUT " \$(OBJ_OUTPUT_DIR)@objs[0].\$(O)\t\t"; shift @objs; } print OUT "\n\n"; ##### conditional cpp compilation ##### while(@cpp_objs_cond) { my $obj = @cpp_objs_cond[0]; my $f = "$obj.cpp"; push(@cpp_objs, $obj); print OUT "ifeq (\$(@Conditional_Flag{$f}),@Conditional_Value{$f})\n"; print OUT "$name_OBJ += \$(OBJ_OUTPUT_DIR)$obj.\$(O)\n"; print OUT "endif\n"; shift @cpp_objs_cond; } print OUT "\n"; ##### regular asm compilation ##### my $name_ASM = "$lib\_OBJ_ASM$Nb"; print OUT "ifdef USE_ASM\n"; print OUT "$name_ASM = "; my @objs = @asm_objs; while(@objs) { print OUT "\\\n"; print OUT " \$(OBJ_OUTPUT_DIR)@objs[0].\$(O)\t\t"; shift @objs; } print OUT "\n"; ##### conditional asm compilation ##### while(@asm_objs_cond) { my $obj = @asm_objs_cond[0]; my $f = "$obj.asm";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -