This is confusing. I have a Makefile:
OBJECTS = INCLUDE_BUILD_PATH = /Users/wen/Projects/include # Change compilation settings here COMPILE = g++ override COMPILE_FLAGS += -O2 # Change linker/compiler specific settings here LD_FLAGS := CC_FLAGS := -c -I$(INCLUDE_BUILD_PATH)/bigint # Add source extensions here SRC_EXT = cpp cc # Add header dependencies here HEADERS = $(wildcard *.hpp) $(wildcard $(INCLUDE_BUILD_PATH)/*/*.hh) # Add source files here CC_FILES = $(wildcard *.cpp) $(wildcard $(INCLUDE_BUILD_PATH)/*/*.cc) CC_O_BUFFER = $(CC_FILES) CC_O_BUFFER := $(CC_O_BUFFER:.cpp=.o) CC_O_BUFFER := $(CC_O_BUFFER:.cc=.o) OBJECTS = $(CC_O_BUFFER) # Change .exe name here EXE_NAME = maketest # Link object files $(EXE_NAME): $(OBJECTS) $(COMPILE) $(COMPILE_FLAGS) $(LD_FLAGS) -o $@ $^ # Build source files define compile_rule %.o : %.$1 $$(COMPILE) $$(COMPILE_FLAGS) $$(CC_FLAGS) -o $$@ $$< endef $(foreach EXT,$(SRC_EXT),$(eval $(call compile_rule,$(EXT)))) # Clean clean: rm -f $(OBJECTS) $(EXE_NAME) # Debug Build debug: @echo "Rerun with COMPILE_FLAGS=-D_DEBUG" # Print variables print: @echo $(CC_FILES) @echo $(OBJECTS) @echo $(HEADERS)
it compiled successfully at first, but then it stopped for no reason, and this was the result:
Yoshi-Air:maketest wen$ make c++ -c -o maketest.o maketest.cpp maketest.cpp:4:10: fatal error: 'BigIntegerLibrary.hh' file not found #include "BigIntegerLibrary.hh" ^ 1 error generated.
the problem was, I didnβt even tell her to use βC ++β in the Makefile, but instead of βg ++β. Also, when I cleared CC_FLAGS , -c was still there. It is like Make, having your own mind.
If I use make print to print my variables, this looks fine:
maketest.cpp /Users/wen/Projects/include/bigint/BigInteger.cc /Users/wen/Projects/include/bigint/BigIntegerAlgorithms.cc /Users/wen/Projects/include/bigint/BigIntegerUtils.cc /Users/wen/Projects/include/bigint/BigUnsigned.cc /Users/wen/Projects/include/bigint/BigUnsignedInABase.cc maketest.o /Users/wen/Projects/include/bigint/BigInteger.o /Users/wen/Projects/include/bigint/BigIntegerAlgorithms.o /Users/wen/Projects/include/bigint/BigIntegerUtils.o /Users/wen/Projects/include/bigint/BigUnsigned.o /Users/wen/Projects/include/bigint/BigUnsignedInABase.o maketest.hpp /Users/wen/Projects/include/bigint/BigInteger.hh /Users/wen/Projects/include/bigint/BigIntegerAlgorithms.hh /Users/wen/Projects/include/bigint/BigIntegerLibrary.hh /Users/wen/Projects/include/bigint/BigIntegerUtils.hh /Users/wen/Projects/include/bigint/BigUnsigned.hh /Users/wen/Projects/include/bigint/BigUnsignedInABase.hh /Users/wen/Projects/include/bigint/NumberlikeArray.hh
Any help or advice would be appreciated. Thanks!
Update
I updated my print to print the expected execution of the compilation:
print: @echo $(CC_FILES) @echo $(OBJECTS) @echo $(HEADERS) @echo "Compiles with:" @echo $(COMPILE) $(COMPILE_FLAGS) $(LD_FLAGS) $(CC_FLAGS)
Result:
maketest.cpp /Users/wen/Projects/include/bigint/BigInteger.cc /Users/wen/Projects/include/bigint/BigIntegerAlgorithms.cc /Users/wen/Projects/include/bigint/BigIntegerUtils.cc /Users/wen/Projects/include/bigint/BigUnsigned.cc /Users/wen/Projects/include/bigint/BigUnsignedInABase.cc maketest.o /Users/wen/Projects/include/bigint/BigInteger.o /Users/wen/Projects/include/bigint/BigIntegerAlgorithms.o /Users/wen/Projects/include/bigint/BigIntegerUtils.o /Users/wen/Projects/include/bigint/BigUnsigned.o /Users/wen/Projects/include/bigint/BigUnsignedInABase.o maketest.hpp /Users/wen/Projects/include/bigint/BigInteger.hh /Users/wen/Projects/include/bigint/BigIntegerAlgorithms.hh /Users/wen/Projects/include/bigint/BigIntegerLibrary.hh /Users/wen/Projects/include/bigint/BigIntegerUtils.hh /Users/wen/Projects/include/bigint/BigUnsigned.hh /Users/wen/Projects/include/bigint/BigUnsignedInABase.hh /Users/wen/Projects/include/bigint/NumberlikeArray.hh Yoshi-Air:maketest wen$ make print maketest.cpp /Users/wen/Projects/include/bigint/BigInteger.cc /Users/wen/Projects/include/bigint/BigIntegerAlgorithms.cc /Users/wen/Projects/include/bigint/BigIntegerUtils.cc /Users/wen/Projects/include/bigint/BigUnsigned.cc /Users/wen/Projects/include/bigint/BigUnsignedInABase.cc maketest.o /Users/wen/Projects/include/bigint/BigInteger.o /Users/wen/Projects/include/bigint/BigIntegerAlgorithms.o /Users/wen/Projects/include/bigint/BigIntegerUtils.o /Users/wen/Projects/include/bigint/BigUnsigned.o /Users/wen/Projects/include/bigint/BigUnsignedInABase.o maketest.hpp /Users/wen/Projects/include/bigint/BigInteger.hh /Users/wen/Projects/include/bigint/BigIntegerAlgorithms.hh /Users/wen/Projects/include/bigint/BigIntegerLibrary.hh /Users/wen/Projects/include/bigint/BigIntegerUtils.hh /Users/wen/Projects/include/bigint/BigUnsigned.hh /Users/wen/Projects/include/bigint/BigUnsignedInABase.hh /Users/wen/Projects/include/bigint/NumberlikeArray.hh Compiles with: g++ -O2 -c -I/Users/wen/Projects/include/bigint
This proves that make knows what I wanted, but when he builds it in a completely different way: c++ instead of g++ ?!
Update 2:
c++ calls clang installed on my system.
Alex B Solution:
But from the compilation command line, it looks like Make tries to use an implicit suffix rule and ignores your template rule.
I tried .SUFFIXES: and yes, it reported a missing rule. Thank you, I will go and consult with the management.