📄 genmake.pl
字号:
push(@asm_objs, $obj); print OUT "ifeq (\$(@Conditional_Flag{$f}),@Conditional_Value{$f})\n"; print OUT "$name_ASM += \$(OBJ_OUTPUT_DIR)$obj.\$(O)\n"; print OUT "endif\n"; shift @asm_objs_cond; } print OUT "\nendif\n"; print OUT "\n\n"; if ($flag) { print OUT "\nendif #$flag\n"; }}#########################################sub write_header{ print OUT "################################################\n"; print OUT "# Common makefile. Automatically generated. #\n"; print OUT "################################################\n"; print OUT "\n"; my @labels = values %libs_label; print OUT "all: @labels\n"; print OUT "all_so: @Shared_Bin_So "; print OUT join("_so ", @labels); print OUT "_so\n"; print OUT "\n"; print OUT "ALL_TESTS = @Ex_Bin @Shared_Bin_So\n"; print OUT "ALL_TESTS_BENCH ="; my @exs = @Ex_Bin; while(@exs) { my $ex = @exs[0]; shift @exs; print OUT " $ex.test"; } print OUT "\n"; print OUT "ALL_TESTS_PURE ="; my @exs = @Ex_Bin; while(@exs) { my $ex = @exs[0]; shift @exs; print OUT " $ex.pure"; } print OUT "\n"; print OUT "\n"; print OUT "tests: \$(ALL_TESTS)\n"; print OUT "tests.test: \$(ALL_TESTS_BENCH)\n"; print OUT "tests.pure: \$(ALL_TESTS_PURE)\n"; print OUT "\n";}########################################### generation of libs ###########################################sub write_libs { print "-= LIBS =-\n"; print OUT "#########################################\n"; print OUT "## LIBRARIES ##\n"; print OUT "#########################################\n"; print OUT "\n"; while(@libs) { my $lib = @libs[0]; print " [$lib]\n"; print OUT "#############\n"; print OUT "############# lib: $lib ################\n"; print OUT "#############\n"; print OUT "\n"; my @lib_dirs = split( ',', @Libs_src_dirs{$lib} ); my $Nb = 1; while(@lib_dirs) { my $subdir = @lib_dirs[0]; my $dir = "$src_dir/$subdir"; my $dir_str = "\$($lib\_SRC_DIR$Nb)"; print " ($subdir)\n"; print OUT " ###### ($dir) ######\n"; print OUT "\n"; write_lib_entry($dir, $lib, $Nb); print OUT "$lib\_SRC_DIR$Nb = \$(LIB_SRC_DIR)$subdir\$(SEP)\n"; print OUT "\n"; print OUT " ##### cpp objs for '$lib/$subdir'\n"; print OUT "\n"; while(@cpp_objs) { write_cpp_entry($dir_str, @cpp_objs[0], ""); # no flag? shift @cpp_objs; } while (@asm_objs) { print OUT " ##### asm objs for '$lib/$subdir'\n"; print OUT "\n"; while(@asm_objs) { write_asm_entry($dir_str, @asm_objs[0], "_a"); # no flag? shift @asm_objs; } } print OUT "\n"; shift @lib_dirs; $Nb++; } print OUT " ##### main entry for '$lib' #####\n"; print OUT "\n"; ##### lib entry ##### my $label = @libs_label{$lib}; my $name = "LIB_$lib"; my $name_so = "LIB_$lib\_SO"; print OUT "$name\_ALL_OBJS = "; while ($Nb>1) { $Nb--; print OUT " \$($lib\_OBJ$Nb) \$($lib\_OBJ_ASM$Nb)"; } print OUT "\n\n"; print OUT "LIB_$lib = \$(LIB_OUTPUT_DIR)libskl_$label.\$(A)\n"; print OUT "LIB_$lib\_SO = \$(LIB_SO_OUTPUT_DIR)libskl_$label.\$(SO)\n"; print OUT "\$($name): \$($name\_ALL_OBJS)\n"; print OUT "\t\$(AR) \$($name) \$($name\_ALL_OBJS)\n"; print OUT "\t\$(RANLIB) \$($name)\n"; print OUT "\$($name\_SO): \$($name\_ALL_OBJS)\n"; print OUT "\t\$(LDSO) \$(OUT) \$($name\_SO) \$($name\_ALL_OBJS) \\\n\t"; if (@Libs_so_link{$lib}) { my @Links = split( ' ', @Libs_so_link{$lib}); while(@Links) { print OUT "\$(LIBINC)$Links[0] "; shift @Links; } } print OUT "\$(LDSO_FLAGS)\n\n"; print OUT "$label: \$($name\)\n"; print OUT "$label\_so: \$($name_so)\n"; print OUT "\n\n"; shift @libs; }}########################################### generation of shared objects ###########################################sub write_shared{ print "-= SHARED =-\n"; print OUT "#########################################\n"; print OUT "## SHARED OBJ ##\n"; print OUT "#########################################\n"; print OUT "\n"; while(@Shared_Bin) { my @Src; while(@Shared_Src) { if (@Shared_Src[0] eq ";") { shift @Shared_Src; last; } push( @Src, @Shared_Src[0] ); shift @Shared_Src; } my @Flag; while(@Shared_Flag) { if (@Shared_Flag[0] eq ";") { shift @Shared_Flag; last; } push( @Flag, @Shared_Flag[0] ); shift @Shared_Flag; } my @Link; while(@Shared_Link) { if (@Shared_Link[0] eq ";") { shift @Shared_Link; last; } push( @Link, @Shared_Link[0] ); shift @Shared_Link; } print " [@Shared_Bin[0]] ( "; print OUT "## Shared obj: @Shared_Bin[0]\n\n"; my @src = @Src; while(@src) { if (@src[0] =~ /([\w\/]+)\.asm/) { write_asm_so_entry( $1, "_so", @Flag ); print "$1.asm "; } elsif (@src[0] =~ /([\w\/]+)\.cpp/) { write_cpp_so_entry($1, "_so", @Flag, "\$(CCSO_FLAGS)"); print "$1.cpp "; } else { write_cpp_so_entry(@src[0], "_so", @Flag, "\$(CCSO_FLAGS)"); print "@src[0].cpp "; } shift @src; } print")\n"; write_so_entry(@Shared_Bin[0], @Src, ";", @Link); shift @Shared_Bin; }}########################################### generation of examples ###########################################sub write_ex_entry{ my $exe = @_[0]; shift @_; my @objs; while(@_) { if (@_[0] eq ";") { shift @_; last; } push @objs, " \$(OBJ_OUTPUT_DIR)@_[0].\$(O)"; shift @_; } my @libs; my @deps; while(@_) { push @libs, "\$(LIBINC)skl\_@_[0] "; push @deps, "\\\n\t \$(LIB_OUTPUT_DIR)libskl\_@_[0].\$(A) "; shift @_; } print OUT "$exe: @objs @deps\n"; print OUT "\t\$(LD) \$(OUT) \$(BUILD_DIR)$exe \\\n"; print OUT "\t @objs\\\n"; print OUT "\t \$(LIBDEF)\$(LIB_OUTPUT_DIR) @libs \$(LD_FLAGS)\n"; print OUT "\n\n"; print OUT "$exe.pure: @objs @deps\n"; print OUT "\t\$(PURIFY) \$(LD) \$(OUT) \$(BUILD_DIR)$exe.pure \\\n"; print OUT "\t @objs\\\n"; print OUT "\t \$(LIBDEF)\$(LIB_OUTPUT_DIR) @libs \$(LD_FLAGS)\n"; print OUT "\n\n"; print OUT "$exe.test: $exe\n"; print OUT "\t.\$(SEP)$exe > test\$(SEP)$exe.test\n"; print OUT "\t\$(DIFF) test\$(SEP)$exe.test \\\n"; print OUT "\t ..\$(SEP)..\$(SEP)data\$(SEP)$exe.test > test\$(SEP)$exe.diff\n"; print OUT "\trm .\$(SEP)$exe\n"; print OUT "\n\n";}sub write_examples{ print "-= EXAMPLES =-\n"; print OUT "#########################################\n"; print OUT "## EXAMPLES ##\n"; print OUT "#########################################\n"; print OUT "\n"; while(@Ex_Bin) { my @Src; while(@Ex_Src) { if (@Ex_Src[0] eq ";") { shift @Ex_Src; last; } push( @Src, @Ex_Src[0] ); shift @Ex_Src; } if (not @Src) { push(@Src, @Ex_Bin[0]); } my @Dep; while(@Ex_Dep) { if (@Ex_Dep[0] eq ";") { shift @Ex_Dep; last; } push( @Dep, @Ex_Dep[0] ); shift @Ex_Dep; } my @Flag; while(@Ex_Flag) { if (@Ex_Flag[0] eq ";") { shift @Ex_Flag; last; } push( @Flag, @Ex_Flag[0] ); shift @Ex_Flag; } if (@Ex_Type[0]=="0") { $src_dir = "TEST_SRC_DIR"; } elsif (@Ex_Type[0]=="1") { $src_dir = "EXAMPLE_SRC_DIR"; } shift @Ex_Type; print " [@Ex_Bin[0]] ( "; print OUT "## Example: @Ex_Bin[0]\n\n"; my @src = @Src; while(@src) { if (@src[0] =~ /(\w+)\.asm/) { write_asm_entry("\$($src_dir)", $1, "_a", @Flag); print "$1.asm "; } elsif (@src[0] =~ /(\w+)\.cpp/) { write_cpp_entry("\$($src_dir)", $1, "", @Flag); print "$1.cpp "; } else { write_cpp_entry("\$($src_dir)", @src[0], "", @Flag); print "@src[0].cpp "; } shift @src; } print")\n"; write_ex_entry(@Ex_Bin[0],@Src,";", @Dep); shift @Ex_Bin; }}#########################################sub write_makefile{ print "Generating $makefile\n"; open(OUT,">$makefile") || die( "can't open $makefile\n" ); write_header; write_libs; write_shared; write_examples; close OUT;}########################################### Doc entries (files.txt) ###########################################sub write_doc{ print "-= DOC ($doctxt) =-\n"; open(DOC,">$doctxt") || die( "can't open $doctxt\n" ); push(@include_dir, $inc_dir); while(@include_dir) { my $file; my $dir = @include_dir[0]; print " [$dir]\n"; shift @include_dir; opendir (DIR, $dir) || die ("Cannot opendir $dir\n"); while ($file=readdir(DIR)) { if ($file =~ /(\w+).h$/) { push(@h_objs,"$dir/$1.h"); } } closedir DIR; } while(@h_objs) { print DOC "//\@Include: @h_objs[0]\n"; shift @h_objs; } close DOC;}########################################### main ###########################################read_config_file;write_makefile;write_doc;#########################################
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -