1# user may define the whole sets of flags
2# LDFLAGS
3# CPPFLAGS
4# CXXFLAGS
5# CFLAGS
6
7# or these user-set flags that will be added to standard flags
8LDFLAGSextra ?=
9CXXFLAGSextra ?=
10
11# user may define the compiler
12CXX ?= g++
13
14# user may set to '' and sed "htslib/htslib/*.h" to <htslib/*.h>
15# if they don't want the bundled htslib
16HTSLIB ?= htslib
17
18# pre-defined flags
19LDFLAGS_shared := -pthread -Lhtslib -Bstatic -lhts -Bdynamic -lz
20LDFLAGS_static := -static -static-libgcc -pthread -Lhtslib -lhts -lz
21LDFLAGS_Mac :=-pthread -lz htslib/libhts.a
22LDFLAGS_Mac_static :=-pthread -lz -static-libgcc htslib/libhts.a
23LDFLAGS_gdb := $(LDFLAGS_shared)
24
25# --iso-8601 is not portable
26DATE_FMT = -Iseconds
27ifdef SOURCE_DATE_EPOCH
28    BUILD_DATE ?= $(shell date -u -d "@$(SOURCE_DATE_EPOCH)" "$(DATE_FMT)" 2>/dev/null || date -u -r "$(SOURCE_DATE_EPOCH)" "$(DATE_FMT)" 2>/dev/null || date -u "$(DATE_FMT)")
29else
30    BUILD_DATE ?= $(shell date "$(DATE_FMT)")
31endif
32
33BUILD_PLACE ?= $(HOSTNAME):$(shell pwd)
34
35COMPTIMEPLACE := -D'COMPILATION_TIME_PLACE="$(BUILD_DATE) $(BUILD_PLACE)"'
36
37# Defaults, can be overridden by make arguments or environment
38CXXFLAGS ?= -pipe -Wall -Wextra -O3
39CFLAGS ?= -pipe -Wall -Wextra -O3
40CXXFLAGS_SIMD ?= -mavx2
41
42# Unconditionally set essential flags and optimization options
43CXXFLAGS_common := -std=c++11 -fopenmp $(COMPTIMEPLACE)
44CXXFLAGS_main := $(CXXFLAGS_common)
45CXXFLAGS_gdb := -O0 -g3 $(CXXFLAGS_common)
46
47##########################################################################################################
48OBJECTS = SoloFeature_collapseUMI_Graph.o SoloFeature_collapseUMIall_multiMappers.o ParametersClip_initialize.o ClipMate_clip.o ClipCR4.o opal/opal.o ClipMate_clipChunk.o ClipMate_initialize.o \
49	SoloFeature_loadRawMatrix.o SoloFeature_emptyDrops_CR.o soloInputFeatureUMI.o SoloFeature_countSmartSeq.o SoloFeature_redistributeReadsByCB.o \
50	SoloFeature_quantTranscript.o SoloFeature_sumThreads.o SoloFeature_countVelocyto.o SoloFeature_countCBgeneUMI.o \
51	Transcriptome_classifyAlign.o SoloFeature_cellFiltering.o \
52	SoloFeature_statsOutput.o bamSortByCoordinate.o SoloBarcode.o \
53	ParametersSolo.o SoloRead.o SoloRead_record.o \
54	SoloReadBarcode.o SoloReadBarcode_getCBandUMI.o SoloBarcode_extractBarcode.o \
55	SoloReadFeature.o SoloReadFeature_record.o SoloReadFeature_inputRecords.o \
56	Solo.o SoloFeature.o SoloFeature_outputResults.o SoloFeature_processRecords.o SoloFeature_addBAMtags.o \
57	ReadAlign_transformGenome.o Genome_transformGenome.o Transcript_convertGenomeCigar.o \
58	twoPassRunPass1.o samHeaders.o Genome_genomeLoad.o Genome_genomeOutLoad.o Transcript_transformGenome.o ReadAlign_outputSpliceGraphSAM.o \
59	ReadAlign_mapOneReadSpliceGraph.o SpliceGraph.o SpliceGraph_swScoreSpliced.o SpliceGraph_swTraceBack.o \
60	SpliceGraph_findSuperTr.o sjAlignSplit.o \
61	GTF.o GTF_transcriptGeneSJ.o GTF_superTranscript.o SuperTranscriptome.o \
62	ReadAlign_outputAlignments.o  \
63	ReadAlign.o STAR.o \
64	SharedMemory.o PackedArray.o SuffixArrayFuns.o Parameters.o Parameters_samAttributes.o InOutStreams.o SequenceFuns.o Genome.o ParametersGenome.o Stats.o \
65	Transcript.o Transcript_alignScore.o Transcript_generateCigarP.o Chain.o \
66	Transcript_variationAdjust.o Variation.o ReadAlign_waspMap.o \
67	ReadAlign_storeAligns.o ReadAlign_stitchPieces.o ReadAlign_multMapSelect.o ReadAlign_mapOneRead.o readLoad.o \
68	ReadAlignChunk.o ReadAlignChunk_processChunks.o ReadAlignChunk_mapChunk.o \
69	OutSJ.o outputSJ.o blocksOverlap.o ThreadControl.o sysRemoveDir.o \
70	ReadAlign_maxMappableLength2strands.o binarySearch2.o\
71	ReadAlign_outputTranscriptSAM.o ReadAlign_outputTranscriptSJ.o ReadAlign_outputTranscriptCIGARp.o ReadAlign_calcCIGAR.cpp \
72	ReadAlign_createExtendWindowsWithAlign.o ReadAlign_assignAlignToWindow.o ReadAlign_oneRead.o \
73	ReadAlign_stitchWindowSeeds.o \
74	ReadAlign_peOverlapMergeMap.o ReadAlign_mappedFilter.o \
75	ParametersChimeric_initialize.o ReadAlign_chimericDetection.o ReadAlign_chimericDetectionOld.o ReadAlign_chimericDetectionOldOutput.o\
76	ChimericDetection.o ChimericDetection_chimericDetectionMult.o ReadAlign_chimericDetectionPEmerged.o \
77	stitchWindowAligns.o extendAlign.o stitchAlignToTranscript.o \
78	ChimericSegment.cpp ChimericAlign.cpp ChimericAlign_chimericJunctionOutput.o ChimericAlign_chimericBAMoutput.o ChimericAlign_chimericStitching.o \
79	Genome_genomeGenerate.o genomeParametersWrite.o genomeScanFastaFiles.o genomeSAindex.o \
80	Genome_insertSequences.o insertSeqSA.o funCompareUintAndSuffixes.o funCompareUintAndSuffixesMemcmp.o \
81	TimeFunctions.o ErrorWarning.o streamFuns.o stringSubstituteAll.o \
82	Transcriptome.o Transcriptome_quantAlign.o Transcriptome_geneFullAlignOverlap.o \
83	ReadAlign_quantTranscriptome.o Quantifications.o Transcriptome_geneCountsAddAlign.o \
84	sjdbLoadFromFiles.o sjdbLoadFromStream.o sjdbPrepare.o sjdbBuildIndex.o sjdbInsertJunctions.o mapThreadsSpawn.o \
85	Parameters_readFilesInit.o Parameters_openReadsFiles.cpp Parameters_closeReadsFiles.cpp Parameters_readSAMheader.o \
86	bam_cat.o serviceFuns.o GlobalVariables.cpp \
87	BAMoutput.o BAMfunctions.o ReadAlign_alignBAM.o BAMbinSortByCoordinate.o signalFromBAM.o bamRemoveDuplicates.o BAMbinSortUnmapped.o
88
89SOURCES := $(wildcard *.cpp) $(wildcard *.c)
90
91
92%.o : %.cpp
93	$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $<
94
95%.o : %.c
96	$(CXX) -c $(CPPFLAGS) $(CFLAGS) $<
97
98all: cleanCompileInfo STAR$(SFX)
99
100opal/opal.o : opal/opal.cpp opal/opal.h
101	cd opal && \
102	$(CXX) -c -I./ -std=c++11 $(CPPFLAGS) $(CXXFLAGS) $(CXXFLAGSextra) $(CXXFLAGS_SIMD) opal.cpp
103
104.PHONY: clean
105clean:
106	'rm' -f *.o opal/opal.o STAR STARstatic STARlong Depend.list parametersDefault.xxd
107
108.PHONY: CLEAN
109CLEAN: clean
110	$(MAKE) -C $(HTSLIB) clean
111
112
113.PHONY: clean_solo
114clean_solo:
115	'rm' -f Solo*.o
116
117.PHONY: cleanCompileInfo
118cleanCompileInfo:
119	'rm' -f STAR.o Parameters.o
120
121ifneq ($(MAKECMDGOALS),clean)
122ifneq ($(MAKECMDGOALS),CLEAN)
123ifneq ($(MAKECMDGOALS),CLEAN)
124ifneq ($(MAKECMDGOALS),clean_solo)
125ifneq ($(MAKECMDGOALS),STARforMac)
126ifneq ($(MAKECMDGOALS),STARforMacGDB)
127Depend.list: $(SOURCES) parametersDefault.xxd $(HTSLIB)
128	echo $(SOURCES)
129	'rm' -f ./Depend.list
130	$(CXX) $(CXXFLAGS) $(CXXFLAGS_common) -MM $^ >> Depend.list
131include Depend.list
132endif
133endif
134endif
135endif
136endif
137endif
138
139htslib : htslib/libhts.a
140
141htslib/libhts.a :
142	$(MAKE) -C htslib lib-static
143
144parametersDefault.xxd: parametersDefault
145	xxd -i parametersDefault > parametersDefault.xxd
146
147STAR$(SFX) : CXXFLAGS := $(CXXFLAGSextra) $(CXXFLAGS_main) $(CXXFLAGS)
148STAR$(SFX) : LDFLAGS := $(LDFLAGSextra) $(LDFLAGS_shared) $(LDFLAGS)
149STAR$(SFX) : Depend.list parametersDefault.xxd $(OBJECTS)
150	$(CXX) -o STAR$(SFX) $(CXXFLAGS) $(OBJECTS) $(LDFLAGS)
151
152STARstatic$(SFX) : CXXFLAGS := $(CXXFLAGSextra) $(CXXFLAGS_main) $(CXXFLAGS)
153STARstatic$(SFX) : LDFLAGS := $(LDFLAGSextra) $(LDFLAGS_static) $(LDFLAGS)
154STARstatic$(SFX) : Depend.list parametersDefault.xxd $(OBJECTS)
155	$(CXX) -o STAR$(SFX) $(CXXFLAGS) $(OBJECTS) $(LDFLAGS)
156
157STARlong$(SFX) : CXXFLAGS := $(CXXFLAGSextra) $(CXXFLAGS_main) -D'COMPILE_FOR_LONG_READS' $(CXXFLAGS)
158STARlong$(SFX) : LDFLAGS := $(LDFLAGSextra) $(LDFLAGS_shared) $(LDFLAGS)
159STARlong$(SFX) : Depend.list parametersDefault.xxd $(OBJECTS)
160	$(CXX) -o STARlong$(SFX) $(CXXFLAGS) $(OBJECTS) $(LDFLAGS)
161
162STARlongStatic$(SFX) : CXXFLAGS := $(CXXFLAGSextra) $(CXXFLAGS_main) -D'COMPILE_FOR_LONG_READS' $(CXXFLAGS)
163STARlongStatic$(SFX) : LDFLAGS := $(LDFLAGSextra) $(LDFLAGS_static) $(LDFLAGS)
164STARlongStatic$(SFX) : Depend.list parametersDefault.xxd $(OBJECTS)
165	$(CXX) -o STARlong$(SFX) $(CXXFLAGS) $(OBJECTS) $(LDFLAGS)
166
167
168
169POSIXSHARED : CXXFLAGS := $(CXXFLAGSextra) $(CXXFLAGS_main) -DPOSIX_SHARED_MEM $(CXXFLAGS)
170POSIXSHARED : LDFLAGS := $(LDFLAGSextra) $(LDFLAGS_shared) $(LDFLAGS)
171POSIXSHARED : Depend.list parametersDefault.xxd $(OBJECTS)
172	$(CXX) -o STAR$(SFX) $(CXXFLAGS) $(OBJECTS) $(LDFLAGS)
173
174gdb : CXXFLAGS := $(CXXFLAGSextra) $(CXXFLAGS_gdb) $(CXXFLAGS)
175gdb : LDFLAGS := $(LDFLAGSextra) $(LDFLAGS_gdb) $(LDFLAGS)
176gdb : Depend.list parametersDefault.xxd $(OBJECTS)
177	$(CXX) -o STAR $(CXXFLAGS) $(OBJECTS) $(LDFLAGS)
178
179gdb-long : CXXFLAGS := $(CXXFLAGSextra) $(CXXFLAGS_gdb) -D'COMPILE_FOR_LONG_READS' $(CXXFLAGS)
180gdb-long : LDFLAGS := $(LDFLAGSextra) $(LDFLAGS_gdb) $(LDFLAGS)
181gdb-long : Depend.list parametersDefault.xxd $(OBJECTS)
182	$(CXX) -o STARlong $(CXXFLAGS) $(OBJECTS) $(LDFLAGS)
183
184STARforMacStatic : CXXFLAGS := $(CXXFLAGSextra) $(CXXFLAGS_main) -D'COMPILE_FOR_MAC' $(CXXFLAGS)
185STARforMacStatic : LDFLAGS := $(LDFLAGSextra) $(LDFLAGS_Mac_static) $(LDFLAGS)
186STARforMacStatic : Depend.list parametersDefault.xxd $(OBJECTS)
187	$(CXX) -o STAR $(CXXFLAGS) $(OBJECTS) $(LDFLAGS)
188
189STARlongForMacStatic : CXXFLAGS := -D'COMPILE_FOR_LONG_READS' $(CXXFLAGSextra) $(CXXFLAGS_main) -D'COMPILE_FOR_MAC' $(CXXFLAGS)
190STARlongForMacStatic : LDFLAGS := $(LDFLAGSextra) $(LDFLAGS_Mac_static) $(LDFLAGS)
191STARlongForMacStatic : Depend.list parametersDefault.xxd $(OBJECTS)
192	$(CXX) -o STARlong $(CXXFLAGS) $(OBJECTS) $(LDFLAGS)
193