void oextend(char *dir, char *word, char *new_dir, int platform, int optimize) { char slash,*sl,*last_slash,ext[200],small_word[100],mk[200]; if (platform==DOS) slash='\\'; else slash='/'; new_dir[0]=0; if (dir && strcmp(dir,".") && strcmp(dir,".\\") && strcmp(dir,"./")) sprintf(new_dir,"%s%c%s",dir,slash,word); else strcpy(new_dir,word); for (sl=new_dir,last_slash=NULL;*sl;sl++) if (*sl=='\\' || *sl=='/') last_slash=sl; if (last_slash) { strcpy(small_word,last_slash+1); *(last_slash+1)=0; } else { strcpy(small_word,new_dir); new_dir[0]=0; } if (dir && strcmp(dir,".") && strcmp(dir,".\\") && strcmp(dir,"./")) sprintf(mk,"%s%c%s",dir,slash,word); else strcpy(mk,word); sprintf(mk,"%s%c%s",dir,slash,word); for (sl=mk;*sl;sl++); while (*sl!='/' && *sl!='\\') sl--; sl++; if (optimize) sprintf(sl,"%s/%s",plat_name[platform],"opt"); else sprintf(sl,"%s/%s",plat_name[platform],"debug"); create_dir(mk); if (optimize) sprintf(ext,"%s/%s/%s%s",plat_name[platform],"opt",small_word,object_extension(platform)); else sprintf(ext,"%s/%s/%s%s",plat_name[platform],"debug",small_word,object_extension(platform)); strcat(new_dir,ext); if (platform==DOS) { for (sl=new_dir;*sl;sl++) if (*sl=='/') *sl='\\'; } }
void make_makefile(int platform) { char tmp[100],*s,de[5]; FILE *fp; if (platform==DOS) strcpy(de,".exe"); else de[0]=0; if (!get_var("MAKEFILE_NAME",tmp)) { if (platform==DOS) strcpy(tmp,"makefile.wat"); else strcpy(tmp,"Makefile"); } fp=fopen(tmp,"w"); if (!fp) { printf("Unable to open %s for writing\n",tmp); exit(0); } fprintf(fp,"CC=%s\n",compiler(platform)); write_flags(fp,platform,0); write_flags(fp,platform,1); list_o_files("IMLIB_OBJS",fp,imlib_objs,imlib_dir,object_extension(platform),platform,0); list_o_files("IMLIB_OBJS",fp,imlib_objs,imlib_dir,object_extension(platform),platform,1); list_o_files("PROG_OBJS",fp,ofiles,NULL,object_extension(platform),platform,0); list_o_files("PROG_OBJS",fp,ofiles,NULL,object_extension(platform),platform,1); if (platform==LINUX) /* for linux make two versions of program, X11 & SVGA */ { sprintf(tmp,"%sx",basename); fprintf(fp,"all : %s %s\n\n",basename,tmp); make_program(fp,basename,"LINUX_SVGA",platform,0); make_program(fp,tmp,"LINUX_X",platform,0); fprintf(fp,"opt : %so %so\n\n",basename,tmp); make_program(fp,basename,"LINUX_SVGA",platform,1); make_program(fp,tmp,"LINUX_X",platform,1); } else { fprintf(fp,"all : %s%s\n\n",basename,de); make_program(fp,basename,plat_name[platform],platform,0); fprintf(fp,"opt : %so%s\n\n",basename,de); make_program(fp,basename,plat_name[platform],platform,1); } sprintf(tmp,"%s_FILES",plat_name[platform]); list_o_depends(fp,tmp,imlib_dir,platform,0); list_o_depends(fp,tmp,imlib_dir,platform,1); list_o_depends(fp,"IMLIB_OBJS",imlib_dir,platform,0); list_o_depends(fp,"IMLIB_OBJS",imlib_dir,platform,1); list_o_depends(fp,"O_FILES",NULL,platform,0); list_o_depends(fp,"O_FILES",NULL,platform,1); if (platform!=DOS) { fprintf(fp,"clean :\n\t" "rm -f $(%s_FILES) $(IMLIB_OBJS) $(O_FILES)\n", plat_name[platform]); fprintf(fp,"cleano :\n\t" "rm -f $(%s_FILES_O) $(IMLIB_OBJS_O) $(O_FILES_O)\n", plat_name[platform]); } if (plat_stuff) fprintf(fp,"%s",plat_stuff); /* add any platform specific additions */ fclose(fp); }
void make_program(FILE *fp, char *name, char *plat_base, int platform, int optimize) { FILE *lfp; char tmp[2000],tmp2[200],de[5],*oe,*oe2; sprintf(tmp2,"%s_FILES",plat_base); get_var(tmp2,tmp); list_o_files(tmp2,fp,tmp,imlib_dir,object_extension(platform),platform,optimize); if (platform==DOS) strcpy(de,".exe"); else de[0]=0; if (optimize) { oe="o"; oe2="_O";} else { oe=""; oe2=""; } fprintf(fp,"%s%s%s : $(%s_FILES%s) $(IMLIB_OBJS%s) $(PROG_OBJS%s)\n",name,oe,de,plat_base,oe2,oe2,oe2); if (platform!=DOS) { if (optimize) fprintf(fp,"\t$(CC) -o %s%s $(%s_FILES_O) $(IMLIB_OBJS_O) $(PROG_OBJS_O)", name,oe,plat_base); else fprintf(fp,"\t$(CC) -o %s%s $(%s_FILES) $(IMLIB_OBJS) $(PROG_OBJS)", name,oe,plat_base); sprintf(tmp,"%s_LIBS",plat_base); if (get_var(tmp,tmp)) fprintf(fp," %s",tmp); fprintf(fp,"\n"); } else { if (optimize) sprintf(tmp,"%so.lnk",name); else sprintf(tmp,"%s.lnk",name); fprintf(fp,"\twlink @%s\n",tmp); lfp=fopen(tmp,"wb"); if (!lfp) { printf("Unable to open linker file %s\n",tmp); exit(0); } if (!optimize) fprintf(lfp,"debug all\n"); fprintf(lfp,"system dos4g\n" "option caseexact\n"); if (optimize) fprintf(lfp,"name %so%s\n",name,de); else fprintf(lfp,"name %s%s\n",name,de); if (get_var("STACK_SIZE",tmp2)) fprintf(lfp,"option stack=%s\n",tmp2); else fprintf(lfp,"option stack=8k\n"); sprintf(tmp,"%s_FILES",plat_base); list_wlink_files(lfp,tmp,imlib_dir,optimize); sprintf(tmp,"IMLIB_OBJS"); list_wlink_files(lfp,tmp,imlib_dir,optimize); sprintf(tmp,"O_FILES"); list_wlink_files(lfp,tmp,NULL,optimize); fclose(lfp); } fprintf(fp,"\n"); }
// Return a new path by replacing a .s extension // with a .o extension. inline Path to_object_file(Path p) { return p.replace_extension(object_extension()); }