Skip to content

Commit

Permalink
[sdks] Add cmake toolchain file for LLVM MXE builds (#11056)
Browse files Browse the repository at this point in the history
We couldn't compile llvmwin{32,64} on Linux because we would try to use {i686,x86_64}-w64-mingw-cmake but it wouldn't exist.
  • Loading branch information
luhenry committed Oct 11, 2018
1 parent 46b723d commit 2343f26
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 18 deletions.
2 changes: 2 additions & 0 deletions sdks/builds/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,5 @@ bcl/
desktop-x86/
desktop-x86_64/
toolchains/
mxe-Win32.cmake
mxe-Win64.cmake
36 changes: 18 additions & 18 deletions sdks/builds/llvm.mk
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ llvm_CMAKE_FLAGS = \
# Parameters
# $(1): version
# $(2): target
# $(3): configure script
# $(3): src
define LLVMProvisionTemplate
_$(1)-$(2)_HASH = $$(shell git -C $$(dir $(3)) rev-parse HEAD)
_$(1)-$(2)_HASH = $$(shell git -C $(3) rev-parse HEAD)
_$(1)-$(2)_PACKAGE = $(1)-$(2)-$$(_$(1)-$(2)_HASH)-$$(UNAME).tar.gz
_$(1)-$(2)_URL = "http://xamjenkinsartifact.blob.core.windows.net/mono-sdks/$$(_$(1)-$(2)_PACKAGE)"

Expand All @@ -39,24 +39,24 @@ $$(TOP)/sdks/out/$(1)-$(2)/.stamp-download:
touch $$@

.PHONY: download-$(1)-$(2)
download-$(1)-$(2): $(3) | setup-$(1)-$(2)
download-$(1)-$(2): | $(3) setup-$(1)-$(2)
-$$(MAKE) $$(TOP)/sdks/out/$(1)-$(2)/.stamp-download

.PHONY: provision-$(1)-$(2)
provision-$(1)-$(2): $(3) | download-$(1)-$(2)
provision-$(1)-$(2): | $(3) download-$(1)-$(2)
$$(if $$(wildcard $$(TOP)/sdks/out/$(1)-$(2)/.stamp-download),,$$(MAKE) package-$(1)-$(2))

.PHONY: archive-$(1)-$(2)
archive-$(1)-$(2): package-$(1)-$(2)
tar -cvzf $$(TOP)/$$(_$(1)-$(2)_PACKAGE) -C $$(TOP)/sdks/out/$(1)-$(2) .
endef

$(eval $(call LLVMProvisionTemplate,llvm,llvm32,$(LLVM_SRC)/CMakeLists.txt))
$(eval $(call LLVMProvisionTemplate,llvm,llvm64,$(LLVM_SRC)/CMakeLists.txt))
$(eval $(call LLVMProvisionTemplate,llvm,llvmwin32,$(LLVM_SRC)/CMakeLists.txt))
$(eval $(call LLVMProvisionTemplate,llvm,llvmwin64,$(LLVM_SRC)/CMakeLists.txt))
$(eval $(call LLVMProvisionTemplate,llvm,llvm32,$(LLVM_SRC)))
$(eval $(call LLVMProvisionTemplate,llvm,llvm64,$(LLVM_SRC)))
$(eval $(call LLVMProvisionTemplate,llvm,llvmwin32,$(LLVM_SRC)))
$(eval $(call LLVMProvisionTemplate,llvm,llvmwin64,$(LLVM_SRC)))
ifeq ($(UNAME),Darwin)
$(eval $(call LLVMProvisionTemplate,llvm36,llvm32,$(LLVM36_SRC)/configure))
$(eval $(call LLVMProvisionTemplate,llvm36,llvm32,$(LLVM36_SRC)))
endif

##
Expand Down Expand Up @@ -157,13 +157,9 @@ endif
# Parameters
# $(1): target
# $(2): arch
#
# Flags
# llvm-$(1)_CONFIGURE_ENVIRONMENT
# $(3): mxe
define LLVMMxeTemplate

_llvm-$(1)_CMAKE=$$(MXE_PREFIX)/bin/$(2)-w64-mingw32$$(if $$(filter $$(UNAME),Darwin),.static)-cmake

# -DLLVM_ENABLE_THREADS=0 is needed because mxe doesn't define std::mutex etc.
# -DLLVM_BUILD_EXECUTION_ENGINE=Off is needed because it depends on threads
# -DCROSS_TOOLCHAIN_FLAGS_NATIVE is needed to compile the native tools (tlbgen) using the host compilers
Expand All @@ -172,12 +168,16 @@ _llvm-$(1)_CMAKE_FLAGS = \
-DCMAKE_INSTALL_PREFIX=$$(TOP)/sdks/out/llvm-$(1) \
-DLLVM_ENABLE_THREADS=OFF \
-DCROSS_TOOLCHAIN_FLAGS_NATIVE=-DCMAKE_TOOLCHAIN_FILE=$$(LLVM_SRC)/cmake/modules/NATIVE.cmake \
-DCMAKE_TOOLCHAIN_FILE=$$(LLVM_SRC)/cmake/modules/$(3).cmake \
-DLLVM_BUILD_EXECUTION_ENGINE=Off \
$$(llvm-$(1)_CMAKE_FLAGS)

.stamp-llvm-$(1)-configure: $$(LLVM_SRC)/CMakeLists.txt
$$(LLVM_SRC)/cmake/modules/$(3).cmake: $(3).cmake.in | $$(LLVM_SRC)
sed -e 's,@MXE_PATH@,$$(MXE_PREFIX),' -e 's,@MXE_SUFFIX@,$$(if $$(filter $(UNAME),Darwin),.static),' < $$< > $$@

.stamp-llvm-$(1)-configure: $$(LLVM_SRC)/CMakeLists.txt $$(LLVM_SRC)/cmake/modules/$(3).cmake
mkdir -p $$(TOP)/sdks/builds/llvm-$(1)
cd $$(TOP)/sdks/builds/llvm-$(1) && $$(_llvm-$(1)_CMAKE) $$(_llvm-$(1)_CMAKE_FLAGS) $$(LLVM_SRC)
cd $$(TOP)/sdks/builds/llvm-$(1) && cmake $$(_llvm-$(1)_CMAKE_FLAGS) $$(LLVM_SRC)
touch $$@

.PHONY: setup-llvm-$(1)
Expand All @@ -199,6 +199,6 @@ endef

ifneq ($(MXE_PREFIX),)
llvm-llvmwin32_CMAKE_FLAGS=-DLLVM_BUILD_32_BITS=On
$(eval $(call LLVMMxeTemplate,llvmwin32,i686))
$(eval $(call LLVMMxeTemplate,llvmwin64,x86_64))
$(eval $(call LLVMMxeTemplate,llvmwin32,i686,mxe-Win32))
$(eval $(call LLVMMxeTemplate,llvmwin64,x86_64,mxe-Win64))
endif
20 changes: 20 additions & 0 deletions sdks/builds/mxe-Win32.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# the name of the target operating system
set(CMAKE_SYSTEM_NAME Windows)

# here is the target environment located
set(CMAKE_FIND_ROOT_PATH @MXE_PATH@)

# which compilers to use for C and C++
set(CMAKE_C_COMPILER ${CMAKE_FIND_ROOT_PATH}/bin/i686-w64-mingw32@MXE_SUFFIX@-gcc)
set(CMAKE_CXX_COMPILER ${CMAKE_FIND_ROOT_PATH}/bin/i686-w64-mingw32@MXE_SUFFIX@-g++)
set(CMAKE_RC_COMPILER ${CMAKE_FIND_ROOT_PATH}/bin/i686-w64-mingw32@MXE_SUFFIX@-windres)

# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search
# programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
set(BUILD_SHARED_LIBS ON)
20 changes: 20 additions & 0 deletions sdks/builds/mxe-Win64.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# the name of the target operating system
set(CMAKE_SYSTEM_NAME Windows)

# here is the target environment located
set(CMAKE_FIND_ROOT_PATH @MXE_PATH@)

# which compilers to use for C and C++
set(CMAKE_C_COMPILER ${CMAKE_FIND_ROOT_PATH}/bin/x86_64-w64-mingw32@MXE_SUFFIX@-gcc)
set(CMAKE_CXX_COMPILER ${CMAKE_FIND_ROOT_PATH}/bin/x86_64-w64-mingw32@MXE_SUFFIX@-g++)
set(CMAKE_RC_COMPILER ${CMAKE_FIND_ROOT_PATH}/bin/x86_64-w64-mingw32@MXE_SUFFIX@-windres)

# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search
# programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
set(BUILD_SHARED_LIBS ON)

0 comments on commit 2343f26

Please sign in to comment.