Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding build support for Windows #190

Closed
grishavanika opened this issue Jun 16, 2019 · 7 comments
Closed

Adding build support for Windows #190

grishavanika opened this issue Jun 16, 2019 · 7 comments
Labels
enhancement New feature or request

Comments

@grishavanika
Copy link
Contributor

Hi,

I'm interested to contribute to coroutines code generation discussed there #92.

Since I'm mostly Windows user/dev, I'm happy to have build steps working on Windows.

I have some changes that allow me to run cppinsights on Windows, see Few hacks and workarounds to build insights (nothing else) on Windows.

Do you interested in something like this ? I can prepare PR and make changes nicer if you like.

As a side note, this may also help with #177 (ignoring hosting issues).

@andreasfertig
Copy link
Owner

Hello @grishavanika,

excellent! Yes, I'm interested in a Windows version. I would then add a CI build for Windows and look into hosting it. Please prepare a PR. I did not get the reason to rename Normalize to NormalizeP for example. I guess that VS17 does not support structured bindings? Hence, the change in the for-loop?

Andreas

@grishavanika
Copy link
Contributor Author

Hi @andreasfertig,

There are few moments with this in general.

I guess that VS17 does not support structured bindings? Hence, the change in the for-loop?

It does support them. The thing is - I'm actually using Clang version 8.0.0 to build insights (see Readme, "Building on Windows" section, I'm passing -T LLVM so CMake uses preinstalled Clang integrated into Visual Studio).
It turns out there is bug in Clang, see this SO. It may be fixed in the latest Clang, but I didn't have time to check.

The reason I used Clang and not native cl.exe in first place is because I thought it will be faster to build insights just to see how much work there is. Now I think it should be simple enough to build the project with cl.exe or support both, Clang and cl.

I guess, this depends on your plans to have CI, so do you plan to use something like AppVeyor to have CI for Windows builds ?
Need to double-check if they have proper version of Clang integrated into VS or, as I said before, make project buildable with native cl.exe.
Also, as you can see from Readme, I'm building Clang/LLVM to get libraries (and most importantly - llvm-config.exe) in place. Not sure what's the best way to get them on CI machines, need to investigate possibilities (maybe there are pre-built Clang/LLVM libraries available for Windows ?).

I did not get the reason to rename Normalize to NormalizeP

There are 2 different sets of Normalize() functions. One set is inside DPrint.h (::clang::insights::details namespace) and another one is in InsightsStrCat.h (::clang::insights namespace).
For ::clang::insights::details::StrCat() with long long, for example, Clang selects Normalize() from DPrint.h instead InsightsStrCat.h (I guess, that's correct - they are in the same namespace and there is no ADL for fundamental type ?).
I was lazy and changed names into something else. I guess, there is another possible fix - just use fully qualified name:

void StrCat(std::string& ret, T&& t, Args&&... args)
{
    ret.append(::clang::insights::Normalize(std::forward<T>(t)));
}

I'm curious to know why this compiles for you :)

Anyway, let me know about your plans for CI (AppVeyor ?) and I'll try to see what can be done.

@andreasfertig
Copy link
Owner

Hello @grishavanika,

thank you for the PR, it is in the progress to merge.
I was happy about the fact that you cared even for the readme that I did not read it in specific. From what I quickly researched it looks like either a self-built Clang is required, as you did it, or AppVeyor comes with one. I plan to use them for the Windows CI. I already created an account.

You are right with the Normalize()functions. They did not make trouble for me on macOS/Linux :-). However, being more precise is better.

Andreas

@grishavanika
Copy link
Contributor Author

Hi @andreasfertig ,

Thank you for merging.

Just in case, I'm looking into available software for AppVeyor: https://www.appveyor.com/docs/windows-images-software/#llvm and see that while Clang binaries are up to date (8.0.0), it looks like LLVM libraries are relatively old (LLVM 5.0.0).

In case this is not enough or you have issues with setting it up - let me know. I think there is workaround with vcpkg to have latest LLVM stuff on AppVeyor.

@andreasfertig
Copy link
Owner

Hello @grishavanika,

I just pushed a new branch appveyor where I added a appveyor.yml. Unfortunately, it does not work as I hoped:

Build started
git clone -q --branch=appveyor https://github.com/andreasfertig/cppinsights.git C:\projects\cppinsights
git checkout -qf 1df8d813b29a2b828a92373f88383ffb69c7e8e1
mkdir "%APPVEYOR_BUILD_FOLDER%/build"
cd "%APPVEYOR_BUILD_FOLDER%/build"
clang++ --version
clang version 8.0.0 (tags/RELEASE_800/final)
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files\LLVM\bin
cmake -G "Visual Studio 15 2017 Win64" -T LLVM ..
-- The C compiler identification is Clang 8.0.0
-- The CXX compiler identification is Clang 8.0.0
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x64/cl.exe
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x64/cl.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x64/cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x64/cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- CMAKE_CXX_COMPILER_ID="Clang" ; BUILD_INSIGHTS_OUTSIDE_LLVM="On" ; IS_CLANG="On" ; IS_GNU="Off" ; IS_MSVC_CL="" ; MSVC="1"
CMake Error at CMakeLists.txt:119 (message):
  llvm-config not found -- LLVM_CONFIG_PATH-NOTFOUND: llvm-config
-- Configuring incomplete, errors occurred!
See also "C:/projects/cppinsights/build/CMakeFiles/CMakeOutput.log".

It looks like the libs are missing. I found this project Building-Zig-on-Windows which offers a Windows version with libs. However, I do not like to depend on something like it. A more common stable way would be better.

Andreas

@grishavanika
Copy link
Contributor Author

Hey, @andreasfertig.

Specifically in your log libs are missing because you didn't add them (more precisely, llvm-config.exe) to the PATH. See https://www.appveyor.com/docs/windows-images-software/#llvm. In theory you just do:

set path=%path%;C:\Libraries\llvm-5.0.0
cmake -G ...

Unfortunately, as you can see, those pre-installed LLVM libs are old (5.0.0).
See one of my logs, for example: https://ci.appveyor.com/project/grishavanika/cppinsights/builds/25340479:

-- llvm_config(LLVM_LDFLAGS)=>-LIBPATH:C:\Libraries\llvm-5.0.0\lib;
-- llvm_config(LLVM_LIBS2)=>C:\Libraries\llvm-5.0.0\lib\LLVMLTO.lib [...]

I played with this a bit and, unfortunately, I don't see any other way except for hosting and/or downloading pre-built LLVM/Clang libraries. This may be also your own github with commited binaries (I personally, don't think this is a good way of handling this).

For the reference, here are few things I tried with AppVeyor.

First, it does support "cache", see https://www.appveyor.com/docs/build-cache/.

In theory, you can build libraries once, cache them and have them for free next time you run the build.

Unfortunately, just to build LLVM from scratch you need big amount of time and there is 60 minutes build time limit for open-source projects, see "Build timeout" https://www.appveyor.com/docs/build-configuration/#build-timeout.

I did go further and tried to abuse AppVeyor cache system to also cache LLVM build files (since cache size limit is 1 GB for open-source projects), so, in theory, you would need to run few first builds that will take one hour each and finally build LLVM since results are cached every time. This is possible (I thought) with APPVEYOR_SAVE_CACHE_ON_ERROR, see "Saving cache for failed build" https://www.appveyor.com/docs/build-cache/#saving-cache-for-failed-build.

Unfortunately, they did good work and when build is canceled due to timeout, cache is not updated even if you set APPVEYOR_SAVE_CACHE_ON_ERROR=true.

For the reference, here is config I played with:

version: 1.0.{build}
image: Visual Studio 2017
environment:
  APPVEYOR_SAVE_CACHE_ON_ERROR: true
install:
- cmd: >-
    set llvm_folder=C:\llvm_local
    if not exist %llvm_folder%\llvm_built_flag set x_llvm=1
    if exist %llvm_folder%\llvm_built_flag set x_llvm=0
    if %x_llvm%==1 cd /d C:\
    if %x_llvm%==1 git clone --depth 1 --branch release/8.x https://github.com/llvm/llvm-project.git
    if %x_llvm%==1 cd llvm-project & mkdir build & cd build
    if %x_llvm%==1 cmake -DLLVM_ENABLE_PROJECTS=clang -DCMAKE_INSTALL_PREFIX=%llvm_folder% -G "Visual Studio 15 2017" -A x64 -Thost=x64 ..\llvm
    if %x_llvm%==1 cmake --build . --config Release --target install
    if %x_llvm%==1 cd .. & echo "built" > llvm_built_flag
cache:
- C:\llvm_local
- C:\llvm-project
build_script:
- cmd: >-
    set path=%path%;C:\Program Files\LLVM\bin
    set path=%path%;C:\llvm_local\bin
    cd /d %APPVEYOR_BUILD_FOLDER%
    mkdir build_appveyor && cd build_appveyor
    cmake -G "Visual Studio 15 2017" -A x64 ..
    cmake --build . --config Release --target insights

Another possible way of doing this was by using Vcpkg: https://github.com/microsoft/vcpkg.
But, again, there are same problems:

  • currently they have LLVM 7.0 and
  • Vcpkg needs to build libs first time and we still have 60 mins time limit.

@andreasfertig
Copy link
Owner

Hello @grishavanika,

thank you for exploring all this! It matches my research and my fears. I had the same options in mind you already explored. Maybe, we start with trying to use the ziglang binaries to have a CI. I plan to ask on the LLVM mailing list for the reason why the Window binaries do not come with the additional libraries. It looks like we are not the only ones missing them.

Andreas

@andreasfertig andreasfertig added the enhancement New feature or request label Jun 28, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants