For a C library, I need to check whether the current compiler is for x86_64 due to memory issues. The command I found that exactly meets my requirement:
CXXARCH:=$(${CXX} -dumpmachine | grep -i 'x86_64')
where ${CXX} is either gcc or clang. For an x86_64 machine, this will return a non-empty string. For a 32-bit machine, say Raspberry Pi, this will be empty.
how can I distinguish between the two cases?
I did this:
ifneq (${CXXARCH},)
MAGICVAR:=-DMY_DEFINE
endif
With an $(info) print, I ensured that in a Raspberry Pi, this condition is not being fulfilled, which it should, because the command clang-6.0 -dumpmachine returns: armv7l-unknown-linux-gnueabihf. So why is this condition not being executed? What am I doing wrong?
The syntax
$(${CXX} -dumpmachine | grep -i 'x86_64')
is shell syntax. It doesn't do what you want in a Makefile. To expand the CXX variable in Makefile, the preferred syntax is to use $(CXX) (while ${CXX} works too, but $CXX does not). To capture the shell output you need to use $(shell command). Thus
CXXARCH:=$(shell $(CXX) -dumpmachine | grep -i 'x86_64')
ifneq ($(CXXARCH),)
MAGICVAR:=-DMY_DEFINE
endif
Notice that the compiler target has nothing to do with "memory issues" in a resulting program. You can use x86_64-linux-gnu-gcc to compile 32-bit programs (-m32) and get the "same memory issues" that you'd have with a 32-bit compiler.
Finally make sure that you've not confused ifneq and ifeq.
ifneq ($(CXXARCH),)
means "if $(CXXARCH) does not expand to an empty string, then..."
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With