Here is the Python script that I use to launch Visual Studio for working on Brazil code locally. It sets the proper search paths -including 3ds max SDK folders- for the compiler and linker for the chosen target platform and 3ds max version, then launches the correct visual studio.
import os
import msvcrt
import platform
import subprocess
from winsound import *
#===============================================================================
# Machine dependent Values
#===============================================================================
MaxBins={
3:"c:\\graphic\\3d\\3dsmax3\\",
4:"c:\\graphic\\3d\\3dsmax4\\",
5:"c:\\graphic\\3d\\3dsmax5\\",
6:"c:\\graphic\\3d\\3dsmax6\\",
7:"c:\\graphic\\3d\\3dsmax7\\",
8:"c:\\graphic\\3d\\3dsmax8\\",
9:"c:\\graphic\\3d\\3dsmax9\\",
10:"c:\\graphic\\3d\\3dsmax2008\\",
}
MaxSDKs={
3:"C:\\dev\\SDK\\Maxsdk3\\",
4:"C:\\dev\\SDK\\Maxsdk4\\",
5:"C:\\dev\\SDK\\Maxsdk5\\",
6:"C:\\dev\\SDK\\Maxsdk6\\",
7:"C:\\dev\\SDK\\Maxsdk7\\",
8:"C:\\dev\\SDK\\Maxsdk8\\",
9:"C:\\dev\\SDK\\Maxsdk9\\",
10:"C:\\dev\\SDK\\Maxsdk10\\",
}
VCExes = {
6:"C:\\dev\\vs6\\Common\\MSDev98\\Bin\\MSDEV.EXE",
7:"C:\\dev\\vs7\\Common7\\IDE\\devenv.exe",
8:"C:\\dev\\vs8\\Common7\\IDE\\devenv.exe",
}
SetVarBatchesVC8x64={ #host OS dependent batches for target platform
"x86" :"C:\\dev\\vs8\\VC\\bin\\x86_amd64\\vcvarsx86_amd64.bat",
"AMD64":"C:\\dev\\vs8\\VC\\bin\\amd64\\vcvarsamd64.bat",
}
SetVarBatches = {
"x86":{
6:"C:\\dev\\vs6\\VC98\\Bin\\vcvars32.bat",
7:"C:\\dev\\vs7\\vc7\\Bin\\vcvars32.bat",
8:"C:\\dev\\vs8\\vc\\Bin\\vcvars32.bat"
},
"x64":{
8:SetVarBatchesVC8x64[os.environ["PROCESSOR_ARCHITECTURE"]]
}
}
BrazilProjectPaths = {
1: "D:\\_works\\dev\\SplutterFishCVS\\B1Max\\",
2: "D:\\_works\\dev\\SplutterFishCVS\\Daedalus_01\\"
}
BrazilTypeDefs = {
"P": "BRAZIL_PRO_EDITION",
"B": "BRAZIL_BASIC_EDITION",
"R": "BRAZIL_RIO_EDITION",
"E": "BRAZIL_EDU_EDITION",
"N": ""
}
#===============================================================================
# Generic Values
#===============================================================================
MaxSDKIncSub = "\\include"
MaxSDKLibSubs= {"x86":"\\lib", "x64":"\\x64\\lib"}
#===============================================================================
# Functions
#===============================================================================
#_______________________________________________________________________________
def choose_max():
while True:
print "\nMAX version [ 3 | 4 | 5 | 6 | 7 | 8 | 9 | 1(0) | Q ] : ",
choice = msvcrt.getche().capitalize()
if choice=="Q": exit()
if choice in ["3","4","5","6","7","8","9"]: return choice
if choice=="0": return "10"
print " incorrect input!",
MessageBeep(MB_ICONHAND)
#_______________________________________________________________________________
def choose_platform():
while True:
print "\nPlatform Type [ (3) x86 | (6) x64 | (Q)uit ] : ",
choice = msvcrt.getche().capitalize()
if choice == "Q": exit()
if choice == "3": return "x86"
if choice == "6": return "x64"
print " incorrect input!",
MessageBeep(MB_ICONHAND)
#_______________________________________________________________________________
def choose_brazil_ver():
while True:
print "\nBrazil r/s version [ 1 | 2 | N | Q ] : ",
choice = msvcrt.getche().capitalize()
if choice=="Q": exit()
if choice in ["1","2","N"]: return choice
print " incorrect input!",
MessageBeep(MB_ICONHAND)
#_______________________________________________________________________________
def choose_brazil_type():
while True:
print "\nBuild Type [ (P)ro | (B)asic | (R)io | (E)du | (Q)uit ]: ",
choice = msvcrt.getche().capitalize()
if choice=="Q": exit()
if choice in ["P","B","R","E"]: return choice
print " incorrect input!",
MessageBeep(MB_ICONHAND)
#_______________________________________________________________________________
def choose_compiler():
while True:
print "\nCompiler Type [ (M)icrosoft | (I)ntel | (Q)uit ] : ",
choice = msvcrt.getche().capitalize()
if choice=="Q": exit()
if choice in ["M","I"]: return choice
print " incorrect input!",
MessageBeep(MB_ICONHAND)
#_______________________________________________________________________________
def choose_asm_generation():
while True:
print "\nGenerate ASM code [ (Y)es | (N)o | (Q)uit ] : ",
choice = msvcrt.getche().capitalize()
if choice=="Q": exit()
if choice in ["Y","N"]: return choice
print " incorrect input!",
MessageBeep(MB_ICONHAND)
#_______________________________________________________________________________
def choose_pdb_generation():
while True:
print "\nGenerate PDB files [ (Y)es | (N)o | (Q)uit ] : ",
choice = msvcrt.getche().capitalize()
if choice=="Q": exit()
if choice in ["Y","N"]: return choice
print " incorrect input!",
MessageBeep(MB_ICONHAND)
#_______________________________________________________________________________
def do_menu():
global max_ver, platform, brazil_ver, brazil_type, compiler_type, gen_asm, gen_pdb
# ask max version
max_ver = int(choose_max())
# ask target platform
if max_ver==9: platform = choose_platform()
else: platform = "x86"
# ask Brazil version
brazil_ver = choose_brazil_ver()
# ask Brazil type
if brazil_ver != "N":
brazil_ver = int(brazil_ver)
brazil_type = choose_brazil_type()
else:
brazil_ver = 0
brazil_type = None
# ask Compiler
compiler_type = choose_compiler()
#ask ASM and PDB generation
gen_asm = choose_asm_generation()
gen_pdb = choose_pdb_generation()
#_______________________________________________________________________________
def run_msvc():
# determine vc version
if max_ver in range(3, 6):vc_ver = 6
elif max_ver in range(6, 9):vc_ver = 7
elif max_ver in range(9,11):vc_ver = 8
else:
print "unsupported max version"
exit();
# determine the include and lib paths
max_sdk_inc = MaxSDKs[max_ver] + MaxSDKIncSub
max_sdk_lib = MaxSDKs[max_ver] + MaxSDKLibSubs[platform]
# prepare the common command strings
call_bat_cmd= "call " + SetVarBatches[platform][vc_ver]
vc_exe_cmd = VCExes[vc_ver] + " /USEENV"
# prepare the environment variables
lib_env = MaxSDKs[max_ver]+MaxSDKLibSubs[platform]
inc_env = MaxSDKs[max_ver]+MaxSDKIncSub
cl_env = ""
link_env= ""
# do the version specific adjustments to the commands
if compiler_type=="I":
cl_env +=" /DUSING_INTEL_COMPILER"
if vc_ver==6:
vc_exe_cmd +=" /Y3" # show build time (undocumented switch)
if vc_ver==8:
cl_env +=" /D_CRT_SECURE_NO_DEPRECATE"
# set brazil type
if brazil_type<> None:
cl_env += " /D" + BrazilTypeDefs[brazil_type]
# Turn on ASM List Generation
if gen_asm=="Y":
cl_env +=" /FAs"
# Turn on PDB Generation
if gen_pdb=="Y":
cl_env +=" /Zi"
link_env+=" /DEBUG"
# Display the variables
print "\n\n"
print "========================================================================="
print "call_bat_cmd=" , call_bat_cmd
print "vc_exe_cmd =" , vc_exe_cmd
print "lib_env =" , lib_env
print "inc_env =" , inc_env
print "cl_env =" , cl_env
print "link_env =" , link_env
print "=========================================================================\n"
# set the environment variables of the sub process
env_vars = os.environ
env_vars.update({
"LIB" : lib_env,
"INCLUDE" : inc_env,
"CL" : cl_env,
"LINK" : link_env,
})
# have sub cmd interpreter execute the commands that needs to be in the same process tree
print "running the compiler..."
command_str = "cmd /s /c "
command_str+= call_bat_cmd
command_str+= " && " + "call ListDevEnvVars.bat"
command_str+= " && " + vc_exe_cmd
subprocess.call(command_str, env=env_vars )
#_______________________________________________________________________________
def incremental_backup():
print "daily backup ..."
subprocess.call("daily_backup.bat")
#===============================================================================
# MAIN
#===============================================================================
do_menu()
run_msvc()
incremental_backup()
#exit
print "press any key to exit...\n"
MessageBeep(MB_ICONASTERISK)
msvcrt.getch()