Interpolate variable in command substitution in Makefile
I am trying to do variable interpolation inside a command substitution in a Makefile.
I have this code:
setup:
mkdir -p data_all ;
for i in $(shell jq -r 'keys | @tsv' assets.json) ; do
git_url=$(shell jq -r ".$$i" assets.json) ;
git clone $$git_url data_all/$$i ;
done
The code is failing, however, because $$i
does not expand in the "shell" line that sets git_url.
How do I interpolate the variable $i in the "shell" line that sets git_url?
makefile
add a comment |
I am trying to do variable interpolation inside a command substitution in a Makefile.
I have this code:
setup:
mkdir -p data_all ;
for i in $(shell jq -r 'keys | @tsv' assets.json) ; do
git_url=$(shell jq -r ".$$i" assets.json) ;
git clone $$git_url data_all/$$i ;
done
The code is failing, however, because $$i
does not expand in the "shell" line that sets git_url.
How do I interpolate the variable $i in the "shell" line that sets git_url?
makefile
add a comment |
I am trying to do variable interpolation inside a command substitution in a Makefile.
I have this code:
setup:
mkdir -p data_all ;
for i in $(shell jq -r 'keys | @tsv' assets.json) ; do
git_url=$(shell jq -r ".$$i" assets.json) ;
git clone $$git_url data_all/$$i ;
done
The code is failing, however, because $$i
does not expand in the "shell" line that sets git_url.
How do I interpolate the variable $i in the "shell" line that sets git_url?
makefile
I am trying to do variable interpolation inside a command substitution in a Makefile.
I have this code:
setup:
mkdir -p data_all ;
for i in $(shell jq -r 'keys | @tsv' assets.json) ; do
git_url=$(shell jq -r ".$$i" assets.json) ;
git clone $$git_url data_all/$$i ;
done
The code is failing, however, because $$i
does not expand in the "shell" line that sets git_url.
How do I interpolate the variable $i in the "shell" line that sets git_url?
makefile
makefile
asked Nov 13 at 0:26
Alex Harvey
3,6901823
3,6901823
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
You mixed up make functions ($(shell ...)
) and true shell constructs. When writing a recipe the simplest is to write it first in plain shell:
mkdir -p data_all ;
for i in $( jq -r 'keys | @tsv' assets.json ) ; do
git_url=$( jq -r ".$i" assets.json ) ;
git clone $git_url data_all/$i ;
done
And then escaping the unwanted $
expansion by make:
mkdir -p data_all ;
for i in $$( jq -r 'keys | @tsv' assets.json ) ; do
git_url=$$( jq -r ".$$i" assets.json ) ;
git clone $$git_url data_all/$$i ;
done
Oh great, I can don't need those "shell" calls either. That's much nicer. Thanks!
– Alex Harvey
Nov 13 at 6:42
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53272049%2finterpolate-variable-in-command-substitution-in-makefile%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
You mixed up make functions ($(shell ...)
) and true shell constructs. When writing a recipe the simplest is to write it first in plain shell:
mkdir -p data_all ;
for i in $( jq -r 'keys | @tsv' assets.json ) ; do
git_url=$( jq -r ".$i" assets.json ) ;
git clone $git_url data_all/$i ;
done
And then escaping the unwanted $
expansion by make:
mkdir -p data_all ;
for i in $$( jq -r 'keys | @tsv' assets.json ) ; do
git_url=$$( jq -r ".$$i" assets.json ) ;
git clone $$git_url data_all/$$i ;
done
Oh great, I can don't need those "shell" calls either. That's much nicer. Thanks!
– Alex Harvey
Nov 13 at 6:42
add a comment |
You mixed up make functions ($(shell ...)
) and true shell constructs. When writing a recipe the simplest is to write it first in plain shell:
mkdir -p data_all ;
for i in $( jq -r 'keys | @tsv' assets.json ) ; do
git_url=$( jq -r ".$i" assets.json ) ;
git clone $git_url data_all/$i ;
done
And then escaping the unwanted $
expansion by make:
mkdir -p data_all ;
for i in $$( jq -r 'keys | @tsv' assets.json ) ; do
git_url=$$( jq -r ".$$i" assets.json ) ;
git clone $$git_url data_all/$$i ;
done
Oh great, I can don't need those "shell" calls either. That's much nicer. Thanks!
– Alex Harvey
Nov 13 at 6:42
add a comment |
You mixed up make functions ($(shell ...)
) and true shell constructs. When writing a recipe the simplest is to write it first in plain shell:
mkdir -p data_all ;
for i in $( jq -r 'keys | @tsv' assets.json ) ; do
git_url=$( jq -r ".$i" assets.json ) ;
git clone $git_url data_all/$i ;
done
And then escaping the unwanted $
expansion by make:
mkdir -p data_all ;
for i in $$( jq -r 'keys | @tsv' assets.json ) ; do
git_url=$$( jq -r ".$$i" assets.json ) ;
git clone $$git_url data_all/$$i ;
done
You mixed up make functions ($(shell ...)
) and true shell constructs. When writing a recipe the simplest is to write it first in plain shell:
mkdir -p data_all ;
for i in $( jq -r 'keys | @tsv' assets.json ) ; do
git_url=$( jq -r ".$i" assets.json ) ;
git clone $git_url data_all/$i ;
done
And then escaping the unwanted $
expansion by make:
mkdir -p data_all ;
for i in $$( jq -r 'keys | @tsv' assets.json ) ; do
git_url=$$( jq -r ".$$i" assets.json ) ;
git clone $$git_url data_all/$$i ;
done
answered Nov 13 at 6:32
Renaud Pacalet
8,80921729
8,80921729
Oh great, I can don't need those "shell" calls either. That's much nicer. Thanks!
– Alex Harvey
Nov 13 at 6:42
add a comment |
Oh great, I can don't need those "shell" calls either. That's much nicer. Thanks!
– Alex Harvey
Nov 13 at 6:42
Oh great, I can don't need those "shell" calls either. That's much nicer. Thanks!
– Alex Harvey
Nov 13 at 6:42
Oh great, I can don't need those "shell" calls either. That's much nicer. Thanks!
– Alex Harvey
Nov 13 at 6:42
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53272049%2finterpolate-variable-in-command-substitution-in-makefile%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown