Makefile: установить параметры для команд, выполняемых неявными правилами (CFLAGS, LDFLAGS)

Я очень новичок в makefiles. Я читаю руководство по GNU-make, но мне все еще неясно, как устанавливать параметры для компилятора и компоновщика, когда они выполняются неявным правилом. Это часть make-файла, обратите внимание, что нет явного объявления о том, как скомпилировать и связать все:

.PHONY: $(TARGET) build_libs

all: build_libs $(TARGET)

$(TARGET):
    @echo "============> building target: $(TARGET)"
    @$(MAKE) -C $(SDK_PATH)/VP_SDK/Build $(TMP_SDK_FLAGS) $(SDK_FLAGS) $(MAKECMDGOALS) USE_LINUX=yes
    mv $(ARDRONE_TARGET_DIR)/ardrone_testing_tool $(TARGET)
    mv $(TARGET) $(ARDRONE_TARGET_DIR)/
    @echo "============> end building target: $(TARGET)"

$(MAKECMDGOALS): build_libs
    @echo "============> making cmd goals"
    @$(MAKE) -C $(SDK_PATH)/VP_SDK/Build $(TMP_SDK_FLAGS) $(SDK_FLAGS) $(MAKECMDGOALS) USE_LINUX=yes
    @echo "============> end making cmd goals"

build_libs:
    @echo "============> building libs"
    @$(MAKE) -C $(SDK_PATH)/Soft/Build $(TMP_SDK_FLAGS) $(SDK_FLAGS) $(MAKECMDGOALS) USE_LINUX=yes
    @echo "============> end building libs"

Этот makefile создает исполняемый файл из исходных файлов и библиотеки. Но я хочу собрать их в общую библиотеку. Из-за этого я (думаю, я) должен добавить -fPIC параметр для cc и -shared а также -soname параметры для ld, Я пробовал с CFLAGS=-fPIC а также LDFLAGS=-shared -soname foo, который не сработал. Есть ли у кого-нибудь предложения о том, как получить общую библиотеку? Если вам нужна дополнительная информация, пожалуйста, просто спросите. Заранее спасибо!

ОБНОВЛЕНИЕ: make-файл в $(SDK_PATH)/Soft/Build:

GEN_CUSTOM_HEADER:=../Common/generated_custom.h

include custom.makefile 
include config.makefile

GNUTOOLS_PATH=/usr/local/$(GNUTOOLS_VERSION)/bin

define ADD_RULE_TEMPLATE
  TO_BUILD+=build_$(1)
endef

# Add rule for each target
$(foreach target,$(TARGETS),$(eval $(call ADD_RULE_TEMPLATE,$(target))))

.PHONY: linux_sample svn_update $(TO_BUILD) build_libs $(MAKECMDGOALS)

all: $(GEN_CUSTOM_HEADER) build_libs $(TO_BUILD)

$(GEN_CUSTOM_HEADER): custom.makefile
    @echo "#ifndef _GENERATED_CUSTOM_CONFIGURATION_H_" > $@
    @echo "#define _GENERATED_CUSTOM_CONFIGURATION_H_" >> $@
    @echo >> $@
    @echo "#if  defined(BR2_PACKAGE_BCM4318_AP)" >> $@
    @echo "#  define AP" >> $@
    @echo "#else" >> $@
    @echo "#  define STA" >> $@
    @echo "#endif" >> $@
    @echo "#define CURRENT_NUM_VERSION_SOFT \"$(MAJOR_VERSION).$(MINOR_VERSION).$(MODIF_VERSION)\"" >> $@
    @echo "#define CURRENT_BUILD_DATE \"$(shell date +%F\ %H:%M)\"" >> $@
    @echo >> $@
ifeq ("$(VIDEO_YUV)","yes")
    @echo "#define USE_VIDEO_YUV" >> $@
endif
ifeq ("$(RECORD_VISION_DATA)","yes")
    @echo "#define RECORD_VISION_DATA" >> $@
endif
    @echo >> $@
    @echo "#define WIFI_NETWORK_NAME \"$(WIFI_NETWORK_NAME)\"" >> $@
    @echo "#define WIFI_BROADCAST \"$(WIFI_BROADCAST)\"" >> $@
    @echo "#define WIFI_ARDRONE_IP \"$(WIFI_ARDRONE_IP)\"" >> $@
    @echo >> $@
    @echo "#if defined(__linux__) || defined(USE_MINGW32)" >> $@
    @echo "# define WIFI_MOBILE_IP \"$(WIFI_MOBILE_IP)\"" >> $@
    @echo "# define WIRED_ITFNAME \"$(WIRED_ITFNAME)\"" >> $@
    @echo "#endif // ! __linux__" >> $@
    @echo >> $@
    @echo >> $@
    @echo "#endif // ! _GENERATED_CUSTOM_CONFIGURATION_H_" >> $@

ifneq "$(MAKECMDGOALS)" ""
  ifneq "$(MAKECMDGOALS)" "clean"
    ifneq "$(MAKECMDGOALS)" "update"
      $(MAKECMDGOALS):
      @echo -e "\nCannot make what you ask me to do :-("
    else
      $(MAKECMDGOALS): svn_update
    endif
  endif
endif

$(MAKECMDGOALS): build_libs $(TO_BUILD)

checkpackages:
ifeq ($(IPHONE_MODE),yes)
    sh $(shell pwd)/check_dependencies.sh iphone RELEASE_BUILD=$(RELEASE_BUILD) $(MAKECMDGOALS)
else
ifeq ($(USE_LINUX),yes)
    sh $(shell pwd)/check_dependencies.sh static RELEASE_BUILD=$(RELEASE_BUILD) $(MAKECMDGOALS)
else
ifeq ($(USE_ANDROID),yes)
    sh $(shell pwd)/check_dependencies.sh android_no_neon RELEASE_BUILD=$(RELEASE_BUILD) $(MAKECMDGOALS)
endif
endif
endif

define GENERIC_RULES_TEMPLATE
build_$(1): 
    @$(MAKE) -C $(1) $(MAKECMDGOALS)
endef

$(foreach target,$(TARGETS),$(eval $(call GENERIC_RULES_TEMPLATE,$(target))))

build_libs: checkpackages
    @$(MAKE) PC_TARGET=yes USE_ARDRONE_TOOL=yes TARGET=pc_ USE_MINGW32=no -C ../Lib/Build $(MAKECMDGOALS)
    @$(MAKE) PC_TARGET=yes USE_ARDRONE_TOOL=no TARGET=pc_ USE_MINGW32=no -C ../Lib/Build $(MAKECMDGOALS)

ifeq ("$(MINGW32_MODE)","yes")
ifeq ($(shell which i586-mingw32msvc-gcc 2> /dev/null),)
        $(warning You need MinGW32 to compile My Ardrone lib for Windows if you want. (under Debian: apt-get install mingw32))
else
#   @$(MAKE) PC_TARGET=yes TARGET=mingw32_ USE_MINGW32=yes TMP_SDK_FLAGS="USE_MINGW32=yes NO_COM=yes USE_BLUEZ=no" -C ../Lib/Build $(MAKECMDGOALS)
#   @$(MAKE) PC_TARGET=yes TARGET=emb_mingw32_ USE_MINGW32=yes CONTROL_DLL=yes TMP_SDK_FLAGS="USE_MINGW32=yes NO_COM=yes USE_BLUEZ=no" -C ../Lib/Build $(MAKECMDGOALS)
endif
endif
ifeq ($(WIIMOTE_SUPPORT),yes)
#   @$(MAKE) PC_TARGET=yes TARGET=pc_ TMP_SDK_FLAGS="USE_BLUEZ=yes" -C ../Lib/libcwiid $(MAKECMDGOALS)
endif

define svn_update_template
   cd ../.. ; \
    echo "Checking out tag $(1) of $(2) ..." ; \
    if [ $(1) != head ] ; then \
       svn co -r $(1) https://svn.ardrone.org/repo/ARDrone_API/$(2) ; \
    else \
        svn co https://svn.ardrone.org/repo/ARDrone_API/$(2) ; \
    fi ; \
    cd Soft/Build ; 
endef

svn_update:
    @-$(call svn_update_template,$(SDK_VERSION),ARDroneLib)

Если вам нужны custom.makefile и config.makefile, вы можете найти их здесь: http://pastebin.com/H8PNKKhu

ОБНОВЛЕНИЕ 2: я только что обнаружил, расположенный в $(SDK_PATH)/VP_SDK/Build: http://pastebin.com/3knnSkmy

3 ответа

Решение

Я это сделал. В заключение!!!

Решение: в $(SDK_PATH)/VP_SDK/Build там был файл с именем generic.makefile содержащий все вызовы компилятора и компоновщика. Я должен был добавить -shared а также -fPIC аргументы к некоторым из них. Звучит очень просто, но ничего из этого не было задокументировано, поэтому мне сначала пришлось искать скрытые вызовы компилятора / компоновщика...

Так как вы не показали нам make-файл в $(SDK_PATH)/Soft/BuildЯ собираюсь сделать предположение.

В руководстве по GNU Make есть список переменных, используемых неявными правилами:

  • CFLAGS: Дополнительные флаги для компилятора Си
  • LDFLAGS: Дополнительные флаги для компилятора, когда он должен вызывать компоновщик 'ld'.

Кроме того, в каталоге неявных правил упоминается LDLIBS переменная, которая называет библиотеки, используемые в правиле неявной ссылки. (Правило неявного связывания хорошо, когда у вас есть ссылка на один исходный файл или когда один из объектных файлов является именем конечного исполняемого файла, в противном случае вам нужно написать правило явного связывания.)

Это не входит в фокус. Похоже, это сгенерированные make-файлы, поэтому их сложно отследить, очевидно, что происходит гораздо больше, чем мы видим (и я не виню вас за то, что вы не публикуете все), и я не вижу, где build_libs правила приводит или любое использование компоновщика, или что-нибудь, что могло бы создать статическую библиотеку. Мы могли бы показать вам, как написать явное правило для создания разделяемой библиотеки, но без списка источников или объектов мы не знали бы, что поместить в эту библиотеку.

Это становится отчаянным, но не могли бы вы попробовать следующее:

1) make -C $(SDK_PATH)/Soft/Build (введите соответствующее значение для $(SDK_PATH)) и убедитесь, что это создает статическую библиотеку.

2) make -nЗахватите поток вывода и поместите его в pastebin. Мы попробуем посмотреть, какие правила он использует, что может привести к тому, что нам нужно.

Другие вопросы по тегам