Skip to content

Commit 06627c5

Browse files
author
Daniel Kroening
committed
goto-cl: /Fo can set an output directory
1 parent 747f75e commit 06627c5

File tree

9 files changed

+62
-24
lines changed

9 files changed

+62
-24
lines changed

buildspec-windows.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ phases:
6363
- |
6464
$env:Path = "C:\tools\cygwin\bin;$env:Path"
6565
cmd /c 'call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64 && bash -c "make -C regression test BUILD_ENV=MSVC" '
66+
cmd /c 'call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64 && bash -c "make -C regression/goto-cl test BUILD_ENV=MSVC" '
6667
6768
- |
6869
$env:Path = "C:\tools\cygwin\bin;$env:Path"
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
3+
/c main1.c main2.c /Fo dir
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
--
7+
^warning: ignoring
8+
^CONVERSION ERROR$

regression/goto-cl/Fo/dir/dummy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// blank

regression/goto-cl/Fo/main1.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// blank

regression/goto-cl/Fo/main2.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// blank

regression/goto-cl/Makefile

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
default: tests.log
2+
3+
test:
4+
@../test.pl -p -c ../../../src/goto-cc/goto-cl
5+
6+
tests.log: ../test.pl
7+
@../test.pl -p -c ../../../src/goto-cc/goto-cl
8+
9+
show:
10+
@for dir in *; do \
11+
if [ -d "$$dir" ]; then \
12+
vim -o "$$dir/*.c" "$$dir/*.out"; \
13+
fi; \
14+
done;
15+
16+
clean:
17+
find -name '*.out' -execdir $(RM) '{}' \;
18+
find -name '*.gb' -execdir $(RM) '{}' \;
19+
find -name '*.obj' -execdir $(RM) '{}' \;
20+
find -name '*.goto-cc-saved' -execdir $(RM) '{}' \;
21+
$(RM) tests.log

src/goto-cc/compile.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -421,9 +421,17 @@ bool compilet::compile()
421421
std::string cfn;
422422

423423
if(output_file_object=="")
424-
cfn=get_base_name(file_name, true)+"."+object_file_extension;
424+
{
425+
std::string file_name =
426+
get_base_name(file_name, true) + "." + object_file_extension;
427+
428+
if(!output_directory_object.empty())
429+
cfn = concat_dir_file(output_directory_object, file_name);
430+
else
431+
cfn = file_name;
432+
}
425433
else
426-
cfn=output_file_object;
434+
cfn = output_file_object;
427435

428436
if(write_object_file(cfn, symbol_table, compiled_functions))
429437
return true;

src/goto-cc/compile.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@ class compilet:public language_uit
4545
std::list<irep_idt> seen_modes;
4646

4747
std::string object_file_extension;
48-
std::string output_file_object, output_file_executable;
48+
std::string output_file_executable;
49+
50+
// the two options below are mutually exclusive -- use either or
51+
std::string output_file_object, output_directory_object;
4952

5053
compilet(cmdlinet &_cmdline, ui_message_handlert &mh, bool Werror);
5154

src/goto-cc/ms_cl_mode.cpp

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -21,23 +21,15 @@ Author: CM Wintersteiger, 2006
2121

2222
#include <iostream>
2323

24-
#include <util/message.h>
25-
#include <util/prefix.h>
2624
#include <util/config.h>
25+
#include <util/file_util.h>
2726
#include <util/get_base_name.h>
27+
#include <util/message.h>
28+
#include <util/prefix.h>
2829

2930
#include "compile.h"
3031

3132
/// does it.
32-
static bool is_directory(const std::string &s)
33-
{
34-
if(s.empty())
35-
return false;
36-
char last_char=s[s.size()-1];
37-
// Visual CL recognizes both
38-
return last_char=='\\' || last_char=='/';
39-
}
40-
4133
int ms_cl_modet::doit()
4234
{
4335
if(cmdline.isset('?') ||
@@ -103,24 +95,26 @@ int ms_cl_modet::doit()
10395

10496
if(cmdline.isset("Fo"))
10597
{
106-
compiler.output_file_object=cmdline.get_value("Fo");
98+
std::string Fo_value = cmdline.get_value("Fo");
10799

108-
// this could be a directory
109-
if(is_directory(compiler.output_file_object) &&
110-
cmdline.args.size()>=1)
111-
compiler.output_file_object+=
112-
get_base_name(cmdline.args[0], true)+".obj";
100+
// this could be a directory or a file name
101+
if(is_directory(Fo_value))
102+
compiler.output_directory_object = Fo_value;
103+
else
104+
compiler.output_file_object = Fo_value;
113105
}
114106

115107
if(cmdline.isset("Fe"))
116108
{
117109
compiler.output_file_executable=cmdline.get_value("Fe");
118110

119111
// this could be a directory
120-
if(is_directory(compiler.output_file_executable) &&
121-
cmdline.args.size()>=1)
122-
compiler.output_file_executable+=
123-
get_base_name(cmdline.args[0], true)+".exe";
112+
if(
113+
is_directory(compiler.output_file_executable) &&
114+
cmdline.args.size() >= 1)
115+
compiler.output_file_executable = concat_dir_file(
116+
compiler.output_file_executable,
117+
get_base_name(cmdline.args[0], true) + ".exe");
124118
}
125119
else
126120
{

0 commit comments

Comments
 (0)