Skip to contentSkip to conversation

toolchain-external: add basic fortran support

PATCH Superseded Benjamin Kamath 3 participants 6 messages Mar 17, 2016 – Mar 18, 2016

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore
#0 lore raw

PATCH 1/2 toolchain-external: add basic fortran support

From: Benjamin Kamath <[email protected]>

Add the necessary support to allow an external toolchain to supply a fortran compiler. This mostly amounts to a toolchain configuration option that sets BR2_INSTALL_LIBFORTRAN, and then various hooks to pass along flags, as well as run-time libraries.

Additionally, gfortran needs to be invoked through the toolchain-wrapper, not just symlinked to $(TARGET_FC)gfortran.

---
 package/Makefile.in                                |  9 +++++++++
 package/gcc/gcc-final/gcc-final.mk                 |  4 ++--
 package/pkg-cmake.mk                               |  6 ++++++
 support/misc/toolchainfile.cmake.in                |  2 ++
 toolchain/helpers.mk                               | 13 +++++++++++++
 toolchain/toolchain-common.in                      |  3 +++
 toolchain/toolchain-external/Config.in             | 12 ++++++++++++
 toolchain/toolchain-external/toolchain-external.mk | 10 +++++++++-
 8 files changed, 56 insertions(+), 3 deletions(-)
package/Makefile.in +9 -0
index dd595e2..125406f 100644
@@ -138,6 +138,7 @@ endif
 TARGET_CPPFLAGS += -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
 TARGET_CFLAGS = $(TARGET_CPPFLAGS) $(TARGET_ABI) $(TARGET_OPTIMIZATION) $(TARGET_DEBUGGING)
 TARGET_CXXFLAGS = $(TARGET_CFLAGS)
+TARGET_FCFLAGS = $(TARGET_ABI) $(TARGET_OPTIMIZATION) $(TARGET_DEBUGGING)
 TARGET_LDFLAGS = $(call qstrip,$(BR2_TARGET_LDFLAGS))
 
 ifeq ($(BR2_BINFMT_FLAT),y)
@@ -145,28 +146,35 @@ TARGET_CFLAGS += $(if $($(PKG)_FLAT_STACKSIZE),-Wl$(comma)-elf2flt=-s$($(PKG)_FL
 	-Wl$(comma)-elf2flt)
 TARGET_CXXFLAGS += $(if $($(PKG)_FLAT_STACKSIZE),-Wl$(comma)-elf2flt=-s$($(PKG)_FLAT_STACKSIZE),\
 	-Wl$(comma)-elf2flt)
+TARGET_FCFLAGS += $(if $($(PKG)_FLAT_STACKSIZE),-Wl$(comma)-elf2flt=-s$($(PKG)_FLAT_STACKSIZE),\
+	-Wl$(comma)-elf2flt)
 TARGET_LDFLAGS += $(if $($(PKG)_FLAT_STACKSIZE),-elf2flt=-s$($(PKG)_FLAT_STACKSIZE),-elf2flt)
 endif
 
 ifeq ($(BR2_BINFMT_FLAT_SHARED),y)
 TARGET_LDFLAGS += -mid-shared-library -mshared-library-id=0
 TARGET_CFLAGS += -mid-shared-library -mshared-library-id=0
+TARGET_FCFLAGS += -mid-shared-library -mshared-library-id=0
 TARGET_CXXFLAGS += -mid-shared-library -mshared-library-id=0
 endif
 ifeq ($(BR2_BINFMT_FLAT_SEP_DATA),y)
 TARGET_LDFLAGS += -msep-data
 TARGET_CFLAGS += -msep-data
+TARGET_FCFLAGS += -msep-data
 TARGET_CXXFLAGS += -msep-data
 endif
 
 ifeq ($(BR2_SSP_REGULAR),y)
 TARGET_CFLAGS += -fstack-protector
+TARGET_FCFLAGS += -fstack-protector
 TARGET_CXXFLAGS += -fstack-protector
 else ifeq ($(BR2_SSP_STRONG),y)
 TARGET_CFLAGS += -fstack-protector-strong
+TARGET_FCFLAGS += -fstack-protector-strong
 TARGET_CXXFLAGS += -fstack-protector-strong
 else ifeq ($(BR2_SSP_ALL),y)
 TARGET_CFLAGS += -fstack-protector-all
+TARGET_FCFLAGS += -fstack-protector-all
 TARGET_CXXFLAGS += -fstack-protector-all
 endif
 
@@ -378,6 +386,7 @@ ifeq ($(BR2_STATIC_LIBS),y)
 SHARED_STATIC_LIBS_OPTS = --enable-static --disable-shared
 TARGET_CFLAGS += -static
 TARGET_CXXFLAGS += -static
+TARGET_FCFLAGS += -static
 TARGET_LDFLAGS += -static
 else ifeq ($(BR2_SHARED_LIBS),y)
 SHARED_STATIC_LIBS_OPTS = --disable-static --enable-shared
package/gcc/gcc-final/gcc-final.mk +2 -2
index 69fdc0c..87480c7 100644
@@ -54,7 +54,7 @@ endef
 # Languages supported by the cross-compiler
 GCC_FINAL_CROSS_LANGUAGES-y = c
 GCC_FINAL_CROSS_LANGUAGES-$(BR2_INSTALL_LIBSTDCPP) += c++
-GCC_FINAL_CROSS_LANGUAGES-$(BR2_TOOLCHAIN_BUILDROOT_FORTRAN) += fortran
+GCC_FINAL_CROSS_LANGUAGES-$(BR2_INSTALL_LIBFORTRAN) += fortran
 GCC_FINAL_CROSS_LANGUAGES = $(subst $(space),$(comma),$(GCC_FINAL_CROSS_LANGUAGES-y))
 
 HOST_GCC_FINAL_CONF_OPTS = \
@@ -152,7 +152,7 @@ ifeq ($(BR2_INSTALL_LIBSTDCPP),y)
 HOST_GCC_FINAL_USR_LIBS += libstdc++
 endif
 
-ifeq ($(BR2_TOOLCHAIN_BUILDROOT_FORTRAN),y)
+ifeq ($(BR2_INSTALL_LIBFORTRAN),y)
 HOST_GCC_FINAL_USR_LIBS += libgfortran
 endif
 
package/pkg-cmake.mk +6 -0
index 81dcfcc..a93709e 100644
@@ -31,6 +31,8 @@ CMAKE_HOST_C_COMPILER = $(HOSTCC)
 CMAKE_HOST_CXX_COMPILER = $(HOSTCXX)
 endif
 
+CMAKE_HOST_Fortran_COMPILER ?= $(HOSTFC)
+
 ifneq ($(QUIET),)
 CMAKE_QUIET = -DCMAKE_RULE_MESSAGES=OFF -DCMAKE_INSTALL_MESSAGE=NEVER
 endif
@@ -119,10 +121,12 @@ define $(2)_CONFIGURE_CMDS
 		-DCMAKE_INSTALL_PREFIX="$$(HOST_DIR)/usr" \
 		-DCMAKE_C_FLAGS="$$(HOST_CFLAGS)" \
 		-DCMAKE_CXX_FLAGS="$$(HOST_CXXFLAGS)" \
+		-DCMAKE_FC_FLAGS="$$(HOST_FCFLAGS)" \
 		-DCMAKE_EXE_LINKER_FLAGS="$$(HOST_LDFLAGS)" \
 		-DCMAKE_ASM_COMPILER="$$(HOSTAS)" \
 		-DCMAKE_C_COMPILER="$$(CMAKE_HOST_C_COMPILER)" \
 		-DCMAKE_CXX_COMPILER="$$(CMAKE_HOST_CXX_COMPILER)" \
+		-DCMAKE_Fortran_COMPILER="$$(CMAKE_HOST_Fortran_COMPILER)" \
 		$(if $$(CMAKE_HOST_C_COMPILER_ARG1),\
 			-DCMAKE_C_COMPILER_ARG1="$$(CMAKE_HOST_C_COMPILER_ARG1)" \
 			-DCMAKE_CXX_COMPILER_ARG1="$$(CMAKE_HOST_CXX_COMPILER_ARG1)" \
@@ -243,9 +247,11 @@ $(HOST_DIR)/usr/share/buildroot/toolchainfile.cmake:
 		-e 's#@@STAGING_SUBDIR@@#$(call qstrip,$(STAGING_SUBDIR))#' \
 		-e 's#@@TARGET_CFLAGS@@#$(call qstrip,$(TARGET_CFLAGS))#' \
 		-e 's#@@TARGET_CXXFLAGS@@#$(call qstrip,$(TARGET_CXXFLAGS))#' \
+		-e 's:@@TARGET_FCFLAGS@@:$(call qstrip,$(TARGET_FCFLAGS)):' \
 		-e 's#@@TARGET_LDFLAGS@@#$(call qstrip,$(TARGET_LDFLAGS))#' \
 		-e 's#@@TARGET_CC@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_CC)))#' \
 		-e 's#@@TARGET_CXX@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_CXX)))#' \
+		-e 's:@@TARGET_FC@@:$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_FC))):' \
 		-e 's#@@CMAKE_SYSTEM_PROCESSOR@@#$(call qstrip,$(CMAKE_SYSTEM_PROCESSOR))#' \
 		$(TOPDIR)/support/misc/toolchainfile.cmake.in \
 		> $@
support/misc/toolchainfile.cmake.in +2 -0
index 5cf381e..4112604 100644
@@ -15,6 +15,7 @@ set(CMAKE_SYSTEM_PROCESSOR @@CMAKE_SYSTEM_PROCESSOR@@)
 
 set(CMAKE_C_FLAGS "@@TARGET_CFLAGS@@ ${CMAKE_C_FLAGS}" CACHE STRING "Buildroot CFLAGS")
 set(CMAKE_CXX_FLAGS "@@TARGET_CXXFLAGS@@ ${CMAKE_CXX_FLAGS}" CACHE STRING "Buildroot CXXFLAGS")
+set(CMAKE_Fortran_FLAGS "@@TARGET_FCFLAGS@@ ${CMAKE_Fortran_FLAGS}" CACHE STRING "Buildroot FCFLAGS")
 set(CMAKE_EXE_LINKER_FLAGS "@@TARGET_LDFLAGS@@ ${CMAKE_EXE_LINKER_FLAGS}" CACHE STRING "Buildroot LDFLAGS")
 set(CMAKE_INSTALL_SO_NO_EXE 0)
 
@@ -29,3 +30,4 @@ set(ENV{PKG_CONFIG_SYSROOT_DIR} "${RELOCATED_HOST_DIR}/@@STAGING_SUBDIR@@")
 # This toolchain file can be used both inside and outside Buildroot.
 set(CMAKE_C_COMPILER "${RELOCATED_HOST_DIR}/@@TARGET_CC@@")
 set(CMAKE_CXX_COMPILER "${RELOCATED_HOST_DIR}/@@TARGET_CXX@@")
+set(CMAKE_Fortran_COMPILER "${RELOCATED_HOST_DIR}/@@TARGET_FC@@")
toolchain/helpers.mk +13 -0
index ee878e8..196f295 100644
@@ -382,6 +382,19 @@ check_cplusplus = \
 	fi
 
 #
+# Check that the external toolchain supports Fortran
+#
+# $1: cross-gfortran path
+#
+check_fortran = \
+	__CROSS_FC=$(strip $1) ; \
+	$${__CROSS_FC} -v > /dev/null 2>&1 ; \
+	if test $$? -ne 0 ; then \
+		echo "Fortran support is selected but is not available in external toolchain" ; \
+		exit 1 ; \
+	fi
+
+#
 # Check that the cross-compiler given in the configuration exists
 #
 # $1: cross-gcc path
toolchain/toolchain-common.in +3 -0
index 46970a6..1d7afa7 100644
@@ -17,6 +17,9 @@ config BR2_ENABLE_LOCALE
 config BR2_INSTALL_LIBSTDCPP
 	bool
 
+config BR2_INSTALL_LIBFORTRAN
+	bool
+
 config BR2_TOOLCHAIN_HAS_THREADS
 	bool
 
toolchain/toolchain-external/Config.in +12 -0
index ff759a0..64027ff 100644
@@ -24,6 +24,7 @@ config BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM
 	select BR2_TOOLCHAIN_EXTERNAL_GLIBC
 	select BR2_TOOLCHAIN_HAS_NATIVE_RPC
 	select BR2_INSTALL_LIBSTDCPP
+	select BR2_INSTALL_LIBFORTRAN
 	select BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_1
 	select BR2_TOOLCHAIN_GCC_AT_LEAST_4_9
 	help
@@ -46,6 +47,7 @@ config BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM
 	select BR2_TOOLCHAIN_EXTERNAL_GLIBC
 	select BR2_TOOLCHAIN_HAS_NATIVE_RPC
 	select BR2_INSTALL_LIBSTDCPP
+	select BR2_INSTALL_LIBFORTRAN
 	select BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_0
 	select BR2_TOOLCHAIN_GCC_AT_LEAST_5
 	help
@@ -68,6 +70,7 @@ config BR2_TOOLCHAIN_EXTERNAL_LINARO_ARMEB
 	select BR2_TOOLCHAIN_EXTERNAL_GLIBC
 	select BR2_TOOLCHAIN_HAS_NATIVE_RPC
 	select BR2_INSTALL_LIBSTDCPP
+	select BR2_INSTALL_LIBFORTRAN
 	select BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_1
 	select BR2_TOOLCHAIN_GCC_AT_LEAST_4_9
 	help
@@ -90,6 +93,7 @@ config BR2_TOOLCHAIN_EXTERNAL_LINARO_ARMEB
 	select BR2_TOOLCHAIN_EXTERNAL_GLIBC
 	select BR2_TOOLCHAIN_HAS_NATIVE_RPC
 	select BR2_INSTALL_LIBSTDCPP
+	select BR2_INSTALL_LIBFORTRAN
 	select BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_0
 	select BR2_TOOLCHAIN_GCC_AT_LEAST_5
 	help
@@ -1047,6 +1051,14 @@ config BR2_TOOLCHAIN_EXTERNAL_CXX
 	  support. If you don't know, leave the default value,
 	  Buildroot will tell you if it's correct or not.
 
+config BR2_TOOLCHAIN_EXTERNAL_FORTRAN
+	bool "Toolchain has Fortran support?"
+	select BR2_INSTALL_LIBFORTRAN
+	help
+	  Select this option if your external toolchain has Fortran
+	  support. If you don't know, leave the default value,
+	  Buildroot will tell you if it's correct or not.
+
 config BR2_TOOLCHAIN_EXTRA_EXTERNAL_LIBS
 	string "Extra toolchain libraries to be copied to target"
 	help
toolchain/toolchain-external/toolchain-external.mk +9 -1
index 37e1a2e..070d0cf 100644
@@ -90,6 +90,10 @@ ifeq ($(BR2_INSTALL_LIBSTDCPP),y)
 USR_LIB_EXTERNAL_LIBS += libstdc++.so.*
 endif
 
+ifeq ($(BR2_INSTALL_LIBFORTRAN),y)
+USR_LIB_EXTERNAL_LIBS += libgfortran.so.*
+endif
+
 LIB_EXTERNAL_LIBS += $(call qstrip,$(BR2_TOOLCHAIN_EXTRA_EXTERNAL_LIBS))
 
 # Details about sysroot directory selection.
@@ -160,6 +164,7 @@ TOOLCHAIN_EXTERNAL_TOOLCHAIN_WRAPPER_ARGS += \
 TOOLCHAIN_EXTERNAL_CROSS = $(TOOLCHAIN_EXTERNAL_BIN)/$(TOOLCHAIN_EXTERNAL_PREFIX)-
 TOOLCHAIN_EXTERNAL_CC = $(TOOLCHAIN_EXTERNAL_CROSS)gcc$(TOOLCHAIN_EXTERNAL_SUFFIX)
 TOOLCHAIN_EXTERNAL_CXX = $(TOOLCHAIN_EXTERNAL_CROSS)g++$(TOOLCHAIN_EXTERNAL_SUFFIX)
+TOOLCHAIN_EXTERNAL_FC = $(TOOLCHAIN_EXTERNAL_CROSS)gfortran$(TOOLCHAIN_EXTERNAL_SUFFIX)
 TOOLCHAIN_EXTERNAL_READELF = $(TOOLCHAIN_EXTERNAL_CROSS)readelf$(TOOLCHAIN_EXTERNAL_SUFFIX)
 
 ifeq ($(filter $(HOST_DIR)/%,$(TOOLCHAIN_EXTERNAL_BIN)),)
@@ -495,6 +500,9 @@ define TOOLCHAIN_EXTERNAL_CONFIGURE_CMDS
 	if test "$(BR2_INSTALL_LIBSTDCPP)" = "y" ; then \
 		$(call check_cplusplus,$(TOOLCHAIN_EXTERNAL_CXX)) ; \
 	fi ; \
+	if test "$(BR2_INSTALL_LIBFORTRAN)" = "y" ; then \
+		$(call check_fortran,$(TOOLCHAIN_EXTERNAL_FC)) ; \
+	fi ; \
 	if test "$(BR2_TOOLCHAIN_EXTERNAL_UCLIBC)" = "y" ; then \
 		$(call check_uclibc,$${SYSROOT_DIR}) ; \
 	elif test "$(BR2_TOOLCHAIN_EXTERNAL_MUSL)" = "y" ; then \
@@ -719,7 +727,7 @@ define TOOLCHAIN_EXTERNAL_INSTALL_WRAPPER
 		*-ar|*-ranlib|*-nm) \
 			ln -sf $$(echo $$i | sed 's%^$(HOST_DIR)%../..%') .; \
 			;; \
-		*cc|*cc-*|*++|*++-*|*cpp) \
+		*cc|*cc-*|*++|*++-*|*cpp|*fortran) \
 			ln -sf toolchain-wrapper $$base; \
 			;; \
 		*gdb|*gdbtui) \
Signature · 1 line
2.5.0
#1 lore raw

PATCH 2/2 package: add lapack

From: Benjamin Kamath <[email protected]>

lapack is a fortran-based linear algebra math
library.

---
 package/Config.in                              |  1 +
 package/lapack/0001-case-sensitive-paths.patch | 15 +++++++++++++++
 package/lapack/Config.in                       | 18 ++++++++++++++++++
 package/lapack/lapack.hash                     |  2 ++
 package/lapack/lapack.mk                       | 24 ++++++++++++++++++++++++
 5 files changed, 60 insertions(+)
 create mode 100644 package/lapack/0001-case-sensitive-paths.patch
 create mode 100644 package/lapack/Config.in
 create mode 100644 package/lapack/lapack.hash
 create mode 100644 package/lapack/lapack.mk
package/Config.in +1 -0
index 2401867..b5a5e39 100644
@@ -1198,6 +1198,7 @@ menu "Other"
 	source "package/gmp/Config.in"
 	source "package/gsl/Config.in"
 	source "package/gtest/Config.in"
+	source "package/lapack/Config.in"
 	source "package/libargtable2/Config.in"
 	source "package/libatomic_ops/Config.in"
 	source "package/libbsd/Config.in"
package/lapack/0001-case-sensitive-paths.patch new file +15 -0
new file mode 100644
index 0000000..e032d78
@@ -0,0 +1,15 @@
+diff -rupN lapack-3.6.0/CBLAS/CMakeLists.txt lapack-3.6.0-old/CBLAS/CMakeLists.txt
+--- lapack-3.6.0/CBLAS/CMakeLists.txt	2016-03-17 13:42:31.121248051 -0700
++++ lapack-3.6.0-old/CBLAS/CMakeLists.txt	2016-03-17 13:41:37.819316904 -0700
+@@ -65,9 +65,9 @@ if(ALL_TARGETS)
+   list(GET ALL_TARGETS 0 _cblas_config_build_guard_target)
+ endif()
+ 
+-configure_file(${CMAKE_CURRENT_SOURCE_DIR}/CMAKE/cblas-config-version.cmake.in
++configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/cblas-config-version.cmake.in
+   ${LAPACK_BINARY_DIR}/cblas-config-version.cmake @ONLY)
+-configure_file(${CMAKE_CURRENT_SOURCE_DIR}/CMAKE/cblas-config-build.cmake.in
++configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/cblas-config-build.cmake.in
+   ${LAPACK_BINARY_DIR}/cblas-config.cmake @ONLY)
+ 
+ 
package/lapack/Config.in new file +18 -0
new file mode 100644
index 0000000..e5e1270
@@ -0,0 +1,18 @@
+config BR2_PACKAGE_LAPACK
+	bool "lapack/blas"
+	select BR2_TOOLCHAIN_BUILDROOT_FORTRAN
+	select BR2_INSTALL_LIBFORTRAN
+	# _fpu_control is used on PowerPC, but not available with
+	# uClibc
+	depends on !(BR2_powerpc && BR2_TOOLCHAIN_USES_UCLIBC)
+	help
+	  LAPACK and BLAS FORTRAN implementation.
+
+	  http://www.netlib.org/lapack/
+
+config BR2_PACKAGE_LAPACK_COMPLEX
+	bool "Complex/Complex16 support"
+	depends on BR2_PACKAGE_LAPACK
+	default y
+	help
+	  Builds support for COMPLEX and COMPLEX16 data types.
package/lapack/lapack.hash new file +2 -0
new file mode 100644
index 0000000..99d25b5
@@ -0,0 +1,2 @@
+# Locally computed:
+sha256  a9a0082c918fe14e377bbd570057616768dca76cbdc713457d8199aaa233ffc3  lapack-3.6.0.tgz
package/lapack/lapack.mk new file +24 -0
new file mode 100644
index 0000000..fb91543
@@ -0,0 +1,24 @@
+################################################################################
+#
+# lapack
+#
+################################################################################
+
+LAPACK_VERSION = 3.6.0
+LAPACK_SOURCE = lapack-$(LAPACK_VERSION).tgz
+# This package provides 2 libraries:
+# - libblas
+# - liblapack
+LAPACK_LICENSE = BSD-3c (libblas and liblapack)
+LAPACK_LICENSE_FILES = LICENSE
+LAPACK_SITE = http://www.netlib.org/lapack
+LAPACK_INSTALL_STAGING = YES
+LAPACK_CONF_OPTS = -DBUILD_SHARED_LIBS=on -DLAPACKE=on -DCBLAS=on
+
+ifeq ($(BR2_PACKAGE_LAPACK_COMPLEX),y)
+LAPACK_CONF_OPTS += -DBUILD_COMPLEX=on -DBUILD_COMPLEX16=on
+else
+LAPACK_CONF_OPTS += -DBUILD_COMPLEX=off -DBUILD_COMPLEX16=off
+endif
+
+$(eval $(cmake-package))
Signature · 1 line
2.5.0
#2 lore raw

PATCH 2/2 package: add lapack

Hi Benjamin,

Quoted 9 lines · Benjamin Kamath
package/lapack/0001-case-sensitive-paths.patch new file +3 -0
new file mode 100644
index 0000000..e032d78
@@ -0,0 +1,15 @@
+diff -rupN lapack-3.6.0/CBLAS/CMakeLists.txt lapack-3.6.0-old/CBLAS/CMakeLists.txt
+--- lapack-3.6.0/CBLAS/CMakeLists.txt	2016-03-17 13:42:31.121248051 -0700
++++ lapack-3.6.0-old/CBLAS/CMakeLists.txt	2016-03-17 13:41:37.819316904 -0700

package/lapack/0001-case-sensitive-paths.patch line 13

Quoted 10 lines
package/lapack/0001-case-sensitive-paths.patch new file +10 -0
+@@ -65,9 +65,9 @@ if(ALL_TARGETS)
+   list(GET ALL_TARGETS 0 _cblas_config_build_guard_target)
+ endif()
+ 
+-configure_file(${CMAKE_CURRENT_SOURCE_DIR}/CMAKE/cblas-config-version.cmake.in
++configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/cblas-config-version.cmake.in
+   ${LAPACK_BINARY_DIR}/cblas-config-version.cmake @ONLY)
+-configure_file(${CMAKE_CURRENT_SOURCE_DIR}/CMAKE/cblas-config-build.cmake.in
++configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/cblas-config-build.cmake.in
+   ${LAPACK_BINARY_DIR}/cblas-config.cmake @ONLY)

The patch needs a description and your sign-off.

[snip]

Quoted 12 lines
package/lapack/lapack.mk new file +6 -0
new file mode 100644
index 0000000..fb91543
@@ -0,0 +1,24 @@
+################################################################################
+#
+# lapack
+#
+################################################################################
+

package/lapack/lapack.mk line 16

Quoted 10 lines
package/lapack/lapack.mk new file +10 -0
+LAPACK_VERSION = 3.6.0
+LAPACK_SOURCE = lapack-$(LAPACK_VERSION).tgz
+# This package provides 2 libraries:
+# - libblas
+# - liblapack
+LAPACK_LICENSE = BSD-3c (libblas and liblapack)
+LAPACK_LICENSE_FILES = LICENSE
+LAPACK_SITE = http://www.netlib.org/lapack
+LAPACK_INSTALL_STAGING = YES
+LAPACK_CONF_OPTS = -DBUILD_SHARED_LIBS=on -DLAPACKE=on -DCBLAS=on

The Buildroot cmake infrastructure sets BUILD_SHARED_LIBS automatically based on Buildroot config. If lapack does not support static build it should depend on !BR2_STATIC_LIBS in Config.in

package/lapack/lapack.mk line 24

Quoted 7 lines
package/lapack/lapack.mk new file +7 -0
+ifeq ($(BR2_PACKAGE_LAPACK_COMPLEX),y)
+LAPACK_CONF_OPTS += -DBUILD_COMPLEX=on -DBUILD_COMPLEX16=on
+else
+LAPACK_CONF_OPTS += -DBUILD_COMPLEX=off -DBUILD_COMPLEX16=off
+endif
+
+$(eval $(cmake-package))

baruch

Signature · 3 lines
     http://baruch.siach.name/blog/                  ~. .~   Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
   - baruch at tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -
#3 lore raw

PATCH 2/2 package: add lapack

Hey Baruch,

Quoted 25 lines · Baruch Siach

Hi Benjamin,

Quoted 9 lines · Benjamin Kamath
package/lapack/0001-case-sensitive-paths.patch new file +3 -0
new file mode 100644
index 0000000..e032d78
@@ -0,0 +1,15 @@
+diff -rupN lapack-3.6.0/CBLAS/CMakeLists.txt lapack-3.6.0-old/CBLAS/CMakeLists.txt
+--- lapack-3.6.0/CBLAS/CMakeLists.txt        2016-03-17 13:42:31.121248051 -0700
++++ lapack-3.6.0-old/CBLAS/CMakeLists.txt    2016-03-17 13:41:37.819316904 -0700

package/lapack/0001-case-sensitive-paths.patch line 13

Quoted 10 lines
package/lapack/0001-case-sensitive-paths.patch new file +10 -0
+@@ -65,9 +65,9 @@ if(ALL_TARGETS)
+   list(GET ALL_TARGETS 0 _cblas_config_build_guard_target)
+ endif()
+
+-configure_file(${CMAKE_CURRENT_SOURCE_DIR}/CMAKE/cblas-config-version.cmake.in
++configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/cblas-config-version.cmake.in
+   ${LAPACK_BINARY_DIR}/cblas-config-version.cmake @ONLY)
+-configure_file(${CMAKE_CURRENT_SOURCE_DIR}/CMAKE/cblas-config-build.cmake.in
++configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/cblas-config-build.cmake.in
+   ${LAPACK_BINARY_DIR}/cblas-config.cmake @ONLY)

The patch needs a description and your sign-off.

Quoted 1 line

[snip]

Fixed

Quoted 38 lines
Quoted 13 lines
package/lapack/lapack.mk new file +6 -0
new file mode 100644
index 0000000..fb91543
@@ -0,0 +1,24 @@
+################################################################################
+#
+# lapack
+#
+################################################################################
+

package/lapack/lapack.mk line 16

Quoted 10 lines
package/lapack/lapack.mk new file +10 -0
+LAPACK_VERSION = 3.6.0
+LAPACK_SOURCE = lapack-$(LAPACK_VERSION).tgz
+# This package provides 2 libraries:
+# - libblas
+# - liblapack
+LAPACK_LICENSE = BSD-3c (libblas and liblapack)
+LAPACK_LICENSE_FILES = LICENSE
+LAPACK_SITE = http://www.netlib.org/lapack
+LAPACK_INSTALL_STAGING = YES
+LAPACK_CONF_OPTS = -DBUILD_SHARED_LIBS=on -DLAPACKE=on -DCBLAS=on

The Buildroot cmake infrastructure sets BUILD_SHARED_LIBS automatically based on Buildroot config. If lapack does not support static build it should depend on !BR2_STATIC_LIBS in Config.in

package/lapack/lapack.mk line 24

Quoted 7 lines
package/lapack/lapack.mk new file +7 -0
+ifeq ($(BR2_PACKAGE_LAPACK_COMPLEX),y)
+LAPACK_CONF_OPTS += -DBUILD_COMPLEX=on -DBUILD_COMPLEX16=on
+else
+LAPACK_CONF_OPTS += -DBUILD_COMPLEX=off -DBUILD_COMPLEX16=off
+endif
+
+$(eval $(cmake-package))

baruch

Quoted 4 lines

--
http://baruch.siach.name/blog/ ~. .~ Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
- baruch at tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -

Fixed, and will upload another patch set. Thanks!

-Ben

#4 lore raw

PATCH 1/2 toolchain-external: add basic fortran support

In reply to Benjamin Kamath

Hi Benjamin,

Quoted 10 lines · Benjamin Kamath

From: Benjamin Kamath <[email protected]>

Add the necessary support to allow an external toolchain to supply a fortran compiler. This mostly amounts to a toolchain configuration option that sets BR2_INSTALL_LIBFORTRAN, and then various hooks to pass along flags, as well as run-time libraries.

Additionally, gfortran needs to be invoked through the toolchain-wrapper, not just symlinked to $(TARGET_FC)gfortran.

Great works!

You may be interested in this work as well:
https://github.com/tSed/buildroot/commits/sma/ext-toolchain-options

more specifically:
https://github.com/tSed/buildroot/commit/82b0c580ce934c969839ce5e5029700d9bbdaff6
https://github.com/tSed/buildroot/commit/3a0ef3799a976fbb8fcaa272cd8c86e0a2eaa4cf
https://github.com/tSed/buildroot/commit/41a79c37bf7720b5a557a6caf054874817166d65
https://github.com/tSed/buildroot/commit/322fe0f571b163d23f0f1008703cbf1f3affe8fd
https://github.com/tSed/buildroot/commit/3dd490a79cba8bffa8f5a05cb5ca44e98426aa46
https://github.com/tSed/buildroot/commit/708d6849f24b3009e3260713018affad874bea5f
https://github.com/tSed/buildroot/commit/44243d7aa174a78000fd26342538660de1019c60
https://github.com/tSed/buildroot/commit/fcfb46274e9e9ec8ad2671ccadbe7b2bb433f2bd
https://github.com/tSed/buildroot/commit/290a0326ac98298adc4c454c8f75cf9da58efe89
https://github.com/tSed/buildroot/commit/b575a3fe025de1c8a679a3f6c72fcfa166a9cd07

The above branch is still a WIP, but the fortran support should be here and working.
(The WIP stuff being updating the external toolchain selection.)

Compare to your series, from a first and quick glance, it seems you better handle fortran flags than I did.

Few comments inlined (this is not a full in-deep review ;-])

Quoted 96 lines
---
 package/Makefile.in                                |  9 +++++++++
 package/gcc/gcc-final/gcc-final.mk                 |  4 ++--
 package/pkg-cmake.mk                               |  6 ++++++
 support/misc/toolchainfile.cmake.in                |  2 ++
 toolchain/helpers.mk                               | 13 +++++++++++++
 toolchain/toolchain-common.in                      |  3 +++
 toolchain/toolchain-external/Config.in             | 12 ++++++++++++
 toolchain/toolchain-external/toolchain-external.mk | 10 +++++++++-
 8 files changed, 56 insertions(+), 3 deletions(-)
package/Makefile.in +9 -0
index dd595e2..125406f 100644
@@ -138,6 +138,7 @@ endif
 TARGET_CPPFLAGS += -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
 TARGET_CFLAGS = $(TARGET_CPPFLAGS) $(TARGET_ABI) $(TARGET_OPTIMIZATION) $(TARGET_DEBUGGING)
 TARGET_CXXFLAGS = $(TARGET_CFLAGS)
+TARGET_FCFLAGS = $(TARGET_ABI) $(TARGET_OPTIMIZATION) $(TARGET_DEBUGGING)
 TARGET_LDFLAGS = $(call qstrip,$(BR2_TARGET_LDFLAGS))
 
 ifeq ($(BR2_BINFMT_FLAT),y)
@@ -145,28 +146,35 @@ TARGET_CFLAGS += $(if $($(PKG)_FLAT_STACKSIZE),-Wl$(comma)-elf2flt=-s$($(PKG)_FL
        -Wl$(comma)-elf2flt)
 TARGET_CXXFLAGS += $(if $($(PKG)_FLAT_STACKSIZE),-Wl$(comma)-elf2flt=-s$($(PKG)_FLAT_STACKSIZE),\
        -Wl$(comma)-elf2flt)
+TARGET_FCFLAGS += $(if $($(PKG)_FLAT_STACKSIZE),-Wl$(comma)-elf2flt=-s$($(PKG)_FLAT_STACKSIZE),\
+       -Wl$(comma)-elf2flt)
 TARGET_LDFLAGS += $(if $($(PKG)_FLAT_STACKSIZE),-elf2flt=-s$($(PKG)_FLAT_STACKSIZE),-elf2flt)
 endif
 
 ifeq ($(BR2_BINFMT_FLAT_SHARED),y)
 TARGET_LDFLAGS += -mid-shared-library -mshared-library-id=0
 TARGET_CFLAGS += -mid-shared-library -mshared-library-id=0
+TARGET_FCFLAGS += -mid-shared-library -mshared-library-id=0
 TARGET_CXXFLAGS += -mid-shared-library -mshared-library-id=0
 endif
 ifeq ($(BR2_BINFMT_FLAT_SEP_DATA),y)
 TARGET_LDFLAGS += -msep-data
 TARGET_CFLAGS += -msep-data
+TARGET_FCFLAGS += -msep-data
 TARGET_CXXFLAGS += -msep-data
 endif
 
 ifeq ($(BR2_SSP_REGULAR),y)
 TARGET_CFLAGS += -fstack-protector
+TARGET_FCFLAGS += -fstack-protector
 TARGET_CXXFLAGS += -fstack-protector
 else ifeq ($(BR2_SSP_STRONG),y)
 TARGET_CFLAGS += -fstack-protector-strong
+TARGET_FCFLAGS += -fstack-protector-strong
 TARGET_CXXFLAGS += -fstack-protector-strong
 else ifeq ($(BR2_SSP_ALL),y)
 TARGET_CFLAGS += -fstack-protector-all
+TARGET_FCFLAGS += -fstack-protector-all
 TARGET_CXXFLAGS += -fstack-protector-all
 endif
 
@@ -378,6 +386,7 @@ ifeq ($(BR2_STATIC_LIBS),y)
 SHARED_STATIC_LIBS_OPTS = --enable-static --disable-shared
 TARGET_CFLAGS += -static
 TARGET_CXXFLAGS += -static
+TARGET_FCFLAGS += -static
 TARGET_LDFLAGS += -static
 else ifeq ($(BR2_SHARED_LIBS),y)
 SHARED_STATIC_LIBS_OPTS = --disable-static --enable-shared
package/gcc/gcc-final/gcc-final.mk +2 -2
index 69fdc0c..87480c7 100644
@@ -54,7 +54,7 @@ endef
 # Languages supported by the cross-compiler
 GCC_FINAL_CROSS_LANGUAGES-y = c
 GCC_FINAL_CROSS_LANGUAGES-$(BR2_INSTALL_LIBSTDCPP) += c++
-GCC_FINAL_CROSS_LANGUAGES-$(BR2_TOOLCHAIN_BUILDROOT_FORTRAN) += fortran
+GCC_FINAL_CROSS_LANGUAGES-$(BR2_INSTALL_LIBFORTRAN) += fortran
 GCC_FINAL_CROSS_LANGUAGES = $(subst $(space),$(comma),$(GCC_FINAL_CROSS_LANGUAGES-y))
 
 HOST_GCC_FINAL_CONF_OPTS = \
@@ -152,7 +152,7 @@ ifeq ($(BR2_INSTALL_LIBSTDCPP),y)
 HOST_GCC_FINAL_USR_LIBS += libstdc++
 endif
 
-ifeq ($(BR2_TOOLCHAIN_BUILDROOT_FORTRAN),y)
+ifeq ($(BR2_INSTALL_LIBFORTRAN),y)
 HOST_GCC_FINAL_USR_LIBS += libgfortran
 endif
 
package/pkg-cmake.mk +0 -0
index 81dcfcc..a93709e 100644

package/pkg-cmake.mk CMAKE_HOST_C_COMPILER = $(HOSTCC) · line 35

Quoted 5 lines
package/pkg-cmake.mk +2 -0
@@ -31,6 +31,8 @@ CMAKE_HOST_C_COMPILER = $(HOSTCC)
 CMAKE_HOST_CXX_COMPILER = $(HOSTCXX)
 endif
 
+CMAKE_HOST_Fortran_COMPILER ?= $(HOSTFC)
+

Is this needed? What for?
AFAICS, there is no host-package requiring HOSTFC...

package/pkg-cmake.mk define $(2)_CONFIGURE_CMDS · line 124

Quoted 8 lines
package/pkg-cmake.mk +1 -0
 ifneq ($(QUIET),)
 CMAKE_QUIET = -DCMAKE_RULE_MESSAGES=OFF -DCMAKE_INSTALL_MESSAGE=NEVER
 endif
@@ -119,10 +121,12 @@ define $(2)_CONFIGURE_CMDS
                -DCMAKE_INSTALL_PREFIX="$$(HOST_DIR)/usr" \
                -DCMAKE_C_FLAGS="$$(HOST_CFLAGS)" \
                -DCMAKE_CXX_FLAGS="$$(HOST_CXXFLAGS)" \
+               -DCMAKE_FC_FLAGS="$$(HOST_FCFLAGS)" \

Why setting CMAKE_FC_FLAGS instead of CMAKE_Fortran_FLAGS?

Quoted 33 lines
package/pkg-cmake.mk +3 -0
                -DCMAKE_EXE_LINKER_FLAGS="$$(HOST_LDFLAGS)" \
                -DCMAKE_ASM_COMPILER="$$(HOSTAS)" \
                -DCMAKE_C_COMPILER="$$(CMAKE_HOST_C_COMPILER)" \
                -DCMAKE_CXX_COMPILER="$$(CMAKE_HOST_CXX_COMPILER)" \
+               -DCMAKE_Fortran_COMPILER="$$(CMAKE_HOST_Fortran_COMPILER)" \
                $(if $$(CMAKE_HOST_C_COMPILER_ARG1),\
                        -DCMAKE_C_COMPILER_ARG1="$$(CMAKE_HOST_C_COMPILER_ARG1)" \
                        -DCMAKE_CXX_COMPILER_ARG1="$$(CMAKE_HOST_CXX_COMPILER_ARG1)" \
@@ -243,9 +247,11 @@ $(HOST_DIR)/usr/share/buildroot/toolchainfile.cmake:
                -e 's#@@STAGING_SUBDIR@@#$(call qstrip,$(STAGING_SUBDIR))#' \
                -e 's#@@TARGET_CFLAGS@@#$(call qstrip,$(TARGET_CFLAGS))#' \
                -e 's#@@TARGET_CXXFLAGS@@#$(call qstrip,$(TARGET_CXXFLAGS))#' \
+               -e 's:@@TARGET_FCFLAGS@@:$(call qstrip,$(TARGET_FCFLAGS)):' \
                -e 's#@@TARGET_LDFLAGS@@#$(call qstrip,$(TARGET_LDFLAGS))#' \
                -e 's#@@TARGET_CC@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_CC)))#' \
                -e 's#@@TARGET_CXX@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_CXX)))#' \
+               -e 's:@@TARGET_FC@@:$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_FC))):' \
                -e 's#@@CMAKE_SYSTEM_PROCESSOR@@#$(call qstrip,$(CMAKE_SYSTEM_PROCESSOR))#' \
                $(TOPDIR)/support/misc/toolchainfile.cmake.in \
                > $@
support/misc/toolchainfile.cmake.in +1 -0
index 5cf381e..4112604 100644
@@ -15,6 +15,7 @@ set(CMAKE_SYSTEM_PROCESSOR @@CMAKE_SYSTEM_PROCESSOR@@)
 
 set(CMAKE_C_FLAGS "@@TARGET_CFLAGS@@ ${CMAKE_C_FLAGS}" CACHE STRING "Buildroot CFLAGS")
 set(CMAKE_CXX_FLAGS "@@TARGET_CXXFLAGS@@ ${CMAKE_CXX_FLAGS}" CACHE STRING "Buildroot CXXFLAGS")
+set(CMAKE_Fortran_FLAGS "@@TARGET_FCFLAGS@@ ${CMAKE_Fortran_FLAGS}" CACHE STRING "Buildroot FCFLAGS")
 set(CMAKE_EXE_LINKER_FLAGS "@@TARGET_LDFLAGS@@ ${CMAKE_EXE_LINKER_FLAGS}" CACHE STRING "Buildroot LDFLAGS")
 set(CMAKE_INSTALL_SO_NO_EXE 0)
 

support/misc/toolchainfile.cmake.in set(ENV{PKG_CONFIG_SYSROOT_DIR} "${RELOCATED_HOST_DIR}/@@STAGING_SUBDIR@@") · line 33

Quoted 4 lines
support/misc/toolchainfile.cmake.in +1 -0
@@ -29,3 +30,4 @@ set(ENV{PKG_CONFIG_SYSROOT_DIR} "${RELOCATED_HOST_DIR}/@@STAGING_SUBDIR@@")
 # This toolchain file can be used both inside and outside Buildroot.
 set(CMAKE_C_COMPILER "${RELOCATED_HOST_DIR}/@@TARGET_CC@@")
 set(CMAKE_CXX_COMPILER "${RELOCATED_HOST_DIR}/@@TARGET_CXX@@")
+set(CMAKE_Fortran_COMPILER "${RELOCATED_HOST_DIR}/@@TARGET_FC@@")

This will set (force to set) the fortran compile path in all configuration, even in those that do not have it... :-/

Quoted 134 lines
toolchain/helpers.mk +13 -0
index ee878e8..196f295 100644
@@ -382,6 +382,19 @@ check_cplusplus = \
        fi
 
 #
+# Check that the external toolchain supports Fortran
+#
+# $1: cross-gfortran path
+#
+check_fortran = \
+       __CROSS_FC=$(strip $1) ; \
+       $${__CROSS_FC} -v > /dev/null 2>&1 ; \
+       if test $$? -ne 0 ; then \
+               echo "Fortran support is selected but is not available in external toolchain" ; \
+               exit 1 ; \
+       fi
+
+#
 # Check that the cross-compiler given in the configuration exists
 #
 # $1: cross-gcc path
toolchain/toolchain-common.in +3 -0
index 46970a6..1d7afa7 100644
@@ -17,6 +17,9 @@ config BR2_ENABLE_LOCALE
 config BR2_INSTALL_LIBSTDCPP
        bool
 
+config BR2_INSTALL_LIBFORTRAN
+       bool
+
 config BR2_TOOLCHAIN_HAS_THREADS
        bool
 
toolchain/toolchain-external/Config.in +12 -0
index ff759a0..64027ff 100644
@@ -24,6 +24,7 @@ config BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM
        select BR2_TOOLCHAIN_EXTERNAL_GLIBC
        select BR2_TOOLCHAIN_HAS_NATIVE_RPC
        select BR2_INSTALL_LIBSTDCPP
+       select BR2_INSTALL_LIBFORTRAN
        select BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_1
        select BR2_TOOLCHAIN_GCC_AT_LEAST_4_9
        help
@@ -46,6 +47,7 @@ config BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM
        select BR2_TOOLCHAIN_EXTERNAL_GLIBC
        select BR2_TOOLCHAIN_HAS_NATIVE_RPC
        select BR2_INSTALL_LIBSTDCPP
+       select BR2_INSTALL_LIBFORTRAN
        select BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_0
        select BR2_TOOLCHAIN_GCC_AT_LEAST_5
        help
@@ -68,6 +70,7 @@ config BR2_TOOLCHAIN_EXTERNAL_LINARO_ARMEB
        select BR2_TOOLCHAIN_EXTERNAL_GLIBC
        select BR2_TOOLCHAIN_HAS_NATIVE_RPC
        select BR2_INSTALL_LIBSTDCPP
+       select BR2_INSTALL_LIBFORTRAN
        select BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_1
        select BR2_TOOLCHAIN_GCC_AT_LEAST_4_9
        help
@@ -90,6 +93,7 @@ config BR2_TOOLCHAIN_EXTERNAL_LINARO_ARMEB
        select BR2_TOOLCHAIN_EXTERNAL_GLIBC
        select BR2_TOOLCHAIN_HAS_NATIVE_RPC
        select BR2_INSTALL_LIBSTDCPP
+       select BR2_INSTALL_LIBFORTRAN
        select BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_0
        select BR2_TOOLCHAIN_GCC_AT_LEAST_5
        help
@@ -1047,6 +1051,14 @@ config BR2_TOOLCHAIN_EXTERNAL_CXX
          support. If you don't know, leave the default value,
          Buildroot will tell you if it's correct or not.
 
+config BR2_TOOLCHAIN_EXTERNAL_FORTRAN
+       bool "Toolchain has Fortran support?"
+       select BR2_INSTALL_LIBFORTRAN
+       help
+         Select this option if your external toolchain has Fortran
+         support. If you don't know, leave the default value,
+         Buildroot will tell you if it's correct or not.
+
 config BR2_TOOLCHAIN_EXTRA_EXTERNAL_LIBS
        string "Extra toolchain libraries to be copied to target"
        help
toolchain/toolchain-external/toolchain-external.mk +9 -2
index 37e1a2e..070d0cf 100644
@@ -90,6 +90,10 @@ ifeq ($(BR2_INSTALL_LIBSTDCPP),y)
 USR_LIB_EXTERNAL_LIBS += libstdc++.so.*
 endif
 
+ifeq ($(BR2_INSTALL_LIBFORTRAN),y)
+USR_LIB_EXTERNAL_LIBS += libgfortran.so.*
+endif
+
 LIB_EXTERNAL_LIBS += $(call qstrip,$(BR2_TOOLCHAIN_EXTRA_EXTERNAL_LIBS))
 
 # Details about sysroot directory selection.
@@ -160,6 +164,7 @@ TOOLCHAIN_EXTERNAL_TOOLCHAIN_WRAPPER_ARGS += \
 TOOLCHAIN_EXTERNAL_CROSS = $(TOOLCHAIN_EXTERNAL_BIN)/$(TOOLCHAIN_EXTERNAL_PREFIX)-
 TOOLCHAIN_EXTERNAL_CC = $(TOOLCHAIN_EXTERNAL_CROSS)gcc$(TOOLCHAIN_EXTERNAL_SUFFIX)
 TOOLCHAIN_EXTERNAL_CXX = $(TOOLCHAIN_EXTERNAL_CROSS)g++$(TOOLCHAIN_EXTERNAL_SUFFIX)
+TOOLCHAIN_EXTERNAL_FC = $(TOOLCHAIN_EXTERNAL_CROSS)gfortran$(TOOLCHAIN_EXTERNAL_SUFFIX)
 TOOLCHAIN_EXTERNAL_READELF = $(TOOLCHAIN_EXTERNAL_CROSS)readelf$(TOOLCHAIN_EXTERNAL_SUFFIX)
 
 ifeq ($(filter $(HOST_DIR)/%,$(TOOLCHAIN_EXTERNAL_BIN)),)
@@ -495,6 +500,9 @@ define TOOLCHAIN_EXTERNAL_CONFIGURE_CMDS
        if test "$(BR2_INSTALL_LIBSTDCPP)" = "y" ; then \
                $(call check_cplusplus,$(TOOLCHAIN_EXTERNAL_CXX)) ; \
        fi ; \
+       if test "$(BR2_INSTALL_LIBFORTRAN)" = "y" ; then \
+               $(call check_fortran,$(TOOLCHAIN_EXTERNAL_FC)) ; \
+       fi ; \
        if test "$(BR2_TOOLCHAIN_EXTERNAL_UCLIBC)" = "y" ; then \
                $(call check_uclibc,$${SYSROOT_DIR}) ; \
        elif test "$(BR2_TOOLCHAIN_EXTERNAL_MUSL)" = "y" ; then \
@@ -719,7 +727,7 @@ define TOOLCHAIN_EXTERNAL_INSTALL_WRAPPER
                *-ar|*-ranlib|*-nm) \
                        ln -sf $$(echo $$i | sed 's%^$(HOST_DIR)%../..%') .; \
                        ;; \
-               *cc|*cc-*|*++|*++-*|*cpp) \
+               *cc|*cc-*|*++|*++-*|*cpp|*fortran) \
                        ln -sf toolchain-wrapper $$base; \
                        ;; \
                *gdb|*gdbtui) \
--

2.5.0

Quoted 4 lines

_______________________________________________
buildroot mailing list
buildroot at busybox.net
http://lists.busybox.net/mailman/listinfo/buildroot

Regards,

Signature · 1 line
Samuel
#5 lore raw

PATCH 1/2 toolchain-external: add basic fortran support

Hey Samuel,

Quoted 31 lines · Samuel Martin

Hi Benjamin,

Quoted 10 lines · Benjamin Kamath

From: Benjamin Kamath <[email protected]>

Add the necessary support to allow an external toolchain to supply a fortran compiler. This mostly amounts to a toolchain configuration option that sets BR2_INSTALL_LIBFORTRAN, and then various hooks to pass along flags, as well as run-time libraries.

Additionally, gfortran needs to be invoked through the toolchain-wrapper, not just symlinked to $(TARGET_FC)gfortran.

Great works!

You may be interested in this work as well:
https://github.com/tSed/buildroot/commits/sma/ext-toolchain-options

more specifically:
https://github.com/tSed/buildroot/commit/82b0c580ce934c969839ce5e5029700d9bbdaff6
https://github.com/tSed/buildroot/commit/3a0ef3799a976fbb8fcaa272cd8c86e0a2eaa4cf
https://github.com/tSed/buildroot/commit/41a79c37bf7720b5a557a6caf054874817166d65
https://github.com/tSed/buildroot/commit/322fe0f571b163d23f0f1008703cbf1f3affe8fd
https://github.com/tSed/buildroot/commit/3dd490a79cba8bffa8f5a05cb5ca44e98426aa46
https://github.com/tSed/buildroot/commit/708d6849f24b3009e3260713018affad874bea5f
https://github.com/tSed/buildroot/commit/44243d7aa174a78000fd26342538660de1019c60
https://github.com/tSed/buildroot/commit/fcfb46274e9e9ec8ad2671ccadbe7b2bb433f2bd
https://github.com/tSed/buildroot/commit/290a0326ac98298adc4c454c8f75cf9da58efe89
https://github.com/tSed/buildroot/commit/b575a3fe025de1c8a679a3f6c72fcfa166a9cd07

Quoted 4 lines

The above branch is still a WIP, but the fortran support should be here and working.
(The WIP stuff being updating the external toolchain selection.)

Nice! I didn't find that before when I did a google search. Very cool/useful external toolchain
feature tool!

Quoted 104 lines

Compare to your series, from a first and quick glance, it seems you better handle fortran flags than I did.

Few comments inlined (this is not a full in-deep review ;-])

Quoted 99 lines
---
 package/Makefile.in                                |  9 +++++++++
 package/gcc/gcc-final/gcc-final.mk                 |  4 ++--
 package/pkg-cmake.mk                               |  6 ++++++
 support/misc/toolchainfile.cmake.in                |  2 ++
 toolchain/helpers.mk                               | 13 +++++++++++++
 toolchain/toolchain-common.in                      |  3 +++
 toolchain/toolchain-external/Config.in             | 12 ++++++++++++
 toolchain/toolchain-external/toolchain-external.mk | 10 +++++++++-
 8 files changed, 56 insertions(+), 3 deletions(-)
package/Makefile.in +9 -0
index dd595e2..125406f 100644
@@ -138,6 +138,7 @@ endif
 TARGET_CPPFLAGS += -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
 TARGET_CFLAGS = $(TARGET_CPPFLAGS) $(TARGET_ABI) $(TARGET_OPTIMIZATION) $(TARGET_DEBUGGING)
 TARGET_CXXFLAGS = $(TARGET_CFLAGS)
+TARGET_FCFLAGS = $(TARGET_ABI) $(TARGET_OPTIMIZATION) $(TARGET_DEBUGGING)
 TARGET_LDFLAGS = $(call qstrip,$(BR2_TARGET_LDFLAGS))
 
 ifeq ($(BR2_BINFMT_FLAT),y)
@@ -145,28 +146,35 @@ TARGET_CFLAGS += $(if $($(PKG)_FLAT_STACKSIZE),-Wl$(comma)-elf2flt=-s$($(PKG)_FL
        -Wl$(comma)-elf2flt)
 TARGET_CXXFLAGS += $(if $($(PKG)_FLAT_STACKSIZE),-Wl$(comma)-elf2flt=-s$($(PKG)_FLAT_STACKSIZE),\
        -Wl$(comma)-elf2flt)
+TARGET_FCFLAGS += $(if $($(PKG)_FLAT_STACKSIZE),-Wl$(comma)-elf2flt=-s$($(PKG)_FLAT_STACKSIZE),\
+       -Wl$(comma)-elf2flt)
 TARGET_LDFLAGS += $(if $($(PKG)_FLAT_STACKSIZE),-elf2flt=-s$($(PKG)_FLAT_STACKSIZE),-elf2flt)
 endif
 
 ifeq ($(BR2_BINFMT_FLAT_SHARED),y)
 TARGET_LDFLAGS += -mid-shared-library -mshared-library-id=0
 TARGET_CFLAGS += -mid-shared-library -mshared-library-id=0
+TARGET_FCFLAGS += -mid-shared-library -mshared-library-id=0
 TARGET_CXXFLAGS += -mid-shared-library -mshared-library-id=0
 endif
 ifeq ($(BR2_BINFMT_FLAT_SEP_DATA),y)
 TARGET_LDFLAGS += -msep-data
 TARGET_CFLAGS += -msep-data
+TARGET_FCFLAGS += -msep-data
 TARGET_CXXFLAGS += -msep-data
 endif
 
 ifeq ($(BR2_SSP_REGULAR),y)
 TARGET_CFLAGS += -fstack-protector
+TARGET_FCFLAGS += -fstack-protector
 TARGET_CXXFLAGS += -fstack-protector
 else ifeq ($(BR2_SSP_STRONG),y)
 TARGET_CFLAGS += -fstack-protector-strong
+TARGET_FCFLAGS += -fstack-protector-strong
 TARGET_CXXFLAGS += -fstack-protector-strong
 else ifeq ($(BR2_SSP_ALL),y)
 TARGET_CFLAGS += -fstack-protector-all
+TARGET_FCFLAGS += -fstack-protector-all
 TARGET_CXXFLAGS += -fstack-protector-all
 endif
 
@@ -378,6 +386,7 @@ ifeq ($(BR2_STATIC_LIBS),y)
 SHARED_STATIC_LIBS_OPTS = --enable-static --disable-shared
 TARGET_CFLAGS += -static
 TARGET_CXXFLAGS += -static
+TARGET_FCFLAGS += -static
 TARGET_LDFLAGS += -static
 else ifeq ($(BR2_SHARED_LIBS),y)
 SHARED_STATIC_LIBS_OPTS = --disable-static --enable-shared
package/gcc/gcc-final/gcc-final.mk +2 -2
index 69fdc0c..87480c7 100644
@@ -54,7 +54,7 @@ endef
 # Languages supported by the cross-compiler
 GCC_FINAL_CROSS_LANGUAGES-y = c
 GCC_FINAL_CROSS_LANGUAGES-$(BR2_INSTALL_LIBSTDCPP) += c++
-GCC_FINAL_CROSS_LANGUAGES-$(BR2_TOOLCHAIN_BUILDROOT_FORTRAN) += fortran
+GCC_FINAL_CROSS_LANGUAGES-$(BR2_INSTALL_LIBFORTRAN) += fortran
 GCC_FINAL_CROSS_LANGUAGES = $(subst $(space),$(comma),$(GCC_FINAL_CROSS_LANGUAGES-y))
 
 HOST_GCC_FINAL_CONF_OPTS = \
@@ -152,7 +152,7 @@ ifeq ($(BR2_INSTALL_LIBSTDCPP),y)
 HOST_GCC_FINAL_USR_LIBS += libstdc++
 endif
 
-ifeq ($(BR2_TOOLCHAIN_BUILDROOT_FORTRAN),y)
+ifeq ($(BR2_INSTALL_LIBFORTRAN),y)
 HOST_GCC_FINAL_USR_LIBS += libgfortran
 endif
 
package/pkg-cmake.mk +0 -0
index 81dcfcc..a93709e 100644
@@ -31,6 +31,8 @@ CMAKE_HOST_C_COMPILER = $(HOSTCC)
 CMAKE_HOST_CXX_COMPILER = $(HOSTCXX)
 endif
 
Quoted 5 lines

package/pkg-cmake.mk CMAKE_HOST_C_COMPILER = $(HOSTCC) · line 35

Quoted 2 lines
package/pkg-cmake.mk +2 -0
+CMAKE_HOST_Fortran_COMPILER ?= $(HOSTFC)
+

Is this needed? What for?
AFAICS, there is no host-package requiring HOSTFC...

Good point, this can be added when something requires it, removed.

Quoted 11 lines

package/pkg-cmake.mk define $(2)_CONFIGURE_CMDS · line 124

Quoted 9 lines
package/pkg-cmake.mk +1 -0
 ifneq ($(QUIET),)
 CMAKE_QUIET = -DCMAKE_RULE_MESSAGES=OFF -DCMAKE_INSTALL_MESSAGE=NEVER
 endif
@@ -119,10 +121,12 @@ define $(2)_CONFIGURE_CMDS
                -DCMAKE_INSTALL_PREFIX="$$(HOST_DIR)/usr" \
                -DCMAKE_C_FLAGS="$$(HOST_CFLAGS)" \
                -DCMAKE_CXX_FLAGS="$$(HOST_CXXFLAGS)" \
+               -DCMAKE_FC_FLAGS="$$(HOST_FCFLAGS)" \

Why setting CMAKE_FC_FLAGS instead of CMAKE_Fortran_FLAGS?

Good catch, fixed.

Quoted 33 lines
Quoted 33 lines
package/pkg-cmake.mk +3 -0
                -DCMAKE_EXE_LINKER_FLAGS="$$(HOST_LDFLAGS)" \
                -DCMAKE_ASM_COMPILER="$$(HOSTAS)" \
                -DCMAKE_C_COMPILER="$$(CMAKE_HOST_C_COMPILER)" \
                -DCMAKE_CXX_COMPILER="$$(CMAKE_HOST_CXX_COMPILER)" \
+               -DCMAKE_Fortran_COMPILER="$$(CMAKE_HOST_Fortran_COMPILER)" \
                $(if $$(CMAKE_HOST_C_COMPILER_ARG1),\
                        -DCMAKE_C_COMPILER_ARG1="$$(CMAKE_HOST_C_COMPILER_ARG1)" \
                        -DCMAKE_CXX_COMPILER_ARG1="$$(CMAKE_HOST_CXX_COMPILER_ARG1)" \
@@ -243,9 +247,11 @@ $(HOST_DIR)/usr/share/buildroot/toolchainfile.cmake:
                -e 's#@@STAGING_SUBDIR@@#$(call qstrip,$(STAGING_SUBDIR))#' \
                -e 's#@@TARGET_CFLAGS@@#$(call qstrip,$(TARGET_CFLAGS))#' \
                -e 's#@@TARGET_CXXFLAGS@@#$(call qstrip,$(TARGET_CXXFLAGS))#' \
+               -e 's:@@TARGET_FCFLAGS@@:$(call qstrip,$(TARGET_FCFLAGS)):' \
                -e 's#@@TARGET_LDFLAGS@@#$(call qstrip,$(TARGET_LDFLAGS))#' \
                -e 's#@@TARGET_CC@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_CC)))#' \
                -e 's#@@TARGET_CXX@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_CXX)))#' \
+               -e 's:@@TARGET_FC@@:$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_FC))):' \
                -e 's#@@CMAKE_SYSTEM_PROCESSOR@@#$(call qstrip,$(CMAKE_SYSTEM_PROCESSOR))#' \
                $(TOPDIR)/support/misc/toolchainfile.cmake.in \
                > $@
support/misc/toolchainfile.cmake.in +1 -0
index 5cf381e..4112604 100644
@@ -15,6 +15,7 @@ set(CMAKE_SYSTEM_PROCESSOR @@CMAKE_SYSTEM_PROCESSOR@@)
 
 set(CMAKE_C_FLAGS "@@TARGET_CFLAGS@@ ${CMAKE_C_FLAGS}" CACHE STRING "Buildroot CFLAGS")
 set(CMAKE_CXX_FLAGS "@@TARGET_CXXFLAGS@@ ${CMAKE_CXX_FLAGS}" CACHE STRING "Buildroot CXXFLAGS")
+set(CMAKE_Fortran_FLAGS "@@TARGET_FCFLAGS@@ ${CMAKE_Fortran_FLAGS}" CACHE STRING "Buildroot FCFLAGS")
 set(CMAKE_EXE_LINKER_FLAGS "@@TARGET_LDFLAGS@@ ${CMAKE_EXE_LINKER_FLAGS}" CACHE STRING "Buildroot LDFLAGS")
 set(CMAKE_INSTALL_SO_NO_EXE 0)
 
Quoted 8 lines

support/misc/toolchainfile.cmake.in set(ENV{PKG_CONFIG_SYSROOT_DIR} "${RELOCATED_HOST_DIR}/@@STAGING_SUBDIR@@") · line 33

Quoted 5 lines
support/misc/toolchainfile.cmake.in +1 -0
@@ -29,3 +30,4 @@ set(ENV{PKG_CONFIG_SYSROOT_DIR} "${RELOCATED_HOST_DIR}/@@STAGING_SUBDIR@@")
 # This toolchain file can be used both inside and outside Buildroot.
 set(CMAKE_C_COMPILER "${RELOCATED_HOST_DIR}/@@TARGET_CC@@")
 set(CMAKE_CXX_COMPILER "${RELOCATED_HOST_DIR}/@@TARGET_CXX@@")
+set(CMAKE_Fortran_COMPILER "${RELOCATED_HOST_DIR}/@@TARGET_FC@@")

This will set (force to set) the fortran compile path in all configuration, even in those that do not have it... :-/

Fixed by passing in the fortran support via sed and conditionally setting based on that.
That said I'm new to CMake so other suggestions are welcome.

Quoted 142 lines
Quoted 135 lines
toolchain/helpers.mk +13 -0
index ee878e8..196f295 100644
@@ -382,6 +382,19 @@ check_cplusplus = \
        fi
 
 #
+# Check that the external toolchain supports Fortran
+#
+# $1: cross-gfortran path
+#
+check_fortran = \
+       __CROSS_FC=$(strip $1) ; \
+       $${__CROSS_FC} -v > /dev/null 2>&1 ; \
+       if test $$? -ne 0 ; then \
+               echo "Fortran support is selected but is not available in external toolchain" ; \
+               exit 1 ; \
+       fi
+
+#
 # Check that the cross-compiler given in the configuration exists
 #
 # $1: cross-gcc path
toolchain/toolchain-common.in +3 -0
index 46970a6..1d7afa7 100644
@@ -17,6 +17,9 @@ config BR2_ENABLE_LOCALE
 config BR2_INSTALL_LIBSTDCPP
        bool
 
+config BR2_INSTALL_LIBFORTRAN
+       bool
+
 config BR2_TOOLCHAIN_HAS_THREADS
        bool
 
toolchain/toolchain-external/Config.in +12 -0
index ff759a0..64027ff 100644
@@ -24,6 +24,7 @@ config BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM
        select BR2_TOOLCHAIN_EXTERNAL_GLIBC
        select BR2_TOOLCHAIN_HAS_NATIVE_RPC
        select BR2_INSTALL_LIBSTDCPP
+       select BR2_INSTALL_LIBFORTRAN
        select BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_1
        select BR2_TOOLCHAIN_GCC_AT_LEAST_4_9
        help
@@ -46,6 +47,7 @@ config BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM
        select BR2_TOOLCHAIN_EXTERNAL_GLIBC
        select BR2_TOOLCHAIN_HAS_NATIVE_RPC
        select BR2_INSTALL_LIBSTDCPP
+       select BR2_INSTALL_LIBFORTRAN
        select BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_0
        select BR2_TOOLCHAIN_GCC_AT_LEAST_5
        help
@@ -68,6 +70,7 @@ config BR2_TOOLCHAIN_EXTERNAL_LINARO_ARMEB
        select BR2_TOOLCHAIN_EXTERNAL_GLIBC
        select BR2_TOOLCHAIN_HAS_NATIVE_RPC
        select BR2_INSTALL_LIBSTDCPP
+       select BR2_INSTALL_LIBFORTRAN
        select BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_1
        select BR2_TOOLCHAIN_GCC_AT_LEAST_4_9
        help
@@ -90,6 +93,7 @@ config BR2_TOOLCHAIN_EXTERNAL_LINARO_ARMEB
        select BR2_TOOLCHAIN_EXTERNAL_GLIBC
        select BR2_TOOLCHAIN_HAS_NATIVE_RPC
        select BR2_INSTALL_LIBSTDCPP
+       select BR2_INSTALL_LIBFORTRAN
        select BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_0
        select BR2_TOOLCHAIN_GCC_AT_LEAST_5
        help
@@ -1047,6 +1051,14 @@ config BR2_TOOLCHAIN_EXTERNAL_CXX
          support. If you don't know, leave the default value,
          Buildroot will tell you if it's correct or not.
 
+config BR2_TOOLCHAIN_EXTERNAL_FORTRAN
+       bool "Toolchain has Fortran support?"
+       select BR2_INSTALL_LIBFORTRAN
+       help
+         Select this option if your external toolchain has Fortran
+         support. If you don't know, leave the default value,
+         Buildroot will tell you if it's correct or not.
+
 config BR2_TOOLCHAIN_EXTRA_EXTERNAL_LIBS
        string "Extra toolchain libraries to be copied to target"
        help
toolchain/toolchain-external/toolchain-external.mk +9 -2
index 37e1a2e..070d0cf 100644
@@ -90,6 +90,10 @@ ifeq ($(BR2_INSTALL_LIBSTDCPP),y)
 USR_LIB_EXTERNAL_LIBS += libstdc++.so.*
 endif
 
+ifeq ($(BR2_INSTALL_LIBFORTRAN),y)
+USR_LIB_EXTERNAL_LIBS += libgfortran.so.*
+endif
+
 LIB_EXTERNAL_LIBS += $(call qstrip,$(BR2_TOOLCHAIN_EXTRA_EXTERNAL_LIBS))
 
 # Details about sysroot directory selection.
@@ -160,6 +164,7 @@ TOOLCHAIN_EXTERNAL_TOOLCHAIN_WRAPPER_ARGS += \
 TOOLCHAIN_EXTERNAL_CROSS = $(TOOLCHAIN_EXTERNAL_BIN)/$(TOOLCHAIN_EXTERNAL_PREFIX)-
 TOOLCHAIN_EXTERNAL_CC = $(TOOLCHAIN_EXTERNAL_CROSS)gcc$(TOOLCHAIN_EXTERNAL_SUFFIX)
 TOOLCHAIN_EXTERNAL_CXX = $(TOOLCHAIN_EXTERNAL_CROSS)g++$(TOOLCHAIN_EXTERNAL_SUFFIX)
+TOOLCHAIN_EXTERNAL_FC = $(TOOLCHAIN_EXTERNAL_CROSS)gfortran$(TOOLCHAIN_EXTERNAL_SUFFIX)
 TOOLCHAIN_EXTERNAL_READELF = $(TOOLCHAIN_EXTERNAL_CROSS)readelf$(TOOLCHAIN_EXTERNAL_SUFFIX)
 
 ifeq ($(filter $(HOST_DIR)/%,$(TOOLCHAIN_EXTERNAL_BIN)),)
@@ -495,6 +500,9 @@ define TOOLCHAIN_EXTERNAL_CONFIGURE_CMDS
        if test "$(BR2_INSTALL_LIBSTDCPP)" = "y" ; then \
                $(call check_cplusplus,$(TOOLCHAIN_EXTERNAL_CXX)) ; \
        fi ; \
+       if test "$(BR2_INSTALL_LIBFORTRAN)" = "y" ; then \
+               $(call check_fortran,$(TOOLCHAIN_EXTERNAL_FC)) ; \
+       fi ; \
        if test "$(BR2_TOOLCHAIN_EXTERNAL_UCLIBC)" = "y" ; then \
                $(call check_uclibc,$${SYSROOT_DIR}) ; \
        elif test "$(BR2_TOOLCHAIN_EXTERNAL_MUSL)" = "y" ; then \
@@ -719,7 +727,7 @@ define TOOLCHAIN_EXTERNAL_INSTALL_WRAPPER
                *-ar|*-ranlib|*-nm) \
                        ln -sf $$(echo $$i | sed 's%^$(HOST_DIR)%../..%') .; \
                        ;; \
-               *cc|*cc-*|*++|*++-*|*cpp) \
+               *cc|*cc-*|*++|*++-*|*cpp|*fortran) \
                        ln -sf toolchain-wrapper $$base; \
                        ;; \
                *gdb|*gdbtui) \
--

2.5.0

Quoted 4 lines

_______________________________________________
buildroot mailing list
buildroot at busybox.net
http://lists.busybox.net/mailman/listinfo/buildroot

Regards,

Quoted 2 lines

--
Samuel

Fixed and uploading another patch set. Separated out changes to the gcc package (more buildroot toolchain related). Very interested in your branch, in terms of LTO support and the external toolchain helper script!

Cheers,
Ben