Makefile doing "too much work" - unix

For my assignment, we are supposed to compile cpp2html.c to produce cpp2html.o. We are to do the same thing with lex.yy.c. lex.yy.c is created by the command flex cppscanner.l. Lastly, we're supposed to link the .o files together to produce an executable program named cpp2html.
My makefile is supposed to use gcc instead of g++, which I believe I am doing correctly. I've tried to get this specific makefile to work for this program for a few hours now, as the one for the g++ portion worked fine. When I submit this makefile, I'm told that "Your makefile does too much work when only cpp2html.c has been changed." I tried looking up this error, and was only able to find someone who had the error on the g++ portion; I tried adapting it, but it didn't work. I've tried changing the format of the makefile, I've tried altering the codes, but I just don't know what I'm doing wrong.
How can I alter my makefile to do what it needs to, without making it do "too much work"?
My makefile is as follows.
cpp2html: cpp2html.o lex.yy.o
gcc -g -DDEBUG cpp2html.o lex.yy.o
mv a.out cpp2html
cpp2html.o: cpp2html.c
gcc -g -DDEBUG -c cpp2html.c
flex cppscanner.l
lex.yy.o: lex.yy.c
gcc -g -c lex.yy.c
EDIT:
cpp2html: cpp2html.o lex.yy.o
gcc -g cpp2html.o lex.yy.o
gcc -g -DDEBUG cpp2html.o lex.yy.o -o cpp2html
cpp2html.o: cpp2html.c
gcc -g -c cpp2html.c
lex.yy.c: cppscanner.l
flex cppscanner.l
lex.yy.o: lex.yy.c
gcc -g -c lex.yy.c

This makefile should resolve this,
cpp2html: cpp2html.o lex.yy.o
gcc -g -DDEBUG cpp2html.o lex.yy.o -o cpp2html
cpp2html.o: cpp2html.c
gcc -g -DDEBUG -c cpp2html.c
lex.yy.o: lex.yy.c
gcc -g -c lex.yy.c
lex.yy.c: cppscanner.l
flex cppscanner.l -o lex.yy.c

Related

No .so file after compiling with R SHLIB

So I wanted to compile my fortran subroutine to be able to use it in R. However I do not get an .so file only a .dll file. Is there maybe a problem with the paths? Or is this supposed to happen.
C:\BCT_Work>R CMD SHLIB draw_JU.f95
c:/Rtools/mingw_64/bin/gfortran -O2 -mtune=generic -c draw_JU.f95 -o draw_JU.o
c:/Rtools/mingw_64/bin/gfortran -shared -s -static-libgcc -o draw_JU.dll tmp.def draw_JU.o -LC:/PROGRA~1/R/R-35~1.1/bin/x64 -lR

make: *** No rule to make target `cookie.h', needed by `mainProg.o'. Stop. Your makefile does not build 'playChomp' when invoked:playChomp

Error i get!-----------------/
This is what my makefile looks like/
i am trying to Compile cookie.cpp to produce cookie.o.
Compile mainProg.cpp to produce mainProg.o.
Link the the .o files to produce an executable program named playChomp
mainprog.cpp' file has the header of cookie.h
i am working in unix in an ssh terminal linux server
makefile..
**all: playChomp
playChomp: mainProg.o cookie.o cookie.h
g++ -g -DDEBUG mainProg.o cookie.o -o playChomp
cookie.o:cookie.cpp
g++ -g -DDEBUG -c cookie.cpp
mainProg.o: mainProg.cpp cookie.h
g++ -g -DDEBUG -c mainProg.cpp**
You need to post some basic information that helps the people to understand better your problem. A few suggestions:
Try making a more meaningful title, put the error message that you receive into the title.
Put the source code of your program into your post. If possible, try to reduce it to a minimum content that still generates the same error message.
Inform your Operational System, Language that you are working on, what version, etc.
Given the following directory listing:
$ ls
cookie.cpp cookie.h mainProg.cpp Makefile
Then the Makefile you have provided:
all: playChomp
playChomp: mainProg.o cookie.o cookie.h
g++ -g -DDEBUG mainProg.o cookie.o -o playChomp
cookie.o: cookie.cpp
g++ -g -DDEBUG -c cookie.cpp
mainProg.o: mainProg.cpp cookie.h
g++ -g -DDEBUG -c mainProg.cpp
Will produce the desired executable:
$ make all
g++ -g -DDEBUG -c mainProg.cpp
g++ -g -DDEBUG -c cookie.cpp
g++ -g -DDEBUG mainProg.o cookie.o -o playChomp
$ ./playChomp
Hello World!
The error you are getting suggests the file is not there (in the directory where you are executing make). Ensure that you are calling make from the directory where those files exist, and triple check the spelling (i.e. make sure you have cookie.h, not Cookie.h, etc.)

A.Compile cpp2html.c to produce cpp2html.o

Your makefile does too much work when only cpp2html.c has been changed:
gcc -g -c cpp2html.c
gcc -g cpp2html.o lex.yy.o
gcc -g -DDEBUG cpp2html.o lex.yy.o -o cpp2html
does not work, I have tried almost every sequence. My code follows:
cpp2html: cpp2html.o lex.yy.o
gcc {g cpp2html.o lex.yy.o
gcc -g -DDEBUG cpp2html.o lex.yy.o -o cpp2html
cpp2html.o: cpp2html.c
gcc -g -c cpp2html.c
lex.yy.c: cppscanner.l
flex cppscanner.l
lex.yy.o: lex.yy.c
gcc -g -c lex.yy.c
As mentioned in the comments, taking the first gcc out solves the problem.

UNIX - makefile help!

Looking for help compiling my program below. I'm getting a "***Stop. no Targets." error when typing in limit.makefile in the compiler buffer. Ideas?
int main(int argc, char *argv[]) {
struct rlimit limit;
limit.rlim_cur = 60000;
limit.rlim_max = 60000;
if (setrlimit(RLIMIT_FSIZE, &limit) == -1){
perror("Error preventing core dump, errno=%d\n", errno);
exit(1);
}
else {
printf("The current core limit is %ll.\n", limit.rlim_cur);
printf("The core max limit is %ll.\n", limit.rlim_max);
exit(0);
}
if (getrlimit(RLIMIT_FSIZE, &limit) == -1){
printf("getlimit() failed with errno=%d\n", errno);
exit(1);
}
}
Compile command: make -k -f limit.makefile
This is what I type for the compiler buffer....still get the error though.
Makefile:
CC = /usr/bin/gcc
CFLAGS = -g -Wall -std=c99 -O2 -arch x86_64
Just tried that make -k -f myfile on an empty file and got your error.
If you just want it to work
CC= /usr/bin/gcc
CFLAGS = -g -Wall -std=c99 -O2 -arch x86_64
all: test.c
$(CC) $(CFLAGS) test.c
Note that the tab under all has to be a "real" tab.
I recommend you check out a makefile tutorial or just compile it from the command line.
gcc -g -Wall -std=c99 -O2 -arch x86_64 limit.c
BTW, not sure about that -arch flag. Not valid on my Linux box.
Try
CC = /usr/bin/gcc
CFLAGS = -g -Wall -std=c99 -O2 -arch x86_64
OBJ = limit.o
%.o: %.c
$(CC) -c -o $# $< $(CFLAGS)
EboMike's is more sophisticated, but here's a simpler one that is guaranteed to work for your one-file project:
CC = /usr/bin/gcc
CFLAGS = -g -Wall -std=c99 -O2 -arch x86_64
limit: limit.c
$(CC) $(CFLAGS) -o limit limit.c
You can run this with just make by itself.
You've not defined what the target to build is anywhere. You can do that on the command line, using the command
make -k -f limit.makefile limit
and the implicit rules of make will compile limit.c into limit. Alternatively define a target in your makefile,
CC = /usr/bin/gcc
CFLAGS = -g -Wall -std=c99 -O2 -arch x86_64
limit: limit.o
The first target will be built by default, and make knows how to compile *.c to *.o and link object files so everything else is automatic.
If you're curious, the default rules are equivalent to (in GNU make)
%.o:%.c
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $# $<
%:%.o
$(CC) $(LDFLAGS) -o $# $^ $(LDLIBS)
where $#, $< and $^ expand to the target, first prereq and all prereqs respectively, the percent signs are wildcards for the target name.

Why does Gnumake from parent directory behave differently?

I am stumped as to why when I do a gnumake from the parent directory it behaves incorrectly, whereas, if I cd to the subdirectory and do gnumake it works correctly.
In the parent makefile, I have a rule like this:
.PHONY: zlib-1.2.5
zlib-1.2.5:
# echo Issuing $(MAKE) in $# ...
pushd zlib-1.2.5; make; popd
I also tried it like this for last line above with the same failure:
make -C zlib-1.2.5
Which gives different result than doing the same from the toplevel
pushd zlib-1.2.5; make; popd
There is a something from the parent makefile that is making its way into the subdirectory makefile and causing it to behave incorrectly, but I don't know how to find it.
The symptom I see is that the subdirectory config generated makefile rule for zlib misses the dependencies and I get this result going straight to the ar without generating the .o(s) first:
cd ~/src; make zlib-1.2.5
CPPFLAGS_AUTO = < >
Issuing make in zlib-1.2.5 ...
pushd zlib-1.2.5; make; popd
~/src/zlib-1.2.5 ~/src
make[1]: Entering directory `/disk2/user/src/zlib-1.2.5'
ar rc libz.a adler32.o compress.o crc32.o deflate.o gzclose.o gzlib.o gzread.o gzwrite.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o
ar: adler32.o: No such file or directory
make[1]: *** [libz.a] Error 1
gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map -O3 -fPIC -D_LARGEFILE64_SOURCE=1 -o libz.so.1.2.5 adler32.lo compress.lo crc32.lo deflate.lo gzclose.lo gzlib.lo gzread.lo gzwrite.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo uncompr.lo zutil.lo -lc -L. libz.a
gcc: adler32.lo: No such file or directory
gcc: compress.lo: No such file or directory
gcc: crc32.lo: No such file or directory
gcc: deflate.lo: No such file or directory
[...]
make[1]: *** [libz.so.1.2.5] Error 1
make[1]: Target `all' not remade because of errors.
make[1]: Leaving directory `/disk2/user/src/zlib-1.2.5'
~/src
Versus from the zlib directory where it works correctly:
cd ~/src/zlib-1.2.5; make
gcc -O3 -D_LARGEFILE64_SOURCE=1 -c -o example.o example.c
gcc -O3 -D_LARGEFILE64_SOURCE=1 -c -o adler32.o adler32.c
gcc -O3 -D_LARGEFILE64_SOURCE=1 -c -o compress.o compress.c
gcc -O3 -D_LARGEFILE64_SOURCE=1 -c -o crc32.o crc32.c
[...]
gcc -O3 -D_LARGEFILE64_SOURCE=1 -c -o zutil.o zutil.c
ar rc libz.a adler32.o compress.o crc32.o deflate.o gzclose.o gzlib.o gzread.o gzwrite.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o
(ranlib libz.a || true) >/dev/null 2>&1
gcc -O3 -D_LARGEFILE64_SOURCE=1 -o example example.o -L. libz.a
gcc -O3 -D_LARGEFILE64_SOURCE=1 -c -o minigzip.o minigzip.c
gcc -O3 -D_LARGEFILE64_SOURCE=1 -o minigzip minigzip.o -L. libz.a
mkdir objs 2>/dev/null || test -d objs
gcc -O3 -fPIC -D_LARGEFILE64_SOURCE=1 -DPIC -c -o objs/adler32.o adler32.c
mv objs/adler32.o adler32.lo
mkdir objs 2>/dev/null || test -d objs
gcc -O3 -fPIC -D_LARGEFILE64_SOURCE=1 -DPIC -c -o objs/compress.o compress.c
mv objs/compress.o compress.lo
[...]
mkdir objs 2>/dev/null || test -d objs
gcc -O3 -fPIC -D_LARGEFILE64_SOURCE=1 -DPIC -c -o objs/zutil.o zutil.c
mv objs/zutil.o zutil.lo
gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map -O3 -fPIC -D_LARGEFILE64_SOURCE=1 -o libz.so.1.2.5 adler32.lo compress.lo crc32.lo deflate.lo gzclose.lo gzlib.lo gzread.lo gzwrite.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo uncompr.lo zutil.lo -lc -L. libz.a
rm -f libz.so libz.so.1
ln -s libz.so.1.2.5 libz.so
ln -s libz.so.1.2.5 libz.so.1
rmdir objs
gcc -O3 -D_LARGEFILE64_SOURCE=1 -o examplesh example.o -L. libz.so.1.2.5
gcc -O3 -D_LARGEFILE64_SOURCE=1 -o minigzipsh minigzip.o -L. libz.so.1.2.5
gcc -O3 -D_LARGEFILE64_SOURCE=1 -o example64 example64.o -L. libz.a
gcc -O3 -D_LARGEFILE64_SOURCE=1 -o minigzip64 minigzip64.o -L. libz.a
run make -D to turn on debug
pushd zlib-1.2.5; make; popd
should be
make -C zlib-1.2.5
The -C flag/switch changes the directory similar to what your code does with the pushd and popd commands. The difference is in the behaviour since this make process is recursive. And actually, you might use $(MAKE) instead of make in the event that a command such as gmake is used instead of what might be BSD make (since it is a GNU makefile).

Resources