153 lines
7.1 KiB
Prolog
153 lines
7.1 KiB
Prolog
|
###############################################################################
|
||
|
# Project file for CS106B/X student program
|
||
|
#
|
||
|
# @version Fall Quarter 2022 for Qt 6
|
||
|
# @author Julie Zelenski
|
||
|
# build client program using installed static library
|
||
|
###############################################################################
|
||
|
|
||
|
SPL_VERSION = 2022.1
|
||
|
SPL_URL = https://web.stanford.edu/dept/cs_edu/qt
|
||
|
|
||
|
TEMPLATE = app
|
||
|
QT += core gui widgets network
|
||
|
CONFIG += silent debug # quiet build and debug symbols always
|
||
|
CONFIG -= depend_includepath # library headers not changing, don't add depend
|
||
|
|
||
|
###############################################################################
|
||
|
# Find/use installed version of cs106 lib and headers #
|
||
|
###############################################################################
|
||
|
|
||
|
# Library installed into per-user writable data location from QtStandardPaths
|
||
|
win32|win64 { QTP_EXE = qtpaths.exe } else { QTP_EXE = qtpaths }
|
||
|
USER_DATA_DIR = $$system($$[QT_INSTALL_BINS]/$$QTP_EXE --writable-path GenericDataLocation)
|
||
|
|
||
|
SPL_DIR = $${USER_DATA_DIR}/cs106
|
||
|
STATIC_LIB = $$system_path($${SPL_DIR}/lib/libcs106.a)
|
||
|
SPL_VERSION_FILE = $$system_path($${SPL_DIR}/lib/version$${SPL_VERSION})
|
||
|
|
||
|
# Confirm presence of lib before build using extra target as prereq
|
||
|
check_lib.target = "$${STATIC_LIB}"
|
||
|
check_lib.commands = $(error No CS106 library found. Install CS106 package following instructions at $${SPL_URL})
|
||
|
QMAKE_EXTRA_TARGETS += check_lib
|
||
|
PRE_TARGETDEPS += $${check_lib.target}
|
||
|
|
||
|
# Confirm version of library is current
|
||
|
check_version.target = "$${SPL_VERSION_FILE}"
|
||
|
check_version.commands = $(error Cannot find version $${SPL_VERSION} of CS106 library. Install CS106 package following instructions at $${SPL_URL})
|
||
|
QMAKE_EXTRA_TARGETS += check_version
|
||
|
PRE_TARGETDEPS += $${check_version.target}
|
||
|
|
||
|
# link against libcs106.a, add library headers to search path
|
||
|
# libcs106 requires libpthread, add link here
|
||
|
LIBS += -lcs106 -lpthread
|
||
|
QMAKE_LFLAGS = -L$$shell_quote($${SPL_DIR}/lib)
|
||
|
# put PWD first in search list to allow local copy to shadow if needed
|
||
|
INCLUDEPATH += $$PWD "$${SPL_DIR}/include"
|
||
|
|
||
|
###############################################################################
|
||
|
# Configure project with custom settings #
|
||
|
###############################################################################
|
||
|
|
||
|
# remove spaces from target executable for better Windows compatibility
|
||
|
TARGET = $$replace(TARGET, " ", _)
|
||
|
|
||
|
# set DESTDIR to project root dir, this is where executable/app will deploy and run
|
||
|
DESTDIR = $$PWD
|
||
|
|
||
|
# student writes ordinary main() function, but it must be called within a
|
||
|
# wrapper main() that handles library setup/teardown. Rename student's
|
||
|
# to distinguish between the two main() functions and avoid symbol clash
|
||
|
# Ask Julie if you are curious why main->qMain->studentMain
|
||
|
DEFINES += main=qMain qMain=studentMain
|
||
|
|
||
|
###############################################################################
|
||
|
# Gather files to list in Qt Creator project browser #
|
||
|
###############################################################################
|
||
|
|
||
|
# honeypot to trick Qt Creator to allow glob-all to coexist with user-added files
|
||
|
# Qt looks for first 'SOURCES *=' line and lists user-added .cpp/h files there.
|
||
|
# Afterward we glob-add files to SOURCES ourselves. Operator *= will unique
|
||
|
# entries, so no worries about duplicates
|
||
|
SOURCES *= "" \
|
||
|
WeatherReport.cpp \
|
||
|
error.cpp
|
||
|
HEADERS *= "" \
|
||
|
WeatherReport.h \
|
||
|
error.h
|
||
|
|
||
|
# Gather any .cpp or .h files within the project folder (student/starter code).
|
||
|
# Second argument true makes search recursive
|
||
|
SOURCES *= $$files(*.cpp, true)
|
||
|
HEADERS *= $$files(*.h, true)
|
||
|
|
||
|
# Gather resource files (image/sound/etc) from res dir, list under "Other files"
|
||
|
OTHER_FILES *= $$files(res/*, true)
|
||
|
# Gather text files from root dir or anywhere recursively
|
||
|
OTHER_FILES *= $$files(*.txt, true)
|
||
|
|
||
|
###############################################################################
|
||
|
# Configure compiler, compile flags #
|
||
|
###############################################################################
|
||
|
|
||
|
# Configure flags for the C++ compiler
|
||
|
# (In general, many warnings/errors are enabled to tighten compile-time checking.
|
||
|
# A few overly pedantic/confusing errors are turned off to avoid confusion.)
|
||
|
|
||
|
CONFIG += sdk_no_version_check # removes spurious warnings on Mac OS X
|
||
|
|
||
|
# MinGW compiler lags, be conservative and use C++11 on all platforms
|
||
|
# rather than special case
|
||
|
CONFIG += c++11
|
||
|
|
||
|
# WARN_ON has -Wall -Wextra, add/remove a few specific warnings
|
||
|
QMAKE_CXXFLAGS_WARN_ON += -Werror=return-type
|
||
|
QMAKE_CXXFLAGS_WARN_ON += -Werror=uninitialized
|
||
|
QMAKE_CXXFLAGS_WARN_ON += -Wunused-parameter
|
||
|
QMAKE_CXXFLAGS_WARN_ON += -Wmissing-field-initializers
|
||
|
QMAKE_CXXFLAGS_WARN_ON += -Wno-old-style-cast
|
||
|
QMAKE_CXXFLAGS_WARN_ON += -Wno-sign-compare
|
||
|
QMAKE_CXXFLAGS_WARN_ON += -Wno-sign-conversion
|
||
|
QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-const-variable
|
||
|
|
||
|
*-clang { # warning flags specific to clang
|
||
|
QMAKE_CXXFLAGS_WARN_ON += -Wempty-init-stmt
|
||
|
QMAKE_CXXFLAGS_WARN_ON += -Wignored-qualifiers
|
||
|
}
|
||
|
|
||
|
*-g++ { # warning flags specific to g++
|
||
|
QMAKE_CXXFLAGS_WARN_ON += -Wlogical-op
|
||
|
}
|
||
|
|
||
|
###############################################################################
|
||
|
# Detect/report errors in project structure #
|
||
|
###############################################################################
|
||
|
|
||
|
# error if project opened from within a ZIP archive (common mistake on Windows)
|
||
|
win32|win64 {
|
||
|
contains(PWD, .*\.zip.*) | contains(PWD, .*\.ZIP.*) {
|
||
|
message( "*******************************************************************" )
|
||
|
message( "*** ERROR: You are trying to open this project from within a ZIP archive." )
|
||
|
message( "*** You must first extract the files then open in Qt Creator." )
|
||
|
message( "*** In File Explorer open the ZIP and choose to Extract All." )
|
||
|
message( "*******************************************************************" )
|
||
|
error( Exiting. Extract project from ZIP first.)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
# error if name of directory has chars that may cause trouble for qmake/make/shell
|
||
|
PROJECT_DIR = $$basename(PWD)
|
||
|
FOUND = $$PROJECT_DIR
|
||
|
FOUND ~= s|[a-z A-Z 0-9 _.+-]|| # yes, spaces ok, limited punctuation, $ % & are dicey
|
||
|
!isEmpty(FOUND) {
|
||
|
message( "*******************************************************************" )
|
||
|
message( "*** ERROR: The name of your project directory has disallowed characters." )
|
||
|
message( "*** The allowed characters are letters, numbers, and simple punctuation." )
|
||
|
message( "*** Your directory is named $$PROJECT_DIR which contains the" )
|
||
|
message( "*** disallowed characters: $$FOUND" )
|
||
|
message( "*** Please rename to a simple name such as Assignment_1 that contains" )
|
||
|
message( "*** no disallowed characters." )
|
||
|
message( "*******************************************************************" )
|
||
|
error(Exiting. Rename project directory to remove disallowed characters. )
|
||
|
}
|