[Buildroot] [PATCH v4 02/11] package/llvm: enable target variant

Thomas Petazzoni thomas.petazzoni at bootlin.com
Sun Apr 1 20:46:07 UTC 2018


Hello,

On Thu, 29 Mar 2018 13:33:37 +0200, Valentin Korenblit wrote:

> diff --git a/package/llvm/llvm.mk b/package/llvm/llvm.mk
> index 71fcaa2b8e..4e58c96e0f 100644
> --- a/package/llvm/llvm.mk
> +++ b/package/llvm/llvm.mk
> @@ -10,13 +10,16 @@ LLVM_SOURCE = llvm-$(LLVM_VERSION).src.tar.xz
>  LLVM_LICENSE = NCSA
>  LLVM_LICENSE_FILES = LICENSE.TXT
>  LLVM_SUPPORTS_IN_SOURCE_BUILD = NO
> +LLVM_INSTALL_STAGING = YES
>  
>  # http://llvm.org/docs/GettingStarted.html#software
>  # host-python: Python interpreter 2.7 or newer is required for builds and testing.
>  # host-zlib: Optional, adds compression / uncompression capabilities to selected LLVM tools.
>  HOST_LLVM_DEPENDENCIES = host-python host-zlib
> +LLVM_DEPENDENCIES = host-llvm zlib
>  
>  # Don't build clang libcxx libcxxabi lldb compiler-rt lld polly as llvm subprojects
> +#This flag assumes that projects are checked out side-by-side and not nested

And ? I also don't understand why this comment is added in PATCH 02 and
not PATCH 01.

>  HOST_LLVM_CONF_OPTS += -DLLVM_ENABLE_PROJECTS=""
>  
>  # Disable CCACHE
> @@ -28,166 +31,238 @@ HOST_LLVM_CONF_OPTS += -DLLVM_BUILD_GLOBAL_ISEL=OFF
>  # * Use "Unix Makefiles" generator for generating make-compatible parallel makefiles.
>  #   Ninja is not supported yet by Buildroot
>  HOST_LLVM_CONF_OPTS += -G "Unix Makefiles"
> +LLVM_CONF_OPTS += -G "Unix Makefiles"

Same comment as for PATCH 01, do we really need to pass this
explicitly ? How do all other CMake packages in Buildroot work ?

> +# Use native llvm-tblgen from host-llvm (needed for cross-compilation)
> +LLVM_CONF_OPTS += -DLLVM_TABLEGEN=$(HOST_DIR)/usr/bin/llvm-tblgen
> +
> +# Copy llvm-config (host variant) to STAGING_DIR since llvm-config
> +# provided by llvm target variant can't run on the host.
> +# Also, llvm-config (host variant) returns include and lib directories
> +# for the host if it's installed in host/usr/bin:
> +# output/host/usr/bin/llvm-config --includedir
> +# output/host/usr/include
> +# When istalled in STAGING_DIR, llvm-config return include and lib

istalled -> installed

> +# directories from STAGING_DIR.
> +# output/staging/usr/bin/llvm-config --includedir
> +# output/staging/usr/include
> +define LLVM_COPY_LLVM_CONFIG_TO_STAGING_DIR
> +	$(INSTALL) -D -m 0755 $(HOST_DIR)/usr/bin/llvm-config \
> +		$(STAGING_DIR)/usr/bin/llvm-config
> +endef
> +LLVM_POST_INSTALL_STAGING_HOOKS = LLVM_COPY_LLVM_CONFIG_TO_STAGING_DIR

I don't understand why this is done as a post-install staging hook. Is
llvm-config build by host-llvm or llvm ? Is it needed for the build of
llvm, or for the build of stuff (like mesa3d) that will link against
the llvm library ?

>  # * LLVM_BUILD_UTILS: Build LLVM utility binaries. If OFF, just generate build targets.
> +#   Keep llvm utility binaries for the host. llvm-tblgen is built anyway as CMakeLists.txt
> +#   has add_subdirectory(utils/TableGen) unconditionally.
>  HOST_LLVM_CONF_OPTS += -DLLVM_BUILD_UTILS=ON
> +LLVM_CONF_OPTS += -DLLVM_BUILD_UTILS=OFF

Seeing all of this, I am not longer sure I like this per-option
explanations anymore.

Maybe something like:

# FOO_BAZ=ON, because ...
# BAZ_BAR=OFF, because ...
HOST_LLVM_CONF_OPTS = \
	... \
	...

# BAZ_BLEH=OFF, because ...
LLVM_CONF_OPTS = \
	... \
	...

And by having comments only for the interesting options, not only for
the obvious stuff.

>  # * BUILD_SHARED_LIBS Build all libraries as shared libraries instead of static
>  #   It is only recommended to be used by LLVM developers.To build LLVM as a single
>  #   shared library, we should use the LLVM_BUILD_LLVM_DYLIB option.

I know this comment was already there in PATCH 01, but I believe a more
useful explanation would be:

BUILD_SHARED_LIBS has a misleading name. It is in fact an option for
LLVM developers to build all LLVM libraries are separate shared
libraries. For normal use of LLVM, it is recommended to build a single
shared library, which is achieved by BUILD_SHARED_LIBS=OFF and
LLVM_BUILD_LLVM_DYLIB=ON.


>  # * CMAKE_BUILD_TYPE: Set build type Debug, Release, RelWithDebInfo, and MinSizeRel.
>  #   Default is Debug. Use the Release build which requires considerably less space.
>  HOST_LLVM_CONF_OPTS += -DCMAKE_BUILD_TYPE=Release
> +LLVM_CONF_OPTS += -DCMAKE_BUILD_TYPE=Release

CMAKE_BUILD_TYPE for target package is already passed by the
cmake-package infrastructure, so you shouldn't override that.

>  # Get target architecture
>  HOST_LLVM_TARGET_ARCH = $(call qstrip,$(BR2_PACKAGE_LLVM_TARGET_ARCH))
>  
>  # Build backend for target architecture
>  HOST_LLVM_CONF_OPTS += -DLLVM_TARGETS_TO_BUILD="$(HOST_LLVM_TARGET_ARCH)"
> +LLVM_CONF_OPTS += -DLLVM_TARGETS_TO_BUILD="$(HOST_LLVM_TARGET_ARCH)"
>  
>  # LLVM target to use for native code generation.
>  HOST_LLVM_CONF_OPTS += -DLLVM_TARGET_ARCH=$(HOST_LLVM_TARGET_ARCH)
> +LLVM_CONF_OPTS += -DLLVM_TARGET_ARCH=$(HOST_LLVM_TARGET_ARCH)

Is there a difference between -DLLVM_TARGETS_TO_BUILD and
-DLLVM_TARGET_ARCH ? You pass the same value to both ?

>  # * LLVM_ENABLE_CXX1Y: Compile with C++1y enabled OFF
>  #   Enable C++ and C++11 support if BR2_INSTALL_LIBSTDCPP=y
>  HOST_LLVM_CONF_OPTS += -DLLVM_ENABLE_CXX1Y=$(if $(BR2_INSTALL_LIBSTDCPP),ON,OFF)
> +LLVM_CONF_OPTS += -DLLVM_ENABLE_CXX1Y=$(if $(BR2_INSTALL_LIBSTDCPP),ON,OFF)

This time, this line makes sense (for the target LLVM).

>  # Builds a release tablegen that gets used during the LLVM build.
>  HOST_LLVM_CONF_OPTS += -DLLVM_OPTIMIZED_TABLEGEN=ON
> +LLVM_CONF_OPTS += -DLLVM_OPTIMIZED_TABLEGEN=ON

You need to build tablegen in the target llvm ?

Thanks,

Thomas
-- 
Thomas Petazzoni, CTO, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com


More information about the buildroot mailing list