[yocto] Another recipe problem.

Paul Eggleton paul.eggleton at linux.intel.com
Tue Oct 27 02:38:20 PDT 2015


Hi Jim,

On Tuesday 27 October 2015 04:30:01 jim Schimpf wrote:
> Hi,
> 
> 	This recipe makes gets to do_install and fails. The failure is:
> | cp eliot /usr/local/bin/
> | cp: cannot create regular file '/usr/local/bin/eliot': Permission denied  
> | <——PROBLEM make[1]: *** [install] Error 1
> | make[1]: Leaving directory
> | `/home/jim/yocto/poky/BB1/tmp/work/cortexa8hf-vfp-neon-poky-linux-gnueabi
> | /elliot/1.0-r0/git/src' make: *** [install] Error 2
> | ERROR: oe_runmake failed
> | WARNING: exit code 1 from a shell command.
> | ERROR: Function failed: do_install (log file is located at
> | /home/jim/yocto/poky/BB1/tmp/work/cortexa8hf-vfp-neon-poky-linux-gnueabi/
> | elliot/1.0-r0/temp/log.do_install.5834)
> ERROR: Task 2 (/home/jim/yocto/poky/meta-local/recipes-IOT/elliot/elliot.bb,
> do_install) failed with exit code '1' NOTE: Tasks Summary: Attempted 404
> tasks of which 403 didn't need to be rerun and 1 failed. No currently
> running tasks (390 of 409)
> 
> The recipe is:
> 
> # -----------------------------------------------------
> # Header Meta data
> SUMMARY = "Internet control tool"
> DESCRIPTION = "Allows easy control of IOT devices wiht a custom built
> language\ It allows easy extension for all sorts of controls"
> AUTHOR = "Christophe de Dinechin"
> HOMEPAGE = "https://c3d/github.io/eliot/"
> LICENSE = "GPL-2.0"
> LIC_FILES_CHKSUM = "file://COPYING;md5=037a8d95ad2212b21ca9d82e49dc36be"
> PR = "r0"
> 
> # -----------------------------------------------------
> # Source data
> SRCREV = "6f93d62c181adb2d09de2a2f7209e75d444a9af1"
> SRC_URI =
> "git://github.com/c3d/eliot.git;user=jschimpf-pandora;protocol=https"
> inherit autotools gettext
> 
> S = "${WORKDIR}/git”
> 
> The make file (which builds the executable in git/src is below : There are a
> number of Makefile.<system>  config files like Makefile.config,
> Makefile..mingw or Makefile.macosx. Should I add another with specifics for
> Yocto ?  Also what would be the path to the Yocto /usr/bin ?
> 
> #***************************************************************************
> *** # Makefile                                                       ELIOT
> project
> #**************************************************************************
> **** #
> #  File Description:
> #
> #    Makefile for the Extensible Language for the Internet of Things
> #
> #
> #
> #
> #
> #
> #
> #
> #***************************************************************************
> *** # This program is released under the GNU General Public License.
> # See http://www.gnu.org/copyleft/gpl.html and Matthew 25:22 for details
> #  (C) 2000-2015 Christophe de Dinechin <christophe at taodyne.com>
> #  (C) 2010-2015 Taodyne SAS
> #***************************************************************************
> ***
> 
> # Set to 'none' to disable LLVM
> COMPILER=none
> #COMPILER=llvm
> 
> PREFIX=/usr/local/
> PREFIX_BIN=$(PREFIX)bin/				<— Problem line
> PREFIX_LIB=$(PREFIX)lib/eliot/
> 
> # List of modules to build
> MODULES=basics io math text remote time-functions temperature
> MODULES_SOURCES=$(MODULES:%=%-module.cpp)
> MODULES_HEADERS=$(MODULES:%=%-module.h)
> 
> # List of source files to process
> SOURCES     =					\
> 	main.cpp				\
> 	tree.cpp				\
> 	action.cpp				\
> 	options.cpp				\
> 	scanner.cpp				\
> 	parser.cpp				\
> 	flight_recorder.cpp			\
> 	errors.cpp				\
> 	gc.cpp					\
> 	syntax.cpp				\
> 	renderer.cpp				\
> 	context.cpp				\
> 	runtime.cpp				\
> 	bytecode.cpp				\
> 	interpreter.cpp				\
> 	opcodes.cpp				\
> 	cdecls.cpp				\
> 	serializer.cpp				\
>         traces_base.cpp                         \
> 	winglob.cpp				\
> 	$(MODULES_SOURCES)			\
> 	$(SOURCES_$(COMPILER))
> 
> SOURCES_llvm =					\
> 	compiler.cpp				\
> 	compiler-llvm.cpp			\
> 	compiler-gc.cpp				\
> 	types.cpp				\
> 	args.cpp				\
> 	expred.cpp				\
> 	parms.cpp				\
> 	unit.cpp				\
> 
> PRODUCT=eliot$(EXE)
> 
> include $(BROOT)Makefile.config
> 
> # Name of 'llvm-config' to use (e.g. llvm-config-2.9)
> LLVM_CONFIG=llvm-config
> 
> LLVM_VERSION=$(LLVM_VERSION_$(COMPILER))
> LLVM_FLAGS=$(LLVM_FLAGS_$(COMPILER))
> LLVM_LIBS=$(LLVM_LIBS_$(COMPILER))
> LLVM_LDFLAGS=$(LLVM_LDFLAGS_$(COMPILER))
> 
> # When LLVM is enabled, we get those
> LLVM_VERSION_llvm=$(shell $(LLVM_CONFIG) --version | sed -e s/[.a-z-]//g)
> LLVM_FLAGS_llvm=$(shell $(LLVM_CONFIG) --cppflags | sed -e s/-DNDEBUG//g) \
> 		  -DLLVM_VERSION=$(LLVM_VERSION)
> LLVM_LIBS_llvm=$(shell $(LLVM_CONFIG) --libs)
> LLVM_LDFLAGS_llvm=$(shell $(LLVM_CONFIG) --ldflags)
> $(LDFLAGS_llvm$(LLVM_VERSION))
> 
> # When LLVM is not enabled
> LLVM_FLAGS_none=-DINTERPRETER_ONLY
> 
> CPPFLAGS+=$(LLVM_FLAGS) -I . -I include $(CPPFLAGS_llvm$(LLVM_VERSION))
> LDFLAGS=$(LLVM_LIBS) $(LLVM_LDFLAGS)
> CPPFLAGS_llvm31=-Wno-unused-local-typedefs
> CPPFLAGS_llvm30=-Wno-unused-local-typedefs
> CPPFLAGS_llvm350=-std=c++11
> CPPFLAGS_llvm360=-std=c++11
> LDFLAGS_llvm350=-lz -lncurses
> LDFLAGS_llvm360=-lz -lncurses
> 
> CPPFLAGS+=	-DELIOT_BIN='"'$(PREFIX_BIN)'"'	\
> 		-DELIOT_LIB='"'$(PREFIX_LIB)'"'
> 
> install: all
> 	cp $(PRODUCT) $(PREFIX_BIN)
> 	mkdir -p $(PREFIX_LIB)
> 	cp builtins.eliot eliot.syntax C.syntax *.stylesheet $(PREFIX_LIB)
> 
> test:
> 	cd ../tests; ./alltests
> hello: show_$(COMPILER)_version
> show_llvm_version:
> 	@echo Building with LLVM version $(LLVM_VERSION)
> show_none_version:
> 	@echo Building in interpreter-only mode
> 
> 
> opt_tests opt-tests:
> 	cd ../tests;		\
> 	./alltests -r O0;	\
> 	./alltests -r O1;	\
> 	./alltests -r O2;	\
> 	./alltests -r O3
> 
> 
> # Module-related rules
> clean: modules-clean
> 
> modules-clean:
> 	rm -f $(MODULES_SOURCES) $(MODULES_HEADERS)
> 
> interp-%:
> 	$(MAKE) COMPILER=none $*
> ionly-%:
> 	$(MAKE) COMPILER=none $*
> 
> 
> %-module.cpp: %.tbl %-module.h Makefile
> 	@echo Generating $@ from $<
> 	./generate-module-body $* > $@
> 
> %-module.h: %.tbl Makefile
> 	@echo Generating $@ from $<
> 	./generate-module-header $* >  $@
> 

Two things:

1) You need to pass in PREFIX as ${prefix} so that it ends up as /usr and not 
/usr/local. You'd do this by doing something like:

EXTRA_OEMAKE += "PREFIX='${prefix}'"

2) The "install" target in that makefile needs patching so it supports an 
additional install path variable (typically named "DESTDIR") which you would 
pass in through EXTRA_OEMAKE, taking the value of '${D}'. I guess by now 
you're familiar with patching files from recipes?

Cheers,
Paul

-- 

Paul Eggleton
Intel Open Source Technology Centre



More information about the yocto mailing list