From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS53758 23.128.96.0/24 X-Spam-Status: No, score=-3.8 required=3.0 tests=AWL,BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_PASS, SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by dcvr.yhbt.net (Postfix) with ESMTP id 33F061F9E0 for ; Fri, 24 Apr 2020 04:02:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726295AbgDXEBr (ORCPT ); Fri, 24 Apr 2020 00:01:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57612 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1726175AbgDXEBp (ORCPT ); Fri, 24 Apr 2020 00:01:45 -0400 Received: from mail-wr1-x441.google.com (mail-wr1-x441.google.com [IPv6:2a00:1450:4864:20::441]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4D1A6C09B047 for ; Thu, 23 Apr 2020 21:01:45 -0700 (PDT) Received: by mail-wr1-x441.google.com with SMTP id j1so9078723wrt.1 for ; Thu, 23 Apr 2020 21:01:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=z5QH4VdRD/8Zirf2HLHGSny9t8h6++VWwQYtfqhBbSo=; b=ZuNPW+E7a5CRfJNE3bzGKd4LvYbUrsp132gXeIMLOHeVUwZHY/3RtR6FwhTbZtFUW0 IatYQ7b6vFJzvuSSJ2UurDhEe6pTd6rx1PKYKDgvnLpJycsjEMa1x7S9y0nEZVEVK3pT 0pImgKjJv/wRM+UE+utPIfJ7HMsTNFeFqb6px3a2Q1UFHhHgQ03uhFcHoeeb/SN2WqL1 /Xx/z3TVd+KxBKWGL3LW3dFZxlrqaYZS3fDXt2xOrdkwAfMFeoHXq5sAaEE/Lo+uAFGD n2IyquDT3Wd1TT4PHx6LDfmg13WFSfPPCBruesOIokFhofPZDssQ80fCYTfgC9M540Go 26Rg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=z5QH4VdRD/8Zirf2HLHGSny9t8h6++VWwQYtfqhBbSo=; b=qeOZGCY0GXgTMTIYXZEVQrWVNLtMJuA+edez/ybwCza6lS4AJxk5O3vTyvJ+lN/aUN 5MACj1fC+agAHEWv3xgb41fF8pgPTiJPEvAGRxVcuEGHx2j4ArfgsCipgmoNlAJHttZk lgvJK15xJpEIgVXfurv4P5YrldKROoUFGsueQu+s/E0chQy4RyjZVR2L+izNTm+Jkr4S TRVnmRJNQY/YXaZZ9owskdZIf0y47CqrRKXH5C5nRGIDjTawV01HuZS1p3xGWQLwmXLd DJsrCBtjYx/cG25Pf/LHimNwnjP7raVWKUwSeRUSkM4v1rz+C4qsRR9D2T27dItR3jER Ibjg== X-Gm-Message-State: AGi0PuY34KrOGN4Obqbv71ipfBWHBI7QiIQURX/o0csA3HPM44x6roz1 UIiJ+FqMIS0RXHOT8N5lQj44rWKe X-Google-Smtp-Source: APiQypLkBizHaZyJR3gQuQyisy3N0lDFBE0BBeCZLF0cgmqNr9DZLD+WI1Pt5R8XNJTkZA9V0KXWew== X-Received: by 2002:a5d:42c7:: with SMTP id t7mr8404732wrr.336.1587700903797; Thu, 23 Apr 2020 21:01:43 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id t16sm1013996wmi.27.2020.04.23.21.01.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2020 21:01:43 -0700 (PDT) Message-Id: <0577d7bf0a84f94396bd956bd7f6bbc711d3bf26.1587700897.git.gitgitgadget@gmail.com> In-Reply-To: References: From: "Sibi Siddharthan via GitGitGadget" Date: Fri, 24 Apr 2020 04:01:36 +0000 Subject: [PATCH 7/8] cmake: support for building git on windows with msvc and clang. Fcc: Sent Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MIME-Version: 1.0 To: git@vger.kernel.org Cc: Sibi Siddharthan , Sibi Siddharthan Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Sibi Siddharthan This patch adds support for Visual Studio and Clang builds The minimum required version of CMake is upgraded to 3.15 because this version offers proper support for Clang builds on Windows. Libintl is not searched for when building with Visual Studio or Clang because there is no binary compatible version available yet. NOTE: In the link options invalidcontinue.obj has to be included. The reason for this is because by default, Windows calls abort()'s instead of setting errno=EINVAL when invalid arguments are passed to standard functions. This commit explains it in detail: 4b623d80f73528a632576990ca51e34c333d5dd6 On Windows the default generator is Visual Studio,so for Visual Studio builds do this: cmake `relative-path-to-srcdir` NOTE: Visual Studio generator is a multi config generator, which means that Debug and Release builds can be done on the same build directory. For Clang builds do this: On bash CC=Clang cmake `relative-path-to-srcdir` -G Ninja -DCMAKE_BUILD_TYPE=[Debug or Release] On cmd set CC=Clang cmake `relative-path-to-srcdir` -G Ninja -DCMAKE_BUILD_TYPE=[Debug or Release] Signed-off-by: Sibi Siddharthan --- CMakeLists.txt | 57 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d9eb1060390..5ad3a2557f7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ # Copyright (c) 2020 Sibi Siddharthan # -cmake_minimum_required(VERSION 3.14) +cmake_minimum_required(VERSION 3.15) #Parse GIT-VERSION-GEN to get the version file(STRINGS ${CMAKE_SOURCE_DIR}/GIT-VERSION-GEN git_version REGEX "DEF_VER=v(.*)") @@ -32,8 +32,11 @@ find_package(ZLIB REQUIRED) find_package(CURL) find_package(EXPAT) find_package(Iconv) -find_package(Intl) +#Don't use libintl on Windows Visual Studio and Clang builds +if(NOT (WIN32 AND (CMAKE_C_COMPILER_ID STREQUAL "MSVC" OR CMAKE_C_COMPILER_ID STREQUAL "Clang"))) + find_package(Intl) +endif() if(NOT Intl_FOUND) add_compile_definitions(NO_GETTEXT) @@ -61,7 +64,7 @@ if(NOT SH_EXE) message(FATAL_ERROR "sh interpreter was not found in your path, please install one. On Windows you can get it from here https://gitforwindows.org/") endif() -if(WIN32) +if(WIN32 AND NOT MSVC)#not required for visual studio builds find_program(WINDRES_EXE windres) if(NOT WINDRES_EXE) message(FATAL_ERROR "Install windres on Windows for resource files") @@ -73,6 +76,13 @@ if(NOT MSGFMT_EXE) message(WARNING "Text Translations won't be build") endif() +#Force all visual studio outputs to CMAKE_BINARY_DIR +if(CMAKE_C_COMPILER_ID STREQUAL "MSVC") + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}) + add_compile_options(/MP) +endif() + #default behaviour include_directories(${CMAKE_SOURCE_DIR}) add_compile_definitions(GIT_HOST_CPU="${CMAKE_SYSTEM_PROCESSOR}") @@ -110,6 +120,10 @@ endif() #Platform Specific if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows") + if(CMAKE_C_COMPILER_ID STREQUAL "MSVC" OR CMAKE_C_COMPILER_ID STREQUAL "Clang") + include_directories(compat/vcbuild/include) + add_compile_definitions(_CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_DEPRECATE) + endif() include_directories(compat/win32) add_compile_definitions(HAVE_ALLOCA_H NO_POSIX_GOODIES NATIVE_CRLF NO_UNIX_SOCKETS WIN32 _CONSOLE DETECT_MSYS_TTY STRIP_EXTENSION=".exe" NO_SYMLINK_HEAD UNRELIABLE_FSTAT @@ -463,14 +477,22 @@ set(libvcs-svn_SOURCES vcs-svn/svndiff.c vcs-svn/svndump.c) add_library(vcs-svn STATIC ${libvcs-svn_SOURCES}) -#add git.rc for gcc if(WIN32) - add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/git.res - COMMAND ${WINDRES_EXE} -O coff -DMAJOR=${PROJECT_VERSION_MAJOR} -DMINOR=${PROJECT_VERSION_MINOR} - -DMICRO=${PROJECT_VERSION_PATCH} -DPATCHLEVEL=0 -DGIT_VERSION="\\\"${PROJECT_VERSION}.GIT\\\"" - -i ${CMAKE_SOURCE_DIR}/git.rc -o ${CMAKE_BINARY_DIR}/git.res - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - VERBATIM) + if(NOT MSVC)#use windres when compiling with gcc and clang + add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/git.res + COMMAND ${WINDRES_EXE} -O coff -DMAJOR=${PROJECT_VERSION_MAJOR} -DMINOR=${PROJECT_VERSION_MINOR} + -DMICRO=${PROJECT_VERSION_PATCH} -DPATCHLEVEL=0 -DGIT_VERSION="\\\"${PROJECT_VERSION}.GIT\\\"" + -i ${CMAKE_SOURCE_DIR}/git.rc -o ${CMAKE_BINARY_DIR}/git.res + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + VERBATIM) + else()#MSVC use rc + add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/git.res + COMMAND ${CMAKE_RC_COMPILER} /d MAJOR=${PROJECT_VERSION_MAJOR} /d MINOR=${PROJECT_VERSION_MINOR} + /d MICRO=${PROJECT_VERSION_PATCH} /d PATCHLEVEL=0 /d GIT_VERSION="${PROJECT_VERSION}.GIT" + /fo ${CMAKE_BINARY_DIR}/git.res ${CMAKE_SOURCE_DIR}/git.rc + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + VERBATIM) + endif() add_custom_target(git-rc DEPENDS ${CMAKE_BINARY_DIR}/git.res) endif() @@ -487,7 +509,13 @@ endif() if(WIN32) target_link_libraries(common-main ws2_32 ntdll ${CMAKE_BINARY_DIR}/git.res) add_dependencies(common-main git-rc) - target_link_options(common-main PUBLIC -municode -Wl,--nxcompat -Wl,--dynamicbase -Wl,--pic-executable,-e,mainCRTStartup) + if(CMAKE_C_COMPILER_ID STREQUAL "GNU") + target_link_options(common-main PUBLIC -municode -Wl,--nxcompat -Wl,--dynamicbase -Wl,--pic-executable,-e,mainCRTStartup) + elseif(CMAKE_C_COMPILER_ID STREQUAL "Clang") + target_link_options(common-main PUBLIC -municode -Wl,-nxcompat -Wl,-dynamicbase -Wl,-entry:wmainCRTStartup -Wl,invalidcontinue.obj) + elseif(CMAKE_C_COMPILER_ID STREQUAL "MSVC") + target_link_options(common-main PUBLIC /IGNORE:4217 /IGNORE:4049 /NOLOGO /ENTRY:wmainCRTStartup /SUBSYSTEM:CONSOLE invalidcontinue.obj) + endif() elseif(UNIX) target_link_libraries(common-main pthread rt) endif() @@ -797,6 +825,13 @@ target_link_libraries(test-tool common-main) set_target_properties(test-fake-ssh test-line-buffer test-svn-fe test-tool PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/t/helper) +if(MSVC) + set_target_properties(test-fake-ssh test-line-buffer test-svn-fe test-tool + PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/t/helper) + set_target_properties(test-fake-ssh test-line-buffer test-svn-fe test-tool + PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/t/helper) +endif() + #wrapper scripts set(wrapper_scripts git git-upload-pack git-receive-pack git-upload-archive git-shell git-remote-ext) -- gitgitgadget