Plik makefile.

0

Witam, chcę stworzyć plik makefile, który w zależności od podanych argumentów będzie powodował inne zachowanie pliku źródłowego.

Mój plik makefile:

all: intdeque.o intdequeconst.o

ifeq ($(debuglevel), 1)
	echo "WERSJA DEBUG"
intdeque.o: intdeque.cc
	g++ -std=c++11 -Wall -DDEBUG_MODE intdeque.cc -o intdeque.o
intdequeconst.o: intdequeconst.cc
	g++ -std=c++11 -Wall -DDEBUG_MODE intdequeconst.cc -o intdequeconst.o
else
	echo "WERSJA NORMALNA"
intdeque.o: intdeque.cc
	g++ -std=c++11 -Wall intdeque.cc -o intdeque.o
intdequeconst.o: intdequeconst.cc
	g++ -std=c++11 -Wall intdequeconst.cc -o intdequeconst.o
endif

Mój plik źródłowy to:

#include<iostream>
#include<cstdlib>
#include"intdeque.h"

using namespace std;

#ifdef debuglevel
constexpr bool DEBUG = true;
#else
constexpr bool DEBUG = false;
#endif

int main(){

cout << "Uruchomiono plik intdeque.o" << endl;
if (DEBUG) cout << "Wersja debug"; else cout << "Wersja normalna";
cout << endl;

return 0;
}

I teraz problem: chodzi o to, żeby przy wpisaniu "make" lub "make debuglevel=0" program wypisał "Wersja normalna", natomiast przy wpisaniu "make debuglevel=1" program wypisał "Wersja debug".

Jak przekazać wartość debuglevel do pliku źródłowego? Próbowałem przegryźć się przez informacje w internecie na temat #ifdef, #ifndef oraz #ifeq, ale nie wiem nadal jak sobie z tym poradzić?

1

Skoro wywołujesz kompilator z przełącznikiem -DDEBUG_MODE to czy w kodzie nie powinno być: #ifdef DEBUG_MODE?

1

Dość prosto.

To jest przykładowy plik z kodem -

#include <iostream>

#ifdef DEBUG
    const char *text = "Hello World";
#else
    const char *text = "Goodbye Cruel World";
#endif

int main() {
    std::cout << text;
}

Chyba oczywiste, a makefile wygląda tak:

debuglevel=NODEBUG

test.exe: test.cpp
	g++ test.cpp -o test.exe -D${debuglevel}

http://www.gnu.org/software/make/manual/make.html#Overriding

czyli możemy robić tak:

D:\test>make
g++ test.cpp -o test.exe -DNODEBUG

Albo tak:

D:\test>make debuglevel=DEBUG
g++ test.cpp -o test.exe -DDEBUG

Oczywiście format tych parametrów (np. debuglevel=1 zamiast debuglevel=DEBUG) można łatwo dostosować do potrzeb, na przykład za pomocą warunkowego wykonywania:
http://www.gnu.org/software/make/manual/make.html#Conditional-Example

PS. masz brzydkie powtórzenia kodu w makefile, lepiej takich rzeczy unikać.

0

OK. Zmieniłem nazwę i teraz działa, ale... tylko wtedy jeśli najpierw usunę poprzednie pliki wytworzone przez makefile. Dodanie

clean: rm -f intdeque.o intdequeconst.o

nie pomaga.

1 użytkowników online, w tym zalogowanych: 0, gości: 1