makefile:4: *** missing separator. Stop
CMakefileC Problem Overview
This is my makefile:
all:ll
ll:ll.c
gcc -c -Wall -Werror -02 c.c ll.c -o ll $@ $<
clean :
\rm -fr ll
When I try to make clean
or make make
, I get this error:
:makefile:4: *** missing separator. Stop.
How can I fix it?
C Solutions
Solution 1 - C
make has a very stupid relationship with tabs. All actions of every rule are identified by tabs. And, no, four spaces don't make a tab. Only a tab makes a tab.
To check, I use the command cat -e -t -v makefile_name
.
It shows the presence of tabs with ^I
and line endings with $
. Both are vital to ensure that dependencies end properly and tabs mark the action for the rules so that they are easily identifiable to the make utility.
Example:
Kaizen ~/so_test $ cat -e -t -v mk.t
all:ll$ ## here the $ is end of line ...
$
ll:ll.c $
^Igcc -c -Wall -Werror -02 c.c ll.c -o ll $@ $<$
## the ^I above means a tab was there before the action part, so this line is ok .
$
clean :$
\rm -fr ll$
## see here there is no ^I which means , tab is not present ....
## in this case you need to open the file again and edit/ensure a tab
## starts the action part
Solution 2 - C
On VS Code, just click the "Space: 4" on the downright corner and change it to tab when editing your Makefile.
Solution 3 - C
You should always write command after a Tab and not white space.
This applies to gcc
line (line #4) in your case. You need to insert tab before gcc
.
Also replace \rm -fr ll
with rm -fr ll
. Insert tabs before this command too.
Solution 4 - C
The solution for PyCharm
would be to install a Makefile support
plugin:
- Open
Preferences
(cmd + ,
) - Go to
Plugins
->Marketplace
- Search for
Makefile support
, install and restart the IDE.
This should fix the problem and provide a syntax for a makefile.
Solution 5 - C
Using .editorconfig
to fix the tabs automagically:
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4
[Makefile]
indent_style = tab
Solution 6 - C
TLDR;
makefile syntax can be quirky
if you want a line of code to be interpreted as make
code it must only be indented with spaces.
if you want a line of code to be interpreted as bash
code it must only be indented with tabs
sometask:
ifeq ($FOO,bar) // this is make code. only spaces
echo "foobar" // this is bash code. only tabs
endif // again, this is make code. only spaces
technically its the leading indentation that dictates the interpreter.
Solution 7 - C
Its pretty old question but still I would like say about one more option using vi/vim
editor to visualize the tabs. If you have vi/vim
installed then open a Makefile
(e.g. vim Makefile
) and enter :set list
. This will show number of tabs inserted as below,
%-linux: force$
^I@if [ "$(GCC_VERSION)" = "2.96" ] ; then \$
^I^Iecho ===== Generating build tree for legacy $@ architecture =====; \$
^I^I$(CONFIGURE) $(CWD) $@ legacy; \$
^Ielse \$
^I^Iecho ===== Generating build tree for $@ architecture =====; \$
^I^I$(CONFIGURE) $(CWD) $@; \$
^Ifi$
^Icd build-$@;make$
Solution 8 - C
The key point was "HARD TAB"
- Check whether you used TAB instead of whitespace
- Check your
.vimrc
forset tabstop=X
Solution 9 - C
If anyone of you are using a product from Intellij, the solution for this it's the following:
- Go to Preferences > Editor > Code Style
- here you need to select the file type related to your problem. But most probably you need to select
Other File Types
. - In the tab opened mark the checkbox for
Use tab character
and be careful,Tab size
andIndent
values must be 4.
Solution 10 - C
You started line 4 with "space,space" instead of "tab" - nothing else.
Solution 11 - C
Solution 12 - C
This is because tab is replaced by spaces. To disable this feature go to
gedit->edit->preferences->editor
and remove check for
"replace tab with space"
Solution 13 - C
If you are here searching how to make the tabs and new lines you added understandable by vim you have to first enable tab in vim.
You can do it using :set noet
i.e. (to switch from spaces to TAB) before you make your tab additions.
With this command your tabs will look like the other ones (i.e. ^I) and *** missing separator. Stop.
error from make will go away :)
after you make changes you can switch back with :set et
Solution 14 - C
If you are editing your Makefile in eclipse:
Windows-> Preferences->General->Editor->Text Editors->Show Whitespace Characters -> Apply
Or use the shortcut shown below.
Tab will be represented by gray ">>" and Space will be represented by gray "." as in figure below.
Solution 15 - C
Use -A or --show-all to show everything for simplicity.
Solution 16 - C
If someone ever comes across this issue with
*** missing separator. Stop.
during the build, they should double-check their path, it should not contain special characters like "#"
Solution 17 - C
Do yourself a favour and make this a permanent member of your .editorconfig
, if your editor/IDE supports it (it probably does!)
[Makefile]
indent_style = tab