<div dir="ltr">Just to close the thread on this (thanks everyone for the help!) I was able to get this working, but cheated a little bit. I looked into using Ninja to output the build commands but found that to be pretty complex. If you want to run Ninja at build time, then you need to compile Ninja from source in Bazel, which is just deferring the "build LLVM in Bazel" problem to another project. You could run Ninja manually to generate all the commands and then check them into source control for Bazel to use during build. This could work, but makes maintainability harder because you have a hidden dependency on Ninja and changing LLVM versions becomes more complicated. It's also tricky because you'd need to read the Ninja commands as input in order to deduce the output files which will be generated. Bazel wants to know it's output file names before it actually begins compiling anything in order to perform proper dependency management and optimizations. I think you'd need a tool to read the Ninja commands and generate a Skylark file which gets checked into source control for Bazel to use (maybe this is where TensorFlow's file comes from).<div><br></div><div>Regardless, I wanted to avoid all this complexity for my particular project, so I cheated a bit and just downloaded the pre-built binaries from <a href="http://releases.llvm.org">releases.llvm.org</a>. This included all the necessary headers, libraries, and tooling binaries (like `llc` which I also needed). I was able to link against this and build a simple "Hello World" language. I was also able to make some nice Bazel tooling pretty easily. It is a little counter to the way Bazel is supposed to work, as the intention is to compile everything from source, usually at head. Since LLVM has proper releases anyways this didn't seem too bad. Downloading the pre-built binaries is also much faster than building the entire codebase from source. The full example is <a href="https://github.com/dgp1130/llvm-bazel-foolang">here</a>. I was able to get this to work with LLVM 3.9.1, though trying a couple other versions had some missing definitions. I may just be missing a dependency somewhere.</div><div><br></div><div>Unfortunately, I was not able to find a good way to turn my Bazel code into a proper library. I'd love to set this up any project could just link to my repo as a repository rule and then just get LLVM as a <font face="monospace, monospace">cc_library(...)</font> they can depend upon. Unfortunately, I couldn't find a good way to do that. Maybe I'll reach out to the Bazel team about that if I have some time. I was also able to integrate this with <a href="https://github.com/dgp1130/sanity-lang">my original project</a>, so the custom toolchain is a little more fleshed out there with external symbol linking, end to end tests, etc.</div><div><br></div><div>Hopefully this is helpful to some future LLVM-Bazel-er.</div><div><br></div><div>Doug</div></div><br><div class="gmail_quote"><div dir="ltr">On Tue, Aug 28, 2018 at 1:05 PM Chris Bieneman <<a href="mailto:chris.bieneman@me.com">chris.bieneman@me.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto">The compile_commands.json file only contains compile commands, not table-gen invocations because those are “utility” commands to CMake.<div><br></div><div>-Chris<br><div><br>On Aug 16, 2018, at 1:28 PM, Douglas Parker via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br><br></div><blockquote type="cite"><div><div dir="auto">I tried running all the commands in the compile_commands.json (thanks for pointing that out), but it runs into the same "No such file or directory: *.inc". I don't see those files built anywhere in that list. Does it take tblgen into account?<div dir="auto"><br></div><div dir="auto">Doug</div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Aug 16, 2018, 1:02 PM Sanjoy Das <<a href="mailto:sanjoy@playingwithpointers.com" target="_blank">sanjoy@playingwithpointers.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">TensorFlow uses bazel to build LLVM:<br>
<a href="https://github.com/tensorflow/tensorflow/tree/master/third_party/llvm" rel="noreferrer noreferrer" target="_blank">https://github.com/tensorflow/tensorflow/tree/master/third_party/llvm</a><br>
The script that generates llvm.autogenerated.BUILD is not open sourced<br>
yet unfortunately but looking skimming through the generated file<br>
should give you a rough idea of what's involved.<br>
<br>
-- Sanjoy<br>
On Thu, Aug 16, 2018 at 11:16 AM Isaiah Norton via llvm-dev<br>
<<a href="mailto:llvm-dev@lists.llvm.org" rel="noreferrer" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br>
>><br>
>> You could look at the cmake+ninja (or other build system) build and dump the commands it executes (I think ninja produces a log, or can do so) which should show you all the commands needed to build any part of LLVM.<br>
><br>
><br>
> There's a switch to dump all compiler commands as a JSON file:<br>
><br>
> <a href="https://cmake.org/cmake/help/v3.12/variable/CMAKE_EXPORT_COMPILE_COMMANDS.html" rel="noreferrer noreferrer" target="_blank">https://cmake.org/cmake/help/v3.12/variable/CMAKE_EXPORT_COMPILE_COMMANDS.html</a><br>
><br>
> On Wed, Aug 15, 2018 at 8:30 PM David Blaikie via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" rel="noreferrer" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br>
>><br>
>><br>
>><br>
>> On Wed, Aug 15, 2018 at 2:05 PM Douglas Parker <<a href="mailto:dgp1130422@gmail.com" rel="noreferrer" target="_blank">dgp1130422@gmail.com</a>> wrote:<br>
>>><br>
>>> I believe it would be possible to run a cmake command to generate a BUILD file, though I don't know if that would be easier to maintain on the LLVM side. Would definitely be happy to see direct support, though I was just trying to figure out what's needed to hack this together on my end.<br>
>>><br>
>>> I guess my real question is what underlying commands are necessary to build all the source files (without actually compiling the C/C++)? If I can understand how to do this manually with terminal/cmake/tblgen, then I could probably get it to work with Bazel.<br>
>>><br>
>>> Looking at TensorFlow's setup, it looks like tblgen has dependencies on support which goes down to zlib and gets a lot of complexity there. I get the impression that tblgen isn't so complicated as to require all that. What would be the minimum steps to build tblgen from source?<br>
>><br>
>><br>
>> You could look at the cmake+ninja (or other build system) build and dump the commands it executes (I think ninja produces a log, or can do so) which should show you all the commands needed to build any part of LLVM.<br>
>><br>
>> But yeah, I think you do have to build support to build tblgen, to run tblgen to generate the rest of the files to continue the build.<br>
>><br>
>> - Dave<br>
>><br>
>>><br>
>>><br>
>>> Doug<br>
>>><br>
>>> On Wed, Aug 15, 2018 at 1:28 PM Chris Bieneman <<a href="mailto:chris.bieneman@me.com" rel="noreferrer" target="_blank">chris.bieneman@me.com</a>> wrote:<br>
>>>><br>
>>>> There have been discussions about adding a Bazel generator before:<br>
>>>> <a href="https://cmake.org/pipermail/cmake-developers/2017-July/030144.html" rel="noreferrer noreferrer" target="_blank">https://cmake.org/pipermail/cmake-developers/2017-July/030144.html</a><br>
>>>><br>
>>>> There does seem to be interest in having that support in CMake, and I can't imagine any insurmountable reason why it couldn't be done. The real issue is that nobody has put in the time to do it.<br>
>>>><br>
>>>> -Chris<br>
>>>><br>
>>>> On Aug 15, 2018, at 11:21 AM, David Blaikie via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" rel="noreferrer" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br>
>>>><br>
>>>><br>
>>>><br>
>>>> On Wed, Aug 15, 2018 at 10:04 AM Chris Lattner <<a href="mailto:clattner@nondot.org" rel="noreferrer" target="_blank">clattner@nondot.org</a>> wrote:<br>
>>>>><br>
>>>>><br>
>>>>><br>
>>>>> > On Aug 14, 2018, at 2:43 PM, David Blaikie via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" rel="noreferrer" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br>
>>>>> ><br>
>>>>> > Yeah - not sure we're quite at the point where LLVM wants to start supporting two build systems again (used to be Configure+Make and the CMake system, now it's just the Cmake system), but if you want to make it work out-of-tree it shouldn't be too difficult (Google does this internally with the internal version of Bazel). Writing a short BUILD extension for running tblgen should be possible without too much complexity - not sure what Tensorflow is doing that makes its solution so complicated, it doesn't seem like it should be terribly hard, just a genrule to run tblgen and generate the appropriate files from the td files.<br>
>>>>><br>
>>>>> Would it be technically possible for cmake to generate bazel files?  If so, it seems that that could be a great bridge, and useful to other projects as well.<br>
>>>><br>
>>>><br>
>>>> /maybe/? It's an interesting thought - not sure I know enough about either build system to have a very informed opinion here, though.<br>
>>>><br>
>>>> - Dave<br>
>>>><br>
>>>>><br>
>>>>><br>
>>>>> -Chris<br>
>>>>><br>
>>>> _______________________________________________<br>
>>>> LLVM Developers mailing list<br>
>>>> <a href="mailto:llvm-dev@lists.llvm.org" rel="noreferrer" target="_blank">llvm-dev@lists.llvm.org</a><br>
>>>> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
>>>><br>
>>>><br>
>> _______________________________________________<br>
>> LLVM Developers mailing list<br>
>> <a href="mailto:llvm-dev@lists.llvm.org" rel="noreferrer" target="_blank">llvm-dev@lists.llvm.org</a><br>
>> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
><br>
> _______________________________________________<br>
> LLVM Developers mailing list<br>
> <a href="mailto:llvm-dev@lists.llvm.org" rel="noreferrer" target="_blank">llvm-dev@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>
</div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>LLVM Developers mailing list</span><br><span><a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a></span><br><span><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a></span><br></div></blockquote></div></div></blockquote></div>