00001
00002 """
00003 Builfile
00004 Solution pour generer des makefile multiplateforme
00005 Il permet aussi de definir le genre de produit que vous
00006 voulez faire avec le projet:
00007 $ python Buildfile -il
00008 produira un fichier de configuration et un Makefile
00009 qui permettra l'utilisateur d'avoir acces a la sortie
00010 de matrices creuses en images ainsi qu'une sortie LaTeX
00011 $ python Buildfile -p
00012 va produire les librairies dynamiques qui seront utilisees
00013 en Python
00014 """
00015
00016 import sys, os, re
00017 import getopt
00018
00019 NOM_EXEC = "ModelMath"
00020 usage = "Usage : %s arguments\n\
00021 \t--with_python -p Necessite Boost.Python et Python2.2(au moins) d'installe, creation des librairies pour Python\n\
00022 \t--with_png -i Permet de faire une sortie graphique (format PNG) des matrices creuses\n\
00023 \t--with_latex -l On pourra sortir un fichier en LaTeX dans le programme\n\
00024 \t--with_html -w Sortie d'un fichier HTML (utilise CSS1)" % sys.argv [0]
00025 with_python = 0
00026 with_png = 0
00027 for_windows = 0
00028 with_latex = 1
00029 with_html = 1
00030
00031 opts = {}
00032 arguments = {}
00033 sources=[]
00034 headers=[]
00035
00036
00037
00038 dependances = "#------------------------------------------------------\n"
00039 compilo="#------------------------------------------------------\n\
00040 #Compilateur et option\n\
00041 CC=g++\n\
00042 AR=ar\n\
00043 CFLAGS=-Wall -pedantic -O3 -malign-double -ffast-math -std=c++98 -I../include\n"
00044 python="linking=-L/usr/local/lib -lpython2.2 -lboost_python -DBOOST_PYTHON_STATIC_MODULE /usr/local/lib/libboost_python-gcc.a\n\
00045 chemin=-I/usr/local/include/boost-1_32 -I/usr/include/python2.2\n"
00046 wo_python="chemin=\nlinking=\n"
00047 entete="\
00048 # Makefile genere par Buildfil.py\n\
00049 # Ce logiciel a ete cree pour Modelib (ISIMA/2005)\n\
00050 # http://neuroo.kouette.com/modelib\n\
00051 # Quentin Lequy et Romain Gaucher\n"
00052 machine="#--------------------------------------------------------\n\
00053 %.o : %.cpp\n\
00054 @echo \" obj file:\"$*.cpp\n\
00055 $(CC) -c $(CFLAGS) $*.cpp "
00056 exec_python="$(chemin)\n\
00057 %.so : %.o\n\
00058 @echo \" so file:\"$*.o\n\
00059 @$(CC) -shared $*.o -o $*.so $(linking)\n"
00060 machine2="\n\n$(EXEC) : $(OBJS)\n\
00061 @echo \" exe file:\"$(EXEC)\n\
00062 @$(CC) -o $(EXEC) -g $(OBJS) $(LFLAGS)\n\
00063 @echo \" generate static_lib:\" $(LIBA)\n\
00064 @$(AR) r $(LIBA) $(OBJS_WITHOUT_MAIN)\n\
00065 @cp -fr $(LIBA) ../bin\n\
00066 \n\
00067 clean:\n\
00068 @echo \"cleaning all files but sources\"\n\
00069 @rm -f $(OBJS) $(EXEC)\n\
00070 \n\
00071 install:\n\
00072 @echo \" writing the path...\"\n\
00073 @export PATH=$PATH:$PWD/../\n\
00074 save:\n\
00075 @cp -fr ./* ../archive/\n\
00076 @rm -fr ../archive/*.o\n\
00077 @rm -f ../projet.tar.bz2\n\
00078 @tar -cvjf ../projet.tar.bz2 ../archive\n"
00079
00080 def usage_error (message, exit_code) :
00081 print '--> ### %s ###' % message
00082 print '--> %s' % usage
00083 sys.exit (exit_code)
00084
00085 def parse_cmds (opts):
00086 global with_python, with_png, for_windows, with_html, with_latex
00087 option = {}
00088
00089 for arg in opts:
00090 if arg in ('-p', '--with_python'):
00091 with_python = 1
00092 elif arg in ('-i','--with_png'):
00093 with_png = 1
00094 elif arg in ('-l','--with_latex'):
00095 with_latex = 1
00096 elif arg in ('-w','--with_html'):
00097 with_html = 1
00098 elif arg in ('-h', '--help'):
00099 print '%s' % usage
00100 sys.exit(1)
00101 else:
00102 str = "option [%s] inconnu" % arg
00103 usage_error(str,0)
00104
00105 if os.name == "posix" or os.name == "mac" or os.name == "riscos":
00106 for_windows = 0
00107 else:
00108 for_windows = 1
00109 """
00110 print "(%s) - (%s)" % (os.name,os.path)
00111 print "Etat du systeme:"
00112 print "\tWITH_PYTHON = %d" % with_python
00113 print "\tWITH_PNG = %d" % with_png
00114 print "\tFOR_WINDOWS = %d" % for_windows
00115 print "\tWITH_LATEX = %d" % with_latex
00116 print "\tWITH_HTML = %d" % with_html
00117 """
00118
00119
00120 def get_files():
00121
00122 global headers, sources
00123 all = {};
00124 dirname = os.getcwd()
00125 all = [f for f in os.listdir(dirname) if os.path.isfile(os.path.join(dirname, f))]
00126
00127
00128 old = re.compile("old.(.+)$")
00129 cpp = re.compile("(.+).cpp$")
00130 h = re.compile("(.+).h$|(.+).cxx$")
00131 for f in all:
00132 if cpp.match(f,re.IGNORECASE) and not old.match(f,re.IGNORECASE):
00133 sources.append(f)
00134 if h.match(f,re.IGNORECASE) and not old.match(f,re.IGNORECASE) and f != NOM_EXEC:
00135 headers.append(f)
00136
00137
00138
00139
00140
00141 def make_configh():
00142 print "Construction de Config.h"
00143 try:
00144 configh = open("../include/Config.h","w")
00145 except IOError:
00146 print "Impossible d'ecrire le fichier desire"
00147 return 0
00148 else:
00149 configh.write("// Fichier genere automatiquement par Buildfile.\n// Modelib / Programmes lineaires pour C++ et Python\n")
00150 configh.write("#ifndef __CONFIG_H\n#define __CONFIG_H\n\n")
00151 configh.write("#define __no_export\n")
00152 if for_windows:
00153 configh.write("#define WINDOWS_VERSION\n")
00154 if with_png:
00155 configh.write("#define EXPORT_SPARSE_MATRIX_PNG\n")
00156 if with_python:
00157 configh.write("#define COMPILE_FOR_PYTHON\n")
00158 if with_latex:
00159 configh.write("#define USE_LATEX_FORMAT\n")
00160 if with_html:
00161 configh.write("#define USE_HTML_FORMAT\n")
00162
00163 configh.write("\n\n#endif\n\n")
00164 configh.close()
00165 return 1
00166
00167 def make_file():
00168 global sources
00169 print "Construction du Makefile"
00170 nom = "Makefile"
00171
00172 try:
00173 makefile = open(nom,"w")
00174 except IOError:
00175 print "Impossible d'ecrire le fichier desire"
00176 return 0
00177 else:
00178
00179 makefile.write("#------------------------------------------------------\n");
00180 makefile.write(entete)
00181 makefile.write("#------------------------------------------------------\n");
00182 srcs = "SRCS="
00183 for f in sources:
00184 if with_latex == 0 and f == "latexFile.cpp":
00185 continue
00186 elif with_png == 0 and f == "Png.cpp":
00187 continue
00188 elif with_html == 0 and f == "htmlFile.cpp":
00189 continue
00190 elif f == "Python.cpp" and not with_python:
00191 continue
00192 else:
00193 srcs = srcs + f + " "
00194 srcs = srcs + "\n"
00195 makefile.write(srcs)
00196 makefile.write("OBJS=$(patsubst %.cpp, %.o, $(SRCS))\n")
00197 EXEC = "EXEC=%s" % NOM_EXEC
00198 if for_windows:
00199 EXEC = EXEC+".exe"
00200 EXEC = EXEC + "\n"
00201 makefile.write(EXEC)
00202 makefile.write("LIBA=model.a\n")
00203
00204
00205 objs = ""
00206 objs2= ""
00207 for f in sources:
00208 if with_latex == 0 and f == "latexFile.cpp":
00209 continue
00210 elif with_png == 0 and f == "Png.cpp":
00211 continue
00212 elif with_html == 0 and f == "htmlFile.cpp":
00213 continue
00214 elif f == "main.cpp":
00215 continue
00216 elif f == "Python.cpp" and not with_python:
00217 continue
00218 else:
00219 objs = objs + f + " "
00220
00221 objs2 = objs.replace(".cpp",".o")
00222
00223 objs2 = "OBJS_WITHOUT_MAIN=" + objs2 + "\n"
00224 makefile.write(objs2)
00225
00226
00227 if with_python:
00228 makefile.write(python)
00229
00230
00231 makefile.write(compilo)
00232 LPFLAG = "LFLAGS=-I../include -lm"
00233 if with_png == 1:
00234 LPFLAG = LPFLAG + " -lpng\n"
00235 else:
00236 LPFLAG = LPFLAG + " \n"
00237 makefile.write(LPFLAG)
00238
00239 makefile.write(dependances)
00240
00241
00242 makefile.write(machine)
00243
00244
00245 if with_python:
00246 makefile.write(exec_python)
00247
00248
00249 makefile.write(machine2)
00250
00251 makefile.close()
00252 return 1
00253
00254 def chercher_path():
00255 print os.path
00256 if for_windows == 0:
00257
00258 print "UNIX version"
00259
00260
00261
00262 try :
00263 options,arguments = getopt.getopt ( sys.argv[1:] , 'hilpw' ,["help","with_png", "with_latex", "with_python", "with_html"] )
00264 except getopt.GetoptError :
00265 usage_error ("Illegal options", 1)
00266 for option in options:
00267 opts[option[0]] = option[1]
00268 parse_cmds(opts)
00269 get_files()
00270 make_configh()
00271 make_file()
00272
00273
00274
00275
00276
00277