45997

How to modify Makefile to support cross compilation?

<h3>Question</h3>

I have the following Makefile:

CC=g++ top_srcdir=$(SRC_DIR)/cpp/src/ INCLUDES:= -I $(top_srcdir) -I $(top_srcdir)command_classes -I $(top_srcdir)platform -I $(top_srcdir)value_classes LIBS:= -lopenzwave -lpthread -ludev LDFLAGS += -L$(SRC_DIR) -Wl,-R$(SRC_DIR) '-Wl,-R$$ORIGIN' all: ozw ozw: Main.cpp $(CC) $(INCLUDES) -c Main.cpp -o ozw-power-on-off.o $(CC) $(LIBS) $(LDFLAGS) ozw-power-on-off.o -o ozw-power-on-off.out clean: rm -rf *.o *.out

I execute it with the following command:

make ARCH=$TARGET_ARCH \ CROSS_COMPILE=$TARGET_PREFIX \ SRC_DIR=$ROOT/$PKG_BUILD

But it ignores ARCH and CROSS_COMPILE values. I tried to replace $(CC) with $(MAKE) and added -$(MAKEFLAGS), but it was saying Nothing to be done for 'Main.cpp'.

How can I fix it and add cross compilation support?


<h3>Answer1:</h3>

A possible example of something I would try is below assuming $ARCH get's mapped to "arm" in this trivial example. I haven't tested it, but have done something similar before.

CC=g++ CC-arm=arm-g++ ozw: Main.cpp $(CC-$(ARCH)) $(INCLUDES) -c Main.cpp -o ozw-power-on-off.o $(CC-$(ARCH)) $(LIBS) $(LDFLAGS) ozw-power-on-off.o -o ozw-power-on-off.out

edit: This assumes that the tool chain exists in your path. edit: Might also modify it such that CC=$(PREFIX)-g++ it all depends on what you how what you pass into it maps against your tool chains naming convention.


<h3>Answer2:</h3>

The <em>things</em> you are passing to make (e.g. ARCH=$TARGET_ARCH) are really just Makefile variables. make doesn't know at all that they are related to <em>cross-compilation</em> (this is just something that you associate in your brain). E.g.

$ cat Makefile ARCH=pdp-11 foo: @echo arch: $ARCH $ make arch: pdp-11 $ make ARCH=le-corbusier arch: le-corbusier

The standard way to do cross-compilation is to just override the compiler/linker. E.g. the following would cross-compile for i686-w64-mingw32:

$ cat Makefile .PHONY: ozw owz: ozw-power-on-off.out ozw-power-on-off.o: Main.cpp $(CXX) $(INCLUDES) $(CPPFLAGS) $(CXXFLAGS) -c $^ -o $@ ozw-power-on-off.out: ozw-power-on-off.o $(CXX) -o $@ $(LDFLAGS) $^ $(LIBS) $ make CXX=i686-w64-mingw32-g++ <h2>a few notes</h2>

Your makefile has a number of issues...

<h3>variable names</h3>

CC is the standard variable for the <em>C-Compiler</em>; for a <em>C++-compiler</em> use CXX

<h3>linking order matters</h3>

Modern linkers will discard unused symbols, leading to possible linker errors if you don't get the order right. Therefore you should puts the $(LIBS) variable at the very end of your linker-invocation

<h3>declare dependencies</h3>

The power of make really is in the ability to resolve dependencies (finding out which parts of the build tree need to be recompiled when a few files have changed). For this to work you need to write rules that encode these dependencies - rather than conjure arbitrary target names and force to rebuild everything.

来源:https://stackoverflow.com/questions/37866783/how-to-modify-makefile-to-support-cross-compilation

Recommend

  • How to add td rowspans to a table?
  • Regex (JavaScript): match feet and/or inches
  • iOS9 Gamecenter error “plugin com.apple.GameCenterUI.GameCenterMatchmakerExtension invalidated”
  • How to create additional TaskExecutor beside TaskExecutionAutoConfiguration?
  • knitr hook to separate 000's, but not for years
  • Passing a view model with Server.TransferRequest()
  • Can you block a website from being in a browser's history?
  • Camera2 Set Fixed Resolution
  • Continuous colorbar with contour levels
  • How to start camel even if the MQTT server is not reachable
  • Can I pass a variable in a Meta Http Equiv Refresh?
  • C# - when to call base.OnSomething?
  • pyodbc fails without error
  • Apache Felix not able to access Postgres JDBC
  • matplotlib and transparency figure
  • locationManager avoid (null) string in a Label
  • How to add a progress ring to the splash screen in Windows 8?
  • get value using jquery
  • pass sessionid through jquery ajax call to php
  • Scrapy + Selenium + Datepicker
  • Project Euler -Prob. #20 (Lua)
  • List using with references, changes behavior when used as a member
  • Android NDK refer to external libraries in JNI
  • React/Redux. Access state from other component
  • Ways of filling 10 places with number from [1..10] such that digit at ith place has value atmost 1 m
  • Google Compute instance receiving email
  • Remove stopwords and tolower function slow on a Corpus in R
  • Spring annotation @Order
  • Was there ever a proposal to include the URL fragment into the HTTP request?
  • Could not resolve all files for configuration ':react-native-vector-icons:classpath'
  • Does hibernate load two seprate copies of same instance if they are loaded twice from database?
  • How to use Typescript with libraries like Ampersand.js that parse configs to build prototypes
  • Request Access Token in Postman for Azure Function App protected by Azure AD B2C
  • Stop an element moving with padding on hover
  • Creating 2d platforms using JavaScript
  • How to define something in JavaScript [closed]
  • I am consuming a WCF service that requires headers from a .NET 2 website. How can I programmatically
  • 'url' requires a non-empty first argument. The syntax changed in Django 1.5, see the docs
  • read part of h5 dataset python
  • convert json to excel in java