Build cmake with g++-4.9 on arm

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Build cmake with g++-4.9 on arm

David Coppa

With the diff below, I have a working cmake-3.4.3 package for arm.

One can say I lost the battle and gave up, but let's face reality:
base libstdc++ on arm is FUBAR, there's not much we can do...

It is plagued by a plethora of bugs:

It forced us to use '-O1 -fno-stack-protector'.
It broke CMake's built-in ELF parser.
And finally ifstream is bugged when linking with -lpthread.

See my previous "std::ifstream is broken on arm" mail on bugs@.

If you want to play, you can install my packages with:

# export PKG_PATH=http://open.bsdgeek.it/arm/
# pkg_add cmake ninja

It will save you some pain, since it took me ~1 day to build cmake
on a BBB.

I've already built some cmake-based ports for testing purposes, and
all seems good so far.

Comments?
OKs?

Index: Makefile
===================================================================
RCS file: /cvs/ports/devel/cmake/Makefile,v
retrieving revision 1.139
diff -u -p -u -p -r1.139 Makefile
--- Makefile 26 Jan 2016 08:44:07 -0000 1.139
+++ Makefile 27 Jan 2016 13:10:03 -0000
@@ -2,12 +2,6 @@
 
 DPB_PROPERTIES =parallel
 
-# avoid segfaults from binaries compiled and then used during the build
-.if ${MACHINE_ARCH} == "arm"
-CFLAGS += -O1 -fno-stack-protector
-CXXFLAGS += -O1 -fno-stack-protector
-.endif
-
 COMMENT = portable build system
 
 VER = 3.4.3
@@ -25,9 +19,14 @@ PERMIT_PACKAGE_CDROM = Yes
 
 WANTLIB += archive c curl expat form jsoncpp m ncurses pthread stdc++ z
 
-# XXX: CMake's built-in ELF parser is broken on arm
+# XXX: On arm libstdc++ from base (and especially iostream) seems
+# to be broken, so use g++ from ports.
+MODULES = gcc4
+MODGCC4_ARCHS = arm
+MODGCC4_LANGS = c++
+
 # XXX: Ninja is broken on m88k
-.if ${MACHINE_ARCH} != "arm" && ${MACHINE_ARCH} != "m88k"
+.if ${MACHINE_ARCH} != "m88k"
 BUILD_DEPENDS = devel/ninja>=1.5.1
 .endif
 
@@ -72,9 +71,8 @@ pre-configure:
  ${WRKSRC}/Modules/FindSDL.cmake \
  ${WRKSRC}/Modules/FindTCL.cmake
 
-# XXX: CMake's built-in ELF parser is broken on arm
 # XXX: Ninja is broken on m88k
-.if ${MACHINE_ARCH} != "arm" && ${MACHINE_ARCH} != "m88k"
+.if ${MACHINE_ARCH} != "m88k"
 do-build:
  cd ${WRKBUILD} && exec ${SETENV} ${MAKE_ENV} ninja -v -j \
  ${MAKE_JOBS} ${ALL_TARGET}
Index: cmake.port.mk
===================================================================
RCS file: /cvs/ports/devel/cmake/cmake.port.mk,v
retrieving revision 1.52
diff -u -p -u -p -r1.52 cmake.port.mk
--- cmake.port.mk 26 Jan 2016 08:44:07 -0000 1.52
+++ cmake.port.mk 27 Jan 2016 13:10:03 -0000
@@ -9,9 +9,8 @@ MAKE_ENV+=LIB${_n}_VERSION=${_v}
 
 USE_NINJA ?= Yes
 
-# XXX: CMake's built-in ELF parser is broken on arm
 # XXX: Ninja is broken on m88k
-.if ${MACHINE_ARCH} == "arm" || ${MACHINE_ARCH} == "m88k"
+.if ${MACHINE_ARCH} == "m88k"
 USE_NINJA = No
 .endif
 
Index: patches/patch-Source_CMakeLists_txt
===================================================================
RCS file: patches/patch-Source_CMakeLists_txt
diff -N patches/patch-Source_CMakeLists_txt
--- patches/patch-Source_CMakeLists_txt 31 Dec 2014 11:06:02 -0000 1.6
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,15 +0,0 @@
-$OpenBSD: patch-Source_CMakeLists_txt,v 1.6 2014/12/31 11:06:02 dcoppa Exp $
-
-XXX: CMake's built-in ELF parser is broken on arm
-
---- Source/CMakeLists.txt.orig Mon Dec 15 14:07:43 2014
-+++ Source/CMakeLists.txt Thu Dec 18 05:37:12 2014
-@@ -16,7 +16,7 @@ if(CMAKE_CXX_PLATFORM_ID MATCHES "OpenBSD")
- else()
-   CHECK_INCLUDE_FILE("elf.h" HAVE_ELF_H)
- endif()
--if(HAVE_ELF_H)
-+if(HAVE_ELF_H AND NOT CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
-   set(CMAKE_USE_ELF_PARSER 1)
- elseif(HAIKU)
-   # On Haiku, we need to include elf32.h from the private headers
Index: patches/patch-bootstrap
===================================================================
RCS file: /cvs/ports/devel/cmake/patches/patch-bootstrap,v
retrieving revision 1.10
diff -u -p -u -p -r1.10 patch-bootstrap
--- patches/patch-bootstrap 8 Dec 2015 17:18:59 -0000 1.10
+++ patches/patch-bootstrap 27 Jan 2016 13:10:03 -0000
@@ -1,7 +1,7 @@
 $OpenBSD: patch-bootstrap,v 1.10 2015/12/08 17:18:59 dcoppa Exp $
 
 Use Ninja to build CMake
-XXX: broken on arm and m88k
+XXX: broken on m88k
 
 --- bootstrap.orig Thu Nov 12 16:39:53 2015
 +++ bootstrap Mon Nov 23 16:54:15 2015
@@ -10,7 +10,7 @@ XXX: broken on arm and m88k
  else
    # Bootstrapping from a standard UNIX prompt.
 -  cmake_bootstrap_generator="Unix Makefiles"
-+  if arch -s | egrep -q '^arm|^m88k'; then
++  if arch -s | grep -q '^m88k'; then
 +    cmake_bootstrap_generator="Unix Makefiles"
 +  else
 +    cmake_bootstrap_generator="Ninja"

Reply | Threaded
Open this post in threaded view
|

Re: Build cmake with g++-4.9 on arm

Stuart Henderson-6
OK. I wonder if this helps icu4c as well.

On 2016/01/27 16:57, David Coppa wrote:

>
> With the diff below, I have a working cmake-3.4.3 package for arm.
>
> One can say I lost the battle and gave up, but let's face reality:
> base libstdc++ on arm is FUBAR, there's not much we can do...
>
> It is plagued by a plethora of bugs:
>
> It forced us to use '-O1 -fno-stack-protector'.
> It broke CMake's built-in ELF parser.
> And finally ifstream is bugged when linking with -lpthread.
>
> See my previous "std::ifstream is broken on arm" mail on bugs@.
>
> If you want to play, you can install my packages with:
>
> # export PKG_PATH=http://open.bsdgeek.it/arm/
> # pkg_add cmake ninja
>
> It will save you some pain, since it took me ~1 day to build cmake
> on a BBB.
>
> I've already built some cmake-based ports for testing purposes, and
> all seems good so far.
>
> Comments?
> OKs?
>
> Index: Makefile
> ===================================================================
> RCS file: /cvs/ports/devel/cmake/Makefile,v
> retrieving revision 1.139
> diff -u -p -u -p -r1.139 Makefile
> --- Makefile 26 Jan 2016 08:44:07 -0000 1.139
> +++ Makefile 27 Jan 2016 13:10:03 -0000
> @@ -2,12 +2,6 @@
>  
>  DPB_PROPERTIES =parallel
>  
> -# avoid segfaults from binaries compiled and then used during the build
> -.if ${MACHINE_ARCH} == "arm"
> -CFLAGS += -O1 -fno-stack-protector
> -CXXFLAGS += -O1 -fno-stack-protector
> -.endif
> -
>  COMMENT = portable build system
>  
>  VER = 3.4.3
> @@ -25,9 +19,14 @@ PERMIT_PACKAGE_CDROM = Yes
>  
>  WANTLIB += archive c curl expat form jsoncpp m ncurses pthread stdc++ z
>  
> -# XXX: CMake's built-in ELF parser is broken on arm
> +# XXX: On arm libstdc++ from base (and especially iostream) seems
> +# to be broken, so use g++ from ports.
> +MODULES = gcc4
> +MODGCC4_ARCHS = arm
> +MODGCC4_LANGS = c++
> +
>  # XXX: Ninja is broken on m88k
> -.if ${MACHINE_ARCH} != "arm" && ${MACHINE_ARCH} != "m88k"
> +.if ${MACHINE_ARCH} != "m88k"
>  BUILD_DEPENDS = devel/ninja>=1.5.1
>  .endif
>  
> @@ -72,9 +71,8 @@ pre-configure:
>   ${WRKSRC}/Modules/FindSDL.cmake \
>   ${WRKSRC}/Modules/FindTCL.cmake
>  
> -# XXX: CMake's built-in ELF parser is broken on arm
>  # XXX: Ninja is broken on m88k
> -.if ${MACHINE_ARCH} != "arm" && ${MACHINE_ARCH} != "m88k"
> +.if ${MACHINE_ARCH} != "m88k"
>  do-build:
>   cd ${WRKBUILD} && exec ${SETENV} ${MAKE_ENV} ninja -v -j \
>   ${MAKE_JOBS} ${ALL_TARGET}
> Index: cmake.port.mk
> ===================================================================
> RCS file: /cvs/ports/devel/cmake/cmake.port.mk,v
> retrieving revision 1.52
> diff -u -p -u -p -r1.52 cmake.port.mk
> --- cmake.port.mk 26 Jan 2016 08:44:07 -0000 1.52
> +++ cmake.port.mk 27 Jan 2016 13:10:03 -0000
> @@ -9,9 +9,8 @@ MAKE_ENV+=LIB${_n}_VERSION=${_v}
>  
>  USE_NINJA ?= Yes
>  
> -# XXX: CMake's built-in ELF parser is broken on arm
>  # XXX: Ninja is broken on m88k
> -.if ${MACHINE_ARCH} == "arm" || ${MACHINE_ARCH} == "m88k"
> +.if ${MACHINE_ARCH} == "m88k"
>  USE_NINJA = No
>  .endif
>  
> Index: patches/patch-Source_CMakeLists_txt
> ===================================================================
> RCS file: patches/patch-Source_CMakeLists_txt
> diff -N patches/patch-Source_CMakeLists_txt
> --- patches/patch-Source_CMakeLists_txt 31 Dec 2014 11:06:02 -0000 1.6
> +++ /dev/null 1 Jan 1970 00:00:00 -0000
> @@ -1,15 +0,0 @@
> -$OpenBSD: patch-Source_CMakeLists_txt,v 1.6 2014/12/31 11:06:02 dcoppa Exp $
> -
> -XXX: CMake's built-in ELF parser is broken on arm
> -
> ---- Source/CMakeLists.txt.orig Mon Dec 15 14:07:43 2014
> -+++ Source/CMakeLists.txt Thu Dec 18 05:37:12 2014
> -@@ -16,7 +16,7 @@ if(CMAKE_CXX_PLATFORM_ID MATCHES "OpenBSD")
> - else()
> -   CHECK_INCLUDE_FILE("elf.h" HAVE_ELF_H)
> - endif()
> --if(HAVE_ELF_H)
> -+if(HAVE_ELF_H AND NOT CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
> -   set(CMAKE_USE_ELF_PARSER 1)
> - elseif(HAIKU)
> -   # On Haiku, we need to include elf32.h from the private headers
> Index: patches/patch-bootstrap
> ===================================================================
> RCS file: /cvs/ports/devel/cmake/patches/patch-bootstrap,v
> retrieving revision 1.10
> diff -u -p -u -p -r1.10 patch-bootstrap
> --- patches/patch-bootstrap 8 Dec 2015 17:18:59 -0000 1.10
> +++ patches/patch-bootstrap 27 Jan 2016 13:10:03 -0000
> @@ -1,7 +1,7 @@
>  $OpenBSD: patch-bootstrap,v 1.10 2015/12/08 17:18:59 dcoppa Exp $
>  
>  Use Ninja to build CMake
> -XXX: broken on arm and m88k
> +XXX: broken on m88k
>  
>  --- bootstrap.orig Thu Nov 12 16:39:53 2015
>  +++ bootstrap Mon Nov 23 16:54:15 2015
> @@ -10,7 +10,7 @@ XXX: broken on arm and m88k
>   else
>     # Bootstrapping from a standard UNIX prompt.
>  -  cmake_bootstrap_generator="Unix Makefiles"
> -+  if arch -s | egrep -q '^arm|^m88k'; then
> ++  if arch -s | grep -q '^m88k'; then
>  +    cmake_bootstrap_generator="Unix Makefiles"
>  +  else
>  +    cmake_bootstrap_generator="Ninja"
>