# Part of the A-A-P recipe executive: Setup using MSVC
# Last Change: 2005 Aug 16
# Copyright (c) 2002-2003 stichting NLnet Labs
# Permission to copy and use this file is specified in the file COPYING.
# If this file is missing you can find it here: http://www.a-a-p.org/COPYING
#
# This module sets up variables and actions for using the Microsoft Visual C
# compiler tools.
#
from RecPython import *
import Global
from Action import action_add
from Dictlist import str2dictlist
from RecPos import RecPos
def exists():
"""
Return TRUE when the MSVC toolchain can be found.
"""
return program_path("cl") or program_path("vcvars32")
def define_actions():
"""
Define the actions that MSVC can accomplish.
"""
rd = Global.globals
cmd = ("defi = $?DEFINE\n"
+ "@defi = re.sub('-D', '/D', defi)\n"
+ "incl = $?INCLUDE\n"
+ "@incl = re.sub('-I', '/I', incl)\n")
# TODO: use DEBUG and OPTIMIZE
rpstack = [ RecPos("compile_msvc c action") ]
action_add(rpstack, rd, str2dictlist(rpstack, "compile_msvc object,libobject,dllobject c"),
cmd + ":sys $MSVC $CPPFLAGS $defi $incl $CFLAGS /c $source /Fo$target")
rpstack = [ RecPos("compile_msvc cpp action") ]
action_add(rpstack, rd, str2dictlist(rpstack, "compile_msvc object,libobject,dllobject cpp"),
cmd + ":sys $MSVC $CPPFLAGS $defi $incl $CXXFLAGS /TP /c $source /Fo$target")
if not rd.get("MSVC"):
rd["MSVC"] = "cl"
# Build action.
# Change $LIBS from "-lname" to "name.lib".
rpstack = [ RecPos("build_msvc action") ]
action_add(rpstack, rd, str2dictlist(rpstack, "build_msvc object"),
"libs = $?LIBS\n"
"libs = `re.sub('(\\\\A| )-l', ' ', libs)`\n"
"libs = `sufadd('.lib', libs)`\n"
":sys $MSLINK $LINKFLAGS /out:$target $source $libs")
rpstack = [ RecPos("build_msvc_dll action") ]
action_add(rpstack, rd, str2dictlist(rpstack, "build_msvc_dll object,libobject,dllobject"),
"libs = $?LIBS\n"
"libs = `re.sub('(\\\\A| )-l', ' ', libs)`\n"
"libs = `sufadd('.lib', libs)`\n"
":sys $MSLINK $LINKFLAGS /DLL /out:$target $libs $source")
if not rd.get("MSLINK"):
rd["MSLINK"] = "link"
if not rd.get("LINKFLAGS"):
rd["LINKFLAGS"] = "/nologo"
rpstack = [ RecPos("build_msvc_lib action") ]
action_add(rpstack, rd, str2dictlist(rpstack, "build_msvc_lib object,libobject,dllobject"),
"libs = $?LIBLIBS\n"
"libs = `re.sub('(\\\\A| )-l', ' ', libs)`\n"
"libs = `sufadd('.lib', libs)`\n"
":sys $MSLIB $LIBFLAGS $source /out:$target $libs")
# XXX: We're using a variable LIBLIBS here, instead of the usual LIBS.
# Static libraries typically don't want to link with the common libraries
# that executables want to link to (in fact, doing so will lead to linker
# errors), but we still need a way to link other libraries to a library.
if not rd.get("MSLIB"):
rd["MSLIB"] = "lib"
if not rd.get("LIBFLAGS"):
rd["LIBFLAGS"] = "/nologo"
# XXX: Should we use ARFLAGS here? The problem with that is that ARFLAGS
# contains "r" when we get here, so it won't be reverted to /nologo.
def use_actions(scope):
"""
Setup variables so that the default actions use the MSVC actions.
"""
scope["C_COMPILE_ACTION"] = "compile_msvc"
scope["CXX_COMPILE_ACTION"] = "compile_msvc"
scope["C_BUILD_ACTION"] = "build_msvc"
scope["CXX_BUILD_ACTION"] = "build_msvc"
scope["BUILDLIB_ACTION"] = "build_msvc_lib"
scope["BUILDDLL_ACTION"] = "build_msvc_dll"
# Avoid using gcc for dependency checks. It may exist but won't work with
# the MSVC compiler flags.
scope["HASGCC"] = "no"
scope["HASGCCXX"] = "no"
# vim: set sw=4 et sts=4 tw=79 fo+=l:
|