Skip to content

Commit

Permalink
Support canonical github.com/llvm/llvm-project repo (ponylang#3014)
Browse files Browse the repository at this point in the history
This repo is the official github repo for LLVM.
  • Loading branch information
winksaville authored and jemc committed Feb 21, 2019
1 parent c42ccd3 commit 66c3947
Show file tree
Hide file tree
Showing 9 changed files with 168 additions and 83 deletions.
4 changes: 2 additions & 2 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -227,15 +227,15 @@ jobs:
user: pony
steps:
- checkout
- run: echo 'export test_ci_params="config=debug default_pic=true llvm_proj=llvm-6.0.0"' >> $BASH_ENV
- run: echo 'export test_ci_params="config=debug default_pic=true llvm_target=llvm-6.x"' >> $BASH_ENV
- run: *test-ci-lib-llvm
lib-llvm-ubuntu-llvm-600-release:
docker:
- image: ponylang/ponyc-ci:ubuntu
user: pony
steps:
- checkout
- run: echo 'export test_ci_params="config=release default_pic=true llvm_proj=llvm-6.0.0"' >> $BASH_ENV
- run: echo 'export test_ci_params="config=release default_pic=true llvm_target=llvm-6.x"' >> $BASH_ENV
- run: *test-ci-lib-llvm
lib-llvm-alpine-debug:
docker:
Expand Down
4 changes: 2 additions & 2 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[submodule "lib/llvm/src"]
path = lib/llvm/src
url = https://github.com/ponylang/llvm.git
branch = release_39
url = https://github.com/llvm/llvm-project
branch = release/3.9.x
43 changes: 29 additions & 14 deletions Makefile-lib-llvm
Original file line number Diff line number Diff line change
Expand Up @@ -4,56 +4,64 @@
# first.
#
# The default target of this makefile builds llvm defined by the submodule,
# which is currently llvm-3.9.1. You may also build lvm-6.0.0 by using
# llvm_proj=llvm-6.0.0. In addition, if you specify llvm_proj=llvm-current
# which is currently llvm-3.9.1. You may also build lvm-7.x by using
# llvm_target=llvm-7.x. In addition, if you specify llvm_target=llvm-current
# then lib/llvm/src will not be altered but will be built.
#
# In the future compiling lib/llvm will be incorporated into Makefile
# and Makefile-lib-llvm will be removed.

config ?= release

root_dir := $(shell pwd)
llvm_dir := $(root_dir)/lib/llvm
llvm_proj :=
llvm_target :=

ifneq ($(llvm_proj),)
$(error "llvm_proj is not named llvm_target")
endif

pony_lib_llvm := $(llvm_dir)
llvm_config := $(pony_lib_llvm)/dist/bin/llvm-config
llvm_build_type := LLVM_BUID_TYPE=Debug
llvm_build_type := Release
new_path := $(pony_lib_llvm)/dist/bin:$(PATH)
llvm_project_list :=

pony_targets := libponyc libponyrt libponyrt-pic libponyc.tests libponyrt.tests libponyc.benchmarks
pony_targets += libponyrt.benchmarks ponyc benchmark install uninstall stats test all
pony_targets += stdlib test-stdlib stdlib-debug test-stdlib-debug test-examples test-ci docs-online

.PHONY: $(pony_targets)
$(pony_targets): $(llvm_config)
@PATH=$(new_path) $(MAKE) -f Makefile-ponyc LLVM_CONFIG=$(llvm_config) $(MAKECMDGOALS) $(MAKEFLAGS)
@PATH=$(new_path) $(MAKE) -f Makefile-ponyc config=$(config) $(MAKECMDGOALS) $(MAKEFLAGS)

.PHONY: $(llvm_config)
$(llvm_config):
@$(MAKE) -C $(pony_lib_llvm) $(llvm_build_type) $(llvm_proj)
@$(MAKE) -C $(pony_lib_llvm) LLVM_BUILD_TYPE=$(llvm_build_type) $(llvm_target) LLVM_PROJECT_LIST="$(llvm_project_list)"

# Clean is needed otherwise the rebuild of llvm won't be linked
.PHONY: rebuild
rebuild: clean
@$(MAKE) -C $(pony_lib_llvm) $(llvm_build_type) rebuild
@PATH=$(new_path) $(MAKE) -f Makefile-ponyc LLVM_CONFIG=$(llvm_config) $(MAKEFLAGS)
@PATH=$(new_path) $(MAKE) -f Makefile-ponyc config=$(config) $(MAKEFLAGS)

# Clean is needed otherwise the rebuild of llvm won't be linked
.PHONY: rebuild-test
rebuild-test: clean
@$(MAKE) -C $(pony_lib_llvm) $(llvm_build_type) rebuild
@PATH=$(new_path) $(MAKE) -f Makefile-ponyc LLVM_CONFIG=$(llvm_config) test $(MAKEFLAGS)
@PATH=$(new_path) $(MAKE) -f Makefile-ponyc config=$(config) test $(MAKEFLAGS)

# Rebuild and then run some tests as passed in the command line parameter gtest_filter.
# Note, the clean is needed otherwise the rebuild of llvm won't be linked.
#
# For example:
# $ time CC=clang CXX=clang++ make -j10 -f Makefile-lib-llvm \
# verbose=1 config=debug default_pic=true default_ssl=openssl_1.1.0 llvm_proj=llvm-current rebuild-some-tests \
# verbose=1 config=debug default_pic=true default_ssl=openssl_1.1.0 llvm_target=llvm-current rebuild-some-tests \
# gtest_filter=--gtest_filter=CodegenOptimisationTest.MergeSendMessageReordering 2>&1 | tee clang-rebuild-some-tests.txt
.PHONY: rebuild-some-tests
rebuild-some-tests: clean
@$(MAKE) -C $(pony_lib_llvm) $(llvm_build_type) rebuild
@PATH=$(new_path) $(MAKE) -f Makefile-ponyc LLVM_CONFIG=$(llvm_config) $(MAKEFLAGS)
@$(MAKE) -C $(pony_lib_llvm) LLVM_BUILD_TYPE=$(llvm_build_type) rebuild
@PATH=$(new_path) $(MAKE) -f Makefile-ponyc config=$(config) $(MAKEFLAGS)
@$(MAKE) -f Makefile-lib-llvm some-tests

# Run the some passing gtest_filter on command line, for example:
Expand All @@ -65,7 +73,7 @@ some-tests:
# Clean just ponyc
.PHONY: clean
clean:
@PATH=$(new_path) $(MAKE) -f Makefile-ponyc clean
@PATH=$(new_path) $(MAKE) -f Makefile-ponyc config=$(config) clean

# Clean ponyc and lib/llvm
.PHONY: clean-all
Expand Down Expand Up @@ -95,10 +103,17 @@ help:
@echo ' where Name is one of:'
@echo ' openssl_0.9.0 (default)'
@echo ' openssl_1.1.0'
@echo ' llvm_proj=Proj Make llvm where Proj is one of:'
@echo ' llvm_target=Target Make llvm where Target is one of:'
@echo ' llvm-3.9.1 (default if not specified)'
@echo ' llvm-6.0.0'
@echo ' llvm-6.x'
@echo ' llvm-7.x'
@echo ' llvm-current'
@echo ' llvm-default'
@echo ' LLVM_BUILD_TYPE=x Build type with x='
@echo ' Release (default)'
@echo ' Debug'
@echo ' RelWithDebInfo'
@echo ' MinSizeRel'
@echo
@echo 'USE OPTIONS:'
@echo ' valgrind'
Expand Down
2 changes: 2 additions & 0 deletions Makefile-ponyc
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,8 @@ else ifeq ($(llvm_version),6.0.1)
$(warning WARNING: LLVM 6 support is experimental and may result in decreased performance or crashes)
else ifeq ($(llvm_version),7.0.1)
$(warning WARNING: LLVM 7 support is experimental and may result in decreased performance or crashes)
else ifeq ($(llvm_version),7.1.0)
$(warning WARNING: LLVM 7 support is experimental and may result in decreased performance or crashes)
else
$(warning WARNING: Unsupported LLVM version: $(llvm_version))
$(warning Please use LLVM 3.9.1)
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ When building ponyc from sources the LLVM installed on your system is used by de

### Instructions:

To compile Pony using LLVM sources on Linux add `-f Makefile-lib-llvm` to any of the examples below. For instance on Ubuntu the standard command line is simply `make`, to build ponyc using LLVM from sources the command line is `make -f Makefile-lib-llvm`. Alternatively you can create a symlink from Makefile to Makefile-lib-llvm, `ln -sf Makefile-lib-llvm Makefile`, and no changes would be needed to the commands. You can specify `llvm_proj=llvm-6.0.0` on the command line and those sources will be used. For example `make -f Makefile-lib-llvm llvm_proj=llvm-6.0.0`.
To compile Pony using LLVM sources on Linux add `-f Makefile-lib-llvm` to any of the examples below. For instance on Ubuntu the standard command line is simply `make`, to build ponyc using LLVM from sources the command line is `make -f Makefile-lib-llvm`. Alternatively you can create a symlink from Makefile to Makefile-lib-llvm, `ln -sf Makefile-lib-llvm Makefile`, and no changes would be needed to the commands. You can specify `llvm_target=llvm-6.0.0` on the command line and those sources will be used. For example `make -f Makefile-lib-llvm llvm_target=llvm-6.0.0`.

Typically you only need to build the LLVM sources once, as the `make clean` target does not cause the LLVM sources to be rebuilt. To rebuild everything use `make -f Makefile-lib-llvm clean-all && `make -f Makefile-lib-llvm`. There is also a distclean target, `make -f Makefle-lib-llvm distclean`, which will remove the llvm sources and they will be retrieved from the ponylang/llvm repo.

Expand Down
1 change: 0 additions & 1 deletion lib/llvm/.gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
/build/
/dist/
/built-*
/installed-*
Expand Down
173 changes: 116 additions & 57 deletions lib/llvm/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
# A valid target is:
# clean
# distclean
# llvm-6.0.0
# llvm-7.x
# llvm-6.x
# llvm-3.9.1
# llvm-default
# llvm-current
Expand All @@ -23,63 +24,102 @@
# successful.
#
# Based on [yurydelendik wasmllvm](https://gist.github.com/yurydelendik/4eeff8248aeb14ce763e)
#

ROOT_DIR := $(shell pwd)
LLVM_URL := https://github.com/ponylang/llvm.git
LLVM_URL := https://github.com/llvm/llvm-project.git

ifeq (,$(MAKECMDGOALS))
MAKECMDGOALS := llvm-default
endif

#$(warning MAKECMDGOALS=$(MAKECMDGOALS))
$(warning "lib/llvm/Makefile MAKECMDGOALS=$(MAKECMDGOALS)")

ifeq ($(MAKECMDGOALS),rebuild)
LLVM_PROJ := llvm-current
LLVM_TARGET := llvm-current
GET_LLVM_SRC_TARGET := get-nothing
LLVM_SRC_DEPTH :=
LLVM_BRANCH :=
else ifeq ($(MAKECMDGOALS),clean)
# Nothing to init
else ifeq ($(MAKECMDGOALS),distclean)
# Nothing to init
else ifeq ($(MAKECMDGOALS),llvm-6.0.0)
LLVM_PROJ := llvm-6.0.0
GET_LLVM_SRC_TARGET := get-llvm-src-$(LLVM_PROJ)
else ifeq ($(MAKECMDGOALS),llvm-7.x)
LLVM_TARGET := llvm-7.x
GET_LLVM_SRC_TARGET := get-llvm-src-$(LLVM_TARGET)
LLVM_SRC_DEPTH := --depth=1
LLVM_BRANCH := -b release/7.x
else ifeq ($(MAKECMDGOALS),llvm-6.x)
LLVM_TARGET := llvm-6.x
GET_LLVM_SRC_TARGET := get-llvm-src-$(LLVM_TARGET)
LLVM_SRC_DEPTH := --depth=1
LLVM_BRANCH := -b release_60
LLVM_BRANCH := -b release/6.x
else ifeq ($(MAKECMDGOALS),llvm-3.9.1)
LLVM_PROJ := llvm-3.9.1
GET_LLVM_SRC_TARGET := get-llvm-src-$(LLVM_PROJ)
LLVM_TARGET := llvm-3.9.1
GET_LLVM_SRC_TARGET := get-llvm-src-$(LLVM_TARGET)
LLVM_SRC_DEPTH := --depth=1
LLVM_BRANCH := -b release_39
LLVM_BRANCH := -b release/3.9.x
else ifeq ($(MAKECMDGOALS),llvm-current)
LLVM_PROJ := llvm-current
LLVM_TARGET := llvm-current
GET_LLVM_SRC_TARGET := get-nothing
LLVM_SRC_DEPTH :=
LLVM_BRANCH :=
else ifeq ($(MAKECMDGOALS),llvm-default)
LLVM_PROJ := llvm-default
$(warning llvm-default.....)
LLVM_TARGET := llvm-default
GET_LLVM_SRC_TARGET := get-default-llvm-src
LLVM_SRC_DEPTH := --depth=1
LLVM_URL :=
LLVM_BRANCH :=
else
$(error Uknown target '$(MAKECMDGOALS)', someone did not pass a goal)
else ifeq ($(MAKECMDGOALS),buildit)
$(warning "lib/llvm/Makefile buildit LLVM_TARGET=$(LLVM_TARGET)")
$(warning "lib/llvm/Makefile buildit LLVM_SRC_DIR=$(LLVM_SRC_DIR)")
$(warning "lib/llvm/Makefile buildit LLVM_BUILD_DIR=$(LLVM_BUILD_DIR)")
# Nothing to init
else ifeq ($(MAKECMDGOALS),installit)
# Nothing to init
$(warning "lib/llvm/Makefile installit LLVM_TARGET=$(LLVM_TARGET)")
$(warning "lib/llvm/Makefile installit LLVM_SRC_DIR=$(LLVM_SRC_DIR)")
$(warning "lib/llvm/Makefile installit LLVM_BUILD_DIR=$(LLVM_BUILD_DIR)")
else ifeq ($(MAKECMDGOALS),generateit)
$(warning "lib/llvm/Makefile generateit LLVM_TARGET=$(LLVM_TARGET)")
$(warning "lib/llvm/Makefile generateit LLVM_SRC_DIR=$(LLVM_SRC_DIR)")
$(warning "lib/llvm/Makefile generateit LLVM_BUILD_DIR=$(LLVM_BUILD_DIR)")
# Nothing to init
else ifeq ($(MAKECMDGOALS),clean)
# Nothing to init
else ifeq ($(MAKECMDGOALS),distclean)
# Nothing to init
#else
# $(error Uknown target '$(MAKECMDGOALS)', someone did not pass a goal)
endif

LLVM_SRC_DIR := $(ROOT_DIR)/src
LLVM_BUILD_DIR := $(ROOT_DIR)/build
LLVM_INSTALL_DIR := $(ROOT_DIR)/dist

LLVM_BUILD_ENGINE := "Unix Makefiles"
LLVM_BUILD_TYPE := Release
LLVM_INSTALL_DIR := $(ROOT_DIR)/dist

LLVM_LINKER := bfd
ifeq (llvm-3.9.1,$(LLVM_PROJ))
# 3.9.1 doesn't supprot -DLLVM_USE_LINKER so make it empty to supress a warning
LLVM_USE_LINKER=
#ifeq (llvm-3.9.1,$(LLVM_TARGET))
# # 3.9.1 doesn't supprot -DLLVM_USE_LINKER so make it empty to supress a warning
# LLVM_USE_LINKER :=
#else
# LLVM_USE_LINKER := -DLLVM_USE_LINKER=$(LLVM_LINKER)
#endif
LLVM_USE_LINKER := -DLLVM_USE_LINKER=$(LLVM_LINKER)

$(warning "lib/llvm/Makefile: LLVM_PROJECT_LIST=$(LLVM_PROJECT_LIST)")
ifeq ($(LLVM_PROJECT_LIST),all)
PROJECT_LIST = clang;clang-tools-extra;libcxx;libcxxabi;libunwind;compiler-rt;lld;lldb;polly;debuginfo-tests
else ifneq ($(LLVM_PROJECT_LIST),)
PROJECT_LIST = $(LLVM_PROJECT_LIST)
else
LLVM_USE_LINKER=-DLLVM_USE_LINKER=$(LLVM_LINKER)
PROJECT_LIST =
endif
$(warning "lib/llvm/Makefile: PROJECT_LIST=$(PROJECT_LIST)")

ifneq ($(PROJECT_LIST),)
LLVM_ENABLE_PROJECTS := -DLLVM_ENABLE_PROJECTS="$(PROJECT_LIST)"
else
LLVM_ENABLE_PROJECTS :=
endif

ifeq ($(LLVM_BUILD_ENGINE),Ninja)
Expand All @@ -94,56 +134,75 @@ ifneq (,$(verbose))
VERBOSE_CMAKE := -DCMAKE_VERBOSE_MAKEFILE=true
endif

$(LLVM_PROJ): built-llvm-$(LLVM_PROJ)
$(LLVM_TARGET): installed-llvm-$(LLVM_TARGET)
@echo "hi installed $(LLVM_TARGET)"

.PHONY: rebuild
rebuild: clean-built-installed
@echo building $(LLVM_PROJ) `git -C src log -1 --pretty="format:hash=%h ref=%d subject=%s"`
$(MAKE) -C $(LLVM_BUILD_DIR)
touch built-llvm-$(LLVM_PROJ)
@echo installing $(LLVM_PROJ)
$(MAKE) -C $(LLVM_BUILD_DIR) install
touch installed-llvm-$(LLVM_PROJ)
make installed-llvm-$(LLVM_TARGET) LLVM_TARGET=$(LLVM_TARGET) LLVM_SRC_DIR=$(LLVM_SRC_DIR) LLVM_BUILD_DIR=$(LLVM_BUILD_DIR)

.PHONY: clean
clean: clean-except-get
.PHONY: buildit
buildit:
@echo building $(LLVM_TARGET) `git -C src log -1 --pretty="format:hash=%h ref=%d subject='%s'"`
$(MAKE) -C $(LLVM_BUILD_DIR)
touch built-llvm-$(LLVM_TARGET)

.PHONY: distclean
distclean: clean-except-get
rm -rf $(LLVM_SRC_DIR)
rm -f get-*
.PHONY: installit
installit:
@echo installing $(LLVM_TARGET)
$(MAKE) -C $(LLVM_BUILD_DIR) install
touch installed-llvm-$(LLVM_TARGET)

.PHONY: clean-except-get
clean-except-get: clean-built-installed
rm -rf $(LLVM_BUILD_DIR) $(LLVM_INSTALL_DIR)
.PHONY: generateit
generateit:
@echo generate $(LLVM_TARGET) `git -C src log -1 --pretty="format:hash=%h ref=%d"`
mkdir -p $(LLVM_BUILD_DIR)
cd $(LLVM_BUILD_DIR); cmake -G $(LLVM_BUILD_ENGINE) $(VERBOSE_CMAKE) $(LLVM_USE_LINKER) $(LLVM_ENABLE_PROJECTS) -DCMAKE_INSTALL_PREFIX=$(LLVM_INSTALL_DIR) -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly -DCMAKE_BUILD_TYPE=$(LLVM_BUILD_TYPE) $(LLVM_SRC_DIR)/llvm
touch $(LLVM_BUILD_DIR)/generated-llvm-makefile-$(LLVM_TARGET)

.PHONY: clean-built-installed
clean-built-installed:
rm -f built-* installed-*
$(LLVM_BUILD_DIR)/generated-llvm-makefile-$(LLVM_TARGET): $(GET_LLVM_SRC_TARGET)
make generateit LLVM_TARGET=$(LLVM_TARGET) LLVM_SRC_DIR=$(LLVM_SRC_DIR) LLVM_BUILD_DIR=$(LLVM_BUILD_DIR)

built-llvm-$(LLVM_PROJ): $(LLVM_BUILD_DIR)/generated-llvm-makefile-$(LLVM_PROJ)
$(MAKE) rebuild
ifeq ($(MAKE),ninja)
built-llvm-$(LLVM_TARGET): $(LLVM_BUILD_DIR)/generated-llvm-makefile-$(LLVM_TARGET)
make buildit LLVM_TARGET=$(LLVM_TARGET) LLVM_SRC_DIR=$(LLVM_SRC_DIR) LLVM_BUILD_DIR=$(LLVM_BUILD_DIR)
else
built-llvm-$(LLVM_TARGET): $(LLVM_BUILD_DIR)/generated-llvm-makefile-$(LLVM_TARGET)
$(MAKE) buildit LLVM_TARGET=$(LLVM_TARGET) LLVM_SRC_DIR=$(LLVM_SRC_DIR) LLVM_BUILD_DIR=$(LLVM_BUILD_DIR)
endif

$(LLVM_BUILD_DIR)/generated-llvm-makefile-$(LLVM_PROJ): $(GET_LLVM_SRC_TARGET)
@echo generate $(LLVM_PROJ) `git -C src log -1 --pretty="format:hash=%h ref=%d subject=%s"`
mkdir -p $(LLVM_BUILD_DIR)
cd $(LLVM_BUILD_DIR); cmake -G $(LLVM_BUILD_ENGINE) $(VERBOSE_CMAKE) $(LLVM_USE_LINKER) -DCMAKE_INSTALL_PREFIX=$(LLVM_INSTALL_DIR) -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly -DCMAKE_BUILD_TYPE=$(LLVM_BUILD_TYPE) $(LLVM_SRC_DIR)
touch $(LLVM_BUILD_DIR)/generated-llvm-makefile-$(LLVM_PROJ)
installed-llvm-$(LLVM_TARGET): built-llvm-$(LLVM_TARGET)
make installit LLVM_TARGET=$(LLVM_TARGET) LLVM_SRC_DIR=$(LLVM_SRC_DIR) LLVM_BUILD_DIR=$(LLVM_BUILD_DIR)

.PHONY: get-nothing
get-nothing: clean

get-default-llvm-src:
@echo get-default-llvm-src
$(MAKE) clean
rm -rf $(LLVM_SRC_DIR)
mkdir $(LLVM_SRC_DIR)
git submodule init
git submodule update $(LLVM_SRC_DEPTH)
git submodule update --init $(LLVM_SRC_DEPTH)
touch get-default-llvm-src

get-llvm-src-$(LLVM_PROJ):
@echo get-llvm-src-$(LLVM_PROJ)
$(MAKE) clean
get-llvm-src-$(LLVM_TARGET):
@echo get-llvm-src-$(LLVM_TARGET)
rm -rf $(LLVM_SRC_DIR)
mkdir $(LLVM_SRC_DIR)
git clone $(LLVM_BRANCH) $(LLVM_SRC_DEPTH) $(LLVM_URL) $(LLVM_SRC_DIR)
touch get-llvm-src-$(LLVM_PROJ)
touch get-llvm-src-$(LLVM_TARGET)

.PHONY: clean
clean: clean-except-get

.PHONY: distclean
distclean: clean-except-get
rm -rf $(LLVM_SRC_DIR)/* $(LLVM_SRC_DIR)/.*
rm -f get-*

.PHONY: clean-except-get
clean-except-get: clean-built-installed
rm -rf $(LLVM_BUILD_DIR) $(LLVM_INSTALL_DIR)

.PHONY: clean-built-installed
clean-built-installed:
rm -f built-* installed-*
Loading

0 comments on commit 66c3947

Please sign in to comment.