755 lines
31 KiB
Markdown
755 lines
31 KiB
Markdown
|
# CSE320 Spring 2022
|
|||
|
|
|||
|
In this course you will be using Linux as your primary development
|
|||
|
environment. In addition, we will be providing you with a git
|
|||
|
repository hosted on a department GitLab server. This document will
|
|||
|
briefly explain the course tools and outline the required setup for
|
|||
|
this course.
|
|||
|
|
|||
|
## Setting up your CSE320 Git repository
|
|||
|
|
|||
|
Git is an open-source distributed version control system. We will use
|
|||
|
git repositories to manage your homework submissions. In addition, the
|
|||
|
use of git allows the Professor and TAs to access and view your your
|
|||
|
code remotely in order to assist you. While some students may be
|
|||
|
familiar with version control and git, we ask that everyone complete
|
|||
|
the following tutorial and instructions. This will ensure that
|
|||
|
everyone in the course has the same background knowledge and can
|
|||
|
submit their homeworks.
|
|||
|
|
|||
|
We are using a CSE department supported git web interface, called
|
|||
|
gitlab. This is similar to github, bitbucket, etc. It is an interface
|
|||
|
to help manage git repositories. These services are INTERFACES to git,
|
|||
|
not git itself. You *may not* use external repositories as we will
|
|||
|
use the repo provided to you to grade your submitted work and share
|
|||
|
gradesheets with you.
|
|||
|
|
|||
|
To setup your repository:
|
|||
|
|
|||
|
1. Navigate to
|
|||
|
[https://gitlab02.cs.stonybrook.edu](https://gitlab02.cs.stonybrook.edu/)
|
|||
|
and log into it with your CS email account (user name only, do not
|
|||
|
include the `@cs.stonybrook.edu`). If you forgot your CS email
|
|||
|
password you can reset it by following the instructions
|
|||
|
[here](https://auth01.cs.stonybrook.edu:10443/). If those
|
|||
|
instructions fail, please email `rt@cs.stonybrook.edu` requesting a
|
|||
|
password reset. A response may take up to 24-48 hours.
|
|||
|
2. Once you have logged in the creation of your repo will be triggered.
|
|||
|
Normally this will occur within a few minutes. If not, then send an
|
|||
|
email to `cse320@cs.stonybrook.edu` and we will look into it.
|
|||
|
Sometimes the 'bot responsible for creating the repos has to be reset.
|
|||
|
|
|||
|
## Setting up Linux Environment
|
|||
|
|
|||
|
Since C is a systems level language, frequently the behavior from one
|
|||
|
person’s computer to another can vary. In the past, we have provided a
|
|||
|
common server for students to use, but this presented a few
|
|||
|
problems. When you wanted to compile your assignment, you would have
|
|||
|
to continuously transfer the file to the server and then compile
|
|||
|
it. If you had any mistakes, you would have to either edit it on the
|
|||
|
server or make the change locally and upload it again. This became
|
|||
|
very tedious which often led to students compiling and testing
|
|||
|
locally on their own machines. This was not always a good idea as
|
|||
|
something that seemed to work for you didn’t always work for the
|
|||
|
grader which caused many issues. Also, many tools, which assist in
|
|||
|
locating and fixing errors in C code, do not exist in Windows and OSX
|
|||
|
environments. So students who installed operating systems such as
|
|||
|
[Linux](https://en.wikipedia.org/wiki/Linux) were at an advantage over
|
|||
|
the students who did not.
|
|||
|
|
|||
|
> :nerd: This document will also outline the homework management and
|
|||
|
submission process. In this class, you will be creating increasingly
|
|||
|
complex C projects which may involve many files. To satisfy these
|
|||
|
requirements, we will be using git to manage & submit your homework
|
|||
|
assignments.
|
|||
|
|
|||
|
> :nerd: While we will try to provide the basics for what needs to be
|
|||
|
done, it will ultimately be up to you to learn how to use these
|
|||
|
tools.
|
|||
|
|
|||
|
To help alleviate the above issues and to setup a local environment
|
|||
|
with the necessary course tools, you must install your working
|
|||
|
environment using one of these two options:
|
|||
|
|
|||
|
- Option 1: A Virtual Machine running Linux (Encouraged Option)
|
|||
|
- Option 2: Multi-Boot/Install Linux on your machine
|
|||
|
|
|||
|
Option 1 is encouraged for the following reasons:
|
|||
|
- Quick setup
|
|||
|
- Ease of use in your native OS
|
|||
|
- Easy to reset if errors in VM environment
|
|||
|
- All course tools are pre-installed
|
|||
|
- Simulate multiple cores on a single core system
|
|||
|
|
|||
|
We have put a lot of effort into setting up a pre-configured VM. If
|
|||
|
for some reason you are unable or unwilling to use this, we have
|
|||
|
provided basic instructions for Option 2 with a script to install all
|
|||
|
the course tools.
|
|||
|
|
|||
|
If you choose option 2, you should have some idea what you are doing,
|
|||
|
already be comfortable with Linux, and be aware that we probably won't
|
|||
|
have the resources to debug any issues you might encounter. If you
|
|||
|
deviate in any other way from these procedures, it is completely at
|
|||
|
your peril.
|
|||
|
|
|||
|
### Option 1: A Virtual Machine running Linux
|
|||
|
|
|||
|
Students often use either [VMware](https://www.vmware.com) or
|
|||
|
[VirtualBox](https://www.virtualbox.org/) to run virtual machines.
|
|||
|
We recommend that you use VirtualBox. It is free, and it runs
|
|||
|
on all of the most popular platforms.
|
|||
|
|
|||
|
In order to run a virtual machine, your machine must support 64-bit
|
|||
|
hardware virtualization. Most machines built after 2006 should support
|
|||
|
this. However, not all machines have the option enabled. You may need
|
|||
|
to modify your BIOS settings to enable this feature. As each machine
|
|||
|
has a different BIOS, it is up to you to find and enable this feature
|
|||
|
on your own machine.
|
|||
|
|
|||
|
Download and install the VirtualBox platform package appropriate
|
|||
|
for your computer from [this site](https://www.virtualbox.org/wiki/Downloads).
|
|||
|
|
|||
|
> :exclamation: Because of recent changes made to the way VirtualBox interfaces
|
|||
|
> with the graphics drivers on various platforms, it is important that you make
|
|||
|
> sure to install VirtualBox version 6.1.27 or greater. With older versions,
|
|||
|
> the course VM image will probably not be able to access the display properly.
|
|||
|
|
|||
|
#### Running the Linux VM
|
|||
|
|
|||
|
We will be using Linux Mint 20 "Ulyana" -- Cinnamon as this semester's OS. We
|
|||
|
have taken the time to set up the VM so it simply needs to be opened
|
|||
|
in your virtualization program. The provided Linux virtual machine
|
|||
|
has all the tools required for various aspects of this course; for
|
|||
|
example, homework submission is pre-installed.
|
|||
|
|
|||
|
To get started, download the VM from here:
|
|||
|
[Google Drive]
|
|||
|
(https://drive.google.com/file/d/1rwUM_rm4sEC-we-i-siOPWDnQEtH6mdC/view?usp=sharing)
|
|||
|
(it's nearly 5 gb so give it some time).
|
|||
|
This should result in your having a file called **CSE320_Spring22.ova**.
|
|||
|
This can be imported directly into VirtualBox by choosing
|
|||
|
"Import Appliance" from the "File" menu and then browsing to select
|
|||
|
the file you downloaded. Click "Next", review the VM settings,
|
|||
|
and then click on "Import". Once the import has completed, you should
|
|||
|
have a VM called "CSE 320". Select this and click on
|
|||
|
"Start" to boot the VM.
|
|||
|
|
|||
|
#### Login Info
|
|||
|
|
|||
|
Upon booting, you will be automatically logged in as user `student`.
|
|||
|
The login info for your reference is:
|
|||
|
|
|||
|
|
|||
|
| Username | Password |
|
|||
|
|:----------------|:-------------|
|
|||
|
| `student` | `cse320` |
|
|||
|
|
|||
|
You will need the password in order to obtain superuser access via `sudo`
|
|||
|
to install software, and you might need to enter both the user name and
|
|||
|
the password if the screen lock should kick in after you have left the VM
|
|||
|
idle for some time.
|
|||
|
|
|||
|
#### VirtualBox Guest Additions
|
|||
|
|
|||
|
The VirtualBox Guest Additions are software components that are added
|
|||
|
to the guest operating system that runs in your VM, to make the VM more
|
|||
|
convenient to use. Examples of things in the Guest Additions are accelerated
|
|||
|
video drivers, support for clipboard and drag-and-drop between the VM
|
|||
|
and the host system, ability to resize the VM window, and so on.
|
|||
|
There is a version of the Guest Additions installed in the VM,
|
|||
|
but since the Guest Additions need to match the version of VirtualBox
|
|||
|
that you are using, you should reinstall them. To do this, you should
|
|||
|
start the VM, then from the "Devices" menu (probably in the titlebar of
|
|||
|
the VM window, or wherever top-level application menus appear on your
|
|||
|
system) select "Insert Guest Additions CD Image". This might cause
|
|||
|
a CD image to be downloaded over the network. If the system offers to
|
|||
|
auto-run the CD, allow it to do so. Otherwise you might have to use
|
|||
|
file manager (under Linux Mint) to open the CD manually. Once started,
|
|||
|
it can take several minutes for the installation to complete.
|
|||
|
|
|||
|
#### VM Snapshots
|
|||
|
|
|||
|
If you choose to install additional tools or other programs to your
|
|||
|
environment, you may want to take a snapshot of your VM. This may save
|
|||
|
you the time of installing your additional software again, in the
|
|||
|
unfortunate event of an unusable VM. Refer to the appropriate VirtualBox
|
|||
|
documentation to learn how to take a snapshot of your VM.
|
|||
|
|
|||
|
### Option 2: Multi-Boot/Install Linux on your machine
|
|||
|
|
|||
|
> Remember, if you choose this option, you should have some idea what
|
|||
|
you are doing, already be comfortable with Linux, and be aware that
|
|||
|
we probably won't have the resources to debug any issues you might
|
|||
|
encounter. If you deviate in any other way from these procedures,
|
|||
|
it is completely at your peril.
|
|||
|
|
|||
|
Install [Linux Mint 20 "Ulyana" - Cinnamon 64-bit](https://linuxmint.com/edition.php?id=281)
|
|||
|
or 20.04 Ubuntu variant (as long as you are using gcc 9.3.0) as a dual-boot or fresh
|
|||
|
install.
|
|||
|
|
|||
|
Clone the [CSE320 course tools](https://gitlab02.cs.stonybrook.edu/cse320/course_tools)
|
|||
|
(https://gitlab02.cs.stonybrook.edu/cse320/course_tools) repository
|
|||
|
into your Linux environment. You may need to install git first.
|
|||
|
|
|||
|
Follow the README in the `course_tools` repo.
|
|||
|
|
|||
|
#### Note about MacOS with Apple M1 Processor
|
|||
|
|
|||
|
We are aware that a number of students are now using Macs with an M1 processor.
|
|||
|
The M1 hardware uses the ARM instruction set, which is different than the
|
|||
|
x86-64 instruction set which the course Linux Mint VM uses. At the time of this
|
|||
|
writing, we do not have any reliable information that would indicate that it would
|
|||
|
be possible to run the Linux Mint VM on an M1. It might be possible to run
|
|||
|
it using QEMU, which is a full x86-64 emulator that is independent of the
|
|||
|
underlying host system hardware and for which versions exist for Macs running
|
|||
|
on the M1, though to date we do not have any information from anyone who has
|
|||
|
succeeded in running the VM this way (please tell us if you have managed to do it).
|
|||
|
However, even if in fact the VM can be run this way it is likely to be very slow.
|
|||
|
So, our best advice at this time would be to try to identify some x86-64-based
|
|||
|
computer that you can use for the course, rather than supposing that you will
|
|||
|
be able to use an M1-based computer.
|
|||
|
|
|||
|
### Working in Unix
|
|||
|
|
|||
|
We understand that many of the students taking this class are new to
|
|||
|
CLI (Command-line interface). You can find a quick crash course in
|
|||
|
[Appendix A of Learn Python the Hard Way](https://learnpythonthehardway.org/book/appendixa.html).
|
|||
|
|
|||
|
> :nerd: For more advanced usage refer
|
|||
|
[here](http://www.ibm.com/developerworks/library/l-lpic1-103-1/). This
|
|||
|
is a REALLY good resource so we recommend bookmarking it for later
|
|||
|
reference.
|
|||
|
|
|||
|
> :nerd: It is **very** important that you properly shut down the Linux Mint
|
|||
|
operating system when you are finished using it, rather than just
|
|||
|
"X-ing out" the VirtualBox VM window. The latter is equivalent to
|
|||
|
going and yanking your desktop PC's power plug out of the wall without
|
|||
|
shutting down Windows, and it can cause data loss and even corruption.
|
|||
|
Use the shutdown icon from the "Mint" menu in the lower left corner
|
|||
|
of the desktop to shutdown Linux Mint. At that point, it will be safe
|
|||
|
to power off the VM.
|
|||
|
|
|||
|
> :nerd: Depending on the host system on which you installed VirtualBox,
|
|||
|
"keyboard integration" and "mouse integration" might or might not be
|
|||
|
supported. If they are supported, then you will be able to fairly
|
|||
|
seamlessly move your mouse in and out of the VM window and what you
|
|||
|
type on the keyboard will go to the proper place. If these features
|
|||
|
are not supported, then you will need to click on the VM window in
|
|||
|
order to use it, at which point the mouse and keyboard will be "captured"
|
|||
|
by the VM. In order to regain control of the mouse and cursor, you
|
|||
|
will need to press the "host key", which is identified at the right-hand
|
|||
|
side of the bottom icon tray of the VirtualBox window. On some systems,
|
|||
|
the default host key is "Right Ctrl".
|
|||
|
|
|||
|
> :nerd: To open a terminal window, you can click on the terminal
|
|||
|
icon (which should be fairly evident), or you can press CTRL + ALT + T.
|
|||
|
|
|||
|
#### Text Editor
|
|||
|
|
|||
|
A _good_ basic text editor is the key for C development.
|
|||
|
|
|||
|
We have pre-installed Sublime Text with plugins such as a C linter to
|
|||
|
assist with C development on the given VM. A linter displays compiler
|
|||
|
errors on top of your code much like an IDE. If you do install another
|
|||
|
editor we recommend looking into a similar feature described as it
|
|||
|
will aid development.
|
|||
|
|
|||
|
You may use another text editor if you so desire. Some popular ones
|
|||
|
are Atom, Vim, Emacs and VSCode. Each have their own linters that you
|
|||
|
can look into installing.
|
|||
|
|
|||
|
**DO NOT** install and use a full IDE (Clion, Netbeans, or Eclipse);
|
|||
|
there are many parts of the compilation process that are hidden from
|
|||
|
you. Not only would you miss out on valuable information pertinent
|
|||
|
to the course but your project is not guaranteed to build in an
|
|||
|
environment separate from the IDE.
|
|||
|
|
|||
|
## Homework Management & Submission
|
|||
|
|
|||
|
#### Setting up your CSE320 repository
|
|||
|
|
|||
|
Once your repository has been created on gitlab, you must clone it in
|
|||
|
your Linux environment. Open a new terminal window
|
|||
|
and type `git clone GIT_URL`. You should replace `GIT_URL` with the
|
|||
|
URL to your repository. You can find it by navigating to your projects
|
|||
|
page on GitLab and selecting the https option.
|
|||
|
|
|||
|
> Your repo should be cloned into your home directory (`/home/student/` or AKA `~/`)
|
|||
|
|
|||
|
Alternatively if you add an ssh-key to your gitlab account you can
|
|||
|
clone, pull, push, etc. using the URL under the SSH option (**highly
|
|||
|
recommended** An SSH key can be done at any time).
|
|||
|
|
|||
|
Reference:
|
|||
|
- [Generating SSH key](http://docs.gitlab.com/ce/ssh/README.html)
|
|||
|
|
|||
|
#### First Commit to your Repo
|
|||
|
|
|||
|
Open a terminal and from the home directory enter the following command:
|
|||
|
(replacing REPO_NAME with your repo's name)
|
|||
|
|
|||
|
<pre>
|
|||
|
$ subl REPO_NAME
|
|||
|
</pre>
|
|||
|
|
|||
|
The text editor, Sublime, will open and your repo's contents will be
|
|||
|
shown on the sidebar. Open the `README.md` file and add the text with
|
|||
|
the following information relevant to you.
|
|||
|
|
|||
|
```markdown
|
|||
|
# FIRST_NAME LAST_NAME
|
|||
|
## ID_NUMBER
|
|||
|
:FAVORITE_EMOJI:
|
|||
|
PROFESSOR_NAME - SECTION_NUMBER
|
|||
|
```
|
|||
|
|
|||
|
You can find your favorite emoji code among these
|
|||
|
[https://gist.github.com/rxaviers/7360908](https://gist.github.com/rxaviers/7360908).
|
|||
|
After that you can save and close the file and return to your terminal.
|
|||
|
|
|||
|
In your terminal, type the following commands, replacing `EMAIL` with
|
|||
|
your CS email address and `NAME` with your name:
|
|||
|
|
|||
|
<pre>
|
|||
|
$ git config --global user.email "EMAIL"
|
|||
|
$ git config --global user.name "FIRST_NAME LAST_NAME"
|
|||
|
$ git config --global push.default simple
|
|||
|
</pre>
|
|||
|
|
|||
|
**NOTE:** This will change your settings for all repos. If you want to
|
|||
|
have different settings for other repos on your machine then omit
|
|||
|
`--global`
|
|||
|
|
|||
|
Change directories into your repo `cd REPO_NAME`
|
|||
|
|
|||
|
Then run the following commands:
|
|||
|
|
|||
|
<pre>
|
|||
|
$ git status
|
|||
|
$ git add README.md
|
|||
|
$ git commit -m "My First Commit"
|
|||
|
$ git push
|
|||
|
</pre>
|
|||
|
|
|||
|
> The `git push` command will prompt for username and password if you used HTTPS.
|
|||
|
|
|||
|
The output will look **similar** to:
|
|||
|
|
|||
|
<pre>
|
|||
|
$ git status
|
|||
|
On branch master
|
|||
|
Your branch is up-to-date with 'origin/master'.
|
|||
|
Changes not staged for commit:
|
|||
|
(use "git add file..." to update what will be committed)
|
|||
|
(use "git checkout -- file..." to discard changes in working directory)
|
|||
|
|
|||
|
modified: README.md
|
|||
|
|
|||
|
no changes added to commit (use "git add" and/or "git commit -a")
|
|||
|
$ git add README.md
|
|||
|
$ git commit -m "My First Commit"
|
|||
|
[master XXXXXXX] My First Commit
|
|||
|
1 files changed, X insertions(+), X deletions(-)
|
|||
|
$ git push
|
|||
|
Counting objects: 4, done.
|
|||
|
Delta compression using up to 4 threads.
|
|||
|
Compressing objects: 100% (4/4), done.
|
|||
|
Writing objects: 100% (4/4), 980 bytes | 0 bytes/s, done.
|
|||
|
Total 4 (delta 2), reused 0 (delta 0)
|
|||
|
To ssh://git@gitlab02.cs.stonybrook.edu:130/CSE320_Fall20/REPONAME.git
|
|||
|
XXXXXXX..XXXXXXX master -> master
|
|||
|
Branch master set up to track remote branch master from origin.
|
|||
|
$
|
|||
|
</pre>
|
|||
|
|
|||
|
This is the basic usage of git. We check the `status` of which files
|
|||
|
are tracked/untracked. Then we `add` them and we `commit` them along
|
|||
|
with a message. Lastly and most importantly we `push` them to the
|
|||
|
remote repository on the gitlab server. If the push was successful,
|
|||
|
you can navigate back to the page `https://gitlab02.cs.stonybrook.edu`
|
|||
|
and select your repository. Inside your repository, select the files
|
|||
|
option on the left menu. You should now see the file `README.md` with
|
|||
|
the contents you added to it.
|
|||
|
|
|||
|
> :scream: Once a commit has been made, its contents cannot be changed.
|
|||
|
> In addition, the GitLab server has been configured so that it is not
|
|||
|
> possible to delete any commits that have been pushed to the "master"
|
|||
|
> branch. This means that any junk you commit to the master branch and
|
|||
|
> push to the server will persist there forever in your repo, as well as
|
|||
|
> in copies that we have to store. In view of this, it is is important that
|
|||
|
> you take great care not to commit junk files, especially files that are
|
|||
|
> very large or binary files that are generated by the compiler.
|
|||
|
> Each time you commit, you should first use `git status` to carefully review
|
|||
|
> the set of files to be committed. Use `git reset` to remove any files that
|
|||
|
> are staged for commit but should not be. We strongly recommend that you
|
|||
|
> *never* use commands such as `git add .` or `git add --all`, as these have
|
|||
|
> the potential to add a lot of junk to your commit. Instead, `git add` each
|
|||
|
> file individually, after perhaps using `git diff` to remind yourself of the
|
|||
|
> reason for the commit and to see if the changes are as they should be.
|
|||
|
|
|||
|
#### Git Tutorial
|
|||
|
|
|||
|
We recommend you complete Codecademy’s git tutorial found
|
|||
|
[here](https://www.codecademy.com/learn/learn-git) if you are
|
|||
|
unfamilar with git.
|
|||
|
|
|||
|
If you’re interested in learning more information about git or
|
|||
|
expanding your knowledge, refer to these references:
|
|||
|
- [git-book](https://git-scm.com/book/en/v2) - Chapter 2 is a MUST
|
|||
|
read chapter, checkout git aliases!
|
|||
|
- [Learn Git Branching](http://learngitbranching.js.org/) - An
|
|||
|
interactive tutorial on git branching
|
|||
|
- [git cheat sheet](https://scotch.io/bar-talk/git-cheat-sheet)
|
|||
|
|
|||
|
# Homework 0
|
|||
|
|
|||
|
#### Obtaining Assignment Code
|
|||
|
|
|||
|
1. Navigate to your repository directory (`cd ~/REPO_NAME`) in your VM
|
|||
|
(using the terminal).
|
|||
|
|
|||
|
2. An assignment, such as this one, will tell you the code is located
|
|||
|
at a particular address. For `hw0` it is:
|
|||
|
`https://gitlab02.cs.stonybrook.edu/cse320/hw0.git`
|
|||
|
|
|||
|
3. Add this remote repository as an additional remote into your
|
|||
|
existing repository. We will name the new remote HW0_CODE.
|
|||
|
|
|||
|
If you use HTTPS:
|
|||
|
|
|||
|
```
|
|||
|
$ git remote add HW0_CODE https://gitlab02.cs.stonybrook.edu/cse320/hw0.git
|
|||
|
```
|
|||
|
|
|||
|
If you use SSH:
|
|||
|
|
|||
|
```
|
|||
|
$ git remote add HW0_CODE ssh://git@gitlab02.cs.stonybrook.edu:130/cse320/hw0.git
|
|||
|
```
|
|||
|
|
|||
|
4. Fetch all the refs in this new repository. This command will prompt
|
|||
|
for username and password if you used HTTPS.
|
|||
|
|
|||
|
```
|
|||
|
$ git fetch HW0_CODE
|
|||
|
```
|
|||
|
|
|||
|
5. Finally, merge and commit the files from the `HW0_CODE` remote's
|
|||
|
`master` branch into your existing repository’s `master` branch.
|
|||
|
|
|||
|
```
|
|||
|
$ git merge -m "Merging HW0_CODE" HW0_CODE/master
|
|||
|
```
|
|||
|
|
|||
|
> :nerd: If you get an error mentioning 'unrelated histories' try
|
|||
|
again adding this flag: `--allow-unrelated-histories`
|
|||
|
|
|||
|
6. If you type the command `ls` you should now see a directory called `hw0`.
|
|||
|
|
|||
|
7. Push these base files to your remote repository (gitlab). This
|
|||
|
command will prompt for username and password if you used HTTPS.
|
|||
|
|
|||
|
```
|
|||
|
$ git push
|
|||
|
```
|
|||
|
|
|||
|
#### Your Homework 0 Working Directory
|
|||
|
|
|||
|
The directory structure of your repo will now look **similar** to
|
|||
|
this. Use `ls -a` or `tree -a` to see the hidden files that begin with
|
|||
|
`.`
|
|||
|
|
|||
|
<pre>
|
|||
|
YOUR_REPO
|
|||
|
├── .git
|
|||
|
│ ├── ...
|
|||
|
├── .gitignore
|
|||
|
├── .gitlab-ci.yml
|
|||
|
├── hw0
|
|||
|
│ ├── academic_honesty.txt
|
|||
|
│ ├── include
|
|||
|
│ │ └── hi.h
|
|||
|
│ ├── Makefile
|
|||
|
│ ├── README.md
|
|||
|
│ ├── src
|
|||
|
│ │ ├── hi.c
|
|||
|
│ │ └── main.c
|
|||
|
│ └── tests
|
|||
|
│ └── test.c
|
|||
|
└── README.md
|
|||
|
</pre>
|
|||
|
|
|||
|
Information about each file is explained below.
|
|||
|
|
|||
|
> :nerd: Enter `subl REPO_NAME` (or `subl .` if you are in your repo
|
|||
|
already) as you did before to easily follow along and look inside
|
|||
|
each file
|
|||
|
|
|||
|
- `.gitignore` - This is a file that tells git to ignore certain
|
|||
|
directories or files that you don't want committed. For example, the
|
|||
|
`bin` and `build` directories are ignored.
|
|||
|
This is because we don't want executables and other generated binary files
|
|||
|
pushed to your remote repository, only source code.
|
|||
|
- `.gitlab-ci.yml` This is gitlab's own continuous integration
|
|||
|
configuration file, explained in a later section.
|
|||
|
- `hw0/` - This is your first homework directory, throughout the
|
|||
|
semester we'll be adding each homework directory in this fashion
|
|||
|
'hw#' where # is the homework number. Inside the `hw0/` directory,
|
|||
|
you will find:
|
|||
|
- `README.md` - This is a file where you can detail notes about the project.
|
|||
|
- `Makefile` - This is your ultimate compilation automation
|
|||
|
tool. The program `make` will use this file to properly compile
|
|||
|
your assignment.
|
|||
|
- `include/` - This is where we keep our `.h` headers. Unlike
|
|||
|
Java, C is a one pass compilation language, which keeps the
|
|||
|
overhead of creating symbol tables and structures low. Since all
|
|||
|
functions must be defined before use, we utilize a header file
|
|||
|
to make the symbols available across multiple files.
|
|||
|
- `hi.h` - This is our header file for `hw0`. **Examine the
|
|||
|
contents of this file.**
|
|||
|
- `src/` - This is where we keep our `.c` source files. These
|
|||
|
files contain the actual definitions of the functions declared
|
|||
|
in our headers.
|
|||
|
- `main.c` - This file contains the C main function, in this
|
|||
|
course you will **ALWAYS** need to keep your main function
|
|||
|
in its own C file isolated from the rest of your functions
|
|||
|
that you implement.
|
|||
|
- `hi.c` - The helper function, `hi`, is defined (implemented)
|
|||
|
here. Each function **does not** need its own file, only
|
|||
|
`main()` needs to be in its own file.
|
|||
|
- `tests/` - This is where we keep our unit tests. There is an
|
|||
|
EXCELLENT unit testing framework called
|
|||
|
[criterion](http://criterion.readthedocs.io/en/master/intro.html)
|
|||
|
that we will be using in the course.
|
|||
|
- `test.c` - This file contains the implementation of our
|
|||
|
testing framework. The Makefile will compile these files
|
|||
|
with all of the non-`main.c` files. This gives the testing
|
|||
|
framework access to your helper functions.
|
|||
|
|
|||
|
> **Do not** modify or alter `.gitlab-ci.yml`, the `Makefile` or the
|
|||
|
`README.md` for any assignment unless otherwise instructed.
|
|||
|
|
|||
|
### Academic Honesty Statement
|
|||
|
|
|||
|
In this course we take Academic Honesty EXTREMELY seriously. Read the
|
|||
|
statement in `academic_honesty.txt` using your favorite text editor or
|
|||
|
using the following command (type `man cat` for more information on
|
|||
|
this tool).
|
|||
|
|
|||
|
From your repository's root directory type:
|
|||
|
<pre>
|
|||
|
$ cat hw0/academic_honesty.txt
|
|||
|
</pre>
|
|||
|
|
|||
|
Next, we will append the Academic Honesty Statement into your
|
|||
|
repository's README along with the date and your "signature"
|
|||
|
confirming that you have read the statement and agree with the policy
|
|||
|
and commit it to your repo.
|
|||
|
|
|||
|
From your repository's root directory type the following commands into
|
|||
|
your terminal, filling in `YOUR_NAME` with the appropriate information
|
|||
|
in the second command.
|
|||
|
|
|||
|
> :nerd: The second "crazy" command is an example of redirection which
|
|||
|
can be done between programs on the command-line. We will learn more
|
|||
|
about redirection and how it works later in the semester.
|
|||
|
|
|||
|
<pre>
|
|||
|
$ cd hw0
|
|||
|
$ cat academic_honesty.txt <(echo "$(date -u) - YOUR_NAME") >> ../README.md
|
|||
|
$ git add --all
|
|||
|
$ git commit -m "Academic Honesty statement"
|
|||
|
$ git push
|
|||
|
</pre>
|
|||
|
|
|||
|
#### CI File
|
|||
|
|
|||
|
This semester we want to ensure that students don't get caught by
|
|||
|
silly mistakes or overlook anything while working on their
|
|||
|
assignments. We will use GitLab's [_Continuous
|
|||
|
Integration_](https://en.wikipedia.org/wiki/Continuous_integration)
|
|||
|
feature to minimize such incidents. It is an automated tool that will
|
|||
|
make sure your work compiles and passes basic tests.
|
|||
|
|
|||
|
There is a `.gitlab-ci.yml` file in the base code. This file is used
|
|||
|
to set up a clean vm, compile your code, run your unit tests, and
|
|||
|
lastly run your program on the gitlab server. When looking on gitlab
|
|||
|
you will notice a red :x: or green :heavy_check_mark:. Each represents
|
|||
|
the result of a 'CI pipeline'. Go to the Pipelines tab to view the
|
|||
|
results of your run. We will provide this file with each homework. The
|
|||
|
CI runs when gitlab "gets around" to doing it so don't be alarmed if
|
|||
|
you don't see your result right away. Also, note that sometimes
|
|||
|
a "Runner System Failure" might occur due to problems on the server.
|
|||
|
A failure reported by CI system does *not* mean that "your commit failed"
|
|||
|
in the sense that what you committed and pushed failed to make it to the
|
|||
|
gitlab server; it means that an error occurred while the system was trying
|
|||
|
to compile and run what you committed. You can always use the `Repository`
|
|||
|
tab of the gitlab web interface to see what commits you have pushed to the
|
|||
|
server. If a commit is shown there, then it is safely on the server.
|
|||
|
|
|||
|
#### Hello, World!
|
|||
|
|
|||
|
In the terminal, navigate into the `hw0` folder of your repository
|
|||
|
(ie. `~/REPO_NAME/hw0/`). Open the file `include/hi.h` and examine its
|
|||
|
contents, read the comments, and follow the directions in the
|
|||
|
files. These directions step you through the base files in the HW to
|
|||
|
familiarize you with basic files structure and the included code
|
|||
|
complements.
|
|||
|
|
|||
|
In the terminal, type `make` to build the `hw0` base code. This will
|
|||
|
compile your c code into executables.
|
|||
|
|
|||
|
<pre>
|
|||
|
$ make
|
|||
|
mkdir -p bin build
|
|||
|
gcc build/hi.o build/main.o -o bin/hi
|
|||
|
gcc -Wall -Werror -std=gnu11 -g -DDEBUG -I include build/hi.o tests/test.c -lcriterion -o bin/hi_tests
|
|||
|
</pre>
|
|||
|
|
|||
|
An executable named `hi` and `hi_tests` will be created in the `bin`
|
|||
|
folder of the `hw0` directory. You can execute either program by
|
|||
|
typing `bin/hi` or `bin/hi_tests` from the `hw0` directory into the
|
|||
|
terminal.
|
|||
|
|
|||
|
Running `bin/hi` will print "Hello, World!" before exiting. Running
|
|||
|
`bin/hi_tests` will fail a unit test and print the warning `"Assertion
|
|||
|
failed: say_hi() function did not say 'Hi'"`.
|
|||
|
|
|||
|
<pre>
|
|||
|
$ bin/hi
|
|||
|
Hello, World!
|
|||
|
$ bin/hi_tests
|
|||
|
[----] tests/test.c:15: Assertion failed: say_hi() function did not say 'Hi'
|
|||
|
[FAIL] CSE320_Suite::test_it_really_does_say_hi: (0.00s)
|
|||
|
[====] Synthesis: Tested: 1 | Passing: 0 | Failing: 1 | Crashing: 0
|
|||
|
</pre>
|
|||
|
|
|||
|
To do this assignment, modify the `say_hi()` function in `src/hi.c` to
|
|||
|
satisfy the unit test (i.e. `return "Hi"`). This is will now make the
|
|||
|
program do what the unit test expects and as a result pass the unit
|
|||
|
test.
|
|||
|
|
|||
|
Rebuild the hw0 executables by typing in ‘make’ to your terminal. Run
|
|||
|
the program again to make sure it satisfies requirements
|
|||
|
|
|||
|
<pre>
|
|||
|
$ make
|
|||
|
mkdir -p bin build
|
|||
|
gcc -Wall -Werror -std=gnu11 -g -DDEBUG -I include -c -o build/hi.o src/hi.c
|
|||
|
gcc build/hi.o build/main.o -o bin/hi
|
|||
|
gcc -Wall -Werror -std=gnu11 -g -DDEBUG -I include build/hi.o tests/test.c -lcriterion -o bin/hi_tests
|
|||
|
$ bin/hi
|
|||
|
Hi, World!
|
|||
|
$ bin/hi_tests
|
|||
|
[====] Synthesis: Tested: 1 | Passing: 1 | Failing: 0 | Crashing: 0
|
|||
|
</pre>
|
|||
|
|
|||
|
To save your code changes, `add` them to the staging area of
|
|||
|
git. `Commit` the changes to a local commit on your VM. Then `push`
|
|||
|
the commits to the remote server (gitlab).
|
|||
|
|
|||
|
You can be sure that everything compiles correctly if at some point a
|
|||
|
check appears next to your repo on gitlab.
|
|||
|
|
|||
|
<pre>
|
|||
|
$ git status
|
|||
|
On branch master
|
|||
|
Your branch is up-to-date with 'origin/master'.
|
|||
|
Changes not staged for commit:
|
|||
|
(use "git add file..." to update what will be committed)
|
|||
|
(use "git checkout -- file..." to discard changes in working directory)
|
|||
|
|
|||
|
modified: src/hi.c
|
|||
|
|
|||
|
no changes added to commit (use "git add" and/or "git commit -a")
|
|||
|
$ git add src/hi.c
|
|||
|
$ git commit -m "Hi Fix"
|
|||
|
[master XXXXXXX] updated hi.c
|
|||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|||
|
$ git push
|
|||
|
Username for 'https://gitlab02.cs.stonybrook.edu': REPO_NAME
|
|||
|
Password for 'https://REPO_NAME@gitlab02.cs.stonybrook.edu':
|
|||
|
</pre>
|
|||
|
|
|||
|
## How to submit with `git submit`
|
|||
|
|
|||
|
This semester you will be submitting all assignments using our custom
|
|||
|
git command: `git submit`
|
|||
|
|
|||
|
The usage for `git submit` is:
|
|||
|
|
|||
|
<pre>
|
|||
|
$ git submit [-c COMMIT_HASH] TAG
|
|||
|
</pre>
|
|||
|
|
|||
|
The **TAG** is which assignment you are tagging, for example: `hw0` or
|
|||
|
`hw1` or `hw2`. This is the format for all tags (with a few
|
|||
|
exceptions) that we will use this semester `hw#` where `#` is the
|
|||
|
assignment number.
|
|||
|
|
|||
|
The `-c` flag is optional. **COMMIT** is the SHA of the commit you
|
|||
|
wish to submit. In case you wanted to submit a different commit than
|
|||
|
your most current one you would just provide the SHA for the commit to
|
|||
|
be submitted. You can view your commit SHAs using the following
|
|||
|
command:
|
|||
|
|
|||
|
> The SHA is the alphanumeric string before the first hyphen.
|
|||
|
|
|||
|
<pre>
|
|||
|
$ git log --pretty=format:"%h - %s - %ar"
|
|||
|
</pre>
|
|||
|
|
|||
|
With `git submit`, you may:
|
|||
|
|
|||
|
* Submit your assignment **only** from the master branch.
|
|||
|
|
|||
|
* The commits that you are submitting must be on the master branch or
|
|||
|
merged into master (commit hash is on master).
|
|||
|
|
|||
|
* You may use other branches if you wish, but you cannot use
|
|||
|
git-submit from these branches.
|
|||
|
|
|||
|
<pre>
|
|||
|
$ git submit hw0
|
|||
|
</pre>
|
|||
|
|
|||
|
This will submit your latest pushed commit for `hw0`. You can submit
|
|||
|
as many times as you wish prior to any deadline.
|
|||
|
|
|||
|
#### How to check your submission
|
|||
|
|
|||
|
It creates a special branch in your repo called 'submit'. The only
|
|||
|
reason it is special is that only instructors have permission to push
|
|||
|
to it, hence why you need a special tool to submit your assignment. So
|
|||
|
the submit tool tags the commit that you want to submit and merges
|
|||
|
that commit into the submit branch under an authorized user.
|
|||
|
|
|||
|
Also, you should see a submission commit on the 'submit' branch. The
|
|||
|
submission commit is a commit with a commit message formatted as
|
|||
|
"<tag-name> submission commit". This you can see by navigating to
|
|||
|
Repository > Commits and selecting the 'submit' branch from the
|
|||
|
dropdown.
|
|||
|
|
|||
|
If you see both of these things, you have successfully submitted the
|
|||
|
assignment. A successfully submitted homework assignment will have a
|
|||
|
tag for that particular homework which you can see if you go to your
|
|||
|
project in Gitlab and navigate to Repository > Tags.
|
|||
|
|
|||
|
---------------------------------------------
|
|||
|
|
|||
|
These are the tools and the dev environment you will be working with
|
|||
|
for the rest of the semester. We have provided you with these tools to
|
|||
|
ease the protocols of this course and prevent mishaps from
|
|||
|
occurring.
|
|||
|
|
|||
|
So that you do not delay your ability to start on `hw1`, you should make
|
|||
|
every effort to complete the steps above by **February 4, 2022**, 11:59PM.
|
|||
|
After that date it will no longer be possible to `git submit hw0`,
|
|||
|
however you should still make the commits to your repository described
|
|||
|
above prior to submitting `hw1`.
|
|||
|
Although `hw0` will not be formally scored and weighted into the final grade
|
|||
|
calculations, you will not receive credit for any other assignments
|
|||
|
in this course unless the signed Academic Honesty statement has previously
|
|||
|
been committed to your repository and thereby incorporated into the
|
|||
|
submissions for those assignments.
|