Merge branch 'master' of gitorious.org:brewtarget/brewtarget into origin/StrikeWaterT...
[brewtarget:malavv-brewtarget.git] / src / CMakeLists.txt
1 # The current directory in the original source.
2 INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR} )
3 # The current directory in the output build directory.
4 INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR} )
5
6 # Put all the required Qt dirs in the includes. 
7 #   That isn't quite what this include does. QT_USE_FILE references
8 #   a cmake macro include, which is good but not required.
9 INCLUDE(${QT_USE_FILE})
10
11 # (ADD_PCH_RULE  _header_filename _src_list)
12 # Version 7/26/2010
13 #
14 # use this macro before "add_executable"
15 #
16 # _header_filename
17 #  header to make a .gch
18 #
19 # _src_list 
20 #   the variable name (do not use ${..}) which contains a
21 #     a list of sources (a.cpp b.cpp c.cpp ...)
22 #  This macro will append a header file to it, then this src_list can be used in
23 #  "add_executable..."
24 #
25 #
26 # Now a .gch file should be generated and gcc should use it. 
27 #        (add -Winvalid-pch to the cpp flags to verify)
28 #
29 # make clean should delete the pch file
30 #
31 # example : ADD_PCH_RULE(headers.h myprog_SRCS)
32 MACRO (ADD_PCH_RULE  _header_filename _src_list)
33    SET(_gch_filename "${CMAKE_CURRENT_BINARY_DIR}/${_header_filename}.gch")
34    SET(_header "${CMAKE_CURRENT_SOURCE_DIR}/${_header_filename}")
35
36    LIST(APPEND ${_src_list} ${_gch_filename})
37
38    SET (_args ${CMAKE_CXX_FLAGS})
39    LIST(APPEND _args -c ${_header} -o ${_gch_filename})
40
41    GET_DIRECTORY_PROPERTY(DIRINC INCLUDE_DIRECTORIES)
42    FOREACH(_inc ${DIRINC})
43       LIST(APPEND _args "-I" ${_inc})
44    ENDFOREACH(_inc ${DIRINC})
45
46    SEPARATE_ARGUMENTS(_args)
47
48    ADD_CUSTOM_COMMAND(OUTPUT ${_gch_filename}
49                       COMMAND rm -f ${_gch_filename}
50                       COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1} ${_args}
51                       DEPENDS ${_header})
52 ENDMACRO(ADD_PCH_RULE _src_list _header_filename)
53
54 # Variable that contains all the .cpp files in this project.
55 SET( brewtarget_SRCS
56     ${SRCDIR}/Algorithms.cpp
57     ${SRCDIR}/BeerXMLElement.cpp
58     ${SRCDIR}/BeerXMLSortProxyModel.cpp
59     ${SRCDIR}/BrewDayWidget.cpp
60     ${SRCDIR}/BrewDayScrollWidget.cpp
61     ${SRCDIR}/brewnote.cpp
62     ${SRCDIR}/BrewNoteWidget.cpp
63     ${SRCDIR}/BtTabWidget.cpp
64     ${SRCDIR}/BtTreeItem.cpp
65     ${SRCDIR}/BtTreeModel.cpp
66     ${SRCDIR}/BtTreeView.cpp
67     ${SRCDIR}/BtTreeFilterProxyModel.cpp
68     ${SRCDIR}/BeerColorWidget.cpp
69     ${SRCDIR}/BtDatePopup.cpp
70     ${SRCDIR}/BtFolder.cpp
71     ${SRCDIR}/BtLabel.cpp
72     ${SRCDIR}/BtTextEdit.cpp
73     ${SRCDIR}/brewtarget.cpp
74     ${SRCDIR}/BtSplashScreen.cpp
75     ${SRCDIR}/CelsiusTempUnitSystem.cpp
76     ${SRCDIR}/ColorMethods.cpp
77     ${SRCDIR}/ConverterTool.cpp
78     ${SRCDIR}/CustomComboBox.cpp
79     ${SRCDIR}/database.cpp
80     ${SRCDIR}/equipment.cpp
81     ${SRCDIR}/EquipmentButton.cpp
82     ${SRCDIR}/EquipmentListModel.cpp
83     ${SRCDIR}/EquipmentEditor.cpp
84     ${SRCDIR}/FahrenheitTempUnitSystem.cpp
85     ${SRCDIR}/fermentable.cpp
86     ${SRCDIR}/FermentableEditor.cpp
87     ${SRCDIR}/FermentableDialog.cpp
88     ${SRCDIR}/FermentableSortFilterProxyModel.cpp
89     ${SRCDIR}/FermentableTableModel.cpp
90     ${SRCDIR}/HeatCalculations.cpp
91     ${SRCDIR}/hop.cpp
92     ${SRCDIR}/HopDialog.cpp
93     ${SRCDIR}/HopEditor.cpp
94     ${SRCDIR}/HopSortFilterProxyModel.cpp
95     ${SRCDIR}/HopTableModel.cpp
96     ${SRCDIR}/instruction.cpp
97     ${SRCDIR}/IbuMethods.cpp
98     ${SRCDIR}/ImperialVolumeUnitSystem.cpp
99     ${SRCDIR}/InstructionWidget.cpp
100     ${SRCDIR}/MainWindow.cpp
101     ${SRCDIR}/MaltinessWidget.cpp
102     ${SRCDIR}/mash.cpp
103     ${SRCDIR}/MashButton.cpp
104     ${SRCDIR}/MashEditor.cpp
105     ${SRCDIR}/MashListModel.cpp
106     ${SRCDIR}/mashstep.cpp
107     ${SRCDIR}/MashStepEditor.cpp
108     ${SRCDIR}/MashStepTableModel.cpp
109     ${SRCDIR}/MashStepTableWidget.cpp
110     ${SRCDIR}/MashWizard.cpp
111     ${SRCDIR}/matrix.cpp
112     ${SRCDIR}/misc.cpp
113     ${SRCDIR}/MiscEditor.cpp
114     ${SRCDIR}/MiscDialog.cpp
115     ${SRCDIR}/MiscSortFilterProxyModel.cpp
116     ${SRCDIR}/MiscTableModel.cpp
117     ${SRCDIR}/NamedMashEditor.cpp
118     ${SRCDIR}/OgAdjuster.cpp
119     ${SRCDIR}/OptionDialog.cpp
120     ${SRCDIR}/PreInstruction.cpp
121     ${SRCDIR}/PrimingDialog.cpp
122     ${SRCDIR}/QueuedMethod.cpp
123     ${SRCDIR}/recipe.cpp
124     ${SRCDIR}/RecipeFormatter.cpp
125     ${SRCDIR}/RefractoDialog.cpp
126     ${SRCDIR}/SetterCommand.cpp
127     ${SRCDIR}/SetterCommandStack.cpp
128     ${SRCDIR}/ScaleRecipeTool.cpp
129     ${SRCDIR}/SIVolumeUnitSystem.cpp
130     ${SRCDIR}/SIWeightUnitSystem.cpp
131     ${SRCDIR}/StrikeWaterDialog.cpp
132     ${SRCDIR}/style.cpp
133     ${SRCDIR}/StyleButton.cpp
134     ${SRCDIR}/StyleListModel.cpp
135     ${SRCDIR}/StyleEditor.cpp
136     ${SRCDIR}/StyleSortFilterProxyModel.cpp
137     ${SRCDIR}/TimerListDialog.cpp
138     ${SRCDIR}/TimerWidget.cpp
139     ${SRCDIR}/TimeUnitSystem.cpp
140     ${SRCDIR}/unit.cpp
141     ${SRCDIR}/UnitSystem.cpp
142     ${SRCDIR}/UnitSystems.cpp
143     ${SRCDIR}/USVolumeUnitSystem.cpp
144     ${SRCDIR}/USWeightUnitSystem.cpp
145     ${SRCDIR}/water.cpp
146     ${SRCDIR}/WaterTableModel.cpp
147     ${SRCDIR}/WaterTableWidget.cpp
148     ${SRCDIR}/WaterEditor.cpp
149     ${SRCDIR}/yeast.cpp
150     ${SRCDIR}/YeastDialog.cpp
151     ${SRCDIR}/YeastEditor.cpp
152     ${SRCDIR}/YeastTableModel.cpp
153     ${SRCDIR}/YeastSortFilterProxyModel.cpp
154     ${SRCDIR}/RecipeExtrasDialog.cpp
155     ${SRCDIR}/MashDesigner.cpp
156     ${SRCDIR}/BtDigitWidget.cpp
157     ${SRCDIR}/PitchDialog.cpp
158     ${SRCDIR}/RecipeExtrasWidget.cpp
159 )
160
161 # List of all the *.ui.
162 # TODO: can I somehow have a separate CMakeLists.txt
163 # in the ui/ directory instead of here?
164 SET( brewtarget_UIS
165     ${UIDIR}/aboutDialog.ui
166     ${UIDIR}/brewDayWidget.ui
167     ${UIDIR}/brewDayScrollWidget.ui
168     ${UIDIR}/brewNoteWidget.ui
169     ${UIDIR}/btSplashScreen.ui
170     ${UIDIR}/converterTool.ui
171     ${UIDIR}/mainWindow.ui
172     ${UIDIR}/mashStepEditor.ui
173     ${UIDIR}/miscEditor.ui
174     ${UIDIR}/fermentableEditor.ui
175     ${UIDIR}/fermentableDialog.ui
176     ${UIDIR}/equipmentEditor.ui
177     ${UIDIR}/hopDialog.ui
178     ${UIDIR}/hopEditor.ui
179     ${UIDIR}/htmlViewer.ui
180     ${UIDIR}/instructionWidget.ui
181     ${UIDIR}/mashEditor.ui
182     ${UIDIR}/namedMashEditor.ui
183     ${UIDIR}/mashWizard.ui
184     ${UIDIR}/miscDialog.ui
185     ${UIDIR}/ogAdjuster.ui
186     ${UIDIR}/optionsDialog.ui
187     ${UIDIR}/primingDialog.ui
188     ${UIDIR}/recipeExtrasDialog.ui
189     ${UIDIR}/refractoDialog.ui
190     ${UIDIR}/scaleRecipeTool.ui
191     ${UIDIR}/strikeWaterDialog.ui
192     ${UIDIR}/styleEditor.ui
193     ${UIDIR}/timerListDialog.ui
194     ${UIDIR}/timerWidget.ui
195     ${UIDIR}/waterEditor.ui
196     ${UIDIR}/yeastDialog.ui
197     ${UIDIR}/yeastEditor.ui
198     ${UIDIR}/mashDesigner.ui
199     ${UIDIR}/pitchDialog.ui
200     ${UIDIR}/brewDayScrollWidget.ui
201     ${UIDIR}/recipeExtrasWidget.ui
202 )
203
204 # The list of files that need to be moc'd.
205 # In other words, classes that have Q_OBJECT declarations and stuff.
206 SET( brewtarget_MOC_HEADERS
207     ${SRCDIR}/BeerColorWidget.h
208     ${SRCDIR}/BeerXMLElement.h
209     ${SRCDIR}/BeerXMLSortProxyModel.h
210     ${SRCDIR}/BrewDayWidget.h
211     ${SRCDIR}/BrewDayScrollWidget.h
212     ${SRCDIR}/brewnote.h
213     ${SRCDIR}/BrewNoteWidget.h
214     ${SRCDIR}/brewtarget.h
215     ${SRCDIR}/BtTabWidget.h
216     ${SRCDIR}/BtTreeModel.h
217     ${SRCDIR}/BtTreeView.h
218     ${SRCDIR}/BtTreeFilterProxyModel.h
219     ${SRCDIR}/BtDigitWidget.h
220     ${SRCDIR}/BtDatePopup.h
221     ${SRCDIR}/BtFolder.h
222     ${SRCDIR}/BtLabel.h
223     ${SRCDIR}/BtTextEdit.h
224     ${SRCDIR}/BtSplashScreen.h
225     ${SRCDIR}/ConverterTool.h
226     ${SRCDIR}/CustomComboBox.h
227     ${SRCDIR}/database.h
228     ${SRCDIR}/EquipmentButton.h
229     ${SRCDIR}/EquipmentListModel.h
230     ${SRCDIR}/EquipmentEditor.h
231     ${SRCDIR}/FermentableEditor.h
232     ${SRCDIR}/FermentableDialog.h
233     ${SRCDIR}/FermentableSortFilterProxyModel.h
234     ${SRCDIR}/FermentableTableModel.h
235     ${SRCDIR}/HopDialog.h
236     ${SRCDIR}/HopEditor.h
237     ${SRCDIR}/HopSortFilterProxyModel.h
238     ${SRCDIR}/HopTableModel.h
239     ${SRCDIR}/InstructionWidget.h
240     ${SRCDIR}/MainWindow.h
241     ${SRCDIR}/MaltinessWidget.h
242     ${SRCDIR}/MashButton.h
243     ${SRCDIR}/MashDesigner.h
244     ${SRCDIR}/MashEditor.h
245     ${SRCDIR}/NamedMashEditor.h
246     ${SRCDIR}/MashListModel.h
247     ${SRCDIR}/MashStepEditor.h
248     ${SRCDIR}/MashStepTableModel.h
249     ${SRCDIR}/MashStepTableWidget.h
250     ${SRCDIR}/MashWizard.h
251     ${SRCDIR}/MiscDialog.h
252     ${SRCDIR}/MiscEditor.h
253     ${SRCDIR}/MiscSortFilterProxyModel.h
254     ${SRCDIR}/MiscTableModel.h
255     ${SRCDIR}/OgAdjuster.h
256     ${SRCDIR}/OptionDialog.h
257     ${SRCDIR}/PitchDialog.h
258     ${SRCDIR}/PrimingDialog.h
259     ${SRCDIR}/QueuedMethod.h
260     ${SRCDIR}/RecipeExtrasDialog.h
261     ${SRCDIR}/RecipeExtrasWidget.h
262     ${SRCDIR}/RecipeFormatter.h
263     ${SRCDIR}/RefractoDialog.h
264     ${SRCDIR}/ScaleRecipeTool.h
265     ${SRCDIR}/SetterCommandStack.h
266     ${SRCDIR}/StrikeWaterDialog.h
267     ${SRCDIR}/StyleButton.h
268     ${SRCDIR}/StyleListModel.h
269     ${SRCDIR}/StyleEditor.h
270     ${SRCDIR}/StyleSortFilterProxyModel.h
271     ${SRCDIR}/TimerListDialog.h
272     ${SRCDIR}/TimerWidget.h
273     ${SRCDIR}/unit.h
274     ${SRCDIR}/WaterTableModel.h
275     ${SRCDIR}/WaterTableWidget.h
276     ${SRCDIR}/WaterEditor.h
277     ${SRCDIR}/YeastDialog.h
278     ${SRCDIR}/YeastEditor.h
279     ${SRCDIR}/YeastSortFilterProxyModel.h
280     ${SRCDIR}/YeastTableModel.h
281     ${SRCDIR}/equipment.h
282     ${SRCDIR}/fermentable.h
283     ${SRCDIR}/hop.h
284     ${SRCDIR}/instruction.h
285     ${SRCDIR}/mash.h
286     ${SRCDIR}/mashstep.h
287     ${SRCDIR}/misc.h
288     ${SRCDIR}/recipe.h
289     ${SRCDIR}/style.h
290     ${SRCDIR}/water.h
291     ${SRCDIR}/yeast.h
292 )
293
294 SET( FILES_TO_TRANSLATE
295      ${brewtarget_SRCS}
296      ${brewtarget_UIS}
297 )
298
299 #======Speed up compilation by using precompiled headers for development======
300 #IF( UNIX AND NOT APPLE )
301 #   SET( precompiled_h "equipment.h" "fermentable.h" "hop.h" "instruction.h" "mash.h" "mashstep.h" "misc.h" "recipe.h" "style.h" "unit.h" "water.h" "yeast.h" "database.h" "brewtarget.h" )
302 #   FOREACH( header ${precompiled_h} )
303 #      ADD_PCH_RULE( ${header} brewtarget_SRCS )
304 #   ENDFOREACH()
305 #ENDIF()
306
307 #======================Some Custom Targets/Commands============================
308
309 # Creates a target for ${CMAKE_CURRENT_BINARY_DIR}/blankdb.sqlite needed by
310 # the brewtarget.qrc resource file.
311 ADD_CUSTOM_COMMAND( OUTPUT blankdb.sqlite
312                     COMMAND ${RM_COMMAND} ARGS ${RM_ARGS} "blankdb.sqlite" # Need to remove it if it exists first.
313                     COMMAND ${SQLITE3_CMD} ARGS "blankdb.sqlite" "<" "${ROOTDIR}/create_db.sql"
314                     WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
315                     MAIN_DEPENDENCY "${ROOTDIR}/create_db.sql"
316 )
317
318 #==================================Qt Junk=====================================
319
320 # Create the moc sources from the headers.
321 QT4_WRAP_CPP(brewtarget_MOC_SRCS ${brewtarget_MOC_HEADERS})
322
323 # Create the ui_*.h files from the *.ui files.
324 QT4_WRAP_UI(brewtarget_UIS_H ${brewtarget_UIS})
325
326 # Generate the resource .cpp from the .qrc file.
327 QT4_ADD_RESOURCES(brewtarget_QRC_CPP ${brewtarget_QRC})
328 QT4_ADD_RESOURCES(brewtarget_cfg_QRC_CPP ${brewtarget_cfg_QRC})
329
330 # Translations
331 FIND_PROGRAM( LUPDATE_CMD lupdate-qt4 )
332 IF( LUPDATE_CMD )
333   ADD_CUSTOM_TARGET(
334      update_translations
335      COMMAND ${LUPDATE_CMD} "-no-obsolete" ${FILES_TO_TRANSLATE} "-ts" ${TRANSLATIONS_FILES}
336   )
337 ENDIF()
338 # Creates the .qm files.
339 QT4_ADD_TRANSLATION(QM_FILES ${TRANSLATIONS_FILES})
340
341 # Add a target for the QM_FILES so that we can add
342 # the translations as a dependency for the executable later.
343 ADD_CUSTOM_TARGET(translations DEPENDS ${QM_FILES})
344
345 #============================Icon for Windows==================================
346
347 IF( WIN32 AND MINGW )
348   ADD_CUSTOM_COMMAND(OUTPUT ${WINDIR}/icon.o
349                      COMMAND windres.exe -I${CMAKE_CURRENT_SOURCE_DIR}
350                      -i${RCFILE}
351                      -o${WINDIR}/icon.o
352                      DEPENDS ${RCFILE}
353   )
354   SET(brewtarget_SRCS ${brewtarget_SRCS} ${WINDIR}/icon.o)
355 ELSEIF(WIN32)
356   SET(brewtarget_SRCS ${brewtarget_SRCS} ${RCFILE})
357 ENDIF()
358
359 #===========================Create the binary==================================
360
361 ADD_EXECUTABLE(
362    ${brewtarget_EXECUTABLE}
363    ${SRCDIR}/main.cpp
364    ${brewtarget_SRCS}
365    ${brewtarget_MOC_SRCS}
366    ${brewtarget_QRC_CPP}
367    ${brewtarget_cfg_QRC_CPP}
368    ${brewtarget_UIS_H}
369 )
370 ADD_DEPENDENCIES( ${brewtarget_EXECUTABLE} translations )
371
372 # Link brewtarget against appropriate libraries.
373 IF( WIN32 AND MINGW )
374    ############################################################################
375    # Need to set some linker flags that I don't know how to get
376    # automatically.
377    ############################################################################
378
379    # MinGW-specific flags.
380    #    '-Wl,-subsystem,windows' supresses the output command window.
381    #    '-Wl,-s' strips the executable of symbols.
382    SET_TARGET_PROPERTIES( ${brewtarget_EXECUTABLE} PROPERTIES LINK_FLAGS "-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl,-subsystem,windows")
383 ENDIF()
384
385 # Link brewtarget against Qt libraries defined by QT_LIBRARIES
386 TARGET_LINK_LIBRARIES( ${brewtarget_EXECUTABLE} ${QT_LIBRARIES} ${PHONON_LIBS} )
387 MESSAGE( STATUS "Libraries: ${QT_LIBRARIES} ${PHONON_LIBS}" )
388
389 #=================================Tests========================================
390
391 QT4_WRAP_CPP( testing_MOC_SRCS ${SRCDIR}/Testing.h )
392 ADD_EXECUTABLE(
393    brewtarget_tests
394    ${SRCDIR}/Testing.cpp
395    ${testing_MOC_SRCS}
396    ${brewtarget_SRCS}
397    ${brewtarget_MOC_SRCS}
398    ${brewtarget_QRC_CPP}
399    ${brewtarget_cfg_QRC_CPP}
400    ${brewtarget_UIS_H}
401 )
402 TARGET_LINK_LIBRARIES( brewtarget_tests ${QT_LIBRARIES} ${QT_QTTEST_LIBRARY} ${PHONON_LIBS} )
403 ADD_TEST(
404    NAME test
405    COMMAND brewtarget_tests
406 )
407
408 #=================================Installs=====================================
409
410 # Install executable.
411 INSTALL( TARGETS ${brewtarget_EXECUTABLE}
412          RUNTIME DESTINATION ${TARGETPATH} )
413
414 # Install the translations.
415 INSTALL(FILES ${QM_FILES}
416         DESTINATION "${DATAPATH}/translations_qm")
417
418 IF( APPLE )
419    # This SHOULD run macdeployqt on the app bundle at install time.
420    # Don't know if it works. Could someone try?
421    # May have to add a WORKING_DIRECTORY.
422    INSTALL( CODE
423             "EXECUTE_PROCESS( COMMAND ${QT_BINARY_DIR}/macdeployqt ${BT_BUNDLE_DIR} )" )
424 ENDIF()