Необходимо дважды запустить make после очистки - PullRequest
0 голосов
/ 08 мая 2020

Все, что я хочу сделать, это собрать исходные файлы из разных исходных каталогов в одну папку, а затем выполнить сборку этих файлов make. После очистки мне нужно дважды запустить команду make, чтобы выполнить сборку.

Итак, сначала я запускаю make clean, затем я запускаю make, в результате чего появляется сообщение об отсутствии файлов -o. Но когда я снова запускаю make, сборка проходит и генерирует файлы сборки.

Мой make-файл выглядит так, как показано ниже

.PHONY:  dirs all clean

all: dirs $(OBJ_DIR) $(OBJ_FILES) 
    "$(CC) -rvn fLib.a $(OBJ_FILES)

# clean build target. Remove all files without reporting errors in case they don't exist.
clean:
    @rm -rf fLib.a $(OBJ_DIR)

# Build target for creating flat header file folder for SharedTrackerAPI (FLAT_INC_DIR) 
# due to too long paths in Windows 7 build
dirs:
    @echo 'Making flat source and header folders.'
    @mkdir -p $(OBJ_DIR)
    @for f in $(SRC_FILES); do cp $$f $(OBJ_DIR); done
    @mkdir -p $(FLAT_INC_DIR) 
    @OLD_CWD=$(CURDIR)
    @cd $(FLAT_INC_DIR)
    @find  $(STA_RADAR_TRACKER_IFACE) -name '*.h' | xargs -i  cp -l {} $(FLAT_INC_DIR)
    @cd $(OLD_CWD)

$(OBJ_DIR)/%.o: $(OBJ_DIR)/%.cpp
    "$(TASKING_CTC_BIN)"/cctc.exe $(CXXFLAGS) -c -o $@ $< $(CC_INCLUDE_PATH) 

Что я делаю не так, что мне приходится дважды запускать make после очистки.

1 Ответ

1 голос
/ 08 мая 2020

Проблема в том, что, хотя dirs поместит исходные файлы в плоский исходный каталог, Make этого не знает. Перед тем, как выполнить правило dirs, он уже определил, что он не знает способа создания объектных файлов.

Быстрое и грязное решение - сказать Make «поверь мне, все будет хорошо»; Примерное правило объекта:

$(OBJ_DIR)/%.o:
    "$(TASKING_CTC_BIN)"/cctc.exe $(CXXFLAGS) -c -o $@ $(OBJ_DIR)/$*.cpp $(CC_INCLUDE_PATH)

Если вы остановитесь на этом, у вас будет рабочее решение.

Если вам нужен более чистый, эффективный и гибкий make-файл, вы должны пересмотреть подход к поиск исходных файлов. Я не вижу веских причин для использования подхода с плоским исходным файлом, но если вы действительно хотите его использовать, вот хороший способ:

vpath %.cpp $(dir $(SRC_FILES))

$(OBJ_DIR)/%.cpp: %.cpp
    @cp $< $@

Теперь вы можете избавиться от dir и использовать свой немодифицированный правило объекта:

$(OBJ_DIR)/%.o: $(OBJ_DIR)/%.cpp
    "$(TASKING_CTC_BIN)"/cctc.exe $(CXXFLAGS) -c -o $@ $< $(CC_INCLUDE_PATH) 

Как обрабатывать файлы заголовков (FLAT_INC_DIR) зависит от вас, но я снова рекомендую vpath.

...