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

tc-build: Python rewrite #2

Merged
merged 85 commits into from
Apr 27, 2019
Merged
Show file tree
Hide file tree
Changes from 63 commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
9a4ffa9
Initial skeleton
msfjarvis Apr 15, 2019
9a1ee12
build.py: Rename to build-llvm.py and make executable
nathanchance Apr 15, 2019
fa0208d
build-llvm.py: Use a more generic python3 shebang
nathanchance Apr 15, 2019
16e3ea1
build-llvm.py: Set defaults, fix '-i' type, and remove debug prints
nathanchance Apr 16, 2019
4af4a46
build-llvm.py: Add check_dependencies function
nathanchance Apr 16, 2019
e1502a3
utils.py: Create and use
nathanchance Apr 16, 2019
8a60208
build-llvm.py: Implement most of check_cc_ld_variables
nathanchance Apr 16, 2019
d715e7a
tc-build: Implement fetch_llvm_binutils
nathanchance Apr 16, 2019
3d3b58f
build-llvm.py: Implement cleanup
nathanchance Apr 16, 2019
b405c5c
build-llvm.py: Implement invoke_cmake
nathanchance Apr 16, 2019
26a3a28
build-llvm.py: Implement invoke_ninja
nathanchance Apr 16, 2019
e008cae
build-llvm.py: Remove pass statement
nathanchance Apr 16, 2019
fd31fcc
build-binutils.py: Add skeleton
nathanchance Apr 16, 2019
72c09d1
build-binutils.py: Implement parse_parameters
nathanchance Apr 16, 2019
c13fdb8
build-binutils.py: Implement create_tuples
nathanchance Apr 16, 2019
ea718e9
tc-build: Ditch os / os.path for pathlib wherever possible
nathanchance Apr 16, 2019
3984ecb
utils.py: Don't use colorama, just print the raw escape codes
nathanchance Apr 16, 2019
bc86c90
build-llvm.py: Implement clang_version check
nathanchance Apr 16, 2019
33dd379
build-llvm.py: Fix help text formatting
nathanchance Apr 16, 2019
370f6b2
build-llvm.py: Properly handle '-I' relative paths
nathanchance Apr 16, 2019
5c7f08a
build-llvm.py: Don't print out header if '-n' was supplied
nathanchance Apr 16, 2019
38a1880
build-binutils.py: Improve path handling
nathanchance Apr 16, 2019
445a931
build-binutils.py: Finish implementing the rest of the script
nathanchance Apr 16, 2019
d54a7e0
build-binutils.py: Fix shebang
nathanchance Apr 16, 2019
75385f3
tc-build: Add header comments and LICENSE file
nathanchance Apr 16, 2019
b6a1476
build-binutils.py: Fix powerpc64le tuple
nathanchance Apr 17, 2019
1cc5af0
README.md: Update
nathanchance Apr 17, 2019
6c70a32
build-llvm.py: Add comments
nathanchance Apr 17, 2019
40228bf
build-llvm.py: Add final installation information
nathanchance Apr 17, 2019
e37d635
utils.py: Remove blank print lines
nathanchance Apr 17, 2019
4be375a
utils.py: Add comments
nathanchance Apr 17, 2019
02f5492
tc-build: Format using yapf using Google's style
nathanchance Apr 17, 2019
5bc5437
utils.py: Remove unused exports
nathanchance Apr 17, 2019
ce779fb
build-llvm.py: Remove unused import
nathanchance Apr 17, 2019
881946f
build-llvm.py: Wrap long comment
nathanchance Apr 17, 2019
8ba8685
utils.py: Fix weird linting with a variable
nathanchance Apr 17, 2019
57e44fc
build-binutils.py: Improve host target handling
nathanchance Apr 17, 2019
c0bf810
build-binutils.py: Improve help text slightly
nathanchance Apr 17, 2019
f7466ad
tc-build: Dynamically hide binutils folder
nathanchance Apr 17, 2019
434d9d6
build-binutils.py: Remove hyphens from target checks in invoke_configure
nathanchance Apr 17, 2019
71b3f36
README.md: Fix spelling
nathanchance Apr 17, 2019
0f3395f
github: Add bug report issue template
nathanchance Apr 17, 2019
687574f
Rename functions based on review comments
msfjarvis Apr 17, 2019
6cdc0d1
Reformat with yapf
msfjarvis Apr 17, 2019
19016b4
build-binutils: Break down if-else ladder
msfjarvis Apr 17, 2019
6100a73
Remove license from individual files
msfjarvis Apr 17, 2019
18cca8b
build-llvm: Properly initialize defines dict
msfjarvis Apr 17, 2019
8d0b0da
build-llvm: Additional style fixes
msfjarvis Apr 17, 2019
38f1c4b
build-llvm: Suppress referenced-before-assignment errors
msfjarvis Apr 17, 2019
cc3f7ff
build-llvm: Use upstream Linux clang-version script
msfjarvis Apr 17, 2019
636d2f6
build-binutils: Cleanup target_list population
msfjarvis Apr 17, 2019
846e0e8
build-llvm: Convert function comments to docstrings
msfjarvis Apr 17, 2019
facb853
build-binutils: Convert function comments to docstrings
msfjarvis Apr 17, 2019
2a7fe17
utils: Convert function comments to docstrings
msfjarvis Apr 17, 2019
cc8f489
build-binutils: Reformat dictionary init
msfjarvis Apr 17, 2019
0358cf1
build-llvm.py: Add some comments with links for options
nathanchance Apr 17, 2019
6bfdb84
build-llvm.py: Add missing LLVM_INCLUDE_TESTS value
nathanchance Apr 17, 2019
3c86b65
utils: Split out checksum verification into separate function
msfjarvis Apr 17, 2019
e019b68
build-llvm: Change default install folder to 'build'
msfjarvis Apr 17, 2019
0bb8560
build-binutils: Properly handle --targets
msfjarvis Apr 17, 2019
a9db8b0
build-llvm.py: Add a new line between build duration and installation…
nathanchance Apr 18, 2019
fbf2d31
.gitignore: Remove leading slashes
nathanchance Apr 18, 2019
60a1367
build-llvm.py: Add classes to slim down arguments in invoke_cmake
nathanchance Apr 18, 2019
dbbece4
build-llvm.py: Tell YAPF not to try and format the cmake defines
nathanchance Apr 18, 2019
7ab0e7f
build-llvm.py: Move dirs assignment closer to use
nathanchance Apr 19, 2019
367aad7
build-llvm.py: Eliminate unnecessary assignment for cc, cxx, and ld
nathanchance Apr 19, 2019
df716ae
tc-build: Remove unnecessary copyright comments
nathanchance Apr 19, 2019
7e4f9ca
utils.py: Further document why create_gitignore exists
nathanchance Apr 19, 2019
9ca5833
build-llvm.py: Remove explicit 'utf-8' parameter to decode()
nathanchance Apr 19, 2019
574e851
build-llvm.py: Run YAPF
nathanchance Apr 19, 2019
990af6d
build-llvm.py: Use strip() instead of rstrip()
nathanchance Apr 20, 2019
b58bab0
build-llvm.py: Use subprocess.run and return returncode directly
nathanchance Apr 20, 2019
3fc3254
build-llvm.py: Don't use negated branches in check_cc_ld_variables
nathanchance Apr 20, 2019
ebc14d2
utils.py: Use double quotes and add comments explaining escape codes
nathanchance Apr 20, 2019
c18e269
utils.py: Use format specifier in print_header
nathanchance Apr 21, 2019
6c49b7a
build-binutils.py: Simplify create_targets a bit
nathanchance Apr 22, 2019
aff3e18
build-binutils.py: Make targets list a set initially in create_targets
nathanchance Apr 22, 2019
51670aa
build-binutils.py: Avoid crash when 'all' is not specified first
nathanchance Apr 22, 2019
c912e50
build-binutils.py: Remove duplicate '--target' and '--program-prefix'…
nathanchance Apr 22, 2019
3d3b6c2
build-binutils.py: Use '%' operator in invoke_configure
nathanchance Apr 22, 2019
82a437e
build-binutils.py: Make architecture configure flags a dictionary
nathanchance Apr 22, 2019
5e69eb2
build-llvm.py: Fix running the script outside of the repo
nathanchance Apr 25, 2019
0bbcbfa
build-binutils: Correct docstring grammar
msfjarvis Apr 26, 2019
7037bc6
build-binutils: Collapse host_arch_target return
msfjarvis Apr 26, 2019
08e1c72
build-llvm.py: Avoid crash in clang_version with Python 3.5
nathanchance Apr 27, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
---
name: Bug report
about: Something isn't working properly
title: ''
label: ''
assignees: ''

---

**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

**Expected behavior**
A clear and concise description of what you expected to happen.

**Screenshots**
If applicable, add screenshots to help explain your problem.

**Environment (please complete the following information):**
- Command you ran: [e.g. `./build-llvm.py`]
- Distribution: [e.g. Debian stretch or Arch Linux]
- Python version: [e.g. 3.7.3]
- Shell: [e.g. zsh]
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
/.idea/
/venv/
*.pyc
llvm-project/
build/
201 changes: 201 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.

"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.

"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:

(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and

(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and

(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and

(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.

You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.

Copyright 2019 The ClangBuiltLinux Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
63 changes: 61 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,61 @@
# tc-build
A set of scripts to build LLVM and binutils
# Toolchain build scripts

There are times where a tip of tree LLVM build will have some issue fixed and it isn't available to you, maybe because it isn't in a release or it isn't available through your distribution's package management system. At that point, to get that fix, LLVM needs to be compiled, which sounds scary but is [rather simple](https://llvm.org/docs/GettingStarted.html). The `build-llvm.py` script takes it a step farther by trying to optimize both LLVM's build time by:

* Trimming down a lot of things that kernel developers don't care about:
* Documentation
* LLVM tests
* Ocaml bindings
* libfuzzer
* Building with the faster tools available (in order of fastest to slowest):
* clang + lld
* clang/gcc + ld.gold
* clang/gcc + ld.bfd

It also aims to make kernel compilation go a little bit faster by generating a toolchain that is optimized for the host CPU (using `-O2 -march=native -mtune=native`).

## Getting started

These scripts have been tested in a Docker image of the following distributions, with the following packages installed:

* ### Debian/Ubuntu

```
apt install ca-certificates ccache clang cmake curl file gcc g++ git make ninja-build python3 texinfo zlib1g-dev
```

On Debian Buster or Ubuntu Bionic/Cosmic/Disco, `apt install lld` should be added as well for faster compiles.

* ### Fedora

```
dnf install ccache clang cmake gcc gcc-c++ git lld make ninja-build python3 zlib-devel
```

* ### Arch Linux

```
pacman -S base-devel ccache clang cmake git lld ninja python3
```

Python 3.5.3+ is recommended, as that is what the script has been tested against. These scripts should be distribution agnostic. Please feel free to add different distribution install commands here through a pull request.

## build-llvm.py

By default, `./build-llvm.py` will clone LLVM, grab the latest binutils tarball (for the LLVMgold.so plugin), and build LLVM, clang, and lld, and install them into `build`. Run `./build-llvm.py -h` for more options.

## build-binutils.py

This script builds a standalone copy of binutils. By default, `./build-binutils.py` will download binutils 2.32, build for all architectures we currently care about (arm32, aarch64, powerpc32, powerpc64le, and x86_64), and install them into `build`. Run `./build-binutils.py -h` for more options.

Building a standalone copy of binutils might be needed because certain distributions like Arch Linux (whose options the script uses) might symlink `/usr/lib/LLVMgold.so` to `/usr/lib/bfd-plugins` ([source](https://bugs.archlinux.org/task/28479)), which can cause issues when using the system's linker for LTO (even with `LD_LIBRARY_PATH`):

```
bfd plugin: LLVM gold plugin has failed to create LTO module: Unknown attribute kind (60) (Producer: 'LLVM9.0.0svn' Reader: 'LLVM 7.0.1')
```

Having a standalone copy of binutils (ideally in the same folder at the LLVM toolchain so that only one `PATH` modification is needed) works around this without any adverse side effects. Another workaround is bind mounting the new `LLVMgold.so` to `/usr/lib/LLVMgold.so`.

## Getting help

Please open an issue on this repo and include your distribution, shell, the command you ran, and the error output.
nathanchance marked this conversation as resolved.
Show resolved Hide resolved
Loading