glx@9732: Option Explicit
glx@9732:
glx@9732: Dim FSO
glx@9732: Set FSO = CreateObject("Scripting.FileSystemObject")
glx@9732:
glx@9732: ' openttd_vs90.sln is for MSVC 2008
glx@9732: ' openttd_vs90.vcproj is for MSVC 2008
glx@9732: ' langs_vs90.vcproj is for MSVC 2008
glx@9732: ' strgen_vs90.vcproj is for MSVC 2008
glx@9732:
glx@9732: ' openttd_vs80.sln is for MSVC 2005
glx@9732: ' openttd_vs80.vcproj is for MSVC 2005
glx@9732: ' langs_vs80.vcproj is for MSVC 2005
glx@9732: ' strgen_vs80.vcproj is for MSVC 2005
glx@9732:
glx@9732: Sub safety_check(filename)
glx@9732: Dim file, line, regexp, list
glx@9732:
glx@9732: ' Define regexp
glx@9732: Set regexp = New RegExp
glx@9732: regexp.Pattern = "#|ottdres.rc|win32.cpp|win32_v.cpp"
glx@9732: regexp.Global = True
glx@9732:
glx@9732: ' We use a dictionary to check duplicates
glx@9732: Set list = CreateObject("Scripting.Dictionary")
glx@9732:
glx@9732: Set file = FSO.OpenTextFile(filename, 1, 0, 0)
glx@9732: While Not file.AtEndOfStream
glx@9732: line = Replace(file.ReadLine, Chr(9), "") ' Remove tabs
glx@9732: If Len(line) > 0 And Not regexp.Test(line) Then
glx@9732: line = FSO.GetFileName(line)
glx@9732: if list.Exists(line) Then
glx@9732: WScript.Echo " !! ERROR !!" _
glx@9732: & vbCrLf & "" _
glx@9732: & vbCrLf & "The filename '" & line & "' is already used in this project." _
glx@9732: & vbCrLf & "Because MSVC uses one single directory for all object files, it" _
glx@9732: & vbCrLf & "cannot handle filenames with the same name inside the same project." _
glx@9732: & vbCrLf & "Please rename either one of the file and try generating again." _
glx@9732: & vbCrLf & "" _
glx@9732: & vbCrLf & " !! ERROR !!"
glx@9732: WScript.Quit(1)
glx@9732: End If
glx@9732: list.Add line, line
glx@9732: End If
glx@9732: Wend
glx@9732: file.Close
glx@9732: End Sub
glx@9732:
rubidium@10249: Sub get_files(srcdir, dir, list)
rubidium@10249: Dim file, filename
rubidium@10249: Dim rekeep, reskip
rubidium@10249:
rubidium@10249: ' pattern for files to keep
rubidium@10249: Set rekeep = New RegExp
rubidium@10355: rekeep.Pattern = "\.h(pp)?$"
rubidium@10249: rekeep.Global = True
rubidium@10249:
rubidium@10249: ' pattern for files to exclude
rubidium@10249: Set reskip = New RegExp
rubidium@10355: reskip.Pattern = "\.svn"
rubidium@10249: reskip.Global = True
rubidium@10249:
rubidium@10249: For Each file in dir.Files
rubidium@10249: filename = Replace(file.path, srcdir, "") ' Remove */src/
rubidium@10249: filename = Replace(filename, "\", "/") ' Replace separators
rubidium@10249: If rekeep.Test(filename) And Not reskip.Test(filename) Then
rubidium@10249: list.Add filename, filename
rubidium@10249: End If
rubidium@10249: Next
rubidium@10249: End Sub
rubidium@10249:
rubidium@10249: Sub get_dir_files(srcdir, dir, list)
rubidium@10249: Dim folder
rubidium@10249: ' Get files
rubidium@10249: get_files srcdir, dir, list
rubidium@10249:
rubidium@10249: ' Recurse in subfolders
rubidium@10249: For Each folder in dir.SubFolders
rubidium@10249: get_dir_files srcdir, folder, list
rubidium@10249: Next
rubidium@10249: End Sub
rubidium@10249:
rubidium@10249: Sub headers_check(filename, dir)
rubidium@10249: Dim source_list_headers, src_dir_headers, regexp, line, file, str
rubidium@10249:
rubidium@10249: ' Define regexp for source.list parsing
rubidium@10249: Set regexp = New RegExp
rubidium@10249: regexp.Pattern = "\.h"
rubidium@10249: regexp.Global = True
rubidium@10249:
rubidium@10249: ' Parse source.list and store headers in a dictionary
rubidium@10249: Set source_list_headers = CreateObject("Scripting.Dictionary")
rubidium@10249: Set file = FSO.OpenTextFile(filename, 1, 0, 0)
rubidium@10249: While Not file.AtEndOfStream
rubidium@10249: line = Replace(file.ReadLine, Chr(9), "") ' Remove tabs
rubidium@10249: If Len(line) > 0 And regexp.Test(line) And line <> "../objs/langs/table/strings.h" Then
rubidium@10249: source_list_headers.Add line, line
rubidium@10249: End If
rubidium@10249: Wend
rubidium@10249: file.Close()
rubidium@10249:
rubidium@10249: ' Get header files in /src/
rubidium@10249: Set src_dir_headers = CreateObject("Scripting.Dictionary")
rubidium@10249: get_dir_files dir, FSO.GetFolder(dir), src_dir_headers
rubidium@10249:
rubidium@10249: ' Finding files in source.list but not in /src/
rubidium@10249: For Each line In source_list_headers
rubidium@10249: If Not src_dir_headers.Exists(line) Then
rubidium@10249: str = str & "< " & line & vbCrLf
rubidium@10249: End If
rubidium@10249: Next
rubidium@10249:
rubidium@10249: ' Finding files in /src/ but not in source.list
rubidium@10249: For Each line In src_dir_headers
rubidium@10249: If Not source_list_headers.Exists(line) Then
rubidium@10249: str = str & "> " & line & vbCrLf
rubidium@10249: End If
rubidium@10249: Next
rubidium@10249:
rubidium@10249: ' Display the missing files if any
rubidium@10249: If str <> "" Then
rubidium@10249: str = "The following headers are missing in source.list and not in /src/ or vice versa." _
rubidium@10249: & vbCrLf & str
rubidium@10249: WScript.Echo str
rubidium@10249: End If
rubidium@10249: End Sub
rubidium@10249:
glx@9732: Function load_main_data(filename)
glx@9732: Dim res, file, line, deep, skip, first_time
glx@9732: res = ""
glx@9732: ' Read the source.list and process it
glx@9732: Set file = FSO.OpenTextFile(filename, 1, 0, 0)
glx@9732: While Not file.AtEndOfStream
glx@9732: line = Replace(file.ReadLine, Chr(9), "") ' Remove tabs
glx@9732: If Len(line) > 0 Then
glx@9732: Select Case Split(line, " ")(0)
glx@9732: Case "#end"
glx@9732: If deep = skip Then skip = skip - 1
glx@9732: deep = deep - 1
glx@9732: Case "#else"
glx@9732: If deep = skip Then
glx@9732: skip = skip - 1
glx@9732: ElseIf deep - 1 = skip Then
glx@9732: skip = skip + 1
glx@9732: End If
glx@9732: Case "#if"
glx@9732: line = Replace(line, "#if ", "")
glx@9732: If deep = skip And ( _
glx@9732: line = "SDL" Or _
glx@9732: line = "PNG" Or _
glx@9732: line = "WIN32" Or _
glx@9732: line = "MSVC" Or _
glx@9800: line = "DIRECTMUSIC" Or _
truebrain@9859: line = "HAVE_THREAD" _
glx@9732: ) Then skip = skip + 1
glx@9732: deep = deep + 1
glx@9732: Case "#"
glx@9732: if deep = skip Then
glx@9732: line = Replace(line, "# ", "")
glx@9732: if first_time <> 0 Then
glx@9732: res = res & " " & vbCrLf
glx@9732: Else
glx@9732: first_time = 1
glx@9732: End If
glx@9732: res = res & _
glx@9732: " " & vbCrLf
glx@9732: End If
glx@9732: Case Else
glx@9732: If deep = skip Then
glx@9732: line = Replace(line, "/" ,"\")
glx@9732: res = res & _
glx@9732: " " & vbCrLf & _
glx@9732: " " & vbCrLf
glx@9732: End If
glx@9732: End Select
glx@9732: End If
glx@9732: Wend
glx@9732: res = res & " "
glx@9732: file.Close()
glx@9732: load_main_data = res
glx@9732: End Function
glx@9732:
glx@9732: Function load_lang_data(dir)
glx@9732: Dim res, folder, file
glx@9732: res = ""
glx@9732: Set folder = FSO.GetFolder(dir)
glx@9732: For Each file In folder.Files
glx@9732: file = FSO.GetFileName(file)
glx@9732: If FSO.GetExtensionName(file) = "txt" Then
glx@9732: file = Left(file, Len(file) - 4)
glx@9732: res = res _
glx@9732: & vbCrLf & " " _
glx@9732: & vbCrLf & " " _
glx@9732: & vbCrLf & " " _
glx@9732: & vbCrLf & " " _
glx@9732: & vbCrLf & " "
glx@9732: End If
glx@9732: Next
glx@9732: load_lang_data = res
glx@9732: End Function
glx@9732:
glx@9732: Sub generate(data, dest)
glx@9732: Dim srcfile, destfile, line
glx@9732: WScript.Echo "Generating " & FSO.GetFileName(dest) & "..."
glx@9732: Set srcfile = FSO.OpenTextFile(dest & ".in", 1, 0, 0)
glx@9732: Set destfile = FSO.CreateTextFile(dest, -1, 0)
glx@9732:
glx@9732: ' Everything above the !!FILES!! marker
glx@9732: line = srcfile.ReadLine()
glx@9732: While line <> "!!FILES!!"
glx@9732: If len(line) > 0 Then destfile.WriteLine(line)
glx@9732: line = srcfile.ReadLine()
glx@9732: Wend
glx@9732:
glx@9732: ' Our generated content
glx@9732: destfile.WriteLine(data)
glx@9732:
glx@9732: ' Everything below the !!FILES!! marker
glx@9732: While Not srcfile.AtEndOfStream
glx@9732: line = srcfile.ReadLine()
glx@9732: If len(line) > 0 Then destfile.WriteLine(line)
glx@9732: Wend
glx@9732: srcfile.Close()
glx@9732: destfile.Close()
glx@9732: End Sub
glx@9732:
glx@9732: Dim ROOT_DIR
glx@9732: ROOT_DIR = FSO.GetFolder("..").Path
glx@9732: If Not FSO.FileExists(ROOT_DIR & "/source.list") Then
glx@9732: ROOT_DIR = FSO.GetFolder(".").Path
glx@9732: End If
glx@9732: If Not FSO.FileExists(ROOT_DIR & "/source.list") Then
glx@9732: WScript.Echo "Can't find source.list, needed in order to make this run." _
glx@9732: & vbCrLf & "Please go to either the project dir, or the root dir of a clean SVN checkout."
glx@9732: WScript.Quit(1)
glx@9732: End If
glx@9732:
glx@9732: safety_check ROOT_DIR & "/source.list"
rubidium@10249: headers_check ROOT_DIR & "/source.list", ROOT_DIR & "\src\" ' Backslashes needed for DoFiles
glx@9732:
glx@9732: Dim openttd
glx@9732: openttd = load_main_data(ROOT_DIR &"/source.list")
glx@9732: generate openttd, ROOT_DIR & "/projects/openttd_vs80.vcproj"
glx@9732: generate openttd, ROOT_DIR & "/projects/openttd_vs90.vcproj"
glx@9732:
glx@9732: Dim lang
glx@9732: lang = load_lang_data(ROOT_DIR & "/src/lang")
glx@9732: generate lang, ROOT_DIR & "/projects/langs_vs80.vcproj"
glx@9732: generate lang, ROOT_DIR & "/projects/langs_vs90.vcproj"