diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h index 18d81e1b5fa0..7633ae60daa5 100644 --- a/clang/include/clang/Driver/Driver.h +++ b/clang/include/clang/Driver/Driver.h @@ -54,7 +54,8 @@ class Driver { enum DriverMode { GCCMode, GXXMode, - CPPMode + CPPMode, + CLMode } Mode; public: diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 0c3f6ca2436e..98b87bebc0e6 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -96,6 +96,7 @@ void Driver::ParseDriverMode(ArrayRef Args) { .Case("gcc", GCCMode) .Case("g++", GXXMode) .Case("cpp", CPPMode) + .Case("cl", CLMode) .Default(~0U); if (M != ~0U) diff --git a/clang/test/Driver/cl.c b/clang/test/Driver/cl.c new file mode 100644 index 000000000000..c5273135e94e --- /dev/null +++ b/clang/test/Driver/cl.c @@ -0,0 +1,3 @@ +// RUN: %clang_cl -fsyntax-only -c %s + +void f(); diff --git a/clang/test/lit.cfg b/clang/test/lit.cfg index 46fc5b500872..a5bb350f08d8 100644 --- a/clang/test/lit.cfg +++ b/clang/test/lit.cfg @@ -204,7 +204,8 @@ config.substitutions.append( ('%clang_cc1', '%s -cc1 -internal-isystem %s' getClangBuiltinIncludeDir(config.clang))) ) config.substitutions.append( ('%clang_cpp', ' ' + config.clang + ' --driver-mode=cpp ')) - +config.substitutions.append( ('%clang_cl', ' ' + config.clang + + ' --driver-mode=cl ')) config.substitutions.append( ('%clangxx', ' ' + config.clang + ' --driver-mode=g++ ')) config.substitutions.append( ('%clang', ' ' + config.clang + ' ') ) @@ -227,6 +228,9 @@ config.substitutions.append( config.substitutions.append( (' %clang-cpp ', """*** invalid substitution, use '%clang_cpp'. ***""") ) +config.substitutions.append( + (' %clang-cl ', + """*** invalid substitution, use '%clang_cl'. ***""") ) ### diff --git a/clang/tools/driver/CMakeLists.txt b/clang/tools/driver/CMakeLists.txt index 3dac964f802c..77c819e70d20 100644 --- a/clang/tools/driver/CMakeLists.txt +++ b/clang/tools/driver/CMakeLists.txt @@ -76,8 +76,16 @@ add_custom_command(TARGET clang POST_BUILD set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${clang_pp}) +# Create the clang-cl symlink in the build directory. +set(clang_cl "${LLVM_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/clang-cl${CMAKE_EXECUTABLE_SUFFIX}") +add_custom_command(TARGET clang POST_BUILD + COMMAND ${CMAKE_COMMAND} -E ${CLANGXX_LINK_OR_COPY} "${clang_binary}" "${clang_cl}") + +set_property(DIRECTORY APPEND + PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${clang_cl}) + install(TARGETS clang RUNTIME DESTINATION bin) -# Create the clang++ symlink at installation time. +# Create the clang++ and clang-cl symlinks at installation time. install(SCRIPT clang_symlink.cmake -DCMAKE_INSTALL_PREFIX=\"${CMAKE_INSTALL_PREFIX}\") diff --git a/clang/tools/driver/clang_symlink.cmake b/clang/tools/driver/clang_symlink.cmake index c7341cb2fa61..9204f9f36655 100644 --- a/clang/tools/driver/clang_symlink.cmake +++ b/clang/tools/driver/clang_symlink.cmake @@ -19,9 +19,16 @@ endif() set(bindir "${CLANGXX_DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/") set(clang "clang${EXECUTABLE_SUFFIX}") set(clangxx "clang++${EXECUTABLE_SUFFIX}") +set(clang_cl "clang-cl${EXECUTABLE_SUFFIX}") message("Creating clang++ executable based on ${clang}") execute_process( COMMAND "${CMAKE_COMMAND}" -E ${CLANGXX_LINK_OR_COPY} "${clang}" "${clangxx}" WORKING_DIRECTORY "${bindir}") + +message("Creating clang-cl executable based on ${clang}") + +execute_process( + COMMAND "${CMAKE_COMMAND}" -E ${CLANGXX_LINK_OR_COPY} "${clang}" "${clang_cl}" + WORKING_DIRECTORY "${bindir}") diff --git a/clang/tools/driver/driver.cpp b/clang/tools/driver/driver.cpp index b3f2a83e121b..7ad3d0ab40bf 100644 --- a/clang/tools/driver/driver.cpp +++ b/clang/tools/driver/driver.cpp @@ -219,8 +219,10 @@ static void ParseProgName(SmallVectorImpl &ArgVector, { "clang-cpp", "--driver-mode=cpp" }, { "clang-g++", "--driver-mode=g++" }, { "clang-gcc", 0 }, + { "clang-cl", "--driver-mode=cl" }, { "cc", 0 }, { "cpp", "--driver-mode=cpp" }, + { "cl" , "--driver-mode=cl" }, { "++", "--driver-mode=g++" }, }; std::string ProgName(llvm::sys::path::stem(ArgVector[0]));