web-dev-qa-db-fra.com

Conversion d'un projet Makefile en Cmake

J'apprends à utiliser cmake pour cette classe mais la documentation est extrêmement détaillée et dense. De nombreux tutoriels sont soit trop simples pour être utiles (cmake avec un seul fichier), soit trop compliqués.

le Makefile d'origine du projet ressemble à:

# Some optimization settings
# see: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

# Standard all target
all: hw1_p2

# Simple program to do brute-force k-nearest neighbor searches against a signature file
hw1_p2: prob2.o ParseRecord.o Sorter.o Timing.o
        g++ -o hw1_p2 prob2.o ParseRecord.o Sorter.o Timing.o

prob2.o: prob2.cpp utility_templates.hpp
        g++ -Wall -c prob2.cpp

ParseRecord.o: ParseRecord.cpp ParseRecord.hpp utility_templates.hpp
        g++ -Wall -c ParseRecord.cpp

Sorter.o: Sorter.cpp Sorter.hpp
        g++ -Wall -c Sorter.cpp

# Timing class
Timing.o: Timing.hpp Timing.cpp
        g++ -Wall -c Timing.cpp

# Clean code-derived files
clean:
        rm -f *.o hw1_p2 

Le projet est organisé comme ceci

  • cmakelearn
    • CMakeLists.txt
    • construire
    • src
      • CMakeLists.txt
      • ParseRecord.hpp
      • Timing.cpp
      • small.dat
      • Makefile
      • Sorter.cpp
      • Timing.hpp
      • utility_templates.hpp
      • ParseRecord.cpp
      • Sorter.hpp
      • prob2.cpp

Jusqu'à présent, d'après la lecture que j'ai faite, je comprends que vous avez besoin d'un fichier CMakelists.txt dans chaque répertoire. Le dossier de build est là pour que je puisse y aller et lancer cmake ..

Dans le fichier CMakelists.txt de niveau supérieur que j'ai

cmake_minimum_required (VERSION 2.6)
project (CMAKETEST)
add_subdirectory(src)

et dans le dir src CMakelist.txt voici ma tentative:

include_directories(${CMAKETEST_SOURCE_DIR}/src)
link_directories(${CMAKETEST_BINARY_DIR}/src)

add_executable(hw1_p2 prob2.cpp ParseRecord.cpp Sorter.cpp Timing.cpp)

Je ne sais même pas vraiment par où commencer à part ça. Ce commentaire d'un tutoriel résume à peu près mes réflexions sur cmake et la documentation en ce moment:

Pas assez détaillé pour être utile. Cela dit, je n'aime pas beaucoup CMake de toute façon; trop de choses distinctes et arbitraires que vous devez simplement savoir. C'est du moins mon impression. Comme "add_definitions (-std = c99)". Vraiment? Est-ce que ce nom vous saute aux yeux pour ajouter des indicateurs à un compilateur? Et ‘set (VAR a b c)’ est-il plus intuitif que VAR = a b c ou quelque chose du genre? Beh sur l'article, et sur CMake. Pourtant, je sais que CMake prend d'assaut le monde de la construction.

Pourtant, je veux vraiment apprendre et comprendre cela, donc toute aide que vous pourrez fournir sera très appréciée et utile. Merci d'avance.

17
Harrison

Le add_executable La commande sert à construire des exécutables, mais vous semblez essayer de l'utiliser pour construire un objet (.o) également. Puisque vous ne créez qu'un seul exécutable, vous n'avez besoin que d'un add_executable commande:

add_executable(hw1_p2 prob2.cpp ParseRecord.cpp Sorter.cpp Timing.cpp)
5
David Brown

Il n'est pas nécessaire de créer des fichiers cmakelists.txt dans chaque sous-répertoire. Pour un projet aussi simple, il devrait suffire de tout mettre dans le toplevel cmakelists.txt

cmake_minimum_required (VERSION 2.6)
project (CMAKETEST C CXX)

add_executable(hw1_p2 src/prob2.cpp src/ParseRecord.cpp src/Sorter.cpp src/Timing.cpp)

ce simple cmakelists.txt devrait faire le travail.

6
user1283078