Makefile

Discussion in 'WASM.UNIX' started by Saessie, May 27, 2008.

  1. Saessie

    Saessie New Member

    Blog Posts:
    0
    Joined:
    Mar 7, 2007
    Messages:
    29
    Здравствуйте!

    Написал здоровенную прогу на С++ под Linux с большим количеством поддиректорий, в которых хранятся сишные файлы и хедеры. Проблема теперь осталась одна - создать makefile, который бы находился в головной директории (abc) проекта, причем:

    файлы .cxx располагаются в различных поддиректориях (abc/*/*.cxx)
    там же находятся соответствующие файлы .h

    Данный makefile должен создавать исполняемый файл с именем, например, anr, в той же директории, где находится сам makefile.

    Компилятор - gcc. OC - Linux.

    Начал делать:

    source_dirs := subdir1 subdir2 subdir3 subdir4 subdir5 subdir6
    search_wildcard s := */*.cxx
    anr: $(notdir $(patsubst %.cxx,%.o,$(wildcard $(search_wildcard s))))
    gcc $^ -o $@


    Это, разумеется не все. Это только начало. Только проблема - уже этот код не работает, т.е. не создаются объектные файлы .o. Наверно, потому что у меня файл, например, file1.cxx имеет первые 1-ую строку вида
    #include "subdir1/file.h"
    И команда make пытается, находясь уже в subdir1, найти в ней файл subdir1/file.h, которого, естественно, там нет.
    Как это побороть? Естественно, вариант убрать путь к хедерам из директив include не проходит, так как файлов .cxx у меня > 100 штук.

    Не исключаю, что 1-ая строка моего makefile'а не нужна, а 3-ья - просто неправильна. Помогите, пожалуйста, исправить и дописать.
     
  2. rei3er

    rei3er maxim

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    917
    Location:
    minsk
    применять make рекурсивно
    в каждом каталоге с *.cxx определять свой Makefile
     
  3. Saessie

    Saessie New Member

    Blog Posts:
    0
    Joined:
    Mar 7, 2007
    Messages:
    29
    А потом сделать один головной makefile в верхней директории, из которого вызывать остальные?
    Как сделать этот вызов? Командой

    @make -s -C $(subdir1) subdir1

    или как-то по-другому? И что значит subdir1 в конце этой строки?

    Ведь все равно придется убирать путь к хедерам из директив include всех сишных файлов, так?
     
  4. pas

    pas New Member

    Blog Posts:
    0
    Joined:
    Apr 18, 2003
    Messages:
    330
    Location:
    Russia
    Есть простой способ - посмотрите исходники любого проекта.
     
  5. Booster

    Booster New Member

    Blog Posts:
    0
    Joined:
    Nov 26, 2004
    Messages:
    4,860
    Saessie
    Есть автогенераторы. СMake, Bakefile и пр.
     
  6. device

    device Reflection

    Blog Posts:
    0
    Joined:
    Apr 26, 2007
    Messages:
    1,198
    Location:
    RF
    autoscan
    autoconf
    automake
    aclocal

    А еще лучше: KDevelop IDE. Сама все сделает.