2016-05-29 4 views
1

Sorry, wenn dies ein dup ist, aber ich konnte es nirgends finden.Ändern Makefile Abhängigkeiten, so dass Zwischendateien nicht erstellt werden

Ich arbeite an einem Makefile, das eine Reihe von Zwischendateien erstellt, von denen viele sehr groß sind. Ich hatte das Makefile so eingerichtet, dass ich diese Zwischendateien löschen würde, aber ich glaube, es kommt nicht zurück, um mich zu beißen.

zum Beispiel, wenn Datei10 nur auf file9 abhängig ist, würde ich die depedency machen wie:

file10 : file9 
file9 : file8 
etc... 

wenn ich im Schritt war file10 zu schaffen, würde ich alles außer file9 gelöscht haben. Allerdings, wenn ich alle Dateien löschen, und dann den Befehl ausführen:

make file10 

alle Zwischendateien erstellt werden ... Ich habe versucht, die Dateinamen, da beide .INTERMEDIATE : file8 file7 ... etc Markierung und .SECONDARY : ..., aber das bedeutet nicht scheinen das Verhalten in irgendeiner Weise zu verändern.

Ich realisiere, das ist wahrscheinlich eine normalerweise gute Eigenschaft von make, aber ich frage mich, ob ich es in irgendeiner Weise deaktivieren kann?

Danke!

EDIT: Hier ist das komplette Makefile. Das mag für einige ein bisschen schlampig sein, ich bin sehr neu in Makefiles. Eine Sache zu beachten, die 'Fastq-Dump' Funktionen geben Dateien mit einem * _1.fastq und (in einigen Fällen) auch als * _2.fastq. Deshalb sind die Abhängigkeiten zu Beginn seltsam sind

## all   : execute all functions in this makefile (currently not being implemented) 
all: 
## run_bqsr  : runs bqsr on data using SNPs identified using SAMTOOLS mpileup command 
.PHONY : run_bqsr 
run_bqsr : $(BAMFILE)_recal_data.grp 
     module load R_3.2.2 && java -jar /opt/gatk/3.3-0/GenomeAnalysisTK.jar -T BaseRecalibrator -nct 8 -R $(REF_GENOME_PATH) -I $(BAMFILE)_realigned_reads.bam -BQSR $(BAMFILE)_recal_data.grp -o $(BAMFILE)_post_recal_data.grp -plots $(BAMFILE)_after_recal.pdf 
%_recal_data.grp : %_mpileup.bcf 
     module load module load R_3.2.2 && java -jar /opt/gatk/3.3-0/GenomeAnalysisTK.jar -T BaseRecalibrator -nct 8 -R $(REF_GENOME_PATH) -I $*_realigned_reads.bam -knownSites $*_mpileup.bcf -o $*_recal_data.grp -plots $*_before_recal.pdf 
# create a reference of 'known' SNPs using samtools mpileup. use the -B option to increase sensitivity (important not to include false negatives in analysis because it will mess up the process of adjusting base scores 
%_mpileup.bcf : %_realigned_reads.bam 
     module load samtools_1.2 && samtools mpileup -C50 --BCF -B -f $(REF_GENOME_PATH) $*_realigned_reads.bam -o $*_mpileup.bcf 

## realign_indels  : realign raw sequencing reads around indels using GATK's RealignerTargetCreator and IndelRealiner 
.PHONY : realign_indels 
realign_indels : $(BAMFILE)_realigned_reads.bam 
%_realigned_reads.bam : %_target_intervals.list 
     java -jar /opt/gatk/3.3-0/GenomeAnalysisTK.jar -T IndelRealigner -R $(REF_GENOME_PATH) -I $(BAMFILE)_dedup_reads.bam -targetIntervals $*_target_intervals.list -o $*_realigned_reads.bam && rm $(BAMFILE)_dedup_reads.ba* $(BAMFILE)_target_intervals.list 

%_target_intervals.list : $(BAMFILE)_dedup_reads.bam 
     java -jar /opt/gatk/3.3-0/GenomeAnalysisTK.jar -T RealignerTargetCreator -nt 8 -R $(REF_GENOME_PATH) -I $(BAMFILE)_dedup_reads.bam -o $*_target_intervals.list 

## remove_dups : remove duplicate reads from SAMfiles, sort, and convert to a single merged BAM file 
.PHONY : remove_dups 
remove_dups : $(BAMFILE)_dedup_reads.bam 
$(BAMFILE)_dedup_reads.bam : $(SAMFILES) 
     mkdir -p $(BAMFILE_DIR)/metrics; java -jar /opt/picard/1.72/MarkDuplicates.jar $(addprefix I=, $(SAMFILES)) OUTPUT=$(BAMFILE)_dedup_reads.bam M=$(BAMFILE_DIR)/metrics/$(QUERY_INPUT).metrics && java -jar /opt/picard/1.72/BuildBamIndex.jar I=$(BAMFILE)_dedup_reads.bam && rm -r $(SAMFILE_TEMPDIR)/* $(FASTQ_DIR)/* 
#mark samfiles and fastq files as secondary: 
.INTERMEDIATE : $(SAMFILE_TEMPDIR)/* $(FASTQ_DIR)/* 
## map_fastqs : map fastq files to appropriate genome 
.PHONY : map_fastqs 
map_fastqs : $(SAMFILES) 
%_sorted.sam : $(FASTQs) 
     module load bwa_0.7.13; mkdir -p $(dir $*) ; if echo $(PAIRED) | grep $(notdir $*); then bwa mem -M -R '@RG\tID:$(notdir $*)$(RG)' $(REF_GENOME_PATH) $(FASTQ_DIR)/$(notdir $*)_1.fastq $(FASTQ_DIR)/$(notdir $*)_2.fastq > $*.sam ; else bwa mem -M -R '@RG\tID:$(notdir $*)$(RG)' $(REF_GENOME_PATH) $(FASTQ_DIR)/$(notdir $*)_1.fastq > $*.sam; fi && java -jar /opt/picard/1.72/SortSam.jar I=$*.sam O=$*_sorted.sam SORT_ORDER=coordinate 

## print_fastqs : print full path fastq files to be written 
.PHONY : print_fastqs 
print_fastqs : 
     @echo $(addprefix ../FASTQ/$(QUERY_INPUT)/,$(ALL_FASTQs)) 
## get_fastqs : get all fastq files for particular query: 
.PHONY : get_fastqs 
get_fastqs : $(ALL_FASTQs) 
%_2.fastq : %_1.fastq 
     $(MARK_READS_EXE) $*_1.fastq && $(MARK_READS_EXE) $*_2.fastq 
%_1.fastq : 
     mkdir -p $(dir $*); cd $(dir $*); $(FASTQDUMP_EXE) --split-files -F -I -X 10000 $(notdir $*) 
#$(ALL_FASTQs) : $(FASTQs) 
#  echo $* $< 
## give_org  : print organism of this biosample 
.PHONY : give_org 
give_org : 
     @echo $(ORGANISM) 

## print_SRRs : print the SRR files that will be downloaded 
.PHONY : print_SRRs 
print_SRRs : 
     @printf '\nPAIRED = $(PAIRED)\nUNPAIRED = $(UNPAIRED)\n' 

## clean    : clean up temporary files 
.PHONY : clean 
clean : 
     rm $(FASTQ_DIR)/SRR* $(SAMFILE_TEMPDIR)/*.sam $(BAMFILE_DIR)/$(QUERY_INPUT)* 

## help   : print help statement 
.PHONY : help 
help : makefile 
     @sed -n 's/^##//p' $< 
+1

Zeigen Sie ein komplettes Beispiel, gibt es schließlich eine physische, permanente Datei, die eine Voraussetzung für 'Datei1' ist? Denn wenn nicht, dann ist es nicht verwunderlich, dass make alles neu erstellt: wenn 'file1' nicht existiert, dann muss es neu gemacht werden, was bedeutet, dass' file2' neu erstellt werden muss, was usw. bedeutet. Ich denke deine Frage zu Zwischendateien kann ein Ablenkungsmanöver sein. – user657267

Antwort

1

Angenommen, ich richtig habe verstanden, wie Sie Ihre Frage zu Ihrem Make-Datei betrifft, %_1.fastq : hat keine Voraussetzungen, was bedeutet, machen immer jedes Ziel Remake, das entspricht dieses Muster, wenn es nicht existiert.

Wenn es irgendwelche Voraussetzungen hat sie dann hinzufügen, wenn nicht, dann diese Dateien nicht Zwischendateien überhaupt sind und Sie müssen so viel machen sagen, indem sie explizite Ziele mit so etwas wie

$(filter %_1.fastq,$(ALL_FASTQs)): 
    # Recipe 

machen könnten Sie machen Sie dasselbe mit .PRECIOUS: %_1.fastq, obwohl dies den zusätzlichen Effekt hat, die Dateien zu verlassen, wenn das Rezept fehlschlägt, was wahrscheinlich nicht etwas ist, was Sie wollen.

Verwandte Themen