Afif, Are you trying to get the output from different SQL recipes to go into different files.
This will be a problem when using sqlite3 as your make .SHELL. Why? Because the contents of a make recipe is always passed to the .SHELL as a parameter. Never on stdin. But that is what you need. Why do you need the recipe on stdin? Because meta-commands (aka dot commands) such as .output are limited in where they can appear. In particular, that are not understood when they appear in the contents of a multi-line string as the SQL parameter to sqlite3 . So, the workaround to this problem in general is this one line bash utility which you use as the .SHELL instead of sqlite3: #!/bin/env bash ### bash1in: A bash utility script which pipes its last argument to a ### process gained by executing all but its last argument. Useful in ### Makefiles where you want the recipes to appear on stdin of some ### command other than the usual bash shell. For example, to write ### recipes in sqlite3 (allowing dot-commands), include the following in your Makefile: ### SHELL=./bash1in ### .SHELLFLAGS=sqlite3 ${DB} ### .ONESHELL: # optional cat <<< "${@:$#}" | "${@:1:$(($# - 1))}"o Now you can write makefiles like this: ### FILE: sqlite3.test.mk - demonstration of using sqlite3 as ### interpreter of Make recipes using utility bash script (in same ### directory) `bash1in`. SHELL=./bash1in .SHELLFLAGS=sqlite3 ${DB} .ONESHELL: ${DB}: CREATE TABLE greeting (g string ); INSERT INTO greeting values("Hello World"); INSERT INTO greeting values("Hello sqlite3"); db.out.schema: .output $@ .schema db.out.select.%: .output $@ select * from $*; Which can be run like this: > make -f sqlite3.test.mk DB=db.t CREATE TABLE greeting (g string ); INSERT INTO greeting values("Hello World"); INSERT INTO greeting values("Hello sqlite3"); > make -f sqlite3.test.mk DB=db.t db.out.select.greeting .output db.out.select.greeting select * from greeting; > cat db.out.select.greeting Hello World Hello sqlite3 > make -f sqlite3.test.mk DB=db.t db.out.schema .output db.out.schema .schema > cat db.out.schema CREATE TABLE greeting (g string ); What is nice about this approach is that it works with other interpreters. I've used this approach for instance with the R language as the interpreter. This should fix ya! Malcolm Cook -----Original Message----- From: help-make-bounces+mec=stowers....@gnu.org [mailto:help-make-bounces+mec=stowers....@gnu.org] On Behalf Of Afif Elghraoui Sent: Monday, May 25, 2015 11:05 PM To: help-make@gnu.org Subject: Shell for evaluating .SHELLFLAGS Hello, I am trying to use sqlite3 as my Makefile shell. In order to have the query outputs go to a file, I need to pass a file in to sqlite using its -i flag. I rely on the process substitution feature in bash for the .SHELLFLAGS to provide the file: SHELL=/usr/bin/env sqlite3 .SHELLFLAGS=-init <(echo ".output $@") $(DB) I get this error: /bin/sh: 1: Syntax error: "(" unexpected Makefile:13: recipe for target 'fq' failed It looks like .SHELLFLAGS is evaluated with /bin/sh regardless of what SHELL is set to. Is there any way I could evaluate them with bash? Many thanks and regards Afif _______________________________________________ Help-make mailing list Help-make@gnu.org https://lists.gnu.org/mailman/listinfo/help-make _______________________________________________ Help-make mailing list Help-make@gnu.org https://lists.gnu.org/mailman/listinfo/help-make